一个 IP 数据报由首部和数据两部分组成。
首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
在首部的固定部分的后面是一些可选字段,其长度是可变的。(可有可无)
IP协议主要是将包从源地址发往目标地址,里面最重要的就是源地址和目标地址,源和目的地址各占4个字节。
版本4比特,用来指定是IPV4还是IPV6。
这个字段占8比特,作用是给数据包加上标记,在路由器那边带有标记的优先转发,这能够确保某种应用的流量带宽有保障。
占用两个字节,总长度是指首部加数据部分,数据包最大的长度为65535个字节。网卡通常有个最大传输单元MTU,最大的传输单元是1500个字节,也就是网卡能够接收数据包的大小为1500个字节,网卡就需要分片了,每个分片都得加上网络层的地址,接收端收到这些片的时候还得准装成包。
它怎么知道组装成一个包呢,这里面就有标识。
一个数据包分片之后标识都是一样的,接收端看到几个分片的标识都一样,那么怎么正确的拼接呢,这就需要片片偏移了。
片偏移用来指明这个片的第一个字节是整个片的第多少个字节。接收端收到之后就会将片按照片偏移组装成一个包。
片标志位为1,那么代表后面还有分片,为0代表后面没有分片。
一数据报的总长度为 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耗尽了。
协议占用8比特,也就是一个字节,用来指明数据包里面是啥,比如快递上面写着里面的物品是什么类型的。
可以看到数据包里面可以装的内容是ICMP协议,上面这些都可以装到IP数据包里面。
协议号为1为ICMP协议
协议号为6为TCP协议
UDP协议是17
只检查首部有没有差错,不检查数据部分。
源地址/目的地址
总结一下,计算机A和计算机B通信,中间过路由器,A将数据不管是TCP还是UDP也好,加上网络层的字段,过路由器的时候接口要检验首部校验和有没有错误,如果有错误路由器就直接丢弃,如果没有错误TTL就减1,到另外一个路由器也得检验首部校验和有没有错,然后TTL再减1。
IP 首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。
选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。
增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。
实际上这些选项很少被使用。