【计算机网络】UDP协议

目录

一、UDP协议概述

主要特点

头部结构

二、与TCP的对比

相同点:都属于传输层协议

不同点:

1、连接方式

2.可靠性  

3.传输效率  

4.有序性  

5.流量控制和拥塞控制  

6.应用场景  

7.首部长度

三、数据传输过程

1.1 TCP字节流服务图

1.2 UDP数据报服务图

四、代码示例(发送UDP数据包)

服务器端:

客户端:

五、面试问题

1、tcp与udp能不能使用同一个端口号?

 2、同一个协议,TCP 和 TCP 能不能使用同一个端口号?

六、适用场景

七、注意事项


一、UDP协议概述

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供简单、不可靠的数据传输服务。与TCP不同,UDP不保证数据包的顺序、可靠性或重传机制,但具有低延迟和高效率的特点,适用于实时性要求高的应用场景。

主要特点

  • 无连接:通信前无需建立连接,直接发送数据。
  • 不可靠:不保证数据包是否到达目的地,也不保证顺序。
  • 高效:头部开销小(仅8字节),传输延迟低。
  • 支持广播和多播:能够向多个目标同时发送数据。

头部结构

UDP头部由4个字段组成,共8字节:

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|  源端口  |  目标端口  |  数据长度  |  校验和  |
+--------+--------+--------+--------+
  • 源端口(2字节):发送方端口号,可选字段(全0表示无端口)。
  • 目标端口(2字节):接收方端口号。
  • 数据长度(2字节):UDP头部和数据的总长度(最小为8字节)。
  • 校验和(2字节):校验头部和数据的完整性(可选,全0表示未校验)。

    二、与TCP的对比

    • 相同点:都属于传输层协议

    • 不同点:

    1、连接方式

    • UDP:无连接,不可靠,数据包服务。(无连接的协议,发送数据时不需要先建立连接,也不需要在数据传输完成后释放连接,简单地将数据报发送出去即可)。
    • TCP:面向连接的,可靠的,流式服务。(面向连接的协议,在数据传输之前,需要先建立连接,通过三次握手来确保连接的可靠性,数据传输完成后,需要释放连接)

    2.可靠性  

    •  TCP:提供可靠的传输服务。它通过序列号、确认应答、重传机制等保证数据的有序性和完整性,能够自动纠正传输过程中出现的错误。  
    • UDP:不保证数据传输的可靠性。它只是尽最大努力将数据报发送到目的地,不进行错误检查和重传,可能会出现数据丢失、重复或乱序的情况。

    3.传输效率  

    • TCP:由于需要建立连接、进行可靠性检查和流量控制等,会引入一定的开销,传输效率相对较低。  
    • UDP:没有连接建立和复杂的控制机制,头部开销小,传输效率高,适合对实时性要求高、允许一定数据丢失的应用。

    4.有序性  

    • TCP:能保证数据按照发送的顺序到达接收端,对数据进行排序和重组,确保应用层接收到的是有序的数据。  
    • UDP:不保证数据的有序性,数据报可能会以不同的顺序到达接收端,应用层需要自己处理数据的顺序问题。

    5.流量控制和拥塞控制  

    • TCP:具有完善的流量控制和拥塞控制机制。通过滑动窗口协议进行流量控制,根据网络拥塞情况调整发送速率,避免网络拥塞。  
    • UDP:没有内置的流量控制和拥塞控制机制,需要应用层自行实现相关功能,如果网络出现拥塞,可能导致数据丢失加剧。

    6.应用场景  

    • TCP:适用于对数据准确性和完整性要求高的场景,如文件传输、电子邮件、远程登录、网页浏览等。  
    • UDP:适用于对实时性要求高、能容忍一定数据丢失的场景,如视频直播、音频通话、在线游戏、DNS查询等。

    7.首部长度

    • TCP:首部长度一般为20字节,当有选项时,首部长度会增加。  
    • UDP:首部长度固定为8字节,包括源端口、目的端口、长度和校验和字段。
    特性UDPTCP
    连接方式无连接面向连接(三次握手)
    可靠性不可靠可靠(重传、确认机制)
    数据顺序不保证保证顺序
    头部开销8字节20-60字节
    适用场景实时性要求高数据完整性要求高

    三、数据传输过程

    1.1 TCP字节流服务图

    发送端

    • 应用层:应用层通过多次调用 `send()` 函数分别发送 “abcdef”、“12345”、“test” 这些数据。`send()` 函数用于将应用层数据传递给传输层。
    • 传输层:TCP 协议将这些数据暂存于 TCP 发送缓冲区。TCP 为了提高传输效率,会根据自身机制(如窗口大小、拥塞控制等 )对发送缓冲区中的数据进行组合和封装。如图中所示,可能会把 “abcdef” 和 “123” 组合在一起封装成一个 TCP 报文段,“45test” 单独封装成一个 TCP 报文段。这种组合并非严格按应用层发送顺序和边界,而是根据 TCP 自身策略。

    接收端

    • 传输层:接收端的 TCP 协议从网络中接收 TCP 报文段,先存储在 TCP 接收缓冲区。
    • 应用层:应用层通过 `recv()` 函数从 TCP 接收缓冲区读取数据。由于 TCP 发送时可能对数据进行了组合封装,接收端应用层调用 `recv()` 读取数据时,不一定能按发送端应用层的原始边界和顺序获取数据,可能会一次性读取多个发送端组合封装的数据,也可能分多次读取。

            总体而言,该图展示了 TCP 字节流服务中,数据在发送端和接收端的处理过程,突出 TCP 并不保证应用层数据的边界,而是以字节流形式进行传输和处理。  

            呈现了 TCP 协议的数据传输流程。发送端应用层多次调用 send() 函数发送数据,数据先存于 TCP 发送缓冲区,传输层根据自身机制(如窗口、拥塞控制 )将缓冲区数据封装成 TCP 报文段发送;接收端传输层接收 TCP 报文段存于 TCP 接收缓冲区,应用层通过 recv() 函数读取数据。

    1.2 UDP数据报服务图

    发送端

    • 应用层:通过 `sendto()` 函数来发起数据发送操作。`sendto()` 是 UDP 编程中用于发送数据报的函数,它可以指定目标地址(IP 地址和端口号 )以及要发送的数据内容。在应用层,可能会有多个不同的操作或请求需要通过 UDP 发送数据,所以会多次调用 `sendto()` 函数 。
    • 传输层:将应用层传递过来的数据封装成 UDP 数据报。UDP 数据报由 UDP 报头和数据部分组成,报头包含源端口号、目的端口号、长度和校验和等信息,完成封装后的数据报会被发送到网络中。

    接收端

    • 传输层:从网络中接收 UDP 数据报,检查数据报的目的端口号等信息,将符合条件的数据报传递给应用层 。
    • 应用层:使用 `recvfrom()` 函数接收从传输层传来的 UDP 数据报。`recvfrom()` 函数不仅能接收数据,还能获取发送方的地址信息(源 IP 地址和端口号 ) 。同样,在应用层可能会多次调用 `recvfrom()` 函数来处理不同时刻接收到的数据报。

            展示了 UDP 协议数据传输过程。发送端应用层通过 sendto() 函数将数据传递给传输层,传输层封装成 UDP 数据报进行发送;接收端传输层接收 UDP 数据报,应用层通过recvfrom() 函数接收数据。体现了 UDP 无连接、简单的传输特点,发送方直接发送,接收方直接接收,不涉及复杂连接建立与管理。

    四、代码示例(发送UDP数据包)

    左边为TCP图示,右边为UDP图示。

    服务器端:

    • socket();
    • bind();
    • recvfrom();
    • sendto();
    • close();
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    int main(){
        int sockfd=socket(AF_INET,SOCK_DGRAM,0);//数据报
        if(sockfd==-1){
            exit(1);
        }
        struct sockaddr_in saddr,caddr;
        memset(&saddr,0,sizeof(saddr));
        saddr.sin_family=AF_INET;
        saddr.sin_port=htons(6000);
        saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
        int res =bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//指定ip,端口
        if(res==-1){
            printf("bind error\n");
            exit(1);
        }
        while(1){
            int len=sizeof(caddr);
            char buff[128]={0};
            recvfrom(sockfd,buff,127,0,(struct sockaddr*)&caddr,&len);//接收某个客户端的数据
            printf("buff=%s\n",buff);
            sendto(sockfd,"ok",2,0,(struct sockaddr*)&caddr,sizeof(caddr));
        }
        close(sockfd);
        exit(0);
    }

    客户端:

    • socket();
    • sendto();
    • recvfrom();
    • close();
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    int main(){
        int sockfd=socket(AF_INET,SOCK_DGRAM,0);//数据报
        if(sockfd==-1){
            exit(1);
        }
        struct sockaddr_in saddr;//指定服务器地址
        memset(&saddr,0,sizeof(saddr));
        saddr.sin_family=AF_INET;
        saddr.sin_port=htons(6000);
        saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
        while(1){
            printf("input:\n");
            char buff[128]={0};
            fgets(buff,128,stdin);//从键盘获取数据
            if(strncmp(buff,"end",3)==0){
                break;
            }
            sendto(sockfd,buff,strlen(buff)-1,0,(struct sockaddr*)&saddr,sizeof(saddr));//给服务器发数据
            memset(buff,0,128);
            int len=sizeof(saddr);
            recvfrom(sockfd,buff,127,0,(struct sockaddr*)&saddr,&len);//接收某个服务器的数据
            printf("buff=%s\n",buff);
            
        }
        close(sockfd);
        exit(0);
    }

    五、面试问题

    1、tcp与udp能不能使用同一个端口号?

    TCP和UDP可以使用相同的端口号,因为它们是独立的传输协议,每种协议有自己的端口空间。在通信过程中,端口号用于标识应用程序或服务,以便正确地将数据包传递到目标应用程序。因此,同一个端口号可以同时被TCP和UDP协议使用,只要它们不在同一个主机上相互冲突即可。这种情况在网络编程或应用程序开发中是很常见的。

     2、同一个协议,TCP 和 TCP 能不能使用同一个端口号?

    不可以,每个协议都有自己的一组预留端口号。TCP和UDP有各自独立的端口号范围,因此TCP和TCP不能使用相同的端口号。TCP的端口号范围是0到65535,UDP的端口号范围也是0到65535,但它们之间的端口号是相互独立的。

    六、适用场景

    1. 实时应用:如视频会议(Zoom)、在线游戏(王者荣耀)等,对延迟敏感。
    2. 广播/多播:DNS查询、DHCP分配IP地址等。
    3. 简单请求-响应:SNMP网络管理协议。

    七、注意事项

    • 丢包处理:应用层需自行实现重传或纠错机制(如QUIC协议)。
    • 防火墙:某些网络可能屏蔽UDP流量,需配置例外规则。
    • 数据大小:避免发送超过MTU(通常1500字节)的数据包,防止分片。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    易ლ拉罐

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值