网络层-IP 协议全景解析:从地址分配到内网穿透,解锁互联网通信底层密码

IP协议

1.协议头格式

.IPv4 报文头部字段详解(逐字段整理)

4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length × 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是 15×4=60字节。
8位服务类型(Type Of Service) :3位优先权字段(已废弃),4位TOS字段,1位保留字段(必须置为0)。 4位TOS分别表示:最小延时、最大吞吐量、最高可靠性、最小成本。这四者相互冲突,只能选择一个。 对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
16位总长度(total length) :IP数据报整体占多少个字节(头部+数据)。
16位标识(id):唯一的标识主机发送的每一份数据报。如果IP报文在数据链路层被分片了,那么每一个片里面的id都是相同的。
3位标志字段: 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到); 第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文; 第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 × 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数,初始是64。每经过一个路由,TTL -= 1,一直减到0还没到达,那就丢弃了。这个字段主要是用来防止路由循环的。
8位协议:表示上层协议的类型(如TCP=6,UDP=17,ICMP=1等)。
16位头部校验和:使用CRC进行校验,校验对象只包括IP头部,不包括数据部分。用来鉴别头部是否损坏。
32位源地址32位目标地址:表示发送端和接收端。
选项字段(不定长,最多40字节):可选信息,目前很少使用。
16位标识(id)
1.基本功能

主机发送 IP 报文时,会给每个报文分配一个唯一的 16 位编号(这就是 "标识"),用来区分不同的报文 ------ 相当于给每个包裹贴了独有的快递单号。

2.分片时的作用

数据链路层有 "最大传输单元(MTU)" 限制(比如以太网 MTU 是 1500 字节),如果 IP 报文超过这个限制,会被拆成多个 "分片"。这时候,同一个原报文拆分出的所有分片,都会用和原报文相同的 id,接收方靠这个相同的 id,就能把这些分片重新拼回原来的完整报文。

3位标志字段:
  1. 第一位:保留位相当于 "预留空位"------ 现在暂时不用这个位,但提前留着,方便以后 IP 协议升级时新增功能用。

  2. 第二位:禁止分片位把这个位设为 1,就等于给报文加了 "禁止拆分" 的标签:如果报文长度超过数据链路层的 MTU(最大传输尺寸),IP 模块不会拆分它,而是直接丢弃这个报文。

  3. 第三位:更多分片位这是分片的 "结束标识":如果报文被拆成分片,除了最后一个分片,其他分片的这个位都设为 1;只有最后一个分片,这个位设为 0------ 接收方看到这个位是 0,就知道 "这是最后一块,能拼回完整报文了"。

点分十进制IPv4 地址的标准表示格式

  • 把 32 位二进制分成 4 个连续的 8 位段(每段叫一个 "字节");
  • 把每个 8 位二进制段转换成十进制数 (范围是 0~255,因为 8 位二进制最大是11111111,对应十进制 255);
  • 最后用 ** 英文句号 "."** 把这 4 个十进制数隔开,就是点分十进制格式。

2 .地址管理

2.1网段划分

IP地址分为两个部分,网络号主机号

• 网络号:保证相互连接的两个网段具有不同的标识;

• 主机号:同⼀网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

• 不同的子网其实就是把网络号相同的主机放到⼀起.

• 如果在子网中新增⼀台主机,则这台主机的网络号和这个子网的网络号⼀致,但是主机号必须不能和 子网中的其他主机重复.

1 . 公网 IP(外网 IP):互联网的 "唯一身份证"
  • 特点:全互联网范围内唯一,就像每个人的身份证号,不会和别人重复。
  • 作用:用来在整个互联网上标识设备,比如你访问百度,百度服务器的公网 IP 是独一无二的,才能被全球设备找到。
2. 私网 IP(内网 IP):局域网的 "内部编号"
  • 特点:只在自己的局域网内有效,不同局域网里可以重复(比如你家的 192.168.1.2 和邻居家的 192.168.1.2 不冲突)。
  • 固定网段:只有这 3 类是私网 IP(其他都是公网 IP):
    • 10 开头:比如 10.0.0.1
    • 172.16~172.31 开头:比如 172.20.1.5
    • 192.168 开头:比如 192.168.100.98
3. NAT 机制:"共享公网 IP" 的工具

因为公网 IP 数量有限,不够每个设备分,所以用 NAT(网络地址转换)让一个公网 IP 对应多个内网设备

  • 比如你家路由器会分配一个公网 IP(比如 220.181.38.148),你家的手机、电脑用的是私网 IP(比如 192.168.1.2、192.168.1.3);
  • 这些设备访问互联网时,路由器会通过 NAT 把它们的私网 IP 转换成同一个公网 IP 对外通信,相当于 "共享一个互联网身份证"。

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同. 那么问题来了,手动管理子网内的IP,是⼀个相当麻烦的事情.

• 有⼀种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便.

• ⼀般的路由器都带有DHCP功能.因此路由器也可以看做⼀个DHCP服务器.

DHCP 的全拼是 Dynamic Host Configuration Protocol(动态主机配置协议) ,它的核心作用是:自动给联网设备分配网络参数,不用手动设置就能上网

2.2网络NAT映射:

第一步:两台设备同时发起访问,路由器建 "唯一映射"

当手机和电脑都访问百度时,路由器会分别处理两个请求:

  1. 收到手机的请求(源:192.168.1.5:5000 → 目标:180.101.49.11:80):
    • 分配公网映射端口 = 8080;
    • 新增 NAT 表记录:192.168.1.5:5000 ↔ 220.190.120.35:8080 → 180.101.49.11:80
  2. 收到电脑的请求(源:192.168.1.6:6000 → 目标:180.101.49.11:80):
    • 分配公网映射端口 = 9090(确保和手机的 8080 不同);
    • 新增 NAT 表记录:192.168.1.6:6000 ↔ 220.190.120.35:9090 → 180.101.49.11:80

此时 NAT 表有两条完全独立的记录,核心区别在 "私网 IP + 私网端口""公网映射端口" ------ 哪怕目标都是百度 80 端口,这两个维度的差异足以区分。

第二步:百度服务器返回响应,携带 "公网映射端口"

百度服务器收到两个请求后,会分别返回响应,响应的 "目的地址" 是路由器的公网 IP + 映射端口:

  • 给手机的响应:目的 = 220.190.120.35:8080 → 源 = 180.101.49.11:80;
  • 给电脑的响应:目的 = 220.190.120.35:9090 → 源 = 180.101.49.11:80。

服务器不需要知道内网设备,只需要按 "请求的来源公网标识" 返回数据 ------ 这两个响应的 "目的端口"(8080 vs 9090)不同,是路由器区分的 "直接钥匙"。

第三步:路由器查 NAT 表,精准转发

路由器收到两个响应后,只需要做一件事:提取响应的 "目的公网映射端口",匹配 NAT 表中的记录

  1. 响应目的端口 = 8080 → 匹配 NAT 表第一条记录 → 转发给内网 192.168.1.5:5000(手机);
  2. 响应目的端口 = 9090 → 匹配 NAT 表第二条记录 → 转发给内网 192.168.1.6:6000(电脑)。

整个过程中,路由器根本不需要 "额外判断"------ 公网映射端口是它自己分配的,且每个端口只对应一个 "私网 IP + 私网端口 + 目标服务" 的组合,只要端口匹配,就能精准找到对应的设备和应用

内网多个设备使用相同的本地端口号,只要它们访问的目标不同,NAT就可以复用同一个公网端口!

私网的IP在私网中只有一个 ,但是不同的设别可能他自己的操作系统分配的端口号一样 ,访问的公网IP是一样的 ,但是端口号不一样,所以说即使他们访问的同一个应用程序的服务器,服务器发送的响应也能很快的识别对应的私网设备

核心逻辑链(从设备访问到响应投递)

  1. 私网侧唯一标识:同一局域网内,「私网 IP + 私网端口」组合绝对唯一(私网 IP 由路由器分配,唯一;私网端口由设备 OS 分配,单设备内同协议唯一,跨设备可重复,但 IP 不同导致组合唯一);
  2. 路由器分配公网端口 :当不同设备(私网端口可相同)访问同一个公网服务器时,路由器会给每个「私网 IP + 私网端口」组合,分配唯一的公网端口(公网 IP 固定,公网端口不同,确保「公网 IP + 公网端口」唯一);
  3. 服务器接收请求:服务器只看到「公网 IP + 公网端口」,不知道私网信息,处理后返回响应,响应的 "目的地址" 就是这个「公网 IP + 公网端口」;
  4. 路由器精准转发:路由器收到响应后,通过「公网端口」查 NAT 表,找到对应的「私网 IP + 私网端口」,把响应转发给目标设备。

同一时间,一个公网端口不是只能对应「一个内网端口」,而是只能对应「一个唯一的四元组(私网 IP + 私网端口 + 目的 IP + 目的端口)」" ------ 只要四元组不同,同一个公网端口可以在同一时间对应多个不同的内网会话

公网设备 A 直接访问局域网设备 B:

  1. 私网 IP 是 "局域网内部地址" :局域网设备 B 的 IP(比如 192.168.1.10)是 "私网 IP",这类 IP 在公网上是不可路由的------ 公网设备 A 根本找不到 "192.168.1.10" 这个地址(全世界有无数个局域网在用 192.168.x.x 网段)。

  2. NAT 是 "单向机制" :路由器的 NAT 表,只有当局域网设备主动访问公网 时才会建立映射(比如 B 主动访问百度,路由器会记录 "B 的私网 IP + 端口 ↔ 公网 IP + 端口")。但公网设备 A 主动访问 B 时,路由器的 NAT 表里没有对应的映射记录,不知道该把 A 的请求转发给哪个内网设备,只能直接丢弃请求。

2.3内网穿透(公网访问内网的服务器):

整个流程是这样的:
  1. 建立中转连接 :家里服务器的「内网穿透程序」主动和云服务器建立TCP 长连接(这一步能成功,因为 "内网设备主动连公网设备" 是 NAT 允许的)。

  2. 外部发起访问:外部访问者(公网)访问云服务器的「13306 端口」。

  3. 云服务器转发请求 :云服务器收到 13306 端口的请求后,通过之前和家里服务器建立的TCP 长连接,把请求数据转发给家里的服务器。

  4. 家里服务器处理请求:家里服务器的穿透程序收到数据后,把它转发给自己的「3306 端口服务程序」(比如 MySQL);服务程序处理后,再把响应通过 TCP 长连接发回云服务器。

  5. 云服务器返回响应:云服务器把家里服务器的响应,转发给外部访问者。

核心取决于 "是否有公网可达的中转节点(含云服务器),但是云服务器是最稳定常用的方法

过去曾经提出⼀种划分⽹络号和主机号的方案,把所有IP地址分为五类,如下图所⽰。

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,⼤多数组织都申请B类网络地址,导致B 类地址很快就分配完了,⽽A类却浪费了⼤量地址;

• 例如,申请了⼀个B类地址,理论上⼀个子网内能允许6万5千多个主机.A类地址的子网内的主机数更 多.

• 然而实际网络架设中,不会存在⼀个子网内有这么多的情况.因此⼤量的IP地址都被浪费掉了.

针对这种情况提出了新的划分方案,称为CIDR(ClasslessInterdomainRouting)无类别域间路由)表示法:IP 地址 + "/" + 子网掩码二进制中 1 的位数

• 引入⼀个额外的子网掩码(subnetmask)来区分网络号和主机号;

• 子网掩码也是⼀个32位的正整数.通常用⼀串"0"来结尾;

• 将IP地址和子网掩码进行"按位与"操作,得到的结果就是网络号;

• 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围;

IP地址和子网掩码还有⼀种更简洁的表示方法,例如140.252.20.68/24,表⽰IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0

特殊的IP地址

• 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;

• 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同⼀个链路中相互连接的所有主机发 送数据包;

127.*的IP地址⽤于本机环回(loopback)测试,通常是127.0.0.1(本机IP可以当作)

1. 广播地址的基本功能

往 "广播地址" 发送数据包,相当于在当前局域网内 "群发"------ 这个数据包会被转发给同一局域网里的所有设备(但只局限在当前局域网,出不了这个网段)。

2. 广播和 "群聊" 的区别

虽然形式上像群聊,但技术逻辑完全不同

  • 广播:只在同一个局域网内生效(比如你家 WiFi 下的设备);
  • 群聊(比如微信 / QQ 群):群成员可以是不同局域网、不同城市的设备,靠互联网服务器中转,和广播没关系。
3. 实际例子:手机投屏

手机投屏前 "自动搜索可投屏设备",就是靠广播实现的:

  • 手机和电视必须连同一个 WiFi(同一局域网)
  • 手机往广播地址发请求:"谁能投屏?";
  • 局域网里的电视 / 投影仪收到广播后,会给手机回应,这样手机就能列出可投屏设备了。
4. 广播的传输协议限制

广播只能用 UDP 协议 传输:因为 TCP 是 "一对一建立连接" 的,不支持 "群发";而 UDP 是无连接的,可以直接往广播地址发数据 ------ 所以广播功能都依赖 UDP 实现。

简单说:广播是局域网内的 "群发工具",手机投屏搜设备、打印机自动发现这些场景,都是靠它实现的~

2.4IP地址的数量限制

我们知道,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还没有普及;

2.5私有IP地址和公网IP地址

如果⼀个组织内部组建局域网,IP地址只用于局域⽹内的通信,而不直接连到Internet上,理论上使⽤任意 的IP地址都可以,但是RFC1918规定了⽤于组建局域⽹的私有IP地址

• 10.*,前8位是⽹络号,共16,777,216个地址

• 172.16.到172.31.,前12位是⽹络号,共1,048,576个地址

• 192.168.*,前16位是⽹络号,共65,536个地址

包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公⽹IP)

• ⼀个路由器可以配置两个IP地址,⼀个是WAN口IP,⼀个是LAN口IP(子网IP).

• 路由器LAN口连接的主机,都从属于当前这个路由器的子网中.

• 不同的路由器,子网IP其实都是⼀样的(通常都是192.168.1.1).子网内的主机IP地址不能重复.但是子网之间的IP地址就可以重复了.

• 每⼀个家用路由器,其实又作为运营商路由器的子网中的⼀个节点.这样的运营商路由器可能会有很 多级,最外层的运营商路由器,WAN⼝IP就是⼀个公⽹IP了.

• 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样 逐级替换,最终数据包中的IP地址成为⼀个公网IP.这种技术称为NAT(NetworkAddress Translation,网络地址转换).

• 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在⼀台具有外⽹IP 的服务器上.这样的服务器可以在阿里云/腾讯云上进⾏购买

2.6 路由选择

在复杂的网络结构中,找出⼀条通往终点的路线

路由的过程,是⼀跳⼀跳(HopbyHop)"问路"的过程.

所谓"⼀跳"就是数据链路层中的⼀个区间.具体在以太⽹中指从源MAC地址到⽬的MAC地址之间的帧 传输区间

IP数据包的传输过程也和问路⼀样.

• 当IP数据包,到达路由器时,路由器会先查看⽬的IP;

• 路由器决定这个数据包是能直接发送给⽬标主机,还是需要发送给下⼀个路由器;

• 依次反复,⼀直到达目标IP地址;

那么如何判定当前这个数据包该发送到哪⾥呢?这个就依靠每个节点内部维护⼀个路由表;

• 路由表可以使用route命令查看

• 如果⽬的IP命中了路由表,就直接转发即可;

• 路由表中的最后⼀行,主要由下⼀跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不 匹配时,就按缺省路由条目规定的接口发送到下⼀跳地址。

假设某主机上的网络接口配置和路由表如下:

• 这台主机有两个网络接口,⼀个网络接口连到192.168.10.0/24网络,另⼀个网络接口连到 192.168.56.0/24⽹络;

• 路由表的Destination是⽬的网络地址,Genmask是⼦⽹掩码,Gateway是下⼀跳地址,Iface是发送接 口,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路由器根据它的路由表决定下⼀跳地址

2.7 路由表生成算法(选学)

路由表可以由网络管理员手动维护(静态路由),也可以通过⼀些算法自动生成(动态路由). 调研⼀些相关的生成算法,例如距离向量算法,LS算法,Dijkstra算法等.

相关推荐
I · T · LUCKYBOOM1 小时前
23.ssh远程连接、TCP策略
linux·运维·服务器·网络·tcp/ip·ssh
Vect__1 小时前
Linux常见指令
linux·服务器
运维有小邓@1 小时前
ManageEngine 卓豪荣登 KuppingerCole 2025 年《身份威胁检测与响应领导力指南》,获评市场领导者
网络·安全·web安全
福尔摩斯张1 小时前
C语言文件操作详解(一):文件的打开与关闭(详细)
java·linux·运维·服务器·c语言·数据结构·算法
发光小北1 小时前
SG-PN-EIP (S)-220(Profinet 从站转 EtherNet/IP 从站网关)
网络·网络协议·tcp/ip
白帽黑客-晨哥1 小时前
零基础转行网络安全需要学多久?
网络·安全·web安全·网络安全·零基础·就业·转行
豐儀麟阁贵1 小时前
9.4字符串操作
java·linux·服务器·开发语言
minji...1 小时前
Linux 进程控制(二) (进程等待wait/waitpid)
linux·运维·服务器·数据结构
新诺韦尔API1 小时前
手机在网状态查询接口对接详细流程
大数据·网络·智能手机·api