下图是将UDP报文封装成为一份IP数据报的格式
UDP首部(8字节)格式:
UDP检验和覆盖UDP首部和UDP数据。回想IP首部的检验和,他只是覆盖IP首部,但是并不覆盖IP数据报中的任何数据。UDP和TCP在首部中都有覆盖他们首部和数据的检验和。UDP检验和是可选的,而TCP的检验和是必须的。
UDP数据报和TCP端都包含了一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部的一些字段。其目的是让UDP两次检查数据是否已经正确达到目的地。
如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被翘翘丢弃。不产生任何差错报文(当IP层检验到IP首部检验和有差错时也是这样做的)。UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何变动。
网络MTU确认方法:
用Traceroute确定路径MTU
在确定一条网络通路的MTU,需要修改taceroute程序,用它来确定路径MTU。要做的是发送分组,并设置“不分片”标志位。发送的第一个分组的长度正好与出口MTU相等,每次接收到ICMP“不能分片”差错时就见效分组的长度。如果路由器发送的ICMP差错报文是新格式,包含出错的MTU,那么就将该MTU值来发送,否则就用下一个最小的MTU值来发送。
最大UDP数据报长度
在理论上,IP数据报的最大长度是65535(16位),这是由IP首部的数据长度限制的。除去20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据最长长度为65507字节。但是,大多数实现所提供的长度比这个最大长度小。产生这样的原因有:
(1)应用程序可能会受到其程序接口的限制。Socket API提供了一个可提供应用程序调用的函数,以设置接受和发送端的长度。对于UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数据的默认值)。
(2)第二个限制来自于TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。