计算机网络各种常量值

Last Modified: 2022/10/29

IP 数据报理论最大长度

IP 数据报的最大长度是 65535 字节,包括头部长度。因为 IP 数据报头部有个长度字段,16位,所以最大长度为 65535 字节。同时头部还有个字段(ihl)指示头部长度,Ihl 可表示的最大长度为 60 字节。知道了头部长度,便知道数据报的数据部分从哪里开始。

尽管理论长度可达 65535 字节,但是受限于链路层,通常会将大的报文拆成小的片段。主机不需要接受大于 576 字节的 Ipv4 数据报。当大的数据报被分片后,总长度字段只是的是本分片的总长度。

以太网最小帧大小

最小帧大小 64 字节,不足 64 字节的数据帧会被填充到 64 字节,因此最小有效载荷为 46 字节。

64 - 12字节以太网帧头 - 4字节(fcs帧尾)= 46字节

MTU

在 TCP/IP 分层中,数据链路层用 MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU 是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头。

如果以太网的 MTU为 1500 字节,实际上数据帧的最大长度为 1512 字节,其中以太网数据帧的帧头为 12 字节。

当发送的 IP 数据报的大小超过了 MTU 时,IP 层就需要对数据进行分片,否则数据将无法发送成功。

IP 分片

IP 分片发生在 IP 层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的 MTU 是不同的,如果传输路径上的某个网络的 MTU 比源端网络的 MTU 小,路由器就可能对 IP 数据报再次分片。而分片数据的重组只会发生在目的端的 IP 层。

在 IP 首部有 4 个字节是用于分片的。前 16 位是 IP 数据报的标识,同一个数据报的各个分片的标识是一样的,目的端会根据这个标识来判断 IP 分片是否属于同一个 IP 数据报。

中间 3 位是标志位,其中有 1 位用来表示是否有更多的分片,如果是最后一个分片,该标志位为 0,否则为 1。后面 13 位表示分片在原始数据的偏移,这里的原始数据是 IP 层收到的传输的 TCP 或 UDP 数据,不包含 IP 首部。

需要注意的,在分片的数据中,传输层的首部只会出现在第一个分片中。因为传输层的数据格式对 IP 层是透明的,传输层的首部只有在传输层才会有它的作用,IP 层不知道也不需要保证在每个分片中都有传输层首部。所以,在网络上传输的数据包是有可能没有传输层首部的。

避免 IP 分片

在网络编程中,我们要避免出现 IP 分片,原因是 IP 层没有超时重传机制,如果 IP 层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。

由此可见,IP 分片会大大降低传输层传送数据的成功率,所以我们要避免 IP 分片。 对于 UDP 包,我们需要在应用层去限制每个包的大小,一般不要超过 1472 字节,即:

UDP包大小 = 以太网MTU(1500)减去 UDP首部(8)减去 IP首部(20)

对于 TCP 数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了。在建立连接的三次握手的过程中,连接双方会相互通告 MSS(Maximum Segment Size,最大报文段长度)。

MSS 计算公式:

MSS = MTU 减去 IP首部(20)减去 TCP首部(20)

如果每次发送的 TCP 数据都不会超过双方 MSS 的最小值,就保证了IP数据报不会超过 MTU,避免了 IP 分片。

ipv4 选项和 ipv6 扩展头部

ipv4 头部长度是 20-60 字节之间,基本头部长度 20 字节,但是 ipv4 支持一些特殊的选项,如记录路由,这些选项可将 ipv4 头部扩展到 60 字节。

ipv6 的头部固定为 40 字节,ipv6 是通过扩展头部来实现 ipv4 选项功能的。ipv6 头部中的下一头部字段(8bit)可以为扩展头部或者是其它协议头部。

有问题吗?点此反馈!

温馨提示:反馈需要登录