在tcp层将数据打包封装向下传递后,网络层将其整个看为一个数据,然后对其数据加网络报头操作,在网络层最具有代表的协议就是ip协议。在这里我们探究ipv4的报头。
ip报头
4位版本:指定ip的版本号,对于ipv4来说就是4。
4位首部长度:和tcp报头一样,15个单位,每个单位代表4个字节。
8位服务类型:3位弃用,1位待用,还有4位分别标识:: 最小延时, 最大吞吐量, 最高可靠性, 最小成本,仅能存在一位被设置,假设是打游戏那就要设置最小延迟,如果是文件传输就要最大吞吐量,如果是银行转账就是最高可靠性。这是给路由器看的位。
16位报文长度:顾名思义,就是报文的大小
16位标识、3位标识位、13位偏移我们等等再唠。
8位生存时间:就是个计数器,防止报文长时间占用网络。
16位首部检验和:防止数据丢失篡改等等。
32位源ip地址:就是发送方的ip。
32位目的ip地址:该报文要去的目的机器ip。
报文切片组装
由于在网络中流动的报文是有大小限制的,一般而言,在ethernet默认MTU值为1500字节,我们就以1500字节讨论这个切片问题。
当传输层tcp协议向下传递了一个2980字节的数据帧。
在网络层中如果报文过大,必须将其做分片操作。
介绍报头第二行设置
16位标识:每一个在网络层组装的报文都是不同的16位标识,类似于tcp层的32位序列号,这个序列号是区分不同报文的序列号,如果从网络得到相同的16位标识的报文,那么报文就是被切片了。
3位标识:1位待用,1位禁止切片的标识,如果某个报文该位被设置,但是又过大,那么就直接将其报文丢弃。1位更多分片标志位,如果有报文该位被设置1,那么其报文之后一定还有报文在路上,如果被标识为0,原可能未被分片,或者是分片的最后一片。
13位分片位置:就是该分片在原报文中的起始位置。
5个问题:
- 分片好吗?
- 如何识别ip报文的不同
- 如何识别分片
- 如何分片。
- 如何对获得的分片组合
- 异常处理
1、分片并不是主流,分片增加了网络负担,并且升高了丢包率。
2、依托ip报头中的16位标识,区分报文,原报文不同的情况下,报文取得16位标识是一定不同的
3、如果发现接收多个ip报文16标识相同说明报文被分片,当然不同标识也不是未被分片。如果发现3位标识的“更多分片”被设置为1,那么就说明被分片了(最后一个分片设置为0)。如果偏移设置不为0,说明被分片了(第一个分片的分片偏移为1)。
4、分片过程:
分片后必须为其他报文增加新的ip报头。每次切分后需要设置新旧报头的3个标识:报文总大小,更多分片,13为分片偏移。
5、分片组合
6、异常处理,如果接收到多个分片报文,会留存分片报文到最大网络传输时间,如果在时间后仍然分片报文为齐全,则将该全部16为标识相同的分片报文全部丢弃。