UDP(用户数据报协议)

UDP封装

UDP是一个简单的面向数据报的运输层协议,提供不可靠的数据传输,只负责将IP层的数据发送出去,而不关心它是否到达目的地。  

UDP首部

  • 端口号表示发送进程和接收进程。TCP端口号和UDP端口号相互独立。
  • UDP长度字段指的是UDP首部和UDP数据的字节长度(最小为8字节)。

UDP检验和

UDP校验和覆盖UDP首部和UDP数据(IP校验和只覆盖IP首部)。 UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。

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

UDP校验和和TCP校验和基本算法的不同之处:

  1. UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。
  2. UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地。
  3. UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。

IP分片

物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。   把一份IP数据报分片以后,只有到达目的地才进行重新组装。重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对运输层(TCP和UDP)是透明的,除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。IP首部中包含的数据为分片和重新组装提供了足够的信息。   对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。   最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)。   IP数据报是指IP层端到端的传输单元(在分片之前和重新组装之后),分组是指在IP层和链路层之间传送的数据单元。一个分组可以是一个完整的IP数据报,也可以是IP数据报的一个分片。  

UDP分片举例


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

发生ICMP不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。  

需要分片但又设置不分片标志比特时的ICMP不可达差错报文格式


用Traceroute确定路径MTU

利用路径MTU发现机制,应用程序就可以充分利用更大的MTU来发送报文。


最大UDP数据报长度

理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部, UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。   由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此, UDP编程接口允许应用程序指定每次返回的最大字节数。


ICMP源站抑制差错

当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生ICMP“源站抑制(source quench)”差错。注意限定词“可能”,即使一个系统已经没有缓存并丢弃数据报,也不要求它一定要发送源站抑制报文。  

ICMP源站抑制差错报文格式