网络面试题 Part1:协议和子网

3 minute read

Published:

0x01 计算机网络基础

1. TCP 三次握手与四次挥手

TCP 数据包头部共 20 字节,结构参考下图:

tcp_header
TCP Header
  • 0-4 字节:SrcIP / DstIP
  • 5-8 字节:Sequence Number
  • 9-12 字节:Acknowledge Number
  • 13-16 字节:
    • 13-14 字节:4 offset + 6 Reserved Data + 6 Signal
    • 15-16 字节:Window 大小
  • 17-20 字节:
    • 17-18 字节:校验和
    • 19-20 字节:紧急指针

13-14 byte 的最后 6 bit 为信号标志位,其中就包括 SYN、ACK、FIN 标志位。

三次握手流程

构建 TCP 连接时,三次握手顺序如下,Client 和 Server 都会出一个随机的 Sequence Number,ACK 中返回 seq+1 作为 ACK 编码。

sequenceDiagram
  Client-)Server: SYN
  Server-)Client: SYN+ACK
  Client-)Server: ACK

Why Not:为什么两次无法结束连接

假如将 TCP 三次握手流程改为两次。 Client 端不需要确认 Server 端第二次握手发送的 SYN 包,直接传输数据。

BAD CASE

假设某个 Client 发送的第一个连接请求 SYN-1 因网络延迟而滞留,Client 因未接到 SYN-1-ACK,选择重发,发送了第二个请求 SYN-2 并成功建立了连接,并在数据传输完毕后释放 FIN-2 构造的连接。

此时,延迟的 SYN-1 才到达 Server 端,Server 端将会正常构造连接,而 Client 无法拒绝错误回应,将会被动产生新连接。

四次挥手流程

因为 TCP 是全双工模式连接,所以双方结束连接时,需各自释放连接。

四次挥手过程如下:

  sequenceDiagram
    Client->>Server: FIN
    activate Client
    participant Client
    Note left of Client: FIN-WAIT-1
    Server->>Client: ACK
    deactivate Client
    participant Client
    Note left of Client: FIN-WAIT-2
    Server->>Client: FIN
    activate Server
    participant Server
    Note right of Server: LAST-ACK
    Client->>Server: ACK
    deactivate Server
    Note left of Client: TIME-WAIT(2MSL)
    Note right of Server: CLOSE
    Note left of Client: CLOSE

Why Not:为什么三次无法结束连接

假如将 TCP 四次挥手流程改为三次。 Server 端不等待 Client 端回应第三次挥手请求,直接关闭套接字。

BAD CASE

第四次挥手时,客户端发送给服务端的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN。

如果客户端在 2x MSL 内收到了 FIN,就会重新发送 ACK 并再次等待 2x MSL,防止 Server 没有收到 ACK 而不断重发 FIN…

2. TCP 和 UDP 特点和适用场景

协议是否连接是否可靠适用场景
TCP有连接(三次握手)可靠、有序、支持重传、拥塞控制Web、文件传输
UDP无连接不可靠、不支持重传视频、语音、DNS、DHCP

3. 什么是 MTU, MSS, Window Scaling, Nagle算法

  • MTU(最大传输单元):物理网中传输的最大单元,包含协议头部及数据,以太网一般为 1500 bytes。
  • MSS(最大报文段):TCP 数据报大小,约为 MTU - 40,即给协议头部留 40 bytes。
  • Window Scaling:TCP 窗口调整,支持高带宽延迟网络。
  • Nagle 算法:合并小包发送,降低发包频率,减少对系统内核造成的载荷花,但会造成更高的平均延迟。

4. 简述 DNS 原理,递归 vs 迭代查询

  • 递归查询
    • 客户端 → 本地 DNS
    • 请求流程:客户端只发 一次请求,要求对方给出最终结果。由 本地域名服务器 (Local DNS) 一口气查到最终 IP 并返回。
    • 返回结果:查询成功或查询失败。
  • 迭代查询:
    • 客户端 → 本地DNS/向根、客户端 → TLD、客户端 → 权威DNS
    • 请求流程:客户端发出 多次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表。客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。
    • 返回结果:最佳的查询点 或 主机地址。
sequenceDiagram
    autonumber
    participant Client as 客户端
    participant LDNS as 本地DNS解析器
    participant Root as 根DNS服务器
    participant TLD as 顶级域DNS(.com / .cn)
    participant Auth as 权威DNS服务器

    %% 递归查询路径
    rect rgb(240,240,255)
    Note over Client,LDNS: 🌀 递归查询(本地DNS替客户端完成所有查询)
    Client->>LDNS: 请求 www.example.com 的 IP(递归查询)
    LDNS->>Root: 询问根服务器(.com 在哪?)
    Root-->>LDNS: 返回 .com 顶级域的地址
    LDNS->>TLD: 询问 .com 域(example.com 在哪?)
    TLD-->>LDNS: 返回 example.com 的权威DNS地址
    LDNS->>Auth: 询问 example.com 权威DNS
    Auth-->>LDNS: 返回 www.example.com 的 IP
    LDNS-->>Client: 返回最终 IP 地址
    end

    %% 迭代查询路径
    rect rgb(255,250,230)
    Note over Client,Auth: 🔁 迭代查询(DNS服务器仅返回下一跳)
    Client->>Root: 直接询问根DNS(www.example.com)
    Root-->>Client: 告诉你 .com 顶级域DNS在哪
    Client->>TLD: 继续询问 .com DNS
    TLD-->>Client: 告诉你 example.com 权威DNS在哪
    Client->>Auth: 最后询问权威DNS
    Auth-->>Client: 返回 www.example.com 的 IP
    end

5. 底层协议:什么是 ARP、DHCP 协议?

  • ARP:IP → MAC 映射,二层通信。
  • DHCP:动态分配IP地址。

6. 子网管理:什么是 NAT, VLAN, 子网划分功能?

  • NAT:负责私网 → 公网地址转换。
  • VLAN:逻辑隔离二层广播域。
  • 子网划分:CIDR 记法(如 192.168.1.0/24)控制子网主机数与网络规模。

0x02 网络性能与调优

7. Linux 下如何查看网络连接和延迟

  • ss -tuna / netstat -anp:查看TCP/UDP连接
  • ping:ICMP往返延迟(RTT)
  • traceroute:每一跳延迟
  • iperf3:TCP/UDP 吞吐测试
  • tcpdump:抓包分析(过滤如 tcp port 80

8. 如何排查高 RTT 成因、丢包现象,以及网络拥塞情况?

  • ping 看波动 & 丢包
  • traceroute 定位异常出现在哪跳连接
  • iperf 确认对端吞吐是否正常
  • tcpdump 确认 TCP 数据包中参数情况,着重看重传次数、窗口大小

指标关注

  • RTT 大 → 拥塞或链路延迟
  • 丢包高 → 链路质量差 or buffer 溢出
  • 窗口小 → 滞后于 BDP,需 window scaling

9. 简述 TCP 拥塞控制四阶段和内容

  • 慢启动(Slow Start):初期指数增长 cwnd,收到一个ack增加一个新窗口。初始拥塞窗口(cwnd)一般为 1~10 个 MSS,每收到一个 ACK,窗口加倍(指数增长),快速探测带宽,但风险高。
  • 拥塞避免:线性增长 cwnd。当 cwnd ≥ ssthresh(慢启动阈值)时,进入拥塞避免。每 RTT 增长线性(每轮 +1 MSS),稳健但增长慢。
  • 快重传:收到 3 个重复ACK,立即重传。不等超时,若收到接收方 3 个重复 ACK(说明某个包丢了)。立即重发丢失的数据包。
  • 快恢复:减半 cwnd,进入拥塞避免而非重头来。快重传后,说明网络可用,但有拥塞。避免 cwnd 退回 1,减少性能损失。调整策略可以用伪代码表述:
    • ssthresh = cwnd / 2
    • cwnd = ssthresh(或 ssthresh + 3)
    • 进入拥塞避免阶段而不是重回慢启动

Reference