计网网络层首部
Posted 飞人01_01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计网网络层首部相关的知识,希望对你有一定的参考价值。
hello。 今天来看看新的一章节:网络层。本章节的主要任务就是认识下面这张图(IP数据包)的首部字段。当然网络层在面试中还可能会被问到 IP分片、ping的工作原理,当然在投递开发岗,基本上都是问应用层和传输层的知识,问到网络层的概率相对低一点。
网络层
网络层的数据包(IP数据包,Packet)是由首部+数据两个部分组成。而这个数据部分,一般情况下都是由传输层传递下来的数据段,但也不排除一些特殊情况,比如有些协议就是从网络层往下传输的,并不会传递到传输层和应用层。
-
版本(version)
占4位,只有两个值。一个是 0b0100 即
IPv4
,另一个是 0b0110 即IPv6
。 -
首部字段(Header Length)
占4位,这个
数值×4 = 首部字段长度
,因为首部字段的最小长度是固定的20字节,最大长度是60字节。所以这个可变部分的最大值就是40个字节。但是一般情况首部字段就是20字节。 -
区分服务(differentiated Service Field)
占8位。这个是用于提高网络的服务质量(QoS,Quality of Service)。这里包括3位的优先级字段、1位的保留字段和4位的TOS字段。4位TOS分别表示:最小时延、最大吞吐量、最高可靠性和最小费用。其中最多有一个能置为1。
比如客户端发送数据给服务端,数据在经过路由器的时候,路由器识别区分服务(例如,区分服务的优先级值为3)的优先级后可以让这部分数据优先通过。 -
总长度(Total Length)
占16位。指的是整个IP数据包的长度,是以字节为单位的。即首部+数据部分的总长度不超过 65535字节。
在上一篇文章,也简单提及过分片的原因,就是IP数据包的长度最大是65535字节,而一个数据帧的数据部分一般情况是1500字节。所以在网络层往数据链路层传递数据时,需要进行“切分数据”,也就是常说的IP分片。
接下里介绍的标识、标识、片偏移就是在描述如何分片。
-
标识(Identification)
占16位。其范围在0-65535之间。初始值是系统随机生成的,每发送一个数据包,其值就会+1。当达到65565后,再次+1就会回归到0。这个数值在分片时,会被复制到每个分片中,因此同一数据包的标志值都是一样的,就能表明这些分片来自同一个数据包。
-
标志(Flags)
占3位。
第1位(Reserved Bit) 保留不用。
第2位是 Don’t Fragment 即
是否不能分片
,值=1时,表示这个IP数据包不能分片,值=0时,表示这个IP数据包可以分片。 第3位是 More Fragment 即
后面是否还有分片
。简单点说就是用来标志当前分片是不是最后一片了。值=1,表示后面还有其他分片,值=0,表示后面没有其他分片了。 -
片偏移(Fragment Offset)
占13位。是分片相对于原始IP数据报开始处的偏移量。(指的是数据部分)
而实际的字节偏移量是 片偏移 * 8
。所以除了最后一个分片以外,其他分片的数据部分的长度必须是8的倍数。
举个例子,假设当前分片不是最后一片,且片偏移=100,则表示这个分片是从原始IP数据报的数据部分的 100 * 8 = 800字节处开始的。
-
生存时间(Time To Live, TTL)
占8位。用于限制IP数据报所经过的路由器数。不同的操作系统,TTL值也是不同的。每个路由器在转发数据之前,会先将TTL值-1,如果TTL值=0后,还没有到达目标主机,则路由器将不会进行转发,会直接返回ICMP差错报文(目标不可达)。
这个TTL存在的意义在于 防止路由器进行死循环转发数据,即A、B两路由器一直互相传递,占用带宽。
-
协议(Protocol)
占8位。用于区分上层协议,表明所封装的数据使用了什么协议。常见的如下:
-
首部校验和(Header Checksum)
占16位。是由发送端进行填充,用于检查首部是否有错误。接收端用CRC算法检验IP数据报首部在传输过程中是否出现了差错,且这个只会检查首部,不会管数据部分的。
-
源IP地址、目标IP地址
这个大家应该都比较熟悉,一个IP地址占32位。用来指定发送端和接收端的IP。
当然,感兴趣的同学还可以了解ping命令,以及ping命令的工作原理,这里就简单说一下ping如何使用。
ping -h
,可查看ping的使用方法。
ping 127.0.0.1
,ping的是环回地址,用于检查本机的网卡是否可用。
ping ip地址 -l 数据包大小
,指定数据包的长度。
还可以用一下命令得到传输数据途径的路由器IP地址:
我们会在linux主机系统下,直接执行命令行: traceroute hostname
。
而在Windows系统下是执行tracert的命令: tracert hostname
。
好啦,本期更新就到此结束啦!!!
以上是关于计网网络层首部的主要内容,如果未能解决你的问题,请参考以下文章