1. 概述
UDP 是一个不可靠的传输层协议,他把应用程序传送给 IP 层的数据发送出去,但并不保证数据的到达。 对于 IP 数据报的长度,应用程序必须要关注,如果他超过 MTU,那么就要对 IP 数据报进行分片,如果需要,源到目的端之间的每个网络都要进行分片,而并不只有发送端主机才需要。
2. UDP 首部
UDP 首部包含了源端口号、目的端口号、长度、检验和四个字段,分别长 2 字节,总计 8 字节。 其中,长度指的是 UDP 首部和数据的字节长度,这个长度是有冗余的,因此实际使用中不应该以这个长度值计算 UDP 数据报或数据的长度值,IP 首部的 IP 数据报的长度指的是数据报的全长。 检验和则是 UDP 首部和 UDP 数据的 CRC32 计算结果,而 IP 首部的检验和则只覆盖 IP 首部,并不覆盖任何 IP 数据报中的数据,UDP 检验和是可选的,TCP 检验和则是必须的。
3. IP 分片
正如此前介绍的,物理网络层需要限制每次发送数据帧的最大长度。 每当 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 差错报文给起始端要求重传。