接上文 【网络原理】TCP/IP协议01
3. 网络层
在复杂的网络环境中确定⼀个合适的路径
① IP 协议
IP 协议,做到工作,主要是两个:
- 地址管理,使用 IP 地址这样的概念,标识网络上的某个设备的位置
- 路由选择,在两个通信设备节点之间,规划出一条合理的路径

- 主机: 配有IP地址, 但是不进行路由控制的设备
- 路由器: 即配有IP地址, 又能进行路由控制
- 节点: 主机和路由器的统称
② IP 报文格式

1️⃣4位版本号(version):指定IP协议的版本,有 IPv4 和 IPv6 两个版本。
2️⃣选项:用于扩展IP功能,可有可无,选项的存在,那么IP的报头长度是可变的
3️⃣4位首部长度:IP 协议报头,和 TCP 协议一样,也是变长的,长度取值范围为0~15,以4字节为单位,即
- 报头最小长度为 20 字节(取最小值5,包含报头中的20个固定字节长度,选项除外)
- 报头最大长度为 60字节(取最大值15),包含 选项40个字节 + 20固定字节
- 详情可看一看上一篇文章的 TCP 部分。
4️⃣8位服务类型:决定 IP 的工作方式,即 IP 可以切换工作状态
- 3位优先权字段(已经弃用),4位TOS字段, 和1位保留字段(必须置为 0).
- 4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本
- 这四者相互冲突, 只能选择⼀个
5️⃣16位总长度:报头+载荷 的长度,即 64kb
- 与 UDP 协议不同,IP 协议内置了拆包组包的功能。
- 比如,IP 携带一个比较大的 TCP 数据包,IP 协议就会自动拆成多个,通过多个 IP 数据包共同传输一个 TCP 数据包。
6️⃣16位标识:唯一标识一个IP数据报。当数据报需要分片时,同一数据报的所有分片具有相同的标识,以便接收方重组。
- 拆包:把拆出来的多个包,设为相同的标识
- 组包:把相同标识的数据包组合到一起
7️⃣3位标志:
- 第⼀位保留(保留的意思是现在不用, 但是说不定以后要用到).
- 第二位表示是否触发了拆包操作,置为1,表示禁止分片/拆包
- 第三位表示当前包是否是最后一个数据包,置为0 表示就是最后一个,类似于结束标志
8️⃣13位片偏移:表示当前分片在原数据报中的位置 (以8字节为单位 )。除了最后一个分片,其他分片的数据长度必须是8的倍数(否则报文不连续)。接收方据此将分片按顺序重组(偏移小的放在前面,大的放后面)。
如果基于 UDP 实现传输超过 64kb 的数据,可以参考 IP 的方案:
- 在应用层中,就可以指定标识符,指定片偏移,指定标志位
9️⃣8位生存时间:一个 IP数据报 到达目的地经过的最大跳数(路由器数),⼀般是64。每经过一个路由器,TTL减1 ,减到0时还没到达目的地, 那么就丢弃了,该字段是为了防止路由循环导致网络瘫痪。
示例:TTL 为64,经过 14(64-50) 次的路由器转发,到达了 搜狗的服务器:

🔟8位协议:表示上层使用的是哪种协议类型(常见值:6=TCP,17=UDP),相对于网络层,上层就是传输层
- 分用的时候,IP协议解析IP数据包的时候,拿到载荷,交给上层处理,此处的8位协议编号,就起到了区分的作用
- 类似于:传输层到应用层 => 端口号 区分到哪个应用程序;网络层到传输层 => 8位协议;数据链路层到网络层 => 也有一个类似的协议编号
1️⃣1️⃣16位首部校验和:这里只需要校验首部,即报头,载荷 部分有 UDP/TCP 校验。
1️⃣2️⃣32位源IP地址/32位目的IP地址:表示发送端和接收端
③ NAT 技术
IP 地址是唯一的,32位IP地址,只能表示43亿9千万个不同的IP,那么 IP 地址不够同了咋办?
有两种方案:
-
- 动态分配IP:上网再分配,不上网不分配,有所缓解,但是不能根本上解决问题
-
- NAT 机制(网络地址转换):
- 把所有的 IP 地址分成两个大类:公网IP/外网IP 和 私网IP/内网IP(10. 或者 172.16-172.31 或者 192.168 表示私网的IP)。
- 私网IP 在同一个局域网中,是唯一的,在不同局域网中,可以重复。例如,我的IP,可能和处在不同局域网中的某个人的IP 是相同的,如果和我处在同一个局域网中,我这个IP 就是唯一的。
- 公网IP 是唯一的。在相同局域网中的所有人的公网IP 是相同的。
- 这个就是NAT机制,通过NAT(网络地址转换)访问互联网时,所有局域网内的设备共享同一个公网IP,就可以用一个公网 IP 对应一系列的内网设备
示例:我的主机IP(私网)地址 是 :

使用IP地址查询工具,可以看到我的外网IP地址 是:

和我处在同一个局域网中的所有人都是这个外网IP。
关于私网IP地址,当电脑插到路由器上,默认会通过DHCP协议,自动分配一个局域网IP(每次分的可能不一样)。当然,也可以手动配置IP,即静态IP。

在 NAT 背景下,网络通信如何进行的?
1️⃣同一个局域网下,设备A 访问 设备B ,由于IP 本身不允许重复,自然不受任何影响,因此这种情况下,NAT 不起作用。
2️⃣公网设备A 访问 公网设备B,由于公网IP 本身也不重复,也不受影响,NAT 不起作用。
3️⃣不同局域网中,设备A 访问 设备B,是不允许的,NAT 机制禁止这样的访问。
- 简单来说,NAT(网络地址转换)的核心设计就像一道单向门,只允许内部设备主动向外连接,默认会拦截所有未经内部设备发起的"陌生"外部访问请求。
- 可以把NAT机制下的路由器比作一位严格的"小区门卫"。以下是几个核心原因:
- 🚪没有登记,门卫拒之门外:NAT设备的核心依据是"NAT会话表",可以看作门卫手里的"登记簿"。当内网设备主动发起对外访问时(如A设备浏览网页),路由器会在表里记下对应关系,之后外部网站的回复数据才能被放行。但外部的设备B想直接访问A,因为没有这条"外出记录",路由器无法确定请求要给谁,所以会直接丢弃数据包。
- 🔒设计初衷:缓解IPv4枯竭并实现安全隔离:NAT诞生于IPv4公网地址短缺的背景下,它允许多个内网设备共享一个公网IP上网,很大程度上缓解了地址不足的问题。与此同时,这种"只出不进"的设计也天然形成了一道防火墙,隐藏了内网细节,避免内网设备直接暴露在外部风险下。
- 🏠 相同的"楼栋号"导致寻址混乱:不同局域网常使用一样的私有地址范围(如设备A的10.x.x.x和设备B可能也一样)。这些地址在公网上是不可见的,它们只在各自网络内部有效,因此从外部直接访问A的10.x.x.x是不可达的。
4️⃣局域网设备A 访问 公网设备B,这个时候,++NAT 就起了作用了++,需要进行网络地址映射。
示例:我想要访问淘宝:

1)NAT IP 转换过程

- 我发送了一个访问的请求数据包,其中 IP数据包中,记录我的主机IP(源IP)以及我要访问的淘宝服务器的公网 IP(目的IP)
- 经过路由器时,路由器在转发之前,触发了网络地址映射(NAT),将我的私网IP 192.168.100.98,替换成了 公网IP 100.1.1.1 ,然后才能去访问 200.1.1.1
此时,和我在同一个局域网中,有另一个人也要访问淘宝:
那么,这个人也是一样的过程:

通过上述的图,可以清晰的看出,局域网中的若干个设备,公用一个公网 IP,本来一个设备一个公网 IP,不够用,但是若干个设备公用一个公网 IP,就够用了。在现实中,一个公网IP 背后代表着几千个,上万个局域网设备。
(当然,上述图只是简单画,可能一个私网IP 中间会经过多个公网IP,但是不是带有公网IP就一定触发NAT,也要看本来的源IP 是不是私网 IP)
问题 :由于局域网中的IP 都是经过映射后,才发送出访问淘宝服务器请求数据报,那么++服务器返回响应++给我和另一个人,此时目的IP 都是相同的(100.1.1.1),如何正确返回呢?

网络通信中,涉及到五元组:源IP,目的IP,源端口,目的端口,协议类型。
通过 IP 区分不出来,那么可以根据 端口号,来进一步区分。
(端口号位于IP 数据包的载荷部分中,即TCP/UDP数据包的报头中)
2)NAPT
局域网内, 有多个主机都访问同⼀个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的,那么NAT路由器可以通过 NAPT 判定将这个数据包转发给哪个局域网的主机。
NAPT ------ 使用IP+port来建立这个关联关系。

如上图所示,通过 端口号,就可以区分出是要将数据包转发给哪一个主机了。
其中,在路由器触发 NAT 地址替换的时候,自身会维护一个 "哈希表"结构,记录替换的映射关系

通过运营商路由器根据之前记录的NAT转换表,将目的IP 100.1.1.1 还原为 192.168.100.98,最终交付给局域网中的对应设备。
(如果在同一个局域网中,出现访问淘宝服务器的主机的端口号相同的情况,也是可以解决的,NAT 设备进行替换的时候,除了可以更改 IP,端口号也是可以修改的,到时候通过转换表记录替换前后的端口号就可以了,这样就能保证正常访问,而不会发生冲突
端口号,不仅可以用来区分,同一个主机上的不同程序,还可以用来区分不同主机上的不同程序)
5️⃣公网设备A ,尝试访问局域网设备B,是不允许的,NAT 机制禁止这样的访问。
如果想让外部向内部访问,通常需要借助外力:要让外网访问内网设备,就需要打破"单向门"。可行的方式:
- 一是使用内网穿透技术,让内网设备主动向外部的公网服务器发起连接,建立一个中转通道。
- 二是使用VPN(虚拟专用网络),在公共网络(如互联网)上,建立一个加密的、专用的"隧道"。
- VPN 让你"住进"那个局域网;内网穿透只是给那个局域网里的某个服务开了一扇"公网侧门"。
上述的两种方式,不和 NAT 冲突,本质上都是借用其他的带有公网IP 的设备进行转发。
3)内网穿透
核心机制就是让外网请求通过一个"中间人",反向拐进你的内网设备。
内网穿透的每一步操作,本质上都是绕开NAT(网络地址转换)对"外人禁止入内"的限制。

VPN 也是类似的过程。
4)IPv6
通过前面的内容,我们知道,解决 IPv4 IP地址不够用的问题:
- 动态分配 IP 地址
- NAT 网络地址转换(主流方案)
除了上述这两种方案,其实有一个终极的方案 ------ IPv6。
IPv4 采用 4 个字节(32bit)作为 IP地址,而 IPv6 采用 16 个字节(128bit)作为 IP 地址。
128个比特位,IPv6 的地址总数为 2^128 个,这个数量极其庞大,足以给地球上的每一粒沙子分配一个独立的 IPv6 地址。
说回 IP 协议,介绍 IP 协议的主要工作。
④ 地址管理
一、网段划分
IP地址分为两个部分,网络号和主机号
- 前半部分成为 网络号,后半部分称为 主机号
- 网络号:保证相互连接的两个网段具有不同的标识
- 主机号:同⼀网段内,主机之间具有相同的网络号,但是必须有不同的主机号

示例1:在同一个局域网中

(一般来说,电脑插到路由器上,就会自动获取一个合法的IP ------ DHCP技术,路由器也可以看作一个DHCP服务器,通过这种技术,可以避免手动设置IP的不便)
示例2:相邻局域网中
通常情况下,一台路由器至少有两个 IP 地址,分别对应它的不同网络接口:
- 内网 IP(LAN 口 IP):这是路由器在家庭或企业内部局域网中的地址,作为网关,供内网设备配置默认路由。它属于私有 IP 地址。
- 外网 IP(WAN 口 IP):这是路由器从运营商获取的地址,用于接入互联网。
而路由器中的这个两个IP,就是在不同的局域网中的,所有说,路由器的功能,就相当于把两个局域网连接在一起。

🅰️子网掩码
当然,一个IP地址中,哪部分是网络号,哪部分是主机号,是可以配置的,通过子网掩码配置。

子网掩码,就是当前网段的划分(划分网络号和主机号)方式。
还有一种以前的划分方式,就是把所有 IP 地址分为五类:
这个方案没有子网掩码,固定分成五类,使用前缀来区分是哪一类,每一类网络号和主机号都是固定的。

- 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
🅱️默认网关
主机号为 1(00000001) 的 IP地址,例如,192.168.1.1 这个 IP 地址:
它在IP协议中,只是一个普通的IP地址,但是在实际组网中,通常会使用这个 IP 作为 默认的网关IP,也是可以设置成其他的,不强制要求。
- 网关:就是网络的入口/出口
- 家庭网络中,网关一般就是路由器,大型的企业/网络结构,网关是一个单独的设备
二、特殊的IP地址
- 将IP地址中的 主机地址 全部设为0(即 00000000), 就成为了网络号,代表这个局域网。例如,192.168.1.0 这个IP地址,就表示网络号。
- 将IP地址中的 主机地址 全部设为1(即 11111111), 就成为了广播地址, 用于给同⼀个链路中相互连接的所有主机发送数据包。例如,192.168.1.255 这个IP地址,就表示广播地址。(往广播地址上发送数据包,就会被转发给局域网中的所有设备)
- 127.* 的IP地址用于本机环回 (Loopback) 测试,通常是127.0.0.1。无论你本机真实的IP地址是多少,都可以写成 127.0.0.1 作为代表。
⑤路由选择
IP 协议另一个主要工作。
路由选择,就是通过 IP 协议,进行数据转发的过程,在复杂的网络结构中,找出⼀条通往终点的路线的过程。
路由选择,其实就像 "问路" 的过程,人在问路的时候,通常是在路边找一个附近的人问,对于路由器也是一样,网络环境非常复杂,任何一个路由器,无法存储所有网络的信息,但是每个路由器,是可以知道附近的网络情况的(至少知道谁和它相连)。
当数据包到达某个路由器的时候,就会匹配这个路由器的 "路由表" ,路由表中就记录了这个路由器周围的设备的IP 是什么,以及也会记录每个设备要通过哪个接口转发过去。
- 如果目的IP 刚好匹配到了路由表中的记录,直接按照当前的对应接口转发过去就可以了
- 如果没有匹配到,路由表有一个特殊的表项,即 "下一跳",下一跳地址,它指向的设备是离目的地更近、离当前设备更远的一台路由器,即下一个要经过的路由器接口,该接口可能在物理上更靠近目标路由器。
4.数据链路层
"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理 层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等。
① 以太网报文格式

- 源地址和目的地址 是指网卡的硬件地址,也叫MAC地址,长度是48位,是在网卡出厂时固化的

- 帧协议类型字段有三种值,分别对应IP、ARP、RARP。类型不同,载荷的数据格式就不同
- 帧末尾是CRC校验码
② 认识MAC地址
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地 址, 可能会冲突; 也有些网卡支持用户配置mac地址)
- mac地址也可以作为一个电脑的身份标识
③ MAC地址和IP地址的区别
- IP地址描述的是路途总体的 起点 和 终点
- MAC地址描述的是路途上的每一个区间的起点和终点;
④ MTU
MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层产生的限制。
- 以太网帧中的数据长度规定最小 46 字节,最大1500字节,ARP数据包的长度不够46字节,要在后⾯补填充位
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
- 如果⼀个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片
- 不同的数据链路层标准的MTU是不同的
⑤ ARP协议
ARP不是⼀个单纯的数据链路层的协议,而是⼀个介于数据链路层和网络层之间的协议。
ARP协议的功能是,根据IP地址,得到对应的MAC地址。即ARP协议建立了主机 IP地址 和MAC地址 的映射关系。
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃
- 因此在通讯前必须获得目的主机的硬件地址
工作流程

5. DNS 域名解析协议
DNS协议是一个应用层协议,是⼀整套从域名映射到IP的系统。
TCP/IP中使用 IP地址 和 端⼝号 来确定网络上的⼀台主机的⼀个程序。但是IP地址不方便记忆。于是人们发明了⼀种叫主机名的东西,是⼀个字符串,并且使用 hosts 文件来描述主机名和IP地址的关系,即通过 hosts 文件来实现IP 和 主机名的映射。
例如,知道百度的域名,可以通过 ping 命令来知晓它的 IP地址:

通过 hosts文件来维护这些 域名和IP地址的映射,太复杂了,因此,会把 hosts 文件中的内容提取出来,单独放到一个服务器上,这样的服务器就称为 DNS服务器。用户的电脑访问某个网站的时候,就会先查询 DNS 服务器,把 域名 对应 IP地址 拿到,再真正访问服务器。