IPv4报文格式
IPv4报文首部长度至少为20字节(没有可选字段和填充的情况下),下面来逐一介绍首部各个字段的含义
- Version版本:表示采用哪一种具体的IP协议,对于IPv4来说该字段就填充4以表示,如果是IPv6就填充6
- IHL首部长度:如果IP首部中出现了可选字段和填充,那么首部的长度是不固定的,需要根据该字段中的数值来表示首部的真实长度
- TOS区分服务:表明服务质量,通过填充不同的数来改变最低延迟、最大吞吐、最大安全等权值,不过该字段在IPv4中一般都不被使用,原因在于TOS控制增加了太多复杂度难以维护
- Total Length总长度:表明IP报文的总长度,如果想要得到正文部分的长度,只要将总长度(Total Length)减去首部长度(IHL)即可得到
- Identification标识:用于分片重组,属于同一IP包的分片标识字段是相同的值,报文接受主机可以凭借该字段对分片进行重组
- Flags标志:有3比特组成,第1位不使用恒定为0;第2位标识此IP报文是否允许被分片(0允许1拒绝),该位在确定路径MTU时有用;第3位标志IP在第2位为1时才有用,表示是否为最后一个分片(0是1非)
- Fragment Offset片偏移:接受主机收到属于同一IP包的分片时,需要对其进行按序重组后才能向上交付,片偏移字段中记录了当前正文数据在完整数据正文中的偏移量
- TTL生存时间:IP报文在网络中是有传输时间限制的,如果在范围之内没有到达目标,这个报文就被路由器丢弃不在转发(每经过一个路由器TTL减1,至0丢弃)
- Protocol协议:指示上层采用的协议种类,是UDP填17,TCP填6
- Header CheckSum首部校验和:用于检查报文有没有发生错误,如有则丢弃
- SA源地址 DA目标地址:发送报文的主机IP和接受报文的主机IP
- Option可选字段:可以设置安全级别、源路径、路径记录、时间戳等信息(一般不用)
- Padding填充:如果IP报文具有可选字段,需要将首部长度调整为32的倍数
IPv6(仅作了解)
IPv6必要性
IP v6用以解决IP v4绝对数量不足的问题,一个IPv6的地址为16字节,其能够表示的范围远远大于IPv4。遗憾的是IPv6和IPv4不兼容,从IPv4过渡到IPv6是一项艰巨的任务
IPv6地址结构
IPv6地址以16比特为一组的点分十六进制表示,如FEDC:BA98:7654:3210:FEDC:BA98:7854:3211,与IPv4类似的也分为网络标识和主机标识
IPv6特点
- IP地址扩大与路由控制表的聚合
- 性能提升:首部采用固定40字节,无需首部校验码,不需要做分片处理
- 即插即用:没有DHCP服务器也能自动分配IP地址
- 安全性更高
- 多播、Mobile IP成为扩展功能
IPv6报文格式
- Version:填充6
- 通信量类:等价于IP v4的TOS
- 流标号:用于服务质量控制
- 有效载荷长度:正文长度(不包括首部,因为首部固定40B)
- 下一个首部:指示上层协议类型
- 跳数限制:等价于TTL
- 源地址目标地址:发送报文的主机IP和接受报文的主机IP
IP分片与重组
由于不同数据链路所支持的最大传输单元MTU不一致,当IP报文长度超过MTU时,需要将一个报文拆分为小于MTU的报文分批次传输,当这些分片到目标主机时被重组(注:分片由路由器完成,但重组必须由目标主机来完成)
分片的弊端很明显:就是增加了路由器负担和数据包丢包的概率,如果由一个分片丢失,那么整个IP报文全部作废,即使已经收到了其他分片,此时就需要发送端重传(需要可靠传输时),无疑提高了时间成本,因此需要通过一定的算法尽可能的减少分片
路径MTU
路径MTU是指从发送主机到目标主机之间不需要分片时的最大MTU大小(路径中存在的所有数据链路中最小的MTU),如果每一次发送的报文长度小于路径MTU,节点路由器就不需要分片操作,分片操作只会由发送主机进行(减少路由器压力)
**如何确定路径MTU:**通过试探性发送完整数据包给下一跳节点,下一跳节点会返回其所管理的网段的MTU,迭代操作直至发送主机不在收到MTU告知时就可以确定路径MTU
如果上层采用的是可靠传输TCP,那么通过MTU可以计算出MSS(最大段长度)的值,使得传输层每一次交给网络层的报文长度一定是小于MTU的,这样连发送主机都不用进行分片操作了。