楼主: Lee8899
58 0

Linux网络IP(下)(16) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

初中生

0%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
70 点
帖子
6
精华
0
在线时间
0 小时
注册时间
2018-6-4
最后登录
2018-6-4

楼主
Lee8899 发表于 2025-11-25 07:00:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

前言

本篇文章是IP协议系列的最后一篇,接下来我们将正式进入数据链路层的学习阶段。

一、网段划分

IP地址由两个关键部分组成:网络号和主机号。

  • 网络号:用于标识不同的网络段,确保相互连接的网段拥有唯一的标识。
  • 主机号:在同一网段内,所有设备共享相同的网络号,但每台主机必须具备唯一的主机号以作区分。

可以通过在IP地址后添加“/”并接一个数字的方式指定网络号的位数。例如,在一个32位的IP地址中,若表示为/24,则前24位为网络号,剩余8位为主机号。

如下图所示,路由器连接了两个独立的网段。对于网络标识而言,同一子网内的设备具有相同的网络号;而不同子网之间的网络号则各不相同。至于主机标识,在同一个子网内部必须唯一,但在不同子网之间可以重复使用。

所谓子网,本质上就是将网络号相同的设备归类到一起。当在一个子网中新增一台主机时,该主机需继承当前子网的网络号,同时其主机号必须与已有设备不冲突。

DHCP协议的作用

手动管理IP地址是一项繁琐的任务——每当有新设备接入网络时需要分配IP,设备离线后又需回收IP以便再利用。

因此,实际应用中通常采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)来自动生成和管理IP地址。

DHCP是一种基于UDP的应用层协议,广泛应用于大型局域网环境中。它能够实现:

  • 集中化的IP地址管理与自动分配
  • 为主机提供IP地址、网关地址及DNS服务器信息
  • 提升IP地址的利用率

大多数现代路由器都内置了DHCP服务功能,因此路由器本身也可被视为一台DHCP服务器。

当我们连接Wi-Fi并输入密码时,实际上是让路由器验证身份。一旦通过验证,路由器便会通过DHCP机制为你分配一个动态IP地址,随后你便可基于此地址进行上网操作。

数据传输路径:先定位网络,再定位主机

当数据需要从一台主机跨网络发送至另一台主机时,并非直接寻址目标主机,而是分两步完成:

  1. 首先将数据送达目标主机所在的网络(依据网络号)
  2. 然后在该网络内部根据主机号找到具体的目标设备

这种策略的核心思想在于效率优化。如果一开始就试图在全球范围内逐个匹配主机,那将面临海量IP的遍历问题,显然不可行。

相反,通过优先确定目标网络,相当于一次性排除了大量无关网段中的主机,极大缩小了搜索范围。

换句话说,寻找目标的过程其实是一个不断排除无效选项的过程:

  • 若以单个主机为目标,每次只能排除一个可能项
  • 而以网络为单位查找,则一次可排除成千上万个非目标网段的主机

因此,为了提高路由效率,我们对IP网络进行了网段划分。

传统五类IP地址划分方案

早期曾提出一种按类别划分网络号与主机号的方法,即将IP地址划分为A、B、C、D、E五类,如下图所示:

各类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(保留用途)

判断一个IP属于哪一类,只需查看其前几位二进制位:第一个出现0的比特位位置决定了类别(A/B/C/D/E),这一设计极为巧妙。

子网划分的演进

随着互联网快速发展,传统的五类划分方式暴露出明显缺陷。

例如,许多机构如高校、企业或研究实验室希望申请独立的局域网。由于A类地址仅有7位网络号,最多只能支持128个网络,远不能满足需求,因此多数单位选择申请B类地址。

然而,B类地址拥有16位主机号,理论上支持超过6.5万台主机,而现实中极少有单一局域网达到如此规模,导致大量IP资源被闲置浪费。

为解决此类资源浪费问题,引入了更灵活的子网划分机制。

该机制在原有分类基础上,进一步借用原主机号的部分位作为新的网络号,从而实现更细粒度的网络分割。

为了明确区分新的网络号与主机号边界,引入了子网掩码(subnet mask)的概念。

二、特殊的IP地址

某些IP地址具有特殊用途,不能作为普通主机地址使用:

  • 全0的主机号:表示网络本身,用于指代整个网段(如192.168.1.0/24)
  • 全1的主机号:表示广播地址,用于向本网段所有主机发送消息(如192.168.1.255/24)
  • 环回地址(127.0.0.1):用于本地测试,数据不会离开本机
  • 0.0.0.0:常用于表示默认路由或未配置IP的状态

三、IP地址的数量限制

IPv4地址长度为32位,总共可提供约43亿(2^32)个唯一地址。随着设备数量激增,这一数量已接近枯竭。

尽管通过NAT、CIDR等技术延缓了耗尽速度,但根本解决方案仍是向IPv6过渡,后者采用128位地址,几乎无限扩展地址空间。

四、私网IP地址与公网IP地址

为缓解公网IP短缺问题,定义了若干段私有IP地址范围,这些地址可在局域网内自由使用,但不可在互联网上直接路由:

  • A类私网地址:10.0.0.0 ~ 10.255.255.255(/8)
  • B类私网地址:172.16.0.0 ~ 172.31.255.255(/12)
  • C类私网地址:192.168.0.0 ~ 192.168.255.255(/16)

这些私网地址通过NAT(网络地址转换)技术映射到有限的公网IP上,实现多设备共享上网。

五、路由

路由过程遵循“先找网络,后找主机”的原则。路由器根据目标IP地址中的网络号查找对应的转发路径,直到数据包抵达目标网络,再由最后一跳路由器依据主机号交付给具体设备。

路由表中存储着网络号与接口的映射关系,配合子网掩码进行最长前缀匹配,确保数据高效准确地传递。

总结

通过对IP地址进行网段划分,不仅提升了路由效率,也优化了地址资源的利用。DHCP实现了自动化地址分配,子网掩码支持灵活的网络细分,私有地址结合NAT缓解了公网IP不足的问题。这些机制共同构成了现代IP网络的基础架构,为后续深入理解数据链路层打下坚实基础。

在IP网络中,每一个子网都对应一个子网掩码。子网掩码本质上是一个32位的二进制正整数,通常以连续的“1”开头,结尾则是一串“0”。其作用是区分IP地址中的网络部分与主机部分。

通过将某个主机的IP地址与其所在网络的子网掩码进行“按位与”运算,可以提取出该主机所属网络的网络号。这一过程实际上保留了IP地址前若干位(即网络号部分),而将后面的主机号部分全部置为0。

例如,若某一子网采用前24位作为网络号,则其子网掩码的32位中,前24位为1,后8位为0,用点分十进制表示即为 255.255.255.0。假设某台主机的IP地址为 192.168.128.10,将其与此子网掩码进行按位与操作:

192.168.128.10 & 255.255.255.0 = 192.168.128.0

结果 192.168.128.0 即为该子网的网络号。这说明,“按位与”操作实质上就是清零IP地址中的主机号字段,从而得到纯粹的网络标识。

随着子网划分的深入,可以在已有子网的基础上进一步划分子网,实现更精细的网络管理。这种逐层划分的方式使得在网络路由过程中,数据包所经过的每一跳都会依据更长的网络号进行转发,也就是说,网络号的位数逐渐增加,而对应的主机号位数不断减少。

当数据最终到达目标主机所在的子网时,便可根据本地网络内的主机号定位到具体设备,并完成数据交付,至此整个路由过程结束。

后来出现了一种更为灵活的地址分配方式——CIDR(Classless Inter-Domain Routing),中文名为无类别域间路由。它打破了传统分类IP地址的限制,允许任意长度的网络前缀,提高了IP地址空间的利用率,也增强了路由聚合的能力。

特殊的IP地址类型

并非所有IP地址都可以分配给主机使用,某些特定格式的IP地址具有特殊含义,不能用于常规主机配置。

  • 当一个IP地址的主机部分全为0时,该地址表示的是网络本身的网络号,用来标识整个局域网。
  • 若主机部分全为1,则该地址为广播地址,用于向当前网络内所有主机发送数据包。
  • 以127开头的地址段(如127.0.0.1)被保留用于本机环回测试(loopback test),这类地址不会真正发送到物理网络上。

因此,在计算某个子网中可分配给主机的最大数量时,必须减去这两个不可用地址:网络号(全0)和广播地址(全1)。可用主机数公式为:2主机号位数 - 2。

本机环回的工作机制

本机环回是一种特殊的通信路径,用于测试本地网络协议栈的功能是否正常。虽然数据会完整地经历从应用层到传输层、再到网络层的封装流程,但并不会真正写入网卡或发送至外部网络。

其核心原理如下:

当数据包传递至IP层并准备向下交付时,如果目的IP属于环回地址(如127.0.0.1),IP输出函数不会启动ARP查询或驱动网卡发送数据,而是直接将该数据包插入IP输入队列中。随后,IP输入函数会像处理来自链路层的数据一样,读取并继续向上提交该数据包,完成解包和分用过程。

这意味着环回数据在逻辑上“绕过了”物理网络,但在协议栈内部完成了完整的收发流程,可用于验证TCP/IP各层功能的正确性。

此外,除了明确的环回地址外,以下情况也会导致数据进入内部处理流程:

  • 目的IP是本机自身的IP地址;
  • 目的IP为广播或多播地址。

只有当系统确认数据既非环回、非广播/多播、也不发往本机时,才会触发ARP请求,获取下一跳设备的MAC地址,并通过物理接口将帧发送出去。

真正的外部数据发送流程

对于需要发送到外部网络的数据,其处理路径完全不同:

场景示例:用户从本机访问 http://www.google.com。

  1. 数据生成:应用程序生成数据包,设置目的IP为Google服务器的公网IP地址。
  2. 环回判断:检查目的IP是否为环回地址(如127.*),如果不是,则进入下一步。
  3. 目的地判定:确认目的IP不是本机IP、也不是广播或多播地址。
  4. 外部发送决策:IP层判定此数据包需实际向外传输。
  5. ARP解析:通过ARP协议查询下一跳路由器(或目标主机,若在同一局域网)的MAC地址。
  6. 网络发送:将IP数据报封装成以太网帧,交由网络驱动程序通过物理网卡发送至外部网络。
// 伪代码:IP输出函数处理逻辑
int ip_output(packet)
{
    // 判断是否为发往本机或环回地址
    if (packet->dst_ip == LOOPBACK ||
        packet->dst_ip == MY_IP ||
        packet->dst_ip == BROADCAST)
    {
        // 内部环回:直接送入输入队列,不发送到网络
        enqueue(&ip_input_queue, packet);
        return OK;
    }
    
    // 对于其他情况,执行正常外发流程
    // 获取下一跳MAC地址并通过网卡发送
    resolve_mac_and_send(packet);
}

由此可见,本机环回的数据传输仅停留在网络层内部,不会触及链路层的实际发送机制,最多只到达IP输入队列即告完成。

ip_input_queue.enqueue(packet);

return SUCCESS; // 返回“成功”,但实际上数据并未真正发送出去

// 处理真实的外部数据包:继续向协议栈下层传递

return ethernet_send(packet); // 数据进入数据链路层进行处理

四、私网IP与公网IP的区别

在组织内部搭建局域网时,若IP地址仅用于内部通信而不直接接入Internet,则理论上可使用任意IP地址。然而,根据RFC 1918标准,明确规定了用于局域网建设的私有IP地址范围:

  • 10.*:前8位为网络号,共提供约1677万个地址。
  • 172.16.* 至 172.31.*:前12位为网络号,总计约104万可用地址。
  • 192.168.*:前16位为网络号,包含65,536个地址。

处于上述范围内的IP地址被称为私网IP(或内网IP),其余则统称为公网IP(或全局IP)。

当我们连接云服务器时,所使用的IP地址即为该服务器的公网IP。

通过执行ifconfig命令可以查看本机的私网IP信息。其中,网络接口lo(loopback)代表本地回环接口,而eth0通常表示主机的主网络接口。例如,当前机器的私网IP为10.1.20.8。

需要注意的是,图中显示的119.29.74.118是云服务器对外暴露的公网IP地址;而10.1.20.8则是该服务器在腾讯云内部使用的私网IP地址,恰好落在第一类私网地址范围内。

三、IP地址资源的限制问题

IPv4地址由4字节(32位)组成,总共可提供2^32个地址,约为43亿个。TCP/IP协议要求每台联网主机都必须拥有一个唯一的IP地址。

全球人口已超过70亿,即使只有一半人拥有智能设备,也需要数十亿个IP地址。此外,除手机外,电脑、智能手表、智能家居设备等均需独立IP地址才能接入网络。

更复杂的是,某些设备可能需要多个IP地址,且大量路由器、网关等网络设备也需分配IP。同时,部分特殊用途的IP地址无法用于常规分配,进一步加剧了地址紧张。

因此,43亿个IPv4地址早已不足以满足需求。为此提出了CIDR(无类别域间路由)技术,对原有五类网络结构进行子网细分,旨在减少地址浪费,提高利用率。

尽管CIDR有效提升了地址使用效率,但它并未增加IP地址的总量上限。

为应对IP地址短缺,主要采取以下几种解决方案:

  • 动态IP分配:仅当设备实际接入网络时才分配IP地址。同一MAC地址的设备每次接入可能获得不同IP,避免长期占用固定地址。
  • NAT技术:允许不同局域网中存在相同IP地址的设备共存。NAT不仅缓解了地址不足问题,还能隐藏内部网络结构,增强安全性,抵御外部攻击。
  • IPv6协议:采用16字节(128位)表示IP地址,极大扩展了地址空间,从根本上解决地址枯竭问题。但IPv6与IPv4不兼容,属于独立运行的协议体系,目前尚未全面普及。

关于网络访问与运营商的角色

用户为何需要向运营商支付费用?虽然我们享受的是互联网公司的服务,但实际的数据传输依赖于运营商构建的物理基础设施。

我们的请求并非直接抵达目标服务器,而是经过运营商部署的基站、光缆、交换机和各级路由器,最终完成转发。因此,缴纳的“网费”实质上是购买接入通信网络的权限。

没有运营商提供的底层网络支撑,互联网公司无法存在——因为它们的服务完全建立在网络连通性之上。

所有用户发出的数据,必须先经过运营商的网络节点,再被导向目标服务器。因此,诸如网段划分、子网规划等网络管理工作,通常由运营商负责实施。

数据如何抵达目标服务器

路由器是一种用于连接两个或多个网络的硬件设备,其上设有两种主要接口:LAN口和WAN口。(从跨网络通信的功能也可推断出,路由器至少需要两个端口来实现转发。)

LAN口(Local Area Network):用于连接本地局域网设备,如交换机、集线器或个人计算机。

WAN口(Wide Area Network):连接广域网,通常指向互联网。

我们将LAN口配置的IP地址称为LAN口IP,也叫子网IP;而WAN口所配置的IP地址则称为WAN口IP,亦即外网IP

我们日常使用的设备如电脑、家用路由器,与运营商的网络设施(包括各级运营商路由器)、广域网以及目标服务器之间的连接关系可以大致描述如下: 在不同局域网中,尽管子网内的IP地址常常设置为相同的默认值(例如 192.168.1.1),但只要同一子网内各主机的IP不重复即可。而不同子网之间即使使用相同的私有IP地址也不会冲突,因为它们处于相互隔离的网络环境中。 每个家庭宽带中的路由器实际上充当了运营商更大一级网络中的一个节点。这种结构可能包含多层级的运营商路由设备,最终最外层的WAN口所持有的IP地址便是公网IP,具备全球唯一性。 若希望自研的服务程序能被互联网上的用户访问,就必须将其部署在拥有公网IP的服务器上。这类服务器可通过阿里云、腾讯云等平台租用或购买获得。 值得注意的是,任何数据包一旦被识别为目的地址属于私有IP范围(如10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x),网络设备将立即丢弃该数据包,并停止进一步转发。因此,私有IP无法在公共互联网上传输,否则会破坏IP地址应有的全球唯一属性。 接下来,通过一个形象的比喻来帮助理解 NAT(网络地址转换)的工作机制: 此外,还有一个现实层面的原因:如果所有终端用户都直接分配公网IP,那么就有可能绕开运营商的管理机制,导致非法上网行为难以监控,计费系统也无法有效运行,这是运营商无法接受的情况。 关于局域网间的通信问题,两个独立局域网内的主机通常不能在不经过公网的情况下实现直连。其根本原因在于:要完成数据传输,发送方必须明确知道接收方的IP地址。 即便某台主机获取到了另一局域网中设备的IP地址,但由于这些地址均为私有IP,极有可能出现重复。比如两台设备都使用了192.168.1.100这一地址。 当一台主机尝试向与其自身IP相同的目标地址发送数据时,操作系统会判定该请求是发往本机的,从而不会将数据包向外转发,而是直接在本地处理,导致通信失败。 因此,从一个局域网向另一个局域网发送数据,几乎必须依赖公网作为中转路径。我们在进行即时通讯时,并非直接将信息从一方局域网传送到另一方,而是先将数据上传至中心服务器(经由公网),再由服务器通过公网转发给对方所在的局域网。 不过,凡事总有例外。确实存在一种名为“内网穿透”的技术,能够实现跨公网的局域网到局域网之间的直接通信。 以下是该技术中典型的“打洞”过程(DS打洞机制)的具体步骤: **第一步:注册阶段——告知位置信息** 假设你(A)和朋友(B)分别位于不同的局域网中,你们都需要主动联系一个第三方中介服务(S)。 - A → S:“你好,我是A,我现在使用的公网联系方式是 [1.1.1.1:50000]。” (其中1.1.1.1是A所在公寓的公网IP,50000是由NAT设备动态分配的临时端口号) - B → S:“你好,我是B,我的公网联系方式是 [2.2.2.2:60000]。” 此时,中介S已经记录下: - 可通过 [1.1.1.1:50000] 联系到A; - 可通过 [2.2.2.2:60000] 联系到B。 关键点在于:由于A和B是主动发起对外连接的一方,各自局域网的NAT设备允许此次通信建立,并生成临时映射规则。例如,A的路由器会记住:“来自A-101房间对S的呼叫,出口使用外线号码50000;将来从S回拨此号码的通话应转接给A-101。” 这便创建了一个临时通道。 **第二步:打洞阶段——建立双向通路** 现在,中介S开始协助A与B建立直接连接。 S分别通知双方对方的公网可达地址: - S告诉A:“B的地址是 [2.2.2.2:60000],你可以试着联系他。” - S告诉B:“A的地址是 [1.1.1.1:50000],你现在可以给他打电话。” 随后进入“探路”与“开洞”环节: - A立即根据S提供的信息,向 [2.2.2.2:60000] 发起连接尝试。 当这个请求到达B所在网络的NAT设备(NAT_B)时,保安发现这是一个来自未知源 [1.1.1.1:50000] 的入站请求,而B并未主动发起对该地址的连接,因此很可能被拦截或拒绝。 然而,这次“试探性”通信具有重要意义——它触发了A自己这边的NAT设备(NAT_A)生成一条新的放行规则:“允许来自 [2.2.2.2:60000] 的响应流量进入,并送达A-101。” 这相当于在防火墙上为B方向打开了一个定向“洞口”。 与此同时,B也按照指示向A的地址 [1.1.1.1:50000] 发起连接。 当该请求抵达A的NAT_A设备时,系统检查后发现:“刚才A刚主动联系过这个地址!” 因此符合“内主动,外通”的原则,于是允许该数据包通过并成功送达A。 同理,在B的网络侧,A发出的探测包也为B打开了相应的返回通路。 **第三步:原理剖析——为何能成功?** 整个机制的核心在于利用了NAT设备的一项基本特性:**“内主动,外通”**。 也就是说,只要内部主机曾主动向外部某个IP:Port发起过连接,NAT就会暂时允许该外部地址反向发起连接并将其映射回原主机。 所谓“打洞”,本质上就是让A和B同时向对方的公网地址发送探测包。虽然这些初始数据包本身可能被对方的NAT丢弃,但其真正作用是在各自的NAT设备上“预设”一条允许反向通信的临时规则,即为对方开启一个可进入的“后门”。 这样一来,一旦双方的探测包均成功触发规则创建,后续的数据流便可实现穿越NAT的双向直连,达成真正的P2P通信效果。

时机的把握至关重要:只有当A和B几乎在同一时刻向对方发送“探路”数据包时,才能保证在对方的数据包到达时,本端的通信通路已经成功建立。

五、路由机制

数据在网络中的传输过程,本质上是一跳一跳地进行路径查询与转发。所谓“一跳”,指的是数据链路层中的一个传输区间,在以太网环境中,具体表现为从源MAC地址到目的MAC地址之间的帧传输范围。

在IP数据包的传输路径上,通常会经过多个路由器。每一个路由器都会参与数据包的转发决策。当数据包抵达某个路由器时,该设备会读取其目的IP地址,并根据内部信息判断下一跳的转发方向。

路由器在查询路由表后,可能产生以下三种结果:

  • 通过路由表匹配,确定数据包应转发至的具体子网;
  • 未找到匹配的路由条目,此时将数据包交由默认路由处理;
  • 发现目标网络即为当前所在本地网络,则直接将数据包交付给该网络内的目标主机。

路由表的工作原理

每个路由器都维护着一张路由表,用于指导数据包的转发行为。我们可以通过系统命令如 route 来查看云服务器中的路由表内容。

当数据最终被转发至目标局域网时,通信便进入了局域网层面,这也意味着数据传输再次回归到数据链路层的处理范畴。关于这一层的细节,后续会进一步展开说明。

总结:接下来我们将深入探讨数据链路层,这也是TCP/IP四层模型中最底层的一层,承担着实际物理传输的关键职责。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Linux Lin Internet Protocol network

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-20 04:12