网络层
数据包的结构图
网络层中最小的数据单元为“数据包”。一个数据包由首部固定部分+首部可变部分+数据部分组成。 下面对数据包每个部分进行详细说明
-
版本:占4位,标明当前网络层使用什么协议来传输数据包。 0b0100:IPv4 0b0110:IPv6 补充:0b表示后面的数是2进制,即IPv4是0b0100,即等于十进制的4 -
首部长度:占4位,最终长度=首部长度4 因为数据包固定部分为20字节,所以数据包最小长度为20.即20/4=5=0b0101.所以首部长度最小为0b0101。 因为首部长度占4位,所以最大为0b1111=15,154=60,所以首部长度最大为60,即可变部分最大为60-20=40。 -
区分服务:占8位,有于提高网络的服务质量。 比如百度云开了会员之后,百度云网盘服务器端可以对响应的数据包给区分服务设置成某一个值,然后百度云的路由器就会优先传输这些数据包,以实现会员加速的功能。 -
总长度:占16位 数据包的总长度,即首部固定部分+首部可变部分+数据部分的总长度,最大值65535,所以一个数据包最大为65535字节。
中场说明:数据包最大为65535字节,往下传会达到传输层,传输层的帧最大不超过1500字节,所以在往下传之前,网络层有可能要对数据包进行分片(fragments)在传给传输层,每一片数据都有自己的网络层首部!而分片这个操作引入了 标识、标志、片偏移 这三个字段来进行表示。
-
标识:占16位 数据包的ID,当数据包过大进行分片时,同一个数据包的每一片的标识都是一样的,相当于数据包的ID。 补充:有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1。ID到最大值在加1就可能重置为1,具体规则要看计数器的实现。 -
标志:占3位 第1位:保留位,目前没用 第2位:1表示当前分片没有分片(即是一个完整的数据包),0表示当前数据包被分片了 第3位:1表示当前分片不是最后一片,0表示当前分片是最后一片。
所以当第2位为1时,第3位一定为0,即标志为010。标志为010时表示数据包没有分片。
-
片偏移:标识当前片相对于整个数据包的偏移量,类似于sql的limit offset, size的offset -
生存时间:占8位,TTL(time to live) 每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告。每个操作系统默认的TTL都是不一样的,如下图所示 所以可以通过技术手段,有可能可以通过TTL嗅探出对方用的是什么操作系统。
补充:
- 协议:占8位,表明当前数据包用的是什么网络层协议
- 首部校验和:用于检查首部的数据是否有错误,类似于指纹,也类似于传输层的FCS。
- 源IP地址:发送方的IP地址
- 目标IP地址:接收方的IP地址
|