📚 博主的专栏
上篇文章:传输层协议TCP
下篇文章:数据链路层
文章摘要:本文系统解析IP网络层的核心概念与技术,涵盖公网与私有IP的区别、IP协议的功能及报文结构,详解子网划分原理与CIDR技术如何优化地址分配。探讨路由机制中NAT技术如何实现内外网通信,以及IPv6对物联网与地址短缺问题的解决意义。同时分析IP分片与组装的实现逻辑、MTU限制及避免分片的策略,并结合实例说明路由表匹配与数据包转发流程。通过理解运营商网络架构与公网IP分配逻辑,揭示互联网高效运行的基础,为网络设计与故障排查提供全面参考。
目录
在IP网络层,最重要的是要理解:运营商+私有和公网IP
网络层
在复杂的网络环境中确定一个合适的路径.
IP协议
IP的意义:IP地址提供了一种“能力”(具有很大的概率,能做成一件事), 将数据,从B主机,跨网络,可靠的送至C主机的能力。
网络层提供能力(不保证可靠性,保证不了),传输层提供策略
在计算机网络当中:TCP/IP提供的就是策略加能力
基本概念
主机: 配有 IP 地址, 但是不进行路由控制的设备;
路由器: 即配有 IP 地址, 又能进行路由控制;
节点: 主机和路由器的统称;
在Linux当中通过ifconfig查看IP地址:inet(在云服务器上内网IP)、ether就是mac地址
pupu@VM-8-15-ubuntu:~$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.2.7.35 netmask 255.255.252.0 broadcast 10.2.11.255 inet6 fe80::5054:ff:fe35:6ffe prefixlen 64 scopeid 0x20<link> ether 52:54:00:35:6e:ee txqueuelen 1000 (Ethernet) RX packets 26444354 bytes 9407074884 (9.4 GB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 20536961 bytes 3980058301 (3.9 GB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
IP地址 = 网络号 + 主机号 ,路由的时候先根据网络号进行路由。
协议头格式
1.如何将报头和有效载荷分离?
对于网络层来说,报文的有效载荷部分就是传输层报头、应用层报头、以及数据。而报头也就是网络报头
通过观察网络层报头:与TCP报头相似
1. IP报文标准长度20字节(TCP的标准长度也是20字节)
2. 4位首部长度,取值范围【0-15】* 4字节--->[0, 60](同TCP)、又因为IP报文标准长度20字节,不谈选项的话---->x*4 = 20 ---> x = 5 ====> 填0101。
之后读取IP报文,首先读取20字节,再提取首部长度*4得到实际报文的长度,如果是20,那么剩下的就是数据,如果不是20,并且>20,那么就 - 20,得到选项长度。
2.如何分用
IP是通过8位协议来交付的(TCP、UDP是通过目的端口来交付的)
字段含义
字段名称 | 位数 | 描述 |
---|---|---|
版本 (Version) | 4 bit | 指定 IP 协议版本,IPv4 固定为 4、 IPv6(和IPv4不兼容)固定位6 。 |
头部长度 (Header Length) | 4 bit | 表示 IP 头部的长度,单位为 32bit(4字节)。最大值为 15 ,对应头部最大长度为 15 × 4 = 60 字节 。 |
服务类型 (Type Of Service) | 8 bit | - 3 位优先权字段(已弃用) - 4 位 TOS 字段:可选 最小延时 、最大吞吐量 、最高可靠性 、最小成本 (四者冲突,只能选其一)- 1 位保留字段:必须置 0 。 |
总长度 (Total Length) | 16 bit | 表示整个 IP 数据报的总字节数(包括头部和数据)。最大值为 65535 字节 。 |
生存时间 (Time To Live, TTL) | 8 bit | 报文最大可经过的路由跳数。初始值通常为 64 ,每经过一个路由减 1 ,归零时丢弃。 |
协议 (Protocol) | 8 bit | 标识上层协议类型(例如 ICMP=1 ,TCP=6 ,UDP=17 )。 |
头部校验和 (Header Checksum) | 16 bit | 使用 CRC 校验算法 验证头部完整性,接收端发现校验失败则丢弃报文。 |
源地址 (Source Address) | 32 bit | 发送端的 IPv4 地址(如 192.168.1.1 )。 |
目标地址 (Destination Address) | 32 bit | 接收端的 IPv4 地址(如 192.168.1.2 )。 |
选项字段 | (不定长, 最多 40 字节) | 略 |
虽然现在全球都使用的是IPv4。
但其实我们国家一直都在做IPv6,为未来做准备,并且做的最好的也是我们国家,也一直在推广,但是在现成的网络体系下,推广IPv6是很困难的。大部分公司在组建内网上,都使用的IPv6,而为什么国家要推广IPv6?在为物联网、自动驾驶做准备。IPv6做的好,支持比较好的地方,就能解决ip地址不足的问题,互联网公司上机房也是支持IPv6的,以及行政要求上做通信设备的厂商,路由器也必须支持IPv6。
五元组:
源IP、源端口、目的IP、目的端口、协议号----->标识一个网络通信
网段划分(重要)
在网段划分这里需要明白:
1. 两种网段划分的方式
IP是有用且有限的资源(石油等),经过合理划分,来给不同的区域,国家,地区,组织,学校等,因此为什么我们国家必须在IPv6大力建设。网络世界是被精心设计过的,从硬件到软件。
IP 地址分为两个部分, 网络号和主机号
• 网络号: 保证相互连接的两个网段具有不同的标识;
• 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号
• 不同的子网其实就是把网络号相同的主机放到一起.
• 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同.
那么问题来了, 手动管理子网内的 IP, 是一个相当麻烦的事情.
默认网关也就是路由器:查询自己电脑的默认网关可以通过:ipconfig查询
路由器背面:通过浏览器就可以访问路由器(路由器具有web功能)
• 有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便.
• 一般的路由器都带有 DHCP 功能. 因此路由器也可以看做一个 DHCP 服务器
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示(该图出 自[TCPIP])。
• A 类 0.0.0.0 到 127.255.255.255
• B 类 128.0.0.0 到 191.255.255.255
• C 类 192.0.0.0 到 223.255.255.255
• D 类 224.0.0.0 到 239.255.255.255
• E 类 240.0.0.0 到 247.255.255.255
随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址;
• 例如, 申请了一个 B 类地址, 理论上一个子网内能允许 6 万 5 千多个主机. A 类地址的子网内的主机数更多.
• 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的 IP 地址都被浪费掉了.
针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing):
• 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
• 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
• 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
• 网络号和主机号的划分与这个 IP 地址是 A 类、 B 类还是 C 类无关
任意一个IP一定隶属于某一个子网
可见,IP 地址与子网掩码做与运算可以得到网络号, 主机号从全 0 到全 1 就是子网的地址范围;
IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0
子网掩码和他的网络信息一般在路由器当中配置好。
为什么要进行网段划分
网段划分的主要目的是提高网络效率、增强安全性、简化管理。
通过将大型网络分割成多个子网(网段),可以有效控制广播流量、隔离不同区域的设备,并针对不同需求进行灵活管理。
举个简单例子🌰:
假设一家公司有 3个部门(行政部、技术部、财务部),所有设备最初都在同一个网段(如
192.168.1.0/24
)。这时可能会遇到以下问题:
广播风暴:所有设备都能收到彼此的广播消息(如ARP请求),导致网络拥堵。
安全风险:财务部的敏感数据可能被其他部门直接访问。
管理混乱:IP地址分配缺乏规律,难以排查问题。
划分网段后:
将网络划分为3个子网:
行政部:
192.168.1.0/24
技术部:
192.168.2.0/24
财务部:
192.168.3.0/24
带来的好处:
减少广播流量:每个部门的广播只在各自子网内传播,避免全网拥堵。
提升安全性:财务部子网可设置防火墙规则,限制其他部门的访问。
简化管理:IP地址按部门分配,故障排查更高效。
灵活扩展:未来新增部门时,只需分配新网段,不影响现有网络。
技术原理:
通过子网掩码(如
255.255.255.0
)将IP地址分为网络部分和主机部分,不同子网的设备需通过路由器或三层交换机通信,从而实现逻辑隔离。关键点:网段划分就像把一个大房间隔成多个小单间,既保证隐私(安全),又减少噪音干扰(效率)。
特殊的 IP 地址
• 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网;
• 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
• 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1
IP 地址的数量限制
- 我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址.
- 这意味着, 一共只有 43 亿台主机能接入网络么?
- 实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.
- CIDR(子网掩码) 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP地址的绝对上限并没有增加), 仍然不是很够用.
这时候有三种方式来解决:
- 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
- NAT 技术(后面会重点介绍);
- IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;
私有 IP 地址和公网 IP 地址
如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet 上,理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
- 10.*,前 8 位是网络号,共 16,777,216 个地址。(在较大子网当中使用的)
- 172.16.*到 172.31.*,前 12 位是网络号,共 1,048,576 个地址(在学校)
- 192.168.*,前 16 位是网络号,共 65,536 个地址(在家庭)
包含在这个范围中的, 都成为私有 IP, 其余的则称为全局 IP(或公网 IP);
私有IP不能出现在公网中:
私有IP地址,在不同的私网中,可以重复。
比如我家和朋友的家里私有IP可以随便用,我们的私有IP可以一样。
IP地址标识全网当中的唯一性,这里的IP地址指的是公网IP。未来在通信的时候,每个主机都有自己的私有IP,私有IP不能出现在公网当中的。
真实的网络世界:私有IP地址和公有IP地址构成的、也就是局域网、和公网构成的。
在windows中查看自己的ip地址:ipconfig
在云服务器中:ifconfig
inet 10.2.8.15 netmask 255.255.252.0 broadcast 10.2.11.255
以上就是典型的私有IP地址
虽然存在公网,但是我们上网,都必须先接入一个指定的内网当中。我们所有人都在各自的内网当中。能接到公网的人只有运营商。
通过上图我们能够再次明确:
我们的网络世界 = 内网 + 公网构成
1.路由器是能够构建子网的、家里路由器给我们的手机电脑分配私有IP
2.路由器至少要级联两个网络、因此家庭路由器的另一侧连接运营商路由器,连接的是运营商的子网环境,运营商路由器也会构建子网。
3.前面有讲过一个路由器一旦横跨两个子网,他一定要配上两个IP,一个连接的是自己组建的子网的IP,另一边连接的是另一个子网的IP。自己构建的子网的IP称为:LAN口IP(一般都是.1也就是他是第一台),另一端连接的运营商构建的子网的其中一个IP:WAN口IP。
对于运营商来说家庭路由器也就是运营商所构建的子网当中的末端路由器。接下来运营商还能继续向上搭建,某个区的子网,某个市的子网....最后接入到公网的运营商的路由器就称为出入口路由器(也需要有LAN口IP和WAN口IP),出入口路由器的WAN口IP一般就是公网IP。现在存在着抖音的云服务器,是在公网当中的,运营商的出入口路由器也在公网当中,因此这些路由器之间就可以直接通信了,至此我们就从内网进入到公网环境。
正是因为有了这么多基础设施(建基站,组机房,组光纤,家家户户入网,家家户户买手机,买电脑)的建设,运营商其实也不愿意做,投入产出比太高,回报时间长、金钱少,背后都是由国家政府在大力推动和支持。运营商和政府的决心是决定一个国家互联网发展是否蓬勃向上的重要理由。为什么其他国家(韩国、日本、欧洲...)互联网应用上没有我们国家这么发达,他们不缺运营商,缺的是政府的决心。
全世界的网络是各个国家的运营商精心设计过的。
请求步骤:
这是我们的出发点和需要通信的目的地IP:
src: 192.168.1. 201
dst:122.77.241.3
任何主机,都有能力知道和自己直连的网络号是多少。
当发现先要通信的目的ip不在自己的所在的子网当中时,就只能将报文交给家用路由器。因为家用路由器是连接外网的。 家用路由器就会将报文交给运营商路由器,直连的运营商路由器发现目的地并不在自己所构建的子网中,就会将报文交给出入口路由器,最后会根据公网环境将报文直接转发到抖音服务器。
应答的步骤:
要注意,内网IP是有可能重复的,因此抖音在要应答的时候,目的IP如何填?
规定:私有IP不能出现在公网IP中。因此报文在不断转发的时候,是一直在被处理的。
真实情况下的请求步骤:将报文从内网转到公网
源发起请求的主机整理好报文
将报文发给家用路由器:
家用路由器根据目的IP,与自己的子网做比对,将报文处理后交给运营商出入口路由器。
出入口路由器在将报文转发之前,将src替换为自己的WAN口IP。报文转发到广域网后,直接被转发到目的服务器中。
在服务器应答时,报文回到入口路由器处。
NAT(网络地址转化)技术:
• 子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP. 这种技术称为 NAT(Network Address Translation, 网络地址转换).
云服务器作用
• 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网 IP 的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买
因此运营商是如何做到当网络欠费时,无法让我们上网的,不做NAT转化,把我们的报文直接丢弃。
公网IP
需要知道:公网IP的划分在实际情况下是非常复杂的。
先划分每个国家的网段,再划分每个省的网段,最后划分每个市、区的网段,这个时候,所留的IP如果还是按照公网IP来分,肯定不够了,因此由每个地区运营商再来将末端公网IP,来由私有IP来构建子网。
各国IP地址段示例
公网IP地址的分配由 区域互联网注册机构(RIR) 管理,全球共有5个RIR,负责不同地理区域的IP地址分配。每个国家/地区的IP地址段由所属RIR动态分配,且IP地址可能随时间调整。
以下为部分国家的IPv4地址段示例(动态变化,仅供参考):
1. 中国
IPv4:主要由APNIC分配
中国电信:
58.32.0.0/13
、202.97.0.0/16
中国移动:
111.0.0.0/10
、223.0.0.0/12
中国联通:
123.128.0.0/13
、210.52.0.0/15
2. 美国
IPv4:由ARIN分配
谷歌:
8.8.8.0/24
(DNS)、172.217.0.0/16
亚马逊:
52.0.0.0/15
、54.240.0.0/12
3. 日本
IPv4:由APNIC分配
软银(SoftBank):
126.0.0.0/8
NTT通信:
210.146.0.0/16
、203.141.0.0/16
4. 德国
IPv4:由RIPE NCC分配
德国电信(Deutsche Telekom):
62.0.0.0/8
、91.0.0.0/10
Hetzner:
88.198.0.0/16
、213.239.0.0/16
5. 印度
IPv4:由APNIC分配
Airtel:
116.119.0.0/17
、182.79.0.0/16
Jio:
49.36.0.0/14
、106.51.0.0/16
划分网段,划分了很多子网段,国家的组织等去认领,
路由
在复杂的网络结构中, 找出一条通往终点的路线
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程.
所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源 MAC 地址到目的MAC 地址之间的帧传输区间
跨网络转发的本质:就是要经历不同的子网,即子网间转发。
IP 数据包的传输过程也和问路一样.
• 当 IP 数据包, 到达路由器时, 路由器会先查看目的 IP;
• 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
• 依次反复, 一直到达目标 IP 地址;
那么如何判定当前这个数据包该发送到哪里呢?
这个就依靠每个节点内部维护一个路由表;
• 路由表可以使用 route 命令查看
• 如果目的 IP 命中了路由表, 就直接转发即可;
• 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机上的网络接口配置和路由表如下:
• 这台主机有两个网络接口,一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络;
• 路由表的 Destination 是目的网络地址,Genmask 是子网掩码,Gateway 是下一跳地址,Iface 是发送接口,eth0、1网卡接口,lo-->loop:本地环回。Flags 中的 U 标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
转发过程例 1: 如果要发送的数据包的目的地址是 192.168.56.3
• 跟第一行的子网掩码做与运算得 到 192.168.56.0,与第一行的目的网络地址不符
•再跟第二行的子网掩码做与运算得 到 192.168.56.0,正是第二行的目的网络地址,因此从 eth1 接口发送出去;
• 由于 192.168.56.0/24 正 是与 eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
转发过程例 2: 如果要发送的数据包的目的地址是 202.10.1.2
• 依次和路由表前几项进行对比, 发现都不匹配;
• 按缺省路由条目, 从 eth0 接口发出去, 发往 192.168.10.1 路由器;
• 由 192.168.10.1 路由器根据它的路由表决定下一跳地址
现在我们回到网络层,报文协议头格式
理解IP分片和组装的字段
为什么网络层会分片、不想分片、如何做到不分片?
为什么网络层会分片:当IP数据报长度超过网络链路的 MTU(最大传输单元) 时,必须分片传输。
网络层究竟向数据链路层交多大的数据,由传输层决定,过大,到网络层要给数据链路层的时候,数据链路层无法转发,因此网络层进行分片转发。数据链路层、传输层并不会关心网络层是否进行报文分片,网络层给数据链路层的数据,数据链路层就直接发。一次性的数据,就会分片发给数据链路层,数据链路层也需要多次转发。转发给另外的主机后,到网络层时,网络层需要组装好在向上传给传输层。
为什么不想分片:容易丢包
1.在网络世界里,只有IP报文
2.一个IP报文 vs 10个IP报文,10片报文里,有一片丢失去,对方网络层是否能将9片报文组装交给对方传输层,不能。任意一片报文丢失,也就代表整个报文丢失,对方就不会应答,就会超时,就会重传。
过多的分片,会增加丢包概率,分片不是网络转发的主流。无论上层是UDP还是TCP,分片对上层的影响都是相同的,只不过TCP有丢包重传机制。
如何做到不分片:由传输层决定
因此我们可以回顾之前所讲过的滑动窗口:
为什么滑动窗口里的数据也需要分段,因为下层的需求。在传输层(报文 = 传输层报头+有效载荷)分段发了,能降低在网络层(报文 = 网络层报头+传输层报文)分片发的概率。底层有减少分片发送的需求
• 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值.
• 发送前四个段的时候, 不需要等待任何 ACK, 直接发送
如何分片?如何组装?理解字段
如何组装?
1.如何区分,我收到的报文是否分片
2.如何保证收全报文片?将所有的片偏移进行升序排序,并将报头删除进行组装。
根据报头字段:
标识 (Identification) 16 bit 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片了, 那么每一个片里面的这个 id 都是相同的 标志字段 (Flags) 3 bit - 第 1 位:保留,置 0
- 第 2 位:禁止分片(DF)
,置1
时若报文超 MTU 则丢弃
- 第 3 位:更多分片(MF)
,最后一个分片置0
,其他分片置1
。分片偏移 (Fragment Offset) 13 bit 是分片相对于原始 IP 报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移量是偏移的字节数(不包含报头)除以8. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了).
每一个分片都要添加报头。
如果现在有长度为3000(2980 + 20)的报文;
MTU=1500字节时: 可用载荷 = 1500 - 20(IP头) = 1480字节 分片1:1480字节数据 → 偏移量0/8=0 分片2:1480字节数据 → 偏移量1480/8=185 分片3:剩余20字节 → 偏移量2960/8=370
分片结果
分片 数据长度(字节) 总长度(字节) 片偏移量 MF标志 1 1480 1500 0 1 2 1480 1500 185 1 3 20 40 370 0 [原始数据报] 3000字节 ├── [分片1] 1480数据 + 20头 = 1500字节 (MF=1) ├── [分片2] 1480数据 + 20头 = 1500字节 (MF=1) └── [分片3] 20数据 + 20头 = 40字节 (MF=0)
结语:
随着这篇博客接近尾声,我衷心希望我所分享的内容能为你带来一些启发和帮助。学习和理解的过程往往充满挑战,但正是这些挑战让我们不断成长和进步。我在准备这篇文章时,也深刻体会到了学习与分享的乐趣。
在此,我要特别感谢每一位阅读到这里的你。是你的关注和支持,给予了我持续写作和分享的动力。我深知,无论我在某个领域有多少见解,都离不开大家的鼓励与指正。因此,如果你在阅读过程中有任何疑问、建议或是发现了文章中的不足之处,都欢迎你慷慨赐教。
你的每一条反馈都是我前进路上的宝贵财富。同时,我也非常期待能够得到你的点赞、收藏,关注这将是对我莫大的支持和鼓励。当然,我更期待的是能够持续为你带来有价值的内容