前言
在浏览器里输入一个网址并按下回车,到页面内容出现,这中间发生了什么?
DNS解析、TCP三次握手是常被提及的环节。但一个更基础的问题是:数据包具体是怎么找到目标主机的?
这篇文章把这个问题拆成三个阶段:先找到正确的网络(IP地址),再找到网络里的正确设备(MAC地址),最后找到设备上的正确程序(端口号)。
一、三层寻址模型
TCP/IP网络中,数据包的寻址是分层完成的。每一层关注不同的粒度:
| 寻址层级 | 使用的地址 | 作用范围 | 核心问题 |
|---|---|---|---|
| 网络层 | IP地址 | 全球互联网 | 目标主机在哪个网络? |
| 数据链路层 | MAC地址 | 本地局域网 | 当前链路上的下一跳设备是哪个? |
| 传输层 | 端口号 | 主机内部 | 数据应该交给哪个进程处理? |
数据包从源主机发出时,每一层依次完成自己的寻址任务,再交由下一层封装传输。
二、第一层:IP地址------找到正确的网络
2.1 IP地址的作用
IP地址是网络层的逻辑地址,核心作用是标识一台主机所在的网络,并为路由器提供转发依据。
IPv4地址是32位二进制数,通常写作点分十进制形式,例如192.168.1.100。一个IP地址包含两部分信息:网络号 和主机号。网络号标识主机所在的网络,主机号标识该网络中的具体设备。
以192.168.10.20/24为例,/24表示前24位是网络号(192.168.10.0),后8位是主机号(.20)。同一网络中的所有设备共享相同的网络号。
2.2 路由表决定路径
当主机需要发送数据包时,它不会直接"知道"目标在哪里。主机会查询本机路由表,根据目标IP地址选择一条匹配的路由。
路由表的核心条目是默认网关,通常写作:
text
default via 192.168.10.1 dev eth0
这条规则的含义是:如果目标IP不在本机直连的网段内,就把数据包交给默认网关(192.168.10.1),由网关负责继续转发。
例如,目标地址是8.8.8.8,不属于192.168.10.0/24网段,主机就会使用默认路由,将数据包发往网关。此时,IP数据包的目标IP仍然是8.8.8.8,但数据帧的目标MAC地址被设置成网关的MAC地址。
2.3 路由选择的核心原则:最长前缀匹配
路由表中可能同时存在多条匹配目标地址的路由。例如:
text
10.0.0.0/8
10.20.0.0/16
10.20.30.0/24
default via 192.168.10.1
访问10.20.30.45时,四条路由都"部分匹配",但/24的路由最具体(前缀最长),因此优先选用。
这一原则解释了为什么"明明配置了默认网关,数据却走了另一条线路"------很可能存在一条更具体的路由抢先匹配了目标地址。
三、第二层:MAC地址------找到当前链路上的设备
3.1 MAC地址的作用
IP地址解决了"目标在哪个网络"的问题,但没有解决"数据包在当前这段链路上具体发给谁"。
MAC地址(Media Access Control Address)是数据链路层的地址,用于标识本地网络中的网络接口 。每个网卡出厂时都烧录了一个全球唯一的MAC地址,格式为48位十六进制,例如00:1A:2B:3C:4D:5E。
MAC地址的关键特征是:只在当前局域网内有效。一旦数据包跨过路由器进入另一个网络,原来的MAC地址就失去意义,需要更换。
3.2 ARP:从IP地址找到MAC地址
主机知道目标IP地址,但不知道对应的MAC地址。这时需要使用ARP协议(Address Resolution Protocol)。
ARP的工作流程如下:
-
主机发送一个ARP请求广播:"谁的IP地址是
192.168.10.1?请告诉我你的MAC地址。" -
局域网内的所有设备都会收到这个请求,但只有IP地址匹配的设备会回应。
-
目标设备回复ARP响应,包含自己的MAC地址。
-
请求方将IP-MAC映射关系存入ARP缓存,后续通信直接查缓存。
ARP缓存条目有老化时间(通常几分钟到几十分钟),过期后需要重新发送ARP请求。ARP的请求是广播的,但响应是单播的。
3.3 跨网络时MAC地址的变化
这是理解网络寻址最关键的一点:IP地址在整个传输过程中基本保持不变,但MAC地址每一跳都在改变。
假设主机A(10.10.12.166)向主机B(10.10.11.66)发送数据包,中间经过路由器。
离开主机A时:
-
源IP:
10.10.12.166(主机A) -
目的IP:
10.10.11.66(主机B) -
源MAC:主机A的MAC
-
目的MAC:路由器的MAC地址
到达路由器后,路由器去掉旧的链路层头部,重新封装:
-
源IP:
10.10.12.166(不变) -
目的IP:
10.10.11.66(不变) -
源MAC:路由器的MAC
-
目的MAC:主机B的MAC
数据包到达主机B时,源MAC已经变成了路由器的MAC,而不是主机A的MAC。IP地址标识的是端到端的通信关系,MAC地址标识的是每一段链路上的点对点关系。
四、第三层:端口号------找到正确的应用程序
4.1 为什么需要端口号
数据包到达目标主机后,IP地址的任务就完成了。但主机上可能同时运行着Web服务器、SSH服务、数据库等多个网络程序,数据包应该交给哪一个?
这就是端口号的作用。端口号是16位数字(范围0-65535),用于标识主机上的具体进程或服务。
端口号分为三类:
-
系统端口(0-1023):分配给知名服务,如HTTP(80)、HTTPS(443)、SSH(22)、DNS(53)
-
用户端口(1024-49151):注册给用户应用程序
-
动态端口(49152-65535):客户端临时使用
4.2 端口号如何工作
当数据包到达目标主机时,传输层协议(TCP或UDP)检查数据包头部中的目的端口号,然后将数据交给绑定该端口的进程。
例如,访问一个网站时:
-
浏览器向服务器的80端口 (HTTP)或443端口(HTTPS)发送请求
-
服务器上的Web服务器进程(如Nginx)监听这些端口
-
操作系统收到数据包后,根据目的端口号将数据交给Nginx进程处理
4.3 客户端端口:NAT转换的关键
客户端发起请求时,操作系统会分配一个临时源端口号(通常是49152以上的动态端口)。这个端口号在NAT(网络地址转换)场景中扮演关键角色。
家庭或企业网络通常只有少量公网IP地址,但内部有大量设备需要上网。NAT设备(通常是路由器)通过端口号来区分不同内部设备的连接。
例如,内部设备A(192.168.1.10)和设备B(192.168.1.11)同时访问同一个网站:
-
设备A的连接:源IP
192.168.1.10,源端口50001 -
设备B的连接:源IP
192.168.1.11,源端口50001
NAT设备将两者都转换为公网IP,但分配不同的公网端口:
-
设备A → 公网
203.0.113.5:40001 -
设备B → 公网
203.0.113.5:40002
NAT设备维护一张转换表。当网站返回数据时,根据目的端口号(40001或40002)判断应该转发给内部哪台设备。
五、完整流程总结
一次完整的网络寻址过程可以概括为以下步骤:
第一步:确定目标IP
- 如果输入的是域名,先通过DNS解析获取目标IP地址
第二步:路由选择
-
主机查询路由表,根据目标IP选择出口接口和下一跳
-
如果目标在同一网段,直接使用ARP获取目标MAC
-
如果目标在其他网段,使用默认网关,ARP获取网关的MAC
第三步:数据帧封装
-
IP数据包被封装在以太网帧中
-
帧头包含源MAC和目的MAC(当前链路的下一跳)
-
IP头包含源IP和目的IP(端到端不变)
第四步:逐跳转发
-
数据帧到达路由器后,路由器去掉旧帧头,重新封装新帧头
-
源MAC变为路由器MAC,目的MAC变为下一跳设备MAC
-
IP地址保持不变
第五步:到达目标主机
-
目标主机收到数据帧,检查目的MAC是否匹配自己
-
匹配则去掉帧头,将IP数据包交给网络层
第六步:传输层根据端口号分发
-
传输层检查目的端口号
-
将数据交给绑定该端口的进程
第七步:应用层处理
- Web服务器、数据库等应用程序接收数据并处理
| 地址类型 | 变化规律 | 标识对象 | 作用范围 |
|---|---|---|---|
| IP地址 | 端到端不变 | 主机/接口 | 全球互联网 |
| MAC地址 | 每一跳改变 | 网络接口 | 本地局域网 |
| 端口号 | 端到端不变 | 进程/服务 | 单台主机 |
六、常见疑问
问题一:为什么不能只用IP地址寻址,还需要MAC地址?
IP地址是逻辑地址,与网络拓扑相关,设备移动或网络重构时需要重新配置。MAC地址是物理地址,烧录在硬件中,不随网络变化而改变。在局域网内部,设备之间的通信依赖MAC地址进行帧的交付。IP地址负责"路由到哪个网络",MAC地址负责"交付给本地哪个设备"。
问题二:为什么IP地址端到端不变,MAC地址每跳都变?
IP地址标识的是通信的端点(源主机和目标主机),这个关系在整个通信过程中不会改变。MAC地址标识的是当前链路上的下一跳,数据包每经过一个路由器,就进入了一个新的链路,需要新的链路层地址来完成交付。类似快递包裹上的收件人地址全程不变,但每一段运输使用的运输单据会更换。
问题三:端口号会冲突吗?
同一台主机上,一个端口号在同一时刻只能被一个进程绑定(对于TCP,通常如此)。不同主机之间的端口号互不影响------你的电脑上使用端口80,和服务器上使用端口80,没有任何关系。客户端使用的临时端口号由操作系统动态分配,保证在本机内不冲突即可。
总结:数据包找到目标主机的过程,本质上是三层地址的分工协作。IP地址负责跨网络的路径选择,MAC地址负责本地链路的设备交付,端口号负责主机内部的进程分发。理解这三层的分工和协作,就理解了数据包在网络中传输的完整逻辑。