【计算机网络】MAC 地址、IP 地址和端口有什么区别?
2026/10/24 11:00:57
一、引言:访问一个接口,为什么会出现这么多地址?这里能看到 IP 地址和端口号。与此同时,电脑网卡还有 MAC 地址。它们都像是在“标识某个东西”,但作用并不相同。
如果把 MAC 地址、IP 地址和端口混为一谈,就很难理解:客户端访问远程服务器时,网络究竟根据什么把数据送到正确的位置?
本文会用一个请求场景解释三者的分工,并说明为什么访问远程服务器时,客户端发出的第一帧通常并不会把远端服务器的 MAC 地址作为目的地址。
二、先记住三者的分工
它们不是三种互相竞争的地址,而是在不同层次协同工作。
三、MAC 地址:当前链路上的帧交给谁? MAC 地址常见于以太网和 Wi-Fi 等链路技术中。以太网帧首部包含源 MAC 地址和目的 MAC 地址,帮助链路上的设备处理帧。
例如,在一个局域网里:
当客户端要把 IP 包交给同一局域网中的默认网关时,以太网帧可以使用客户端 MAC 作为源 MAC、网关 MAC 作为目的 MAC。
3.1 MAC 地址是不是设备永远不变的身份证?
不是。MAC 地址通常由网络接口使用,但它并不是可靠的全球设备身份证:
网络接口可能有出厂分配的地址;
软件可以配置或伪装 MAC 地址;
Wi-Fi 设备可能使用随机化 MAC 地址来减少跟踪;
虚拟机、容器网络和虚拟网卡也可能有自己的 MAC 地址。
因此,更准确的理解是:MAC 地址用于特定链路技术中的帧交付,不适合直接当作某台物理设备永久不变的身份。
3.2 MAC 地址能不能直接把数据送到任何地方?
不能。MAC 地址通常只在当前链路交付过程中起作用。跨越路由器时,路由器会处理收到的链路层帧,并为下一条链路重新封装数据。
这也是为什么远程服务器的 MAC 地址通常不会出现在客户端发出的第一跳以太网帧中。
四、IP 地址:数据要去哪个网络位置?
IP 地址用于网络层寻址和路由转发。常见版本有 IPv4 和 IPv6。
例如:
当客户端访问远程服务时,IP 层会根据目标 IP 地址进行寻址。路由器查看路由信息,决定应该把 IP 包转发到哪里。
需要注意:IP 地址不一定是设备永久固定的。它可能由 DHCP 分配、由管理员配置,也可能因网络切换而改变。经过 NAT (网络地址转换)设备时,IP 地址或端口也可能被改写。
4.1 为什么还需要 MAC 地址?
因为 IP 地址和 MAC 地址解决的问题不同。
IP 地址支持跨网络寻址和路由;
MAC 地址帮助当前链路把帧交给下一跳。
可以把跨网段发送理解为:IP 包携带着端到端通信所需的网络层地址信息,而每一跳的链路层帧负责把它送到当前链路的下一站。
假设客户端 192.168.1.10 访问远端服务 203.0.113.20:
客户端判断目标不在本地子网,需要交给默认网关。
客户端通过 ARP 等机制解析本地网关的 IPv4 地址对应的 MAC 地址(具体过程取决于网络环境)。
第一跳以太网帧的目的 MAC 通常是网关的 MAC,而 IP 包的目的 IP 仍是远端服务器的 IP。
路由器根据路由信息转发 IP 包,并使用出口链路对应的链路层格式重新封装。
在最终链路上,帧的目的 MAC 才会指向目标服务器所在链路上的下一跳接口;在直连以太网场景中通常是服务器网卡的 MAC。
在没有 NAT 的简化场景中,源 IP 和目的 IP 通常保持不变;但 IPv4 TTL 会在路由转发时递减。真实网络可能还涉及隧道、NAT、防火墙和其他处理。
五、端口号:一台机器运行多个服务,数据交给谁?
IP 地址可以把数据送到目标主机,但一台主机可能同时运行多个网络服务。传输层需要进一步区分通信端点,TCP 和 UDP 都使用端口号。
例如,一台服务器可能提供:
这些只是常见约定,服务可以配置为监听其他端口。端口号范围为 0~65535,其中 0 通常保留作特殊用途;实际应用一般不会把 0 当作普通服务端口来监听。
5.1 源端口和目的端口 当客户端向服务器发起 TCP 连接时,通信两端都有端口信息:
这里:
端口号不是某个进程永久不变的身份证。端口的分配和使用受 操作系统 、传输协议及应用行为影响;TCP 和 UDP 的端口空间也需要结合各自协议理解。
5.2 为什么 TCP 连接不只看端口号?
同一台服务器的 TCP 8080 端口可以同时处理多个客户端连接。操作系统和 TCP 协议栈会结合连接两端的地址和端口等信息区分连接。
一个 TCP 连接通常可用以下四元组描述:
如果把传输层协议也纳入区分,则常说的五元组是:
这有助于理解为什么多个客户端可以同时访问同一个服务端口,而不会因为目的端口相同就被视为同一条 TCP 连接。
六、把三者放进一次 Java HTTP 请求里 下面使用 Java 11 及以上版本的 HttpClient 访问一个 HTTP/1.1 服务:
运行前提
JDK 11 或更高版本;
本机已有一个可访问的 HTTP 服务监听 127.0.0.1:8080;
服务端存在 /api/hello 路径;
示例中的地址只是本机测试地址,不保证你的电脑上已有对应服务。
在这个例子里:
127.0.0.1 是回环地址,表示本机;
8080 是 URL 中明确指定的目的端口;
客户端连接通常还会使用一个源端口;
对于回环通信,实际链路处理方式与通过物理网卡访问远程主机不同,因此不要用这个例子来推断远程通信的 MAC 地址变化。
如果把 URL 改为远程服务器地址,操作系统网络栈会根据路由和链路情况处理 IP 包及链路层帧。业务代码一般不需要手动填写 TCP 首部或 MAC 地址。
七、常见误区
误区 1:IP 地址就是 MAC 地址
不是。IP 地址用于网络层寻址和路由;MAC 地址用于当前链路上的帧交付。它们的格式、作用范围和工作层次不同。
误区 2:发送给远程服务器时,目的 MAC 就是远程服务器的 MAC
通常不是。第一跳帧的目的 MAC 一般是默认网关的 MAC。路由器会在下一条链路重新封装帧。
误区 3:端口号可以单独定位全球唯一的服务
不行。端口号只有结合主机地址、传输层协议和通信方向等上下文才有意义。不同主机可以同时使用 8080 端口。
误区 4:一个端口只对应一个客户端
不对。服务器同一个 TCP 监听端口可以接收多个客户端连接,连接通过两端地址和端口等信息区分。
误区 5:端口号一定对应一个固定进程
不准确。端口由操作系统和应用按网络通信规则使用;服务可以启动、停止或改变监听端口,客户端源端口也常由系统动态分配。
八、本篇总结
记住这三句话即可:
MAC 地址: 解决当前链路上的帧交付问题。
IP 地址: 解决网络层寻址和跨网络转发问题。
端口号: 帮助传输层区分通信端点和服务。
访问远程 Java 服务时,这三者不是互相替代,而是共同完成通信。IP 地址告诉网络层数据要去哪里,端口让传输层知道要交给哪个通信端点,而链路层 MAC 地址负责当前这一跳的帧交付。
- <blockquote>http://192.168.1.20:8080/api/hello
如果把 MAC 地址、IP 地址和端口混为一谈,就很难理解:客户端访问远程服务器时,网络究竟根据什么把数据送到正确的位置?
本文会用一个请求场景解释三者的分工,并说明为什么访问远程服务器时,客户端发出的第一帧通常并不会把远端服务器的 MAC 地址作为目的地址。
二、先记住三者的分工
它们不是三种互相竞争的地址,而是在不同层次协同工作。
三、MAC 地址:当前链路上的帧交给谁? MAC 地址常见于以太网和 Wi-Fi 等链路技术中。以太网帧首部包含源 MAC 地址和目的 MAC 地址,帮助链路上的设备处理帧。
例如,在一个局域网里:
- 客户端 MAC:AA-AA-AA-AA-AA-AA
- 网关 MAC: BB-BB-BB-BB-BB-BB
3.1 MAC 地址是不是设备永远不变的身份证?
不是。MAC 地址通常由网络接口使用,但它并不是可靠的全球设备身份证:
网络接口可能有出厂分配的地址;
软件可以配置或伪装 MAC 地址;
Wi-Fi 设备可能使用随机化 MAC 地址来减少跟踪;
虚拟机、容器网络和虚拟网卡也可能有自己的 MAC 地址。
因此,更准确的理解是:MAC 地址用于特定链路技术中的帧交付,不适合直接当作某台物理设备永久不变的身份。
3.2 MAC 地址能不能直接把数据送到任何地方?
不能。MAC 地址通常只在当前链路交付过程中起作用。跨越路由器时,路由器会处理收到的链路层帧,并为下一条链路重新封装数据。
这也是为什么远程服务器的 MAC 地址通常不会出现在客户端发出的第一跳以太网帧中。
四、IP 地址:数据要去哪个网络位置?
IP 地址用于网络层寻址和路由转发。常见版本有 IPv4 和 IPv6。
例如:
- 客户端 IP:192.168.1.10
- 服务端 IP:203.0.113.20
需要注意:IP 地址不一定是设备永久固定的。它可能由 DHCP 分配、由管理员配置,也可能因网络切换而改变。经过 NAT (网络地址转换)设备时,IP 地址或端口也可能被改写。
4.1 为什么还需要 MAC 地址?
因为 IP 地址和 MAC 地址解决的问题不同。
IP 地址支持跨网络寻址和路由;
MAC 地址帮助当前链路把帧交给下一跳。
可以把跨网段发送理解为:IP 包携带着端到端通信所需的网络层地址信息,而每一跳的链路层帧负责把它送到当前链路的下一站。
假设客户端 192.168.1.10 访问远端服务 203.0.113.20:
客户端判断目标不在本地子网,需要交给默认网关。
客户端通过 ARP 等机制解析本地网关的 IPv4 地址对应的 MAC 地址(具体过程取决于网络环境)。
第一跳以太网帧的目的 MAC 通常是网关的 MAC,而 IP 包的目的 IP 仍是远端服务器的 IP。
路由器根据路由信息转发 IP 包,并使用出口链路对应的链路层格式重新封装。
在最终链路上,帧的目的 MAC 才会指向目标服务器所在链路上的下一跳接口;在直连以太网场景中通常是服务器网卡的 MAC。
在没有 NAT 的简化场景中,源 IP 和目的 IP 通常保持不变;但 IPv4 TTL 会在路由转发时递减。真实网络可能还涉及隧道、NAT、防火墙和其他处理。
五、端口号:一台机器运行多个服务,数据交给谁?
IP 地址可以把数据送到目标主机,但一台主机可能同时运行多个网络服务。传输层需要进一步区分通信端点,TCP 和 UDP 都使用端口号。
例如,一台服务器可能提供:
这些只是常见约定,服务可以配置为监听其他端口。端口号范围为 0~65535,其中 0 通常保留作特殊用途;实际应用一般不会把 0 当作普通服务端口来监听。
5.1 源端口和目的端口 当客户端向服务器发起 TCP 连接时,通信两端都有端口信息:
- 客户端:192.168.1.10:53124
- 服务端:203.0.113.20:8080
- 53124 是示例客户端源端口,通常由操作系统从可用的临时端口范围中选择;
- 8080 是示例服务端口,应用服务可以监听它;
- 这些端口值仅用于说明,不代表某次真实抓包结果。
端口号不是某个进程永久不变的身份证。端口的分配和使用受 操作系统 、传输协议及应用行为影响;TCP 和 UDP 的端口空间也需要结合各自协议理解。
5.2 为什么 TCP 连接不只看端口号?
同一台服务器的 TCP 8080 端口可以同时处理多个客户端连接。操作系统和 TCP 协议栈会结合连接两端的地址和端口等信息区分连接。
一个 TCP 连接通常可用以下四元组描述:
- 源 IP + 源端口 + 目的 IP + 目的端口
- 传输层协议 + 源 IP + 源端口 + 目的 IP + 目的端口
六、把三者放进一次 Java HTTP 请求里 下面使用 Java 11 及以上版本的 HttpClient 访问一个 HTTP/1.1 服务:
- import java.net.URI;
- import java.net.http.HttpClient;
- import java.net.http.HttpRequest;
- import java.net.http.HttpResponse;
- public class PortDemo {
- public static void main(String[] args) throws Exception {
- HttpClient client = HttpClient.newBuilder()
- .version(HttpClient.Version.HTTP_1_1)
- .build();
- HttpRequest request = HttpRequest.newBuilder()
- .uri(URI.create(
- "http://127.0.0.1:8080/api/hello"))
- .GET()
- .build();
- HttpResponse<String> response = client.send(
- request,
- HttpResponse.BodyHandlers.ofString());
- System.out.println("状态码:" + response.statusCode());
- System.out.println("响应体:" + response.body());
- }
- }
JDK 11 或更高版本;
本机已有一个可访问的 HTTP 服务监听 127.0.0.1:8080;
服务端存在 /api/hello 路径;
示例中的地址只是本机测试地址,不保证你的电脑上已有对应服务。
在这个例子里:
127.0.0.1 是回环地址,表示本机;
8080 是 URL 中明确指定的目的端口;
客户端连接通常还会使用一个源端口;
对于回环通信,实际链路处理方式与通过物理网卡访问远程主机不同,因此不要用这个例子来推断远程通信的 MAC 地址变化。
如果把 URL 改为远程服务器地址,操作系统网络栈会根据路由和链路情况处理 IP 包及链路层帧。业务代码一般不需要手动填写 TCP 首部或 MAC 地址。
七、常见误区
误区 1:IP 地址就是 MAC 地址
不是。IP 地址用于网络层寻址和路由;MAC 地址用于当前链路上的帧交付。它们的格式、作用范围和工作层次不同。
误区 2:发送给远程服务器时,目的 MAC 就是远程服务器的 MAC
通常不是。第一跳帧的目的 MAC 一般是默认网关的 MAC。路由器会在下一条链路重新封装帧。
误区 3:端口号可以单独定位全球唯一的服务
不行。端口号只有结合主机地址、传输层协议和通信方向等上下文才有意义。不同主机可以同时使用 8080 端口。
误区 4:一个端口只对应一个客户端
不对。服务器同一个 TCP 监听端口可以接收多个客户端连接,连接通过两端地址和端口等信息区分。
误区 5:端口号一定对应一个固定进程
不准确。端口由操作系统和应用按网络通信规则使用;服务可以启动、停止或改变监听端口,客户端源端口也常由系统动态分配。
八、本篇总结
记住这三句话即可:
MAC 地址: 解决当前链路上的帧交付问题。
IP 地址: 解决网络层寻址和跨网络转发问题。
端口号: 帮助传输层区分通信端点和服务。
访问远程 Java 服务时,这三者不是互相替代,而是共同完成通信。IP 地址告诉网络层数据要去哪里,端口让传输层知道要交给哪个通信端点,而链路层 MAC 地址负责当前这一跳的帧交付。