这是65535-8(UDP头)-20(IP头)。
UDP长度头是2个字节长,即65535限制。
我知道我们要从中减去8,因为这是UDP头的大小,但如果它始终是8,为什么我们需要减去它呢?
同样的问题也适用于IP头长度的20。
谢谢。
UDP数据报被封装在IP数据包中。如果您将IP数据包头大小设置为20,则表示使用IPv4,而IPv4的最小头大小为20。 IPv4具有理论最大包大小为65535(在IPv4头中有一个16位的总长度字段),但实际IPv4最大包大小将是链路上的MTU。此大小包括IPv4头和IPv4有效负载,即UDP数据报,其中包括UDP头和UDP有效负载。
由于UDP数据报是IPv4数据报的数据,并且IPv4数据报的整个长度(包括IPv4头)是IPv4头的16位总长度字段,因此整个IPv4包,包括IPv4头,最大为65535个八位字节。这在IPv4的定义中详细说明,RFC 971 Internet protocol, Section 3.1 Internet Header Format:
3.1. Internet Header Format
互联网头部内容的摘要如下:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
总长度字段的定义如下:
总长度:16位
总长度是数据报文的长度,以八位字节为单位计算,包括互联网头部和数据。该字段允许数据报文的长度最多达到65,535个八位字节。这样的长报文对于大多数主机和网络来说是不切实际的。所有主机必须准备接受最多576个八位字节的数据报文(无论它们是完整的还是分片的)。建议主机在有保证目标地址准备接受更大数据报文的情况下才发送大于576个八位字节的数据报文。
选择数字576是为了允许在所需的头部信息之外传输合理大小的数据块。例如,该大小允许512个八位字节的数据块加上64个头部八位字节适合一个数据报中。最大的互联网头部是60个八位字节,而典型的互联网头部是20个八位字节,从而为更高级别协议的头部留出余量。
这意味着您必须将IPv4头长度从最大值65,535中减去,以获得包括8个八位字节UDP头的最大UDP数据报长度。