开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
IP协议
上一节介绍了网络分层以及物理层和数据链路层,这一节将继续围绕网络分层,了解数据链路层的上一层网络层,详细介绍一下网络层最主要的IP协议,分析IP协议的首部格式。
IP协议首部
如下图,IP协议首部由以下几个部分组成
需要注意的是每一个部分基本都是4的倍数大小,比较特殊的是标志以及片偏移的大小,它们分别是3字节和13字节。接下来将分别讲一下首部中每一个部分的作用。
首部第一行
版本
4位,如果是0100则是IPv4,如果是0110则是IPv6
首部长度
4位,首部长度需要乘以4才是最终的长度。
比如0101是5,那么首部长度则是20,这是首部的最小值,因为固定字段的长度就是20个字节。
显而易见的1111为最大值,也就是60个字节,那么我们就可以得出可选字段最长为40字节。
区分服务
8位,用于提高网络的服务质量(QoS)
总长度
16位,首部加数据的长度,最大值为65535个字节。
前面讲到数据链路层是说过,一个帧的最长长度MTU为1500个字节,因此对于较长的IP数据包要进行分片(fragments)。那么要怎么判断这是同一个IP包下的数据呢?
下一行的字段就是帮助我们去进行分片的,并且每一片都有自己的IP首部。
首部第二行(分片相关)
标识
16位,数据包的ID,当数据包要进行分片时,同一个数据包的标识都是一样的。会有一个计数器去管理数据包的ID,每当发一个数据包,ID就加一。
标志
3位,每一个字节都代表一个状态。
第一位(Reserved Bit):保留
第二位(Don't Fragment):1表示不允许分片,0表示允许分片
第三位(More Fragment):1代表不是最后一片,0代表是最后一片。如果没有这个标志,只是有后面的偏移量的话,就不知道这个数据到底结束了没有。
片偏移
13位,片偏移乘以8就是就是字节偏移,也就是说每一片的长度都是8的整数倍。
首部第三行
生存时间(TTL)
8位,每个路由器在转发后TTL减一,一旦发现TTL减为0,则立即返回错误报告。在ping后可以看返回的TTL是多少就能判断经过了多少路由器。一般的Linux服务器TTL为64。
协议
8位,表述封装的数据是使用了什么协议,常见的几种协议
| 协议 | ICMP | IP | TCP | UDP | IPv6 |
|---|---|---|---|---|---|
| 值 | 1 | 4 | 6 | 17 | 41 |
首部校验和
16位,用于检查首部是否正确。
剩下的源IP和目标地址IP就是我们需要去传输的主机标识。
总结
本节将IP地址的首部每一个字段都进行了分析,下一节将进入传输层的学习,也就是我们耳熟能详的TCP协议和UDP协议。运输层是非常重要的一层,会分成几节去进行介绍。
感谢观看!