IPv4
IPv4报文结构
版本号 | 首部长度(单位:4字节) | 服务类型 | 数据包长度 | |||
标识 | 留空 | DF MF标识 | 片偏移(单位:8字节) | |||
TTL | 上层协议号 | 首部校验和 | ||||
源IP地址 | ||||||
目标IP地址 | ||||||
可选选项 | ||||||
数据 | ||||||
一行32比特,各位所占比特基本按图上比例划分,详细请看接下来的说明
报文结构说明:
- 版本号:4bit,指明报文的版本,IP4v就是4,事实上除了IPv4还有从1到10不等的版本
- 首部长度:4bit,指明报文首部的长度,因为IPv4首部是可变长度,所以需要这个结构,注意,首部长度的单位是4字节,也就是说首部只能是4字节的倍数,不够需要填充
- 服务类型:8bit,用于区别对待不同的IP,比如高实时或者高吞吐的需求
- 数据包长度:16bit,单位字节,计算包括首部在内报文长度
- 标识:16bit,用于特异标识一个报文,主要用途是与后面的DF、MF片偏移一起用于分片
- 留空:1bit,暂时没有使用
- 分片:网络上的链路容量MTU(最大传输单元)不是相同的,极有可能存在两端MTU大,但是中间MTU减小的情况(网络的吞吐量就是受限于整个链路中最小容量的一段链路),这是,为了让报文还可以正常传输,需要对大报文进行分片。
分片时,DF标识位(1bit,don’t frame 不允许分片的标识位,如果一个报文不允许分片传输,可以通过将其置1来设置)置0,MF标识位(1bit,more frame,说明本分片不是最后一片分片的标识位)置1,然后将报文拆成多个部分,每一个部分都新封装首部信息,其中首部的16bit标识相同,表明这些分片来自于同一个报文,各个分片的次序通过片偏移来表示,第一个分片的偏移是0,第二个偏移量是第一个分片数据部分(即不包含首部)字节数/8,如果第一个分片数据部分不能整除8的话,就减少到可以整除8为止。
为什么偏移量要/8?
因为偏移量很可能要表示与报文总长度一个量级的数字,然而报文总长占16bit,片偏移只有13bit,少3bit,即2^3=8倍
- TTL(存活时间):8bit,表示一个报文可以存活的跳数,防止网络中出现环路而产生的报文不停循环的问题,到达存活时间的跳数,报文会被丢弃
- 上层协议号:8bit,表示IP报文承载的上层,也就是传输层的协议号,其中6表示TCP,1表示UDP
- 首部校验和:用法同TCP和UDP的互联网校验和,但是只检验首部
- 源地址,目的地址:各32bit,就是IPv4的地址