微信扫一扫 分享朋友圈

已有 3 人浏览分享

开启左侧

【计算机网络】MAC 地址、IP 地址和端口有什么区别?

[复制链接]
3 0
一、引言:访问一个接口,为什么会出现这么多地址?
  1. <blockquote>http://192.168.1.20:8080/api/hello
复制代码
这里能看到 IP 地址和端口号。与此同时,电脑网卡还有 MAC 地址。它们都像是在“标识某个东西”,但作用并不相同。

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

本文会用一个请求场景解释三者的分工,并说明为什么访问远程服务器时,客户端发出的第一帧通常并不会把远端服务器的 MAC 地址作为目的地址。
二、先记住三者的分工
image.png
它们不是三种互相竞争的地址,而是在不同层次协同工作。
三、MAC 地址:当前链路上的帧交给谁? MAC 地址常见于以太网和 Wi-Fi 等链路技术中。以太网帧首部包含源 MAC 地址和目的 MAC 地址,帮助链路上的设备处理帧。
例如,在一个局域网里:
  1. 客户端 MAC:AA-AA-AA-AA-AA-AA
  2. 网关 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。

例如:
  1. 客户端 IP:192.168.1.10
  2. 服务端 IP:203.0.113.20
复制代码
当客户端访问远程服务时,IP 层会根据目标 IP 地址进行寻址。路由器查看路由信息,决定应该把 IP 包转发到哪里。

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

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

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

可以把跨网段发送理解为:IP 包携带着端到端通信所需的网络层地址信息,而每一跳的链路层帧负责把它送到当前链路的下一站。
image.png
假设客户端 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 都使用端口号。

例如,一台服务器可能提供:
image.png
这些只是常见约定,服务可以配置为监听其他端口。端口号范围为 0~65535,其中 0 通常保留作特殊用途;实际应用一般不会把 0 当作普通服务端口来监听。
5.1 源端口和目的端口 当客户端向服务器发起 TCP 连接时,通信两端都有端口信息:
  1. 客户端:192.168.1.10:53124
  2. 服务端:203.0.113.20:8080
复制代码
这里:
  • 53124 是示例客户端源端口,通常由操作系统从可用的临时端口范围中选择;
  • 8080 是示例服务端口,应用服务可以监听它;
  • 这些端口值仅用于说明,不代表某次真实抓包结果。
image.png

端口号不是某个进程永久不变的身份证。端口的分配和使用受 操作系统 、传输协议及应用行为影响;TCP 和 UDP 的端口空间也需要结合各自协议理解。
5.2 为什么 TCP 连接不只看端口号?

同一台服务器的 TCP 8080 端口可以同时处理多个客户端连接。操作系统和 TCP 协议栈会结合连接两端的地址和端口等信息区分连接。

一个 TCP 连接通常可用以下四元组描述:
  1. 源 IP + 源端口 + 目的 IP + 目的端口
复制代码
如果把传输层协议也纳入区分,则常说的五元组是:
  1. 传输层协议 + 源 IP + 源端口 + 目的 IP + 目的端口
复制代码
这有助于理解为什么多个客户端可以同时访问同一个服务端口,而不会因为目的端口相同就被视为同一条 TCP 连接。
六、把三者放进一次 Java HTTP 请求里 下面使用 Java 11 及以上版本的 HttpClient 访问一个 HTTP/1.1 服务:
  1. import java.net.URI;
  2. import java.net.http.HttpClient;
  3. import java.net.http.HttpRequest;
  4. import java.net.http.HttpResponse;

  5. public class PortDemo {
  6.     public static void main(String[] args) throws Exception {
  7.         HttpClient client = HttpClient.newBuilder()
  8.                 .version(HttpClient.Version.HTTP_1_1)
  9.                 .build();

  10.         HttpRequest request = HttpRequest.newBuilder()
  11.                 .uri(URI.create(
  12.                         "http://127.0.0.1:8080/api/hello"))
  13.                 .GET()
  14.                 .build();

  15.         HttpResponse<String> response = client.send(
  16.                 request,
  17.                 HttpResponse.BodyHandlers.ofString());

  18.         System.out.println("状态码:" + response.statusCode());
  19.         System.out.println("响应体:" + response.body());
  20.     }
  21. }
复制代码
运行前提
    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 地址负责当前这一跳的帧交付。






免责声明:
1,海欣资源网所发布的资源由网友上传和分享,不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
2,海欣资源网的资源来源于网友分享,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3,海欣资源网所发布的资源由网友上传和分享,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
4,如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉,联系方式邮箱 haixinst@qq.com
海欣资源-企业信息化分享平台。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

5

主题
热度排行
回复排行
最新贴子

Archiver|手机版|海欣资源 ( 湘ICP备2021008090号-1 )|网站地图

GMT+8, 2026-10-24 13:21 , Gzip On, MemCached On.

免责声明:本站所发布的资源和文章均来自网络,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉。