tcp和udpUDP和TCP协议有什么区别?

2022年11月21日 03:11--浏览 ·
--喜欢 ·
--评论UDP和TCP两大协议的区别谈起UDP与TCP两大协议的异同,有人说我喜欢用TCP不喜欢用UDP,也有人说我喜欢用UDP而不喜欢用TCP,使用TCP的人说,我使用使用的协议比较可靠、不容易粘包、不容易丢包;使用UDP的人说,我使用的协议操作简单、传输速度比较快;我想说的是各有各的好处与不足。下面就让四哥给大家讲讲他们的优缺点与重要的区别,然后在选择适合自己的协议进行开发吧。一、TCP与UDP基本区别1.基于连接与无连接2.TCP要求系统资源较多,UDP较少;3.UDP程序结构较简单4.流模式(TCP)与数据报模式(UDP);5.TCP保证数据正确性,UDP可能丢包6.TCP保证数据顺序,UDP不保证二、UDP应用场景:1.面向数据报方式2.网络数据大多为短消息3.拥有大量Client4.对数据安全性无特殊要求5.网络负担非常重,但对响应速度要求高三、具体编程时的区别1.socket()的参数不同2.UDP Server不需要调用listen和accept3.UDP收发数据用sendto/recvfrom函数4.TCP:地址信息在connect/accept时确定5.UDP:在sendto/recvfrom函数中每次均需指定地址信息6.UDP:shutdown函数无效7.UDP不需要经过三次握手与四次挥手的过程编程区别通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。基于上述不同,UDP和TCP编程步骤也有些不同,如下:TCP:TCP编程的服务器端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt(); * 可选3、绑定IP地址、端口等信息到socket上,用函数bind();4、开启监听,用函数listen();5、接收客户端上来的连接,用函数accept();6、收发数据,用函数send()和recv(),或者read()和write();7、关闭网络连接;8、关闭监听;TCP编程的客户端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();* 可选3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选4、设置要连接的对方的IP地址和端口等属性;5、连接服务器,用函数connect();6、收发数据,用函数send()和recv(),或者read()和write();7、关闭网络连接;UDP:与之对应的UDP编程步骤要简单许多,分别如下:UDP编程的服务器端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();* 可选3、绑定IP地址、端口等信息到socket上,用函数bind();4、循环接收数据,用函数recvfrom();5、关闭网络连接;UDP编程的客户端一般步骤是:1、创建一个socket,用函数socket();2、设置socket属性,用函数setsockopt();* 可选3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选4、设置对方的IP地址和端口等属性;5、发送数据,用函数sendto();6、关闭网络连接;TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。以下是他们具体的代码的区别:TCP编程代码:#include#include#include#include#include /* See NOTES */#include#include#include#include#define SERV_PORT 5001#define SERV_IP "192.168.7.8"#define QUIT_STR "quit"int main (void){int fd = -1, newfd = -1;struct sockaddr_in sin;/* 1.创建套接字fd */if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) { /* IPV4的TCP通信 */perror ("socket");exit (1);}/*2.1 填充sin结构体: 填写IP地址和端口这两个要素 */bzero (&sin, sizeof (sin));sin.sin_family = AF_INET;sin.sin_port = htons (SERV_PORT); /* 网络字节序的端口号 */sin.sin_addr.s_addr = inet_addr (SERV_IP);/* 2.2 绑定 */if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("bind");exit (1);}/*3. 把主动套接字变为被动套接字 */listen (fd, 5);printf("Server starting....OK!\n");/*4.阻塞等待客户端连接 */if ((newfd = accept (fd, NULL, NULL)) < 0) {perror ("accept");exit (1);}/*5.读写客户端数据 */while (1) {char buf[BUFSIZ];bzero (buf, BUFSIZ);read (newfd, buf, BUFSIZ - 1);printf ("Server Read: %s\n", buf);if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) { //客户端输入了quitclose (newfd);break;}}close (fd);return 0;}UDP 服务器编程代码:#include#include#include#include#include /* See NOTES */#include#include#include#include#include#define SERV_PORT 5001#define SERV_IP "192.168.7.8"#define QUIT_STR "quit"void usage (char *s){printf ("Usage:\n");printf ("\t%s [serv_port]\n", s);printf ("\tserv_port: server port.\n");printf ("\n");}int main (int argc, char *argv[]){int fd = -1;struct sockaddr_in sin;int port = SERV_PORT;/*优化4: 参数处理 */if (argc != 1 && argc != 2) {usage (argv[0]);exit(1);}if (argc == 2) {port = atoi (argv[1]);}/* 1.创建UDP套接字fd */if ((fd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { /* IPV4的UDP通信 */perror ("socket");exit (1);}/*优化1: 允许绑定的IP地址和端口号能够快速重用 */int b_reuse = 1;setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof (int));/*2.1 填充sin结构体: 填写IP地址和端口这两个要素 */bzero (&sin, sizeof (sin));sin.sin_family = AF_INET;sin.sin_port = htons (port); /* 网络字节序的端口号 */sin.sin_addr.s_addr = htonl (INADDR_ANY); /*优化2: bind在任意IP *//* 2.2 绑定 */if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("bind");exit (1);}printf ("UDP Server starting....OK!\n");/*3.阻塞等待客户端连接 */int ret = -1;char buf[BUFSIZ];struct sockaddr_in cin;socklen_t clen = sizeof (cin);while (1) {bzero (buf, BUFSIZ);do {ret = recvfrom (fd, buf, BUFSIZ - 1, 0, (struct sockaddr *) &cin, &clen);} while (ret < 0 && EINTR == errno);if (ret < 0) {perror ("recvfrom");continue;}char cli_ipv4[16];if (inet_ntop (AF_INET, (void *) &cin.sin_addr, cli_ipv4, sizeof (cin)) == NULL) {perror ("inet_ntop");continue;}printf ("Client(%s:%d) said: %s\n", cli_ipv4, ntohs (cin.sin_port), buf);}close (fd);return 0;}TCP与UDP区别总结:1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信5、TCP首部开销20字节;UDP的首部开销小,只有8个字节6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道来到这里相信很多玩网络编程的朋友已经了解甚至熟悉了他们区别和用处了,但是我还是有必要的重新提一下,没有什么东西是最好的,这好与坏只是相对而言,遵循着相对论的基本转折,因人而异,适合自己的就好!现在UDP与TCP的区别懂了,还需要了解一下他们里面的具体协议和细节哦,下集再会!
TCP(传输控制协议)和UDP(用户数据报协议)之间存在以下区别:连接方式:TCP是面向连接的,发送数据之前需要先建立连接。相反,UDP是无连接的,发送数据之前不需要建立连接。可靠性:TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。然而,UDP尽最大努力交付,但不保证可靠交付。效率:TCP的传输效率相对较低,而UDP的传输效率较高,适用于对高速传输和实时性有较高要求的通信或广播通信。这是因为TCP的拥塞控制机制和确认机制使其在处理数据时需要更多的时间和资源,而UDP则没有这些机制。通信模式:每一条TCP连接只能是点到点的,而UDP则支持一对一,一对多,多对一和多对多的交互通信。头部开销:TCP的首部开销为20字节,相较之下,UDP的首部开销较小,只有8个字节。使用TCP或UDP主要取决于特定的应用程序需求。TCP主要用于需要可靠传输的场景,如文件传输或重要状态信息的传递,因为其顺序性和可靠性对于这些应用至关重要。然而,对于一些对实时性要求较高,且对数据的顺序性和可靠性要求较低的场景,如视频流或实时游戏,通常会使用UDP。
TCP和UDP是TCP/IP体系结构中的传输层中很主要的两个协议,UDP的全称是用户数据报协议,TCP的全称是传输控制协议。①有无连接:使用UDP协议的通讯双方是随时可以进行数据传输的,无需建立连接,而TCP是面向连接服务的,在传输数据的时候需要三次握手进行连接。四次挥手释放连接②是否支持广播或多播:UDP支持了广播、多播和单播的服务,而TCP只支持单播③报文是面向字节流或报文段:UDP是面向应用报文,UDP对应用层交下来的报文,既不会拆分,也不会合并。TCP是面向字节流的,应用程序与TCP交互是一次一个大小不等的数据块,发送方的TCP把应用进程交付下来的报文数据块,看成是无结构的字节流,它不保证接收方收到的数据块和发送方发送的数据块具有对应大小关系。发送方TCP会将数据放入缓冲区,等到可以发送的时候再发送,TCP会根据发送策略,发送给接受方④首部:UDP首部开销比较小,只有8字节,TCP最少首部为20字节,最大首部是60字节,主要因为他实现的功能比较多,实现可靠传输、拥塞控制、流量传输等等。⑤可靠性:UDP向其上层提供无连接不可靠传输服务,数据可能会发生丢失,误码,但是传输效率高。所以主要适用于传输效率要求相对高,对准确性要求相对低和实时性要求高的场景,比如视频会议(因为我们可以接受图像稍微模糊一点,声音稍微不清晰一点)、网络语音电话、广播通信(广播、多播)

我要回帖

更多关于 UDP和TCP协议有什么区别 的文章

 

随机推荐