IP、MAC 与数据传输校招面试题|计算机网络网络层
IP、MAC 与数据传输校招面试题|计算机网络网络层
本章面向计算机专业学生、应届生和校招求职者,重点讲解通过 IP 地址发送请求的过程,以及 IP 地址与 MAC 地址在网络层通信中的分工和联系。
1. 通过 IP 地址发送请求的过程
面试题剖析
这道题主要考察候选人对网络请求完整链路的理解,包括路由选择、ARP、TCP 连接、HTTP 报文封装、路由器转发以及服务器处理等过程。
与通过域名访问相比,通过 IP 地址发送请求不需要进行 DNS 解析。下面以 HTTP/1.1 通过 IPv4 地址访问服务器为例进行说明。
面试题解答
假设客户端访问以下地址:
http://203.0.113.10:8080/users?id=1001
完整过程可以概括为:
解析 IP 和端口
→ 查询本机路由表
→ 获取下一跳 MAC 地址
→ 建立 TCP 连接
→ 发送 HTTP 请求
→ 路由器逐跳转发
→ 服务器处理请求
→ 返回 HTTP 响应
→ 复用或关闭连接
1. 解析请求地址
客户端首先解析 URL,得到:
协议:http
目标 IP:203.0.113.10
目标端口:8080
请求路径:/users
查询参数:id=1001
由于 URL 中已经直接提供了 IP 地址,因此不需要执行 DNS 域名解析。
如果没有显式指定端口,则使用协议的默认端口:
HTTP 默认使用
80端口。HTTPS 默认使用
443端口。
2. 查询本机路由表
操作系统需要判断数据包应该从哪个网络接口发送,以及下一跳应该交给谁。
它会根据目标 IP 查询本机路由表,并按照最长前缀匹配原则选择路由。
主要分为两种情况。
目标 IP 与客户端在同一个局域网
如果目标 IP 和客户端处于同一个子网,客户端可以直接将数据帧发送给目标主机:
客户端 → 目标服务器
目标 IP 与客户端不在同一个局域网
如果目标 IP 位于其他网络,客户端需要先将数据发送给匹配路由指定的下一跳,常见情况是默认网关:
客户端 → 默认网关 → 多个路由器 → 目标服务器
例如,客户端的网络配置为:
客户端 IP:192.168.1.10
子网掩码:255.255.255.0
默认网关:192.168.1.1
目标 IP:203.0.113.10
目标 IP 不属于 192.168.1.0/24 网段,因此客户端会选择默认网关 192.168.1.1 作为下一跳。
如果路由表中没有任何匹配路由,并且也没有默认路由,操作系统会返回网络不可达错误。
3. 获取下一跳设备的 MAC 地址
IP 数据包最终需要封装成数据链路层的数据帧才能通过网卡发送,因此客户端还需要知道下一跳设备的 MAC 地址。
如果目标服务器与客户端在同一个局域网,客户端查询目标服务器的 MAC 地址:
目标服务器 IP → ARP 查询 → 目标服务器 MAC
如果目标服务器位于其他网络,客户端不需要获取远程服务器的 MAC 地址,而是查询默认网关的 MAC 地址:
默认网关 IP → ARP 查询 → 默认网关 MAC
ARP 查询过程可以表示为:
客户端广播:谁拥有 192.168.1.1?
→ 默认网关回复:192.168.1.1 对应 MAC 地址 AA:BB:CC:DD:EE:FF
→ 客户端保存到 ARP 缓存
如果 ARP 缓存中已经有对应记录,则不需要再次广播查询。
需要注意:
IP 地址用于跨网络寻找最终目标主机。
MAC 地址只用于当前一段链路中,将数据交给下一跳设备。
IPv6 不使用 ARP,而是通过 NDP 完成类似功能。
4. 与服务器建立 TCP 连接
对于 HTTP/1.1 和 HTTP/2,客户端通常通过 TCP 与目标 IP 和端口建立连接。
客户端首先选择一个临时源端口,例如:
客户端:192.168.1.10:52000
服务器:203.0.113.10:8080
然后进行 TCP 三次握手:
客户端 → 服务器:SYN
服务器 → 客户端:SYN + ACK
客户端 → 服务器:ACK
其过程可以表示为:
发送 SYN
→ 接收 SYN + ACK
→ 发送 ACK
→ TCP 连接建立
如果目标端口没有程序监听,服务器通常会返回 RST;如果数据包被防火墙丢弃,则客户端可能一直等待,最终连接超时。
5. 构造 HTTP 请求
TCP 连接建立后,客户端构造 HTTP 请求报文。
例如:
GET /users?id=1001 HTTP/1.1
Host: 203.0.113.10:8080
User-Agent: Mozilla/5.0
Accept: application/json
Connection: keep-alive
即使使用 IP 地址访问,HTTP/1.1 请求仍然需要携带 Host 请求头。此时 Host 通常是目标 IP 和非默认端口。
服务器可能在同一个 IP 地址上部署多个网站,并根据 Host 请求头选择具体网站。直接使用 IP 地址访问时,服务器可能返回默认站点,也可能因为找不到对应的虚拟主机而拒绝请求。
6. 对 HTTP 数据逐层封装
HTTP 请求会依次经过传输层、网络层和数据链路层封装:
HTTP 请求
→ 添加 TCP 首部
→ 添加 IP 首部
→ 添加以太网首部和帧尾
→ 通过网卡发送
封装后的数据可以简单表示为:
以太网帧
└── IP 数据包
└── TCP 报文段
└── HTTP 请求
各层主要包含以下信息。
TCP 首部
源端口:52000
目标端口:8080
序列号、确认号、标志位等
IP 首部
源 IP:192.168.1.10
目标 IP:203.0.113.10
TTL:初始生存时间
上层协议:TCP
以太网首部
源 MAC:客户端网卡 MAC
目标 MAC:下一跳设备 MAC
如果目标服务器不在当前局域网,以太网帧中的目标 MAC 是默认网关的 MAC,而不是远程服务器的 MAC。
7. 数据包经过路由器逐跳转发
默认网关收到数据帧后,移除当前链路的帧头,读取 IP 数据包中的目标 IP,然后查询自己的路由表,确定下一跳。
每经过一个路由器,通常都会执行:
接收数据帧
→ 解开当前链路层帧
→ 检查目标 IP
→ TTL 减 1
→ 查询路由表
→ 使用新的源 MAC 和目标 MAC 重新封装
→ 发送给下一跳
在没有 NAT 的情况下:
源 IP 和目标 IP 在端到端传输中通常保持不变。
在各段以太网链路之间经路由转发时,源、目标 MAC 会重新封装;同一二层网络内的普通交换不会逐台改写它们。
TTL 每经过一个路由器都会减 1。
如果客户端通过家庭路由器访问互联网,通常还会进行 NAT:
源地址 192.168.1.10:52000
→ NAT 转换
→ 公网地址 198.51.100.20:60000
此时,发送到互联网的数据包中的源 IP 和源端口可能会被修改。路由器会保存 NAT 映射,以便响应数据能够正确返回客户端。
8. 服务器接收并处理请求
数据包到达服务器后,服务器按照相反顺序解封装:
网卡接收数据帧
→ IP 层检查目标 IP
→ TCP 层根据连接四元组定位 Socket
→ TCP 重组并按序交付数据
→ Web 服务器解析 HTTP 请求
→ 业务程序处理请求
对于已建立的 TCP 连接,协议栈根据连接四元组定位已连接 Socket;应用读取字节后,再根据 Host、请求路径和方法处理 HTTP。
例如:
GET /users?id=1001
→ 匹配 /users 路由
→ 读取 id 参数
→ 查询数据库或缓存
→ 构造 HTTP 响应
9. 服务器返回 HTTP 响应
服务器处理完成后,通过原来的 TCP 连接返回 HTTP 响应:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 24
Connection: keep-alive
{"id":1001,"name":"tom"}
响应数据同样会经过以下过程:
HTTP 响应
→ TCP 分段
→ IP 封装
→ 链路层封装
→ 路由器逐跳转发
→ 到达客户端
响应经过的网络路径不一定与请求完全相同,只要最终能够根据路由到达客户端即可。
客户端收到数据后,TCP 进行确认、排序和去重,将连续字节交给应用;HTTP 响应边界由 HTTP 解析器识别,可以边接收边处理。
10. 复用或关闭连接
请求完成后,客户端和服务器可以继续复用当前连接,也可以关闭连接。
HTTP/1.1 默认使用持久连接,可以继续发送后续请求。
HTTP/2 可以在一条 TCP 连接中并发传输多个流。
HTTP/3 使用基于 UDP 的 QUIC,不进行 TCP 三次握手。
如果连接空闲超时,或者设置了
Connection: close,TCP 连接会被关闭。
使用 IP 地址访问 HTTPS 的注意事项
假设直接访问:
https://203.0.113.10/
客户端会使用 IP 地址进行证书校验。如果服务器证书只签发给域名:
www.example.com
而证书中没有包含 IP 地址 203.0.113.10,客户端就会提示证书与访问地址不匹配。
另外,一台服务器可能通过 SNI 和 Host 为多个域名提供 HTTPS 服务。直接访问 IP 时,服务器可能无法确定应该使用哪个域名的证书和网站配置。
如果只是希望让某个域名临时连接到指定 IP,同时保持正确的 Host、SNI 和证书校验,可以使用类似方式:
curl --resolve www.example.com:443:203.0.113.10 \
https://www.example.com/users
此时网络连接发往 203.0.113.10,但 HTTP Host、TLS SNI 和证书校验仍然使用 www.example.com。
面试时可以总结为:
通过 IP 地址发送请求时,客户端不需要进行 DNS 解析。操作系统首先查询路由表,判断目标主机是否在同一局域网;如果在同一局域网,就通过 ARP 获取目标主机的 MAC 地址,否则获取默认网关的 MAC 地址。随后客户端与目标 IP 和端口建立 TCP 连接,构造 HTTP 请求,并按照 HTTP、TCP、IP和链路层的顺序封装数据。路由器根据目标 IP 逐跳转发,每一跳的 MAC 地址都会改变,而在没有 NAT 的情况下目标 IP 保持不变。服务器接收并解封装数据后,根据端口、Host 和请求路径处理业务,再沿网络返回 HTTP 响应。直接通过 IP 访问 HTTPS 时,还需要注意证书域名校验和虚拟主机匹配问题。
可能追问的问题
目标服务器在同一网段和不同网段时,客户端获取的分别是谁的 MAC 地址?
数据包经过路由器时,源 IP、目标 IP、源 MAC 和目标 MAC 会如何变化?
为什么直接通过 IP 地址访问 HTTPS 网站可能出现证书错误?
2. 有了 IP 地址,为什么还要用 MAC 地址?
面试题剖析
这道题考察分层寻址的目的,重点是区分“数据最终发给谁”和“当前链路先交给谁”。回答时应结合跨网段传输说明下一跳,而不是把原因归结为 MAC 地址不可修改。
面试题解答
IP 地址用于网络层寻址和跨网络转发;在以太网这样的链路上,MAC 地址用于把帧交给同一链路中的下一跳。二者解决不同层次的问题。
- IP 地址为什么适合路由
IP 地址可以按前缀聚合。例如,路由器使用一条 192.0.2.0/24 路由就能表示一个网段,不必记录每台设备。MAC 地址通常不包含可供互联网逐级聚合的网络位置,仅依赖它构建全球转发表难以扩展。
- 有 IP 后为什么还要知道 MAC
主机查询路由表确定出口和下一跳后,需要把 IP 数据包封装成当前链路能够传输的帧。在以太网上,帧头需要源 MAC 和目标 MAC;IPv4 通常通过 ARP 查找下一跳 MAC,IPv6 使用 NDP。
目标与本机同网段时,下一跳通常就是目标主机;目标不在本地网段时,下一跳是匹配路由指定的网关,常见情况是默认网关,而不是远端服务器。

图:示例不含 NAT;IP 地址标识端点,各段以太网链路使用各自的源、目标 MAC。
例如 A 经路由器 R 发给另一网段的 B:第一段帧的源 MAC 是 A、目标 MAC 是 R 的入口接口;R 转发时重新封装,第二段的源 MAC 是 R 的出口接口、目标 MAC 是 B。
- 需要避免的误区
MAC 地址可以被软件配置或随机化,不能作为不可伪造的身份凭证。
IP 地址也不是地理地址,它的前缀主要表达网络拓扑和路由归属。
跨越路由器时会重新封装链路层;经过同一二层网络中的普通交换机时,并不会每台交换机都改写源、目标 MAC。
IP 可以运行在不同链路技术上,并非所有链路都必须使用以太网 MAC。
不含 NAT、隧道等处理时,端点 IP 通常不变;经过 NAT 时,IP 和端口可能改变。
面试时可以总结为:IP 负责可聚合的跨网络寻址,MAC 负责当前以太网链路的下一跳交付。先根据 IP 查路由,再根据下一跳地址找到 MAC,两者配合完成传输。
可能追问的问题
访问公网服务器时,ARP 查询的是服务器还是网关?
数据经过交换机和路由器时,MAC 分别是否变化?
使用 MAC 地址做身份认证有什么问题?
IPv6 为什么不使用 ARP?
继续阅读
阅读导航




