目录
- 1.网络层
- (1)IP协议头格式
- (2)工作流程
- 2.网段划分
- (1)五类地址
- (2)回环地址
- (3)网段的特殊地址
- (4)网络建设
我们前面暂时跳过了网络层,带着网络层的功能去学习链路层。现在可以说我们只差最后一块拼图了,通过网络层,了解IP报头的具体组成,我们就可以串联整个协议栈了。当然,有了ARP、MTU、NAPT的链路层铺垫,网络层会理解地非常轻松。
1.网络层
(1)IP协议头格式
网络层接收传输层的数据段,在这里进一步封装为数据报,报头结构如下图:
4 位版本号: 指定 IP 协议的版本,对于 IPv4 来说,这个字段的值就是 4。有的 IPv4 集成到了系统里,这些生态问题很难改变。
4 位头部长度: 4bit 表示的最大的数字是 15,真实的头部长度要 * 4,所以 IP 头部最大长度是 60 字节。固定长度是 20 字节,选项最多有 40 字节。
8 位服务类型: 其中有 4 位 TOS 字段,分别表示:最小延时、最大吞吐量、最高可靠性、最小成本,这四者相互冲突,只能选择一个(对于 ssh/telnet 这样的应用程序,最小延时比较重要;对于 ftp 这样的程序,最大吞吐量比较重要)。 除此之外,还有 1 位保留字段必须置为 0,以及 3 位已经弃用的优先权字段。
16 位总长度: IP 数据报总长度,包含IP报头 + 数据部分,IP报头的长度前面的 4 位头部长度也单独统计过。
16 位标识: 要理解这个,我们要结合MTU来看,链路层约束IP数据报(包含报头 + 数据)不能超过1500字节,如果超过了就要分片、重组。 所以在网络层,忽略报头的选项部分,发现传输层传下来的数据段超过1480字节的话,就要将数据分成多片,交到目标主机处再进行重组(路由器不会重组)。其中 16 位标识就是给每个分片一个相同的 ID,相同标识的说明它们原本是在一起的,网络层也会根据 16 位标识判断哪些分片属于同一组的。
3 位标志字段: 第 1 位现在不使用; 第 2 位为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文;第三位表示“更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记。000表示无分片或者最后一块分片,001表示首块分片和中间分片。要结合片偏移最终确定。
13 位分片偏移: 是分片相对于原始 IP 报文数据部分开始处的偏移量,分片后每个片作为一个数据报独立传输,偏移量告诉了之后应当按照什么顺序组装,重组后的报文应当是完全连续的。 如果 13 位分片偏移的值是 1,说明其偏移的字节数是 1 * 8,这个偏移值要 * 8才能得到真实偏移值。 因此,每个分片(除了最后一个分片)的数据量应当是 8 的整数倍,否则无法连续地拼接起来。 总结一下,标识字段000,偏移量0表示无分片;001 + 0 表示第一块分片,001 + !0 表示中间的分片,000 + !0 表示最后一块分片,010表示禁止分片。
8 位生存时间(TTL): 数据报到达目的地的最大跳数,一般是64。每次经过一个路由转发,TTL -= 1,如果一直减到 0 还没到达,那么就丢弃,由上层控制重传。这个字段要是用来防止出现路由循环和网络拥堵。
8 位协议: 值表示上层协议的类型,6 对应TCP协议;17 对应UDP协议,1 对应ICMP协议(ping命令使用的协议),也就是说协议号为 1 的话报文就会交给ICMP协议去处理,而不是常认为的TCP和UDP。这和链路层mac帧格式的“类型”有相似之处,IP也是有自己的类型的,不同类型的IP报文其数据部分也不一样。
16 位头部校验和: 进行校验,其功能和链路层的CRC校验一致,主要用于鉴别头部是否损坏,损坏的话该报文直接丢弃。链路层和网络层都有自己的校验手段,链路层校验失败后直接丢弃且不做任何反馈,相应的,IP分片重组肯定收集不齐,也会重组失败,反映到传输层就是传输失败,由相应重传机制控制重传。如果IP层检验和失败,同样会直接丢弃且不做反馈,同样重组分片会因为不齐而失败,由传输层/应用层控制重传。 两者都不维护可靠性传输,如果校验失败都会直接丢弃而不反馈,造成后续的错误最终都汇集到传输层/应用层,由它们进行控制。 这也体现出分层的特点。
32 位源地址和 32 位目标地址: 表示发送端和接收端。其中路由器进行NAPT的时候会来修改这两个字段(正向查表和反向查表)
(2)工作流程
网络层负责接收传输层传下来的数据段。根据数据段的大小,进行分片处理。分片处理后的每一片都是一个独立的数据报,有着完整的IP报头,但是由于将数据部分分片,每个数据报里面的数据部分实际上是支离破碎的(按顺序拆成一块块的,每一块都不是完整的数据段),只有第一个分片有传输层的头部。 所以说需要标志、片偏移共同维护分片标识,因为一旦重组失败了,对于传输层而言数据就是错乱的,数据分片重组在传输层是不应该感知到的。
当IP层包装好后交给链路层,分片由IP层做好后,一定满足MTU的要求,所以链路层拿着数据报,根据数据报里面的目的IP判断是否是在当前局域网。如果是的话就ARP请求对应mac地址,如果不是的话就ARP请求网关地址的mac地址。 之后mac帧被封装传输给交换机,由交换机查表、扩散转发给对应主机。
如果转发给了路由器,路由器会进行解包操作,在链路层进行校验和,如果失败就丢弃。没有失败的话继续解包到网络层,进行头部校验和,如果失败就丢弃。 路由器根据目的IP查看自己的路由表,根据最长前缀选择好下一跳。与此同时路由器会NAPT,修改所有分片的源地址和第一块分片的端口号,并将TTL -= 1,之后封装好新的目的mac后发出去。
直到目的主机上进行解包,校验和,根据标志、标识、片偏移进行重组,重组成功后就将完整的数据段交给传输层,失败的话就不做任何处理。 TCP会触发超时重传或者快重传,UDP的话就需要应用层自己维护重传机制了。
2.网段划分
这里主要是补充一些上篇文章没有提及的IP地址相关的知识,不影响整体理解。
(1)五类地址
下面是总结各类地址的表格
地址类别 | 首段地址范围(十进制) | 网络位/主机位(IPv4共32位) | 默认子网掩码 | 主要用途 |
---|---|---|---|---|
A类 | 1~126(127.0.0.0为回环地址) | 前8位为网络位,后24位为主机位 | 255.0.0.0 | 大型网络(如早期主干网、大型企业) |
B类 | 128.0~191.255 | 前16位为网络位,后16位为主机位 | 255.255.0.0 | 中型网络(如中型企业、高校) |
C类 | 192.0.0~223.255.255 | 前24位为网络位,后8位为主机位 | 255.255.255.0 | 小型网络(如家庭、小型办公室) |
D类 | 224.0.0.0~239.255.255.255 | 不划分网络位与主机位 | 无默认子网掩码 | 组播(如视频会议、数据群发) |
E类 | 240.0.0.0~255.255.255.254(255.255.255.255为广播地址) | 不划分网络位与主机位 | 无默认子网掩码 | 保留地址(用于科研、实验等特殊场景,未公开商用) |
我们就考虑A、B、C类地址,最开始是严格划分的,但后面引入CIDR技术后,基本都是按需分配,如按照子网掩码,/23这种表示方式来划分网络号和主机号,这样极大地提高了地址的利用率。 但这并不意味五类地址被淘汰了,而是引入CIDR进行更精细的划分,比如我用拿到了一个/7的地址块,我可以说我拿到了2块A类地址(主机数为A类地址的两倍)。
(2)回环地址
127开头的地址属于IPv4的回环地址。
也就是说整个127.0.0.0/8网段(即127.0.0.1~127.255.255.254)均为此用途,核心作用是本地设备自我测试(如程序调试、网络协议验证),数据不会发送到外部网络,仅在设备内部循环。最常用的是127.0.0.1,常用来指代本地主机。
(3)网段的特殊地址
一个子网的理论主机总数 = 2 ^ 主机号位数,但实际上是2 ^ 主机号位数 - 2,有两个特殊地址不能使用。
主机号全0用于标识整个网段,主机号全1表示在该网段上广播。主机号网络号全1表示全局广播,全0一般都是临时占位(可表示本网络上的本主机),这些地址都不会分配到一个具体的主机上。
(4)网络建设
我们想要构建子网时,家里直接买个路由器即可,路由器具备构建子网的能力。但局域网的构建运营商也在做,有可能我们路由器出去还是子网,例如家庭路由器的WAN口IP实际上还是运营商子网下的私网IP。
申请公网IP,网络建设工作,都是交给运营商来做的。所以为什么上网交钱是给运营商交钱?我们报文出了路由器后还是在运营商的子网下,我们真正想要得到公网IP需要运营商路由器NAPT之后才会得到,我们需要运营商的路由器为我们提供服务。