【网络协议】网络协议系列六 - 网络层

网络层在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的值
  • 通过tracertpathping命令,可以跟踪数据包经过了哪些路由器

Mac系统首次使用ping设置网络层,可能会提示权限不足,需要授权sudo