一:前言
如果网络中的所有设备都是使用集线器或者交换机进行连接,那么这个网络称为局域网(LAN)。如果将两个局域网连接起来,那么需要路由器。复杂的网络中,可能包含了成千上万的局域网,而这些局域网是由成千上万的路由器连接起来的。
互联网本身是由无数局域网和路由器组成的一个集合
二:IPv4头(固定长度20字节)
版本(version):IP所使用的版本
首部长度(Header Length):IP头的长度
服务类型(Type of Service):优先级标志位和服务类型标志位,被路由器用来进行流量的优先排序
总长度(Total Length):IP头与数据包中数据的长度
标识符(Identification):一个唯一的标识数字,用来识别一个数据包或者被分片数据包的次序
标志(FLags):用来识别一个数据包是否是一组分片数据包的一部分
片偏移(Fragment Offset):一个数据包是一个分片,这个域中的值就会被用来将数据包以正确的顺序重新组装
生存时间(Time to Live):用来定义数据包的生存周期,以经过路由器的跳数/秒数进行描述
死循环会引发各种问题,导致程序或者os的崩溃。当收到ttl为1,则不会进行转发。
协议(Protocol):用来识别在数据包序列中上层协议数据包的类型
首部校验和(Header Checksum):一个错误检测机制,用来确认IP头的内容没有被损坏或者篡改
源地址(Source IP Address):发出数据包的主机的IP地址
目的地址(Destination IP Address):数据包目的地的IP地址
选项(Options):保留作额外的IP选项。包含这源站选路和时间戳的一些选项
数据(Data):使用IP传递的实际数据
可以看出IPv4协议的头部占20字节,Total length为60,故数据部分的长度为40字节
三:IP分片
数据包分片将一个数据流分为更小的片段,它是IP用于解决跨越不同类型网络时可靠传输的一个特性。
一个数据包的分片主要基于第2层数据链路协议所使用的最大传输单元(MTU)的大小,以及使用这些第2层协议的设备配置情况。在多数情况下,第2层所使用的数据链路协议是以太网。
以太网默认的MTU是1500,也就是说以太网上所能传输的最大报文大小是1500字节(并不包括14字节的以太网头本身)
当一个设备准备传输一个IP数据包时,它将会比较这个数据包的大小,以及MTU,用来决定是否需要将这个数据包分片。如果数据包大小大于MTU,那么这个数据包就会被分片,分片步骤如下
- 设备将数据分为若干个将要接下来进行传输的数据包
- 每个IP头的总长度字段会被设置成每个分片的片段长度
- 除了最后一个分片数据包外,之前所有分片数据包的标志位都被标识为1
- IP头中分片部分的分片偏移将会被设置
- 数据包被发送出去
看上图地址10.10.0.3向一个地址为192.168.0.128的设备发送ping请求,由于请求包太大,被分为3部分传输
第一个数据包
根据More fagements 和Fragement offset可以判定这个数据包是分片数据包中的一部分
第二个数据包
第二个 数据包的IP头,同样被设定了标志位,但是这里的分片偏移值是185(以8个字节为单位:140),意味着1500字节的MTU,减去了IP头部的20字节
第三个数据包
这个数据包并没有设定为更多的分片标志位,意外着是最后一个分片,其片偏移值设置为370(实际为2960)
虽然网络上被分片的数据包不怎么常见,但是明白数据包为什么会分片是有用的,当遇到时,可以诊断问题所在或认出丢失的分片
关于IP数据包分片的计算问题,可以看https://blog.csdn.net/qq_39112646/article/details/86763757