一. 概述
在数据链路层中,通过MAC地址进行通信,每种数据链路的最大传输单元(MTU)都不尽相同. 而在网络层通过IP地址来进行通信. 鉴于IP层属于数据链路层的上一层,它必须不受限与不同数据链路的MTU大小. 可以说,IP抽象化了底层的数据链路.
二. IP报文的分片与重组
IP报文为什么要进行分片,如何分片? 下面举例来说明.
如在以太网中,默认的MTU是1500字节, 如果是要传输4342字节的IP数据报就无法在一个帧当中发送完成. 这时,路由器将此IP数据报划分成3个分片进行发送. 而这种分片处理只要路由器认为有必要,会周而复始的进行(分片以8个字节的倍数为单位进行).
经过分片之后的IP数据报在被重组的时候,只能由目标主机进行. 路由器虽然做分片但不会进行重组.
三. IPv4首部
通过IP进行通信时,需要在数据的前面加入IP首部心形. IP首部中包含着用于IP协议进行发包控制时所要的必要信息.
包含以下信息:
- 版本 由4比特组成,表示标识IP首部的版本号. IPv4的版本号即为4.
- 首部长度 由4比特构成,表明IP首部的大小,单位为4字节(32比特).对于没有可选项的IP包,首部长度则设置为“5”. 也就是说,当没有可选项时,IP首部的长度为20字节(4*5=20).
- 区分服务(type of service). 由8比特构成,用来表明服务质量.
- 总长度 表示IP首部与数据部分合起来的总字节数. 该字段长16比特. 因此IP包的最大长度为65535(2的16次方)字节.
- 标识(ID) 由16比特构成,用于分片重组.同一个分片的标识值相同,不同分片的标识值不同. 通常,每发送一个IP包,它的值也逐渐递增. 此外,即使ID相同,如果目标地址,源地址或者协议不同的话,也会被认为是不同的分片 标志(flags) 由3比特构成. 标识包被分片的相关信息.
- 比特0表示未使用.
- 比特1指示是否进行分片,0-可以分片,1-不可以分片.
- 比特2表示包被分片的情况下,表示是否为最后一个包,0-最后一个分片的包,1-分片中段的包.
- 片偏移 (FO:fragment offset) 由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置.
- 生存时间 (TTL: time to live) 由8比特构成, 它最初的意思是以秒为单位记录当前包在网络上应该生存的期限. 然而,在实际中它是指可以中转多少个路由器的意思. 每经过一个路由器,TTL会减少1,直到变成0则丢弃该包(TTL占8位,因此可以表示0~255的数字.因此一个包的中转路由的次数不会超过2的8次方256个,由此可以避免IP包在网络内无限传递的问题).
- 协议 由8比特构成,表示IP首部的下一个首部隶属于哪个协议. 如属于TCP,UDP,还是ICMP等可以在这个字段来指定.
- 首部校验和 16比特(2字节)构成. 该字段只校验数据报的首部,不校验数据部分. 它主要用来确保IP数据报文不被破坏.
- 源地址 32比特(4字节)构成,表示发送端IP地址.
- 目标地址 32比特(4字节)构成,表示接收端IP地址.
- 可选项 长度可变,通常指在进行实验或诊断时使用. 包括以下信息: 安全级别,源路径,路径记录,时间戳.
- 填充(padding) 也称作填充物. 在有可选项的情况下,首部长度可能不是32比特的整数倍. 为此,通过向字段填充0,调整为32比特的整数倍.
- 数据 存入数据. 将IP上层协议的首部也作为数据处理.