程序员大海H头像
【计算机网络】第 3 篇:MAC 地址、IP 地址和端口有什么区别?一次讲清楚封面图

【计算机网络】第 3 篇:MAC 地址、IP 地址和端口有什么区别?一次讲清楚

系列: 从 0 开始学习计算机网络
适合读者: 计算机专业学生、网络基础薄弱的开发者、Java 后端学习者
本文关键词: MAC 地址、IP 地址、端口号、TCP 连接、Java 后端

一、引言:访问一个接口,为什么会出现这么多地址?

在 Java 后端开发中,我们经常访问这样的地址:

http://192.168.1.20:8080/api/hello

这里能看到 IP 地址和端口号。与此同时,电脑网卡还有 MAC 地址。它们都像是在“标识某个东西”,但作用并不相同。

如果把 MAC 地址、IP 地址和端口混为一谈,就很难理解:客户端访问远程服务器时,网络究竟根据什么把数据送到正确的位置?

本文会用一个请求场景解释三者的分工,并说明为什么访问远程服务器时,客户端发出的第一帧通常并不会把远端服务器的 MAC 地址作为目的地址。

二、先记住三者的分工

在这里插入图片描述

名称主要作用可以先怎么理解
MAC 地址链路层帧在当前链路上的交付当前这一跳把帧交给谁
IP 地址网络层寻址和路由转发数据最终要去哪个网络地址
端口号区分传输层通信端点数据交给哪个服务或通信端点

它们不是三种互相竞争的地址,而是在不同层次协同工作。

三、MAC 地址:当前链路上的帧交给谁?

MAC 地址常见于以太网和 Wi-Fi 等链路技术中。以太网帧首部包含源 MAC 地址和目的 MAC 地址,帮助链路上的设备处理帧。

例如,在一个局域网里:

客户端 MAC:AA-AA-AA-AA-AA-AA
网关 MAC:  BB-BB-BB-BB-BB-BB

当客户端要把 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:192.168.1.10
服务端 IP:203.0.113.20

当客户端访问远程服务时,IP 层会根据目标 IP 地址进行寻址。路由器查看路由信息,决定应该把 IP 包转发到哪里。

需要注意:IP 地址不一定是设备永久固定的。它可能由 DHCP 分配、由管理员配置,也可能因网络切换而改变。经过 NAT(网络地址转换)设备时,IP 地址或端口也可能被改写。

4.1 为什么还需要 MAC 地址?

因为 IP 地址和 MAC 地址解决的问题不同。

  • IP 地址支持跨网络寻址和路由;
  • MAC 地址帮助当前链路把帧交给下一跳。

可以把跨网段发送理解为:IP 包携带着端到端通信所需的网络层地址信息,而每一跳的链路层帧负责把它送到当前链路的下一站。

在这里插入图片描述

假设客户端 192.168.1.10 访问远端服务 203.0.113.20:

  1. 客户端判断目标不在本地子网,需要交给默认网关。
  2. 客户端通过 ARP 等机制解析本地网关的 IPv4 地址对应的 MAC 地址(具体过程取决于网络环境)。
  3. 第一跳以太网帧的目的 MAC 通常是网关的 MAC,而 IP 包的目的 IP 仍是远端服务器的 IP。
  4. 路由器根据路由信息转发 IP 包,并使用出口链路对应的链路层格式重新封装。
  5. 在最终链路上,帧的目的 MAC 才会指向目标服务器所在链路上的下一跳接口;在直连以太网场景中通常是服务器网卡的 MAC。

在没有 NAT 的简化场景中,源 IP 和目的 IP 通常保持不变;但 IPv4 TTL 会在路由转发时递减。真实网络可能还涉及隧道、NAT、防火墙和其他处理。

五、端口号:一台机器运行多个服务,数据交给谁?

IP 地址可以把数据送到目标主机,但一台主机可能同时运行多个网络服务。传输层需要进一步区分通信端点,TCP 和 UDP 都使用端口号。

例如,一台服务器可能提供:

服务示例端口常见用途
HTTP 服务80常见 HTTP 默认端口
HTTPS 服务443常见 HTTPS 默认端口
自定义 Spring Boot 服务8080开发或部署中常见的应用端口
MySQL 服务3306常见默认端口

这些只是常见约定,服务可以配置为监听其他端口。端口号范围为 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 + 目的端口

这有助于理解为什么多个客户端可以同时访问同一个服务端口,而不会因为目的端口相同就被视为同一条 TCP 连接。

六、把三者放进一次 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:端口号一定对应一个固定进程

不准确。端口由操作系统和应用按网络通信规则使用;服务可以启动、停止或改变监听端口,客户端源端口也常由系统动态分配。

八、本篇总结

记住这三句话即可:

  1. MAC 地址: 解决当前链路上的帧交付问题。
  2. IP 地址: 解决网络层寻址和跨网络转发问题。
  3. 端口号: 帮助传输层区分通信端点和服务。

访问远程 Java 服务时,这三者不是互相替代,而是共同完成通信。IP 地址告诉网络层数据要去哪里,端口让传输层知道要交给哪个通信端点,而链路层 MAC 地址负责当前这一跳的帧交付。

下一篇预告:《【计算机网络】第 4 篇:ARP、DHCP、子网掩码和路由到底在做什么?》。我们会继续沿着“客户端如何找到并访问服务器”的路径,解释 IP 地址如何配置、网关如何选择,以及设备如何知道下一跳的 MAC 地址。

我是程序员大海,下一期见.

参考资料

  1. RFC 791:Internet Protocol (IPv4)
  2. RFC 826:An Ethernet Address Resolution Protocol
  3. RFC 9293:Transmission Control Protocol (TCP)
  4. RFC 768:User Datagram Protocol
  5. IANA:Service Name and Transport Protocol Port Number Registry

本文中的 IP、MAC 和端口示例用于教学说明,不代表真实设备或实际抓包结果。真实网络中的地址、端口和转发行为会受网络配置、NAT、防火墙、虚拟网络等因素影响。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_86617027/article/details/168882257

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--