UDP 是一个不可靠的传输层协议,他把应用程序传送给 IP 层的数据发送出去,但并不保证数据的到达。 对于 IP 数据报的长度,应用程序必须要关注,如果他超过 MTU,那么就要对 IP 数据报进行分片,如果需要,源到目的端之间的每个网络都要进行分片,而并不只有发送端主机才需要。
UDP 首部包含了源端口号、目的端口号、长度、检验和四个字段,分别长 2 字节,总计 8 字节。 其中,长度指的是 UDP 首部和数据的字节长度,这个长度是有冗余的,因此实际使用中不应该以这个长度值计算 UDP 数据报或数据的长度值,IP 首部的 IP 数据报的长度指的是数据报的全长。 检验和则是 UDP 首部和 UDP 数据的 CRC32 计算结果,而 IP 首部的检验和则只覆盖 IP 首部,并不覆盖任何 IP 数据报中的数据,UDP 检验和是可选的,TCP 检验和则是必须的。
正如此前介绍的,物理网络层需要限制每次发送数据帧的最大长度。 每当 IP 层收到一份要发送的 IP 数据报时,他需要判断向哪个接口发送数据(选路),并查询该接口的 MTU,IP 把 MTU 与数据报长度进行比较,如果需要则进行分片。 IP 分片在传输的下一站就会被重新组装,目的端 IP 层如果发现 IP 数据报被切分,则对切分后的分片进行组装,在发往下一站前,如果发现数据报需要分片,则再次对 IP 数据报进行分片。 这个过程对传输层协议(TCP、UDP)是透明的。
IP 首部的 3 位标志位的第二位 DF 位表示“不分片”位,如果该位为 1,且数据报长度大于下一站 MTU,IP 层则会丢弃数据报,并返回一个 ICMP 不可达差错报文给起始端。 当 IP 报文被分片后,每一片都具有自己的 IP 首部,并在选择路由时与其他分片独立,IP 首部的 16 位标识作为 IP 数据报的唯一标识,同一数据报的所有分片都具有相同的标识,下一站 IP 层收到所有分片后根据片偏移字段完成数据报分片的拼装,如果丢失一片,则返回 ICMP 差错报文给起始端要求重传。