现在的位置: 首页 > 综合 > 正文

(11)UDP:用户数据报协议

2019年07月30日 ⁄ 综合 ⁄ 共 2172字 ⁄ 字号 评论关闭

一、简介

  UDP是一个简单的面向数据包的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么关系。

  UDP数据报封装成的IP数据报格式如下所示:

UDP封装

  UDP不提供可靠性,它把应用程序传给IP的数据发送出去,但并不保证他们能到达目的地。其次,应用程序必须关心IP数据报的长度,如果它超过网络的最大传输单元(Maximum Transmission Unit,MTU),那么就要对IP数据报进行分片。

二、UDP首部

  UDP首部各字段如下图所示:

UDP首部

 

  端口号表示发送进程和接收进程。这里由于IP已经通过协议字段对协议类型进行了区分,所以TCP与UDP的端口号是相互独立的。

  UDP长度字段是UDP首部和数据的字节长度。起最小值是8,即只包含UDP的8字节首部,数据为0。

三、UDP校验和

  UDP校验和覆盖UDP首部和UDP数据。而IP首部的校验和只覆盖IP首部,而不覆盖IP数据报中的任何数据。

  UDP和TCP在首部中都有覆盖他们首部和数据的校验和。UDP校验和可选,TCP校验和则是必需的。

  计算UDP校验和时,首先,UDP数据报长度可为奇数字节,但校验和是把若干16bit字相加,通过在最后增加填充字节0来解决。其次,UDP和TCP都包含一个12字节的伪首部,是为了计算校验和而设置的。伪首部包括IP首部一些字段,其目的是让UDP两次检查数据是否已经正确到达目的地。

UDP校验和计算过程中使用的各个字段

  如果校验和计算结果为0,则存入全1(65535),这在二进制反码计算中是等效的。如果发送的校验和为0,则表示没有计算校验和。如果校验和计算错误则UDP丢弃此数据报且不产生任何差错报文(IP层也是类似做法)。

  不要简单的相信TCP和UDP的校验和,因为这些都只是简单的校验和,不能检验出所有可能发送的差错,应用程序可自行校验保证数据的完整性和正确性。

四、IP分片

  物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层收到一份要发送的IP数据报时,要判断向哪个接口发送数据(选路),并查询接口获得其MTU。IP把MTU与数据报长度比较后,如果需要则进行分片。且分片可发生在原始发送端主机上,也可发生在中间路由器上。IP数据报分片后,只有到达目的地才重新组装。重新组装由目的端IP层完成。

  若IP标志字段中设置了一个称作“不分片”的位,则IP将不对需要分片的数据报分片,相反把数据报丢弃并发送一个ICMP差错报文。IP本身没有超时重传机制,若其中某一片丢失,则由上层负责重传整个数据报(如TCP)。

  以太网上,数据帧的最大长度是1500字节,其中1472字节留给数据(减去20字节IP首部、8字节UDP首部)。传输的数据超过1472则IP进行分片。分片过程中任何运输层(这里是UDP)首部只出现在第1片数据中。UDP分片距离如下:

UDP分片举例

五、ICMP不可达差错(需要分片)

  当路由器收到一份需要分片的数据报,但在IP首部又设置了不分片(DF)的标志比特。若应用程序要判断到达目的端路途中最小MTU是多少(路径MTU发现机制),则这个ICMP差错可被该程序使用。

  这种情况下ICMP报文格式如下:

ICMP不可达差错报文(需要分片)

  可利用Traceroute或采用UDP来确定路径MTU发现。

六、最大UDP数据报长度

  理论上,IP数据报最大长度是65535字节,这是由IP首部16bit总长度字段所限制的。去除20字节IP首部和8字节UDP首部,UDP数据报中用户数据的最大长度为65507字节,但大多数实现所限制的长度比这个最大值要小。

  其中两个限制为:1、应用程序可能会受到其程序接口的限制;socket API提供可供应用程序调用以便设置接收和发送缓存的长度,现在大部分系统都默认提供可读写大于8192字节的UDP数据报。2、TCP/IP内核某些实现特性的限制。

七、ICMP源站抑制差错

  当一个系统接收数据报的速度比其处理速度快时,可能产生这个差错。其报文格式如下:

ICMP源站抑制差错报文

八、UDP服务器的设计

  客户IP地址及端口号、目的IP地址等信息都包含在UDP首部中。

 1、UDP输入队列

    每个UDP端口都与一个有限大小的输入队列相联系。这意味着来自不同客户的差不多同时到达的请求将由UDP自动排队。接收到的UDP数据报以其接收顺序交给应用程序。排队溢出造成UDP模块丢弃数据报的可能性是存在的。首先,应用程序不知道其输入队列何时溢出。只是由UDP对超出数据报进行丢弃处理。其次,UDP输出队列是FIFO的,ARP输入则是LIFO的。

 2、限制本地IP地址和远端IP地址

    系统可以通过限制本地和远端IP地址来接受特定IP的数据报。UDP模块在判断用哪个端点接受数据报时所采用的顺序是最确定的地址首先被匹配,最不确定的地址最后进行匹配。

 3、每个端口有多个接收者

    大多数系统在某一时刻只允许一个程序端点与本地IP地址及UDP端口号相关联。当目的地为该IP地址及端口号的UDP数据报到达主机时,就复制一份传给该端点。

    当UDP数据报到达的目的IP地址为广播或者多播地址,而且在目的IP地址和端口号处有多个端点时,就向每个端点发送一份数据报的复制。

【上篇】
【下篇】

抱歉!评论已关闭.