计算机网络 网络层 IP 数据报的格式以及分片

IP 数据报的格式


一个 IP 数据报由首部和数据两部分组成。

首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。

在首部的固定部分的后面是一些可选字段,其长度是可变的。(可有可无)

IP协议主要是将包从源地址发往目标地址,里面最重要的就是源地址和目标地址,源和目的地址各占4个字节。

版本4比特,用来指定是IPV4还是IPV6。

 这个字段占8比特,作用是给数据包加上标记,在路由器那边带有标记的优先转发,这能够确保某种应用的流量带宽有保障。

占用两个字节,总长度是指首部加数据部分,数据包最大的长度为65535个字节。网卡通常有个最大传输单元MTU,最大的传输单元是1500个字节,也就是网卡能够接收数据包的大小为1500个字节,网卡就需要分片了,每个分片都得加上网络层的地址,接收端收到这些片的时候还得准装成包。

它怎么知道组装成一个包呢,这里面就有标识。

一个数据包分片之后标识都是一样的,接收端看到几个分片的标识都一样,那么怎么正确的拼接呢,这就需要片片偏移了。

 片偏移用来指明这个片的第一个字节是整个片的第多少个字节。接收端收到之后就会将片按照片偏移组装成一个包。

片标志位为1,那么代表后面还有分片,为0代表后面没有分片。

IP 数据报分片


一数据报的总长度为 3820 字节,其数据部分的长度为 3800 字节(使用固定首部),需要分片为长度不超过 1420 字节的数据报片。

因固定首部长度为 20 字节,因此每个数据报片的数据部分长度不能超过 1400 字节。

于是分为 3 个数据报片,其数据部分的长度分别为 1400、1400 和 1000 字节。

原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。

 分片的时候首部都复制,然后算偏移,修改里面的字段,8字节为1个单位。

可以看到分片的标识都是一样的,MF 1 代表分片后面还有分片。分片过后总长度也会发生了改变。

生存时间

最大值是255,这个和过路由器的数量有关系,A和B计算机通信,A要向B计算机发送数据包,中间需要经过路由器,假设TTL是128,在路由器收到数据包转发之前TTL先减去1,再去转发,变为127了。转发一次,生存时间值就减一,经历过三个路由器最终到达B计算机,那么B计算机看到的TTL值就是125。

计算机发的数据包都有一个默认的TTL,这个和系统有关系,Windows有默认值,Linux也有默认值。

如果两个Windows计算机在一个网段ping,那么TTL就是128,因为不过路由器,如果中间过了一个路由器就是127,如果数据包在返回的时候过了两个路由器那么看到的就是126。

如果是Linux系统,那么TTL默认是64,所以TTL初始值要么是128,要么是64这两个初始值了。

 tracert可以跟踪过了多少个路由器,一般路由器数量都不会很多,比如经过50个路由器。

C:\Users\12396>ping www.baidu.com

正在 Ping www.a.shifen.com [180.101.49.12] 具有 32 字节的数据:
来自 180.101.49.12 的回复: 字节=32 时间=15ms TTL=53
来自 180.101.49.12 的回复: 字节=32 时间=15ms TTL=53

180.101.49.12 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 15ms,最长 = 15ms,平均 = 15ms
Control-C
^C
C:\Users\12396>tracert www.baidu.com

通过最多 30 个跃点跟踪
到 www.a.shifen.com [180.101.49.12] 的路由:

  1     3 ms     1 ms     1 ms  172.17.0.2
  2     4 ms     9 ms    11 ms  115.196.12.1
  3   127 ms   127 ms    28 ms  61.164.23.172
  4     6 ms     5 ms     6 ms  183.129.250.141
  5    13 ms    13 ms    13 ms  202.97.33.157
  6     *       14 ms    14 ms  58.213.95.106
  7     *        *       17 ms  58.213.95.126
  8    11 ms    18 ms    12 ms  58.213.96.90

指定为1的时候,计算机发送的数据包,TTL字段就是1,当经过路由器减一就变为0了,于是网关返回来一个数据包告诉你TTL传输过期。 

C:\Users\12396>ping www.baidu.com -i 1

正在 Ping www.a.shifen.com [180.101.49.11] 具有 32 字节的数据:
来自 172.17.0.2 的回复: TTL 传输中过期。
来自 172.17.0.2 的回复: TTL 传输中过期。
来自 172.17.0.2 的回复: TTL 传输中过期。

如果TTL是2,那么是从第二个路由器返回信息,同理如果是3的话会从第三个路由器返回来。使用-i也能够追踪数据包看看过了多少个路由器。

C:\Users\12396>ping www.baidu.com -i 2

正在 Ping www.a.shifen.com [180.101.49.12] 具有 32 字节的数据:
来自 115.196.12.1 的回复: TTL 传输中过期。
来自 115.196.12.1 的回复: TTL 传输中过期。

180.101.49.12 的 Ping 统计信息:
    数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
Control-C
^C

TTL的作用主要是避免环路,比如A路由器上面默认路由指向B,B路由器上面默认路由指向A,这样一个网络就会形成环路,如果没有TTL限制的话,数据包会在链路上面永不消失,所以通过TTL限制数据包TTL耗尽了之后,直接丢掉,路由器返回给客户端TTL耗尽了。

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/123412823