UDP协议

本文详细介绍了UDP协议,包括其数据报格式、UDP-Lite、IP分片机制、PMTU发现、最大UDP数据报长度以及UDP服务器设计。重点讨论了UDP数据报如何处理超过PMTU的情况,以及分片可能导致的问题。同时,提到了UDP-Lite允许部分校验和,适用于网络差错率较高的场景。

1、UDP用户数据报协议

UDP是一种保留消息边界的简单的面向数据报的、无连接的、无序的快速灵活的传输层协议,它不提供队列管理,重复消除,流量控制,拥塞控制等

1、UDP数据报格式


  • UDP长度(lenght):当UDP封装在IPv6中时,如果使用巨型负载,则UDP数据报的大小可以超过65535个字
    节,UDP头中的长度位数只有2个字节不够时会被设置为0,虚拟头部的长度为32位可以满足需求
  • UDP校验和:覆盖了UDP头部、UDP负载数据和一个伪头部,在传输的过程中不会被修改(除非经过NAT)

    1. UDP检查和的算法与IPv4中头部检查和的算法一致,都是采用)0x0000位,因此当UDP负载数据位数不是16位的倍数时检查和的路由器会在后面填充字节(0)
    2. UDP伪头部和填充字节仅仅只是为了校验和的计算,在传输的过程中不传递
    3. UDP检查和是可选的(尽管强烈推荐使用)检查和是发送方计算的(如果检查和为0X0000则表示发送方没有计算检查和接收方无需校验)接收方用于校验错误,但在与IPv6结合使用时因为IPv6没有检查和所以UDPj检查和是强制实行的,UDP/IPv6中伪头部是40字节,UDP/IPv4中伪头部是12字节
    4. UDP校验和在穿过NAT时会被修改(由于NAT会需改IP层IP地址和端口号

2、UDP-Lite

UDP-Lite通过修改UDP,实现部分校验和,对轻微差错不敏感,适用于网络差错率较大的情况(视频音频等),UDP-Lite有自己特有的IPv4协议和IPv6中的下一个头部的值(136)
- UDP-Lite头部中校验和覆盖范围字段给出被校验和覆盖的字节数(从UDP-Lite头部的第一个字节开始)0表示整个UDP-Lite数据报都覆盖,除了0,最小是为8(必须覆盖UDP-Lite头部)

检查和覆盖范围必须覆盖UDP-Lite头部(值必须>=8或者为0表示整个UDP-Lite都覆盖)

3、UDP/IP分片(fragment):如果UDP/IP大小超过了PMTU,则会导致数据报分片

  • IP分片长度只能是8字节的倍数(因为Fragment Offset的基本单位是8字节)
  • UDP分片只有第一个片段包含了UDP头部,其他片段不包含UDP头部(不能通过NAT中的端口映射)
  • UDP分片后,如果有任何一个碎片丢失,则整个数据报都将被丢弃,原因在与UDP没有确认和重传的机制,由于分片可能发生在中间路由器处,所以原发送方也无法得知分片的位置和长度
  • 碎片化后,发送方会调整碎片发送的顺序,先发送最后一个碎片(这样有助于接收方分配足够大的缓存以便重组碎片)
  • 接受方最先接受到数据报的任何一个碎片时会开启一个重组计时器(30s或60s),接到新的碎片时计时器不会被重置,当计时器超时数据报还有碎片没接收到,则接收方会丢弃所有已经接收到的碎片,如果丢弃的碎片中有UDP的第一个碎片则丢弃所有碎片并发送一个ICMP重组超时消息给发送方,如果丢弃的碎片中没有UDP的第一个碎片,则悄悄丢弃所有碎片不发送信息

4、UDP的PMTU发现

  • PMTU(路径最大传输单元):发送某个数据需经过的整条线路的最小MTU
  • PMTUD(路径MTU发现机制):PMTUD在传输层以下,一般不被应用程序发现,但应用程序可以调取它的API用于获取对路径的MTU大小的最好的估计,传统的PMTUD是发送ICMP PTB消息来获取PMTU,PMTUD在IP层运行,IP层京杭给予每个目的地址缓存一个PMTUD信息,并且缓存会定期失效
  • PMTUD实现的方法:发送一个较大的UDP/IPv4数据报,DF位设为1,当UDP超过路由器的MTU时,路由器会丢弃数据报并发送一个ICMPv4 PTB(package too big)消息,并附带下一跳的MTU值及被丢弃UDP/IPv4数据报的头部
  • UDP碎片与ARP地址发现:当主机中没有缓存该地址的ARP时,碎片在发送前会先
    等待ARP回复(如果ARP发送了三次请求都没有得到回复将放弃发送),收到回复后碎片将在短时间内一个接一个的发送出去

5、最大UDP数据报长度

  • 由于规定支持IPv4数据报的最小MTU位576字节,因此UDP的PMTU应该设置为512字节
    :512=576-20(IPv4头部)-8(UDP头部)-36(预留给其他协议和拓展选项如IPSec的长度)
  • 数据报截取:当UDP大小超过接收方应用层一次取读数据的大小时会出现UDP截取,根据操作系统的不同对待超出数据的处理方法不同:一些系统会将应用程序一次性取读截取UDP剩下的未消费部分丢弃掉,不通知应用程序丢弃的数据量,一些系统会将应用程序一次性取读截取UDP剩下的未消费部分丢弃掉(HP-UX),并通知应用程序丢弃的数据量(Linux),一些系统将应用程序取读截取UDP剩下的部分保留等待随后一次的取读(SVR4)

6、UDP服务器设计

当数据报到达UDP服务器而该端口没有被监听时,服务器会丢弃数据报并发送ICMP(Port Unreachable)信息告知发送方

使用UDP应用程序收到的数据是经过解封装的,它并不知道源IP端口号和目的IP,因此需要操作系统以其他方式告知应用程序,UDP服务器才能知道是谁发送的信息且信息是发送给哪一个主机IP的,这样UDP服务器才能处理多个客户机

UDP服务器的三种地址绑定方式

  • 1、每台主机都会被分配多个地址(如本地局域网IP,本地回环IP,组播IP,广播IP等)作为UDP服务器的主机可以根据目的IP的不同选择来区别提供区别服务

  • 2、限制本地IP地址:
    大部分UDP服务器使用IP通配符来接收所有发给服务器主机IP地址的数据报,有一些也可以限定接收的IP地址(如主机的外网IP为128.125.43.14,限定UDP服务器只接受127.0.0.1:7777的数据报,则只有本机回环的才能接收到,以外网IP作为目的IP的数据报将不会被接受到)

  • 3、使用多地址:
    同一台主机分配了不同的IP地址,不同的IP可以使用同一端口号来提供不同的UDP服务(端口复用,需设置SO_REUSEADDR选项),当使用不同IP搭配相同端口号时,接收到的数据报地址会先匹配特定IP,如无特定IP则发送给通用IP的终端

  • 4、限制发送方IP地址:
    限制发送方IP(外部IP):如设置了限定发送方IP的选项,则只有该限定IP为源IP的数据报才可以被接收

  • 5、收到的数据报的目的IP为单播地址时,数据包只能被单一的终端取读(既终端配置接收的IP为单播地址和端口时,同一个IP和端口对只能匹配一个服务终端),
    当数据报的目的IP为组播和多播地址时,可以被多个终端取读(既终端配置接受IP为广播或组播地址时,同一对地址和端口可以被配置给多个不同的终端通过设置SO-REUSEADDR选项)、
  • 6、UDP服务器缺乏流控制和拥塞控制:UDP服务器是迭代服务器,终端需要一个一个处理接收到的数据报,当同时到达多个UDP数据报时,会将没来得及处理的数据报存放在入站队列中,
    当队列超载时,再接受到的数据报将被丢弃(当同一个客户端发送数据报的速率过快时也会引起暂存队列超载)

使用 Wireshark 抓包分析 UDP 协议的数据格式时,可以观察到 UDP 是一种无连接的、不可靠的传输层协议,它不提供流量控制或拥塞控制机制。UDP 数据报由 UDP 头部和数据部分组成。 ### UDP 数据包格式 UDP 的头部固定为 8 字节,包含以下字段: 1. **源端口号(Source Port)**:2 字节,标识发送方使用的端口号。 2. **目的端口号(Destination Port)**:2 字节,标识接收方的应用程序端口号。 3. **长度(Length)**:2 字节,表示 UDP 数据报的总长度(包括头部和数据部分),最小值为 8 字节(仅有头部时)。 4. **校验和(Checksum)**:2 字节,用于差错检测,可选字段[^1]。 在 Wireshark 中抓取 UDP 数据包后,可以通过其详细信息面板查看这些字段的具体值。例如,可以在 “User Datagram Protocol” 部分看到上述字段的解析结果。 ### 使用 Wireshark 抓包分析 UDP 的步骤 1. 打开 Wireshark 并选择网络接口进行监听。 2. 开始抓包并执行相关操作(如使用 `ping` 或 DNS 查询等触发 UDP 流量)。 3. 在过滤器栏输入 `udp` 过滤出所有 UDP 协议的数据包。 4. 点击任意一个 UDP 数据包,在下方详情区域展开 “User Datagram Protocol” 查看具体字段内容。 5. 可以进一步查看数据部分的内容,如 DNS 查询或响应数据。 ### 示例:DNS 查询中的 UDP 数据包 DNS 协议通常基于 UDP 实现,以下是一个 DNS 查询请求的示例: ```plaintext Transmission Control Protocol, Src Port: 53, Dst Port: 50936, Seq: 0, Ack: 1, Len: 32 Source Port: domain (53) Destination Port: 50936 Length: 32 Checksum: 0x1234 [validation disabled] ``` 该示例展示了 DNS 响应数据包的 UDP 头部信息,其中源端口为 53(标准 DNS 端口),目的端口为 50936,数据长度为 32 字节,校验和为 `0x1234`(此处可能禁用了校验和验证)。 通过 Wireshark 提供的解析功能,可以清晰地理解 UDP 数据包的结构及其在网络通信中的作用。由于 UDP 的简单性和低开销,它广泛应用于实时应用中,如视频流、在线游戏和 VoIP 通话等场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值