TCP/IP详解之第11章-UDP:用户数据报协议

知识要点

  • UDP同TCP一样是传输层协议,且网络层均使用IP协议。

    1
    2
    3
    4
    5

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | IP header | UDP header | UDP payload |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    20 bytes 8 bytes
  • UDP是面向数据报的,即将进程的单次输出封装成一个UDP数据报。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    0 1 2 3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Source Port | Destination Port |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Length | Checksum |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    | Data |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • UDP和TCP的校验和均覆盖UDP首部和UDP数据,但是UPD的校验和是可选项,而TCP的校验和是必需项。

  • UDP数据报和TCP段计算校验和时都包含一个12字节的伪首部,其中包含了32位源IP地址和32位目的IP地址,用于检测UPD数据报是否已正确抵达目的地。

  • UDP校验和是端到端的,由发送端计算,接收端验证,以检测端到端之间UDP数据报是否发生任何改动。

  • UDP不提供传输的可靠性保障,即通过UDP发送的数据不保证能否抵达目的地。

  • 使用UDP时应避免IP分片,因为IP层没有超时重传机制。

  • 由于以太网帧的MTU为1500(IEEE 802的MTU为1492),因此,当UDP数据报中的用户数据大于1472(1500-20-8)时会触发IP层分片。

  • 可利用路径MTU发现机制获取路径上最小的MTU值,可用以下命令:

    1
    2
    3
    ping -D -s 8.8.8.8

    tracepath 8.8.8.8
  • 理论上,IP数据报的最大长度为65535(2^16),即UDP数据报中用户数据最大长度为65507=65535-20-8。但是,大多数实现所提供的长度小于这个理论值,原因有二:

    • 应用程序可能会受到程序接口限制
    • TCP/IP的内核实现中,IP数据报的长度小于65535。
  • UDP允许应用层指定可接收的最大字节数,因为IP能够发送或接收特定长度的数据包,并不意味着应用层可以读取同样长度的数据。

习题详解

  • 在 1 1 . 5 节中,向UDP数据报中写入1473 字节用户数据时导致以太网数据报片的发生。在采用以太网IEEE 802封装格式时,导致分片的最小用户数据长度为多少?
    答:因为使用IEEE 802封装时,IP数据报前面存在8个额外的字节,即IEEE 802帧用户数据最大长度为1492(1500-8),因此,UDP导致分片的最小用户数据长度为1465=1492-20-8+1。

  • 阅读RFC 791[Postel 1981a],理解为什么除最后一片外,其他片中的数据长度均要求为
    8字节的整数倍?

    答:这与IP报文格式的设计相关。在IP报文中,表示报文总长度值的字段占16bits,即IP报文的最大长度为65535。而表示分片偏移量的字段占13bits,能表示范围为0~8191。由于IP报文最小长度为20字节,因此IP报文用户数据的最大长度为65515(65535 - 20)个字节。如果使用8字节作为偏移量最小跨度,那么最多可表示8189(65515 / 8)个分片,这与最大分片偏移量(8191)很接近。且当偏移量取最大值时,最后一个分片的长度为3个字节 = 65535 - 20 - (8189 * 8)。

  • 假定有一个以太网和一份8192字节的UDP数据报,那么需要分成多少个数据分片,每个数据分片的偏移和长度为多少?

    答:将8192字节的UDP数据封装成IP报文需加上8字节的UDP头部,即IP报文的数据长度为8200字节。又因为以太网帧的MTU为1500,每个分片除去20字节的IP头部,IP报文最大数据长度为1480,且刚好是8的倍数,满足IP分片要求。

    分片数=8200 / 1480 + 1 = 6,8200 = 1480 * 5 + 800,分片采用tcpdump记号:

    • 分片一:1480@0+,分片长度为1480,偏移量为0,标识位MF=1(More Fragement)
    • 分片二:1480@1480+
    • 分片三:1480@2960+
    • 分片四:1480@4440+
    • 分片五:1480@5920+
    • 分片六:800@7400+
  • 一个用UDP发送数据报的应用程序,它把数据报分成4个数据分片。假定第1片和第2片到达目的端,而第3片和第4片丢失了。应用程序在10秒钟后超时重发该UDP数据报,并且被分成相同的4片(相同的偏移和长度)。假定这一次接收主机重新组装的时间为60秒,那么当重发的第3片和第4片到达目的端时,原先收到的第1片和第2片还没有丢弃。接收端能否把这4片数据重新组装成一份IP数据报?

    答:不能。IP数据报中有一个标识字段,只有标识字段相同的数据分片才能组装成一份IP数据报。当应用程序超时重传时,重传IP数据报具有新的标识,因此,其所生成的分片不能与其他IP数据报的分片重组。

  • 在讨论分片时没有提及任何IP首部中的选项—它们是否也要复制到每个数据报片中,或者只留在第一个数据报片中?我们已经讨论过下面这些IP选项:记录路由、时间戳、严格和宽松的源站选路。你希望分片如何处理这些选项?

    答:不严格和严格的源站选路选项被复制到每一个数据包分片中。时间戳选项和记录路由选项只出现在第一个数据包分片中,而不会被复制到每一个数据包分片中。

  • 在图1-8中,我们说UDP数据报是根据目的UDP端口号进行分配的,这正确吗?

    答:不正确,很多实现是根据目的IP地址、源IP地址和源端口号来过滤送往一个给定UDP端口号的输入数据报。

参考资料

Why the ip fragments must be in multiples of 8 bytes

Comments