UDP数据报中有一个可选的检验和,UDP检验和是一个端到端的检验和。它由发送端计算由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要悄悄被丢弃。不产生任何的差错报文(当IP层检测到IP首部检验和有差错时也这么做 )
关于ICMP不可达差错(需要分片):发生ICMP分片不可达差错的另一种情况是,当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特。
采用UDP路径MTU发现机制的原理是:主机A发送一个300字节的IP数据给路由器B,路由器B的MTU是200字节,IO数据报的首部要设置DF位为1(不允许分片)。在IP数据报到达B后发现不能分片便返回一个ICMP不可达差错报文给A,并在其中包含路由器B的MTU的值。在A收到这个ICMP不可达报文之后发现比需要分片了,于是A自动将DF设置为0(允许分片)。
关于UDP的几个知识要点:
1、UDP和ARP的交互作用:含有UDP的IP数据报在发送前假设被分成了6个数据报片,并发送6个ARP请求(每个IP数据报片发送一个ARP请求)。在接收到第一个ARP应答后,IP数据报的最后一个分片会被发送出去(这个是RFC的规定)。在接收端收到这个数据报片后会启动一个定时器等待其他的数据包片的到来,如果定时器时间内其他数据报片没有到齐那么这些数据报片将会被全部丢弃。
2、数据报截断:UDP编程接口允许应用程序指定每次返回的最大字节数,如果收到的数据报文长度大于应用程序所能处理的长度,则结果要取决于编程接口的实现。而tcp为应用程序提供连续的字节流,没有任何信息边界。在这个接口下不会发生数据丢失。
3、ICMP源站抑制差错:当当一个系统(路由器或者主机)接收数据包的速度比起处理速度快的时候,有可能会产生这个差错,注意是有可能。也有可能直接丢弃数据报。UDP应用程序会忽略到ICMP源站抑制差错报文或者根本就没有接收到它,这也说明了UDP是不可靠传输。