网络寻址详解:从IP地址到MAC地址再到端口号的完整过程

前言

在浏览器里输入一个网址并按下回车,到页面内容出现,这中间发生了什么?

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的工作流程如下:

  1. 主机发送一个ARP请求广播:"谁的IP地址是192.168.10.1?请告诉我你的MAC地址。"

  2. 局域网内的所有设备都会收到这个请求,但只有IP地址匹配的设备会回应。

  3. 目标设备回复ARP响应,包含自己的MAC地址。

  4. 请求方将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设备维护一张转换表。当网站返回数据时,根据目的端口号(4000140002)判断应该转发给内部哪台设备。

五、完整流程总结

一次完整的网络寻址过程可以概括为以下步骤:

第一步:确定目标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地址负责本地链路的设备交付,端口号负责主机内部的进程分发。理解这三层的分工和协作,就理解了数据包在网络中传输的完整逻辑。

相关推荐
比兔代理2 天前
正向代理与反向代理技术辨析,为什么代理 IP 属于正向代理
服务器·网络·http·ip
IpdataCloud2 天前
如何判断游戏注册IP是住宅宽带还是机房代理?IP风险识别看ASN、IDC标签与风险分
tcp/ip·ip
承渊政道3 天前
OpenTTD异地联机指南:用星空组网创建私有房间、连接好友与排查故障
远程连接·端口·星空组网·openttd
xiaoye-duck3 天前
《Linux 网络编程》深入理解 IP 协议(二):网段划分、私有 IP 与 NAT 地址转换
linux·网络·ip
胡志辉的博客3 天前
【完全开源】IP 纯净度检测 可一键部署到自己的CF
前端·javascript·chrome·ip·chromium
csdn_aspnet3 天前
.NetCore Webapi 接口验证请求来源
.netcore·ip·token·签名·webapi·cors·sign
IPdodo_4 天前
住宅 IP 与数据中心 IP 到底差在哪:用 RDAP、BGP 和多源证据做工程判定
网络·网络安全·代理模式·ip
xiaoye-duck4 天前
《Linux 网络编程》深入理解 IP 协议(一):网络层基础与 IP 协议头详解
linux·网络·ip
2401_873479407 天前
IP属地为什么有时显示外省?用IP查询工具核查动态分配、运营商出口与GeoIP库
python·tcp/ip·ip