网络协议系列六 - 网络层
Posted 1024星球
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络协议系列六 - 网络层相关的知识,希望对你有一定的参考价值。
网络层在OSI中的比重很大,几乎所有的网络请求库都会涉及到。
一、网络层(Network)
网络层数据包(IP数据包:Packet)由首部、数据2部分组成。
数据:很多时候是由传输层传递下来的数据段(Segment)。
1.1. 版本(Version)
占4位(0b0100
:IPv4,0b0110
:IPv6)。
1.2. 首部长度(Header Length)
占4位,标识该IP头部有多少个32bit字(4字节),因为4位最大能表示15,所以IP头部最长是60字节。
最小值:0b0101(5 * 4 = 20)
最大值:0b1111(15 * 4 = 60)
首部固定部分是20个字节,虽然还有可变部分,但很多时候就是20个字节。由于最大值是60个字节,所以可变部分是40个字节。
1.3. 区分服务(Differentiated Services Field)
占8位,可以用于提高网络的服务质量(QoS:Quality of Service)
包括3位优先级字段、1位保留字段和4位TOS字段。4位TOS分别表示:最小时延、最大吞吐量、最高可靠性和最小费用。其中最多有一个能置为1。
比如客户端发送数据给服务端,数据在经过路由器的时候,路由器识别区分服务(例如,区分服务的优先级值为3)的优先级后可以让这部分数据优先通过。
1.4. 总长度(Total Length)
占16位。指整个IP数据报的长度,以字节为单位。首部 + 数据的长度之和,最大值是65535(2^16-1)字节
。
但是由于MTU限制(帧的数据不能超过1500字节),长度超过MTU的数据报将会分片传输,所以实际传输的IP数据报长度远远没有达到最大值。因此过大的IP数据包,需要分成片(fragment),每一片都有自己的网络层首部(IP首部)。
标识、标志、片偏移描述了如何分片。
1.5. 标识(Identification)
占16位,数据包的ID。其初始值是系统随机生成,每发送一个数据包,其值加1。该值在分片时被复制到每一个分片中,因此同一个数据包的所有分片的标识都是一样的。
1.6. 标志(Flags)
占3位。
- 第1位(Reserved Bit):保留
- 第2位(Don’t Fragment):表示“是否禁止分片”,1代表禁止分片,0代表允许分片
- 第3位(More Fragments):表示“是否还有更多片”,1代表不是最后一片,0代表是最后一片。如果要分片,除了最后一个分片外,其他的分片都要置1。
1.7. 片偏移(Fragment Offset)
占13位。是分片相对原始IP数据报开始处的偏移(仅指数据部分)。实际偏移值是该值左移3位得到的。所以除最后一个分片,其他分片的数据部分长度必须是8的整数倍(片偏移乘以8:字节偏移)。
为什么要左移3位?
除最后一个片段外,每个片段都必须包含8字节数据的倍数。由于片段偏移是按13位编码的,因此其范围在0到8191个8字节单位之间。 但是,由于“总长度”也考虑了IP标头,因此“片段偏移”最大限制实际上是8189个单位,而不是8191个单位。总长度被编码为16位,这意味着它被限制为65535个字节。 然后,由于IP标头至少为20个字节,因此导致有效载荷被限制为最大65535个字节-20个字节= 65515个字节。 将这65515个字节以8个字节为单位进行划分,结果将可能最多有8189个单位,因此分片偏移限制为最大为8189个单位。
1.8. 生存时间(Time to Live)
占8位。设置了数据可以经过的最多的路由器数(操作系统不同TTL值也不同),每个路由器在转发之前会将TTL减1,如果该值减为0依旧没有到达目的主机,就丢弃该数据包,由这个路由器发送ICMP差错报文(目标不可达)。主要作用就是防止路由死循环(A路由跳B路由,B路由跳A路由,数据一直在往返,如果没有TTL就会产生死循环)。
观察使用ping命令后的TTL,能够推测出对方的操作系统,中间经过了多少个路由器。
1.9. 协议(Protocol)
用于区分上层协议,表明所封装的数据使用了什么协议。
1.10. 首部检验和(Header Checksum)
由发送端填充,检查首部是否有错误。接收端对其使用CRC算法检验IP数据报首部在传输过程中是否损坏(只检查首部,不管数据部分)
1.11. 源IP地址和目标IP地址(Source Address、Destination Address)
各占4个字节。用来指定发送端和接收端的。
1.12. ping的几个相关用法
ping -h
:查看ping的用法(Windows:ping /?
)ping IP地址 -l 数据包大小
:发送指定大小的数据包ping IP地址 -f
:不允许网络层分片ping IP地址 -i TTL
:设置TTL的值- 通过
tracert
、pathping
命令,可以跟踪数据包经过了哪些路由器
Mac系统首次使用
ping
设置网络层,可能会提示权限不足,需要授权sudo
。
以上是关于网络协议系列六 - 网络层的主要内容,如果未能解决你的问题,请参考以下文章
Linux从青铜到王者第二十一篇:Linux网络基础第三篇之数据链路层