UDP协议

时间:2024-04-14 16:20:28

1、UDP用户数据报协议

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

1、UDP数据报格式

UDP协议
UDP协议

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

    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协议
检查和覆盖范围必须覆盖UDP-Lite头部(值必须>=8或者为0表示整个UDP-Lite都覆盖)

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

UDP协议

  • 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服务器的三种地址绑定方式
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的数据报将不会被接受到)
    UDP协议

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

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

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