TCP/IP 网络协议面试笔记

TCP/IP 网络协议面试笔记

参考:网络知识点集锦、TCP 半连接与全连接队列

1 IP 数据报分片的目的

适应各个物理网络不同的 MTU(最大传输单元)。当一个数据报尺寸大于所发网络的 MTU 时,路由器将 IP 数据报分成若干较小的部分(分片),再独立发送。

2 FTP/SMTP 默认端口

  • FTP:21 是控制端口,20 是数据端口;
  • SMTP:25。

3 TCP 三次握手与四次挥手

三次握手建立连接

  1. 客户端发送 SYN=1、SEQ=x 的数据包,请求建立连接;
  2. 服务端回复 SYN=1、ACK=1、ACK_NUMBER=x+1、SEQ=y;
  3. 客户端发送 ACK=1、ACK_NUMBER=y+1、SEQ=x,连接建立。

标志位含义

  • SYN:同步标志,仅在三次握手中有效;
  • ACK:确认标志,确认号 = 发送方序号 + 1(下一个预期序号);
  • RST:复位标志,用于复位连接;
  • URG:紧急标志;
  • PSH:推标志,接收端不再排队而是尽快交给应用处理(telnet/rlogin 交互模式总置位);
  • FIN:结束标志,对应端口仍开放,可接收后续数据。

四次挥手关闭连接

  1. Client 调用 close(),发送 FIN、SEQ=M;
  2. Server 收到后返回 ACK(M+1),关闭读通道(此时 read 返回 0),状态转 CLOSE_WAIT;
  3. Server 调用 close() 发送 FIN、SEQ=N;
  4. Client 回复 ACK(N+1),关闭读通道进入 TIME_WAIT;Server 收到 ACK 转 CLOSED;
  5. Client 在 TIME_WAIT 等待 2 倍 MSL 后进入 CLOSED。

注意:TCP 是双向连接,关闭需在两个方向进行;FIN 包总带 ACK 标记,没有 ACK 仅 FIN 的包通常被视为恶意的。

4 为什么需要 TIME_WAIT

  1. 保证全双工连接可靠关闭:若最后的 ACK 丢失,Server 会重发 FIN,Client 必须维护状态以便重发 ACK,否则 Server 收到 RST 误以为出错;
  2. 保证这次连接的重复数据段从网络中消失:若直接 CLOSED,新连接可能与旧连接端口号相同,延迟数据会被 TCP 误判为新连接的数据。等待 2MSL 保证本次连接的所有数据从网络消失。

相关内核参数:tcp_fin_timeout(默认 60s)、tcp_tw_reuse(1 允许重用)、tcp_tw_recycle(1 快速回收)。主动关闭方进入 TIME_WAIT,持续 2 个 MSL(Windows 默认 240 秒)。

5 什么是 2MSL

MSL(Maximum Segment Lifetime)是报文最大生存时间,超过即丢弃。RFC 793 规定 MSL 为 2 分钟,实际常用 30 秒/1 分钟/2 分钟。TIME_WAIT 状态持续 2MSL,防止最后 ACK 丢失后无法重发。TIME_WAIT 期间端口不可用,可通过 SO_REUSEADDR 复用。

6 Server 与 Client TCP 状态机

  • 客户端:CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
  • 服务端:CLOSED -> LISTEN -> SYN-RECEIVED -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

关键状态:LISTEN 监听;SYN-SENT 等待匹配请求;SYN-RECEIVED 收到请求并确认;ESTABLISHED 连接打开;FIN-WAIT-1 等待中断确认;FIN-WAIT-2 等待对端发中断请求;CLOSE-WAIT 等待处理数据;LAST-ACK 等待确认;TIME-WAIT 等待足够时间确保对端收到确认;CLOSED 无连接状态。

7 TCP 包头结构

源端口(16) + 目标端口(16) + 序列号(32) + 回应序号(32) + TCP头长度(4) + reserved(6) + 控制代码(6) + 窗口大小(16) + 偏移量(16) + 校验和(16) + 选项(32,可选)。TCP 包头最小长度 20 字节。

8 SYN_RECV 与 CLOSE_WAIT

  • SYN_RECV:服务端收到 SYN 未收到 ACK 时处于此状态。相关配置:tcp_synack_retries(默认 5)、tcp_syncookies(防 SYN Flood)。大量 SYN_RECV 的半连接导致半连接队列溢出,连接请求被丢弃,即 SYN Flood 攻击;SYN Cookie 是有效防御手段;
  • CLOSE_WAIT:被动关闭方收到 FIN 但未发出 ACK 的状态。大量 CLOSE_WAIT 通常是服务端代码问题(连接关闭不彻底),应检查代码。

9 OSI 七层模型与 TCP/IP 四层

OSI 参考模型 TCP/IP 说明 协议
应用层 应用层 为应用程序提供服务 HTTP FTP SMTP DNS
表示层 - 数据格式转换、加密  
会话层 - 建立、管理和维护会话  
传输层 传输层 建立端到端连接 TCP UDP
网络层 网络层 IP 选址与路由 IP ICMP ARP RARP
数据链路层 数据链路层 介质访问和链路管理 Ethernet PPP
物理层 - 传输原始比特流 IEEE 802.1A 802.11

10 HTTP 1.0 / 1.1 / 2.0 区别

HTTP 1.1 相对 1.0:

  1. 断点续传:引入 range 头域,返回码 206;
  2. 缓存策略:1.1 引入 Entity tag、If-Unmodified-Since、If-Match、If-None-Match 等更多缓存控制头;
  3. 错误通知:新增 24 个错误状态码,如 409(冲突)、410( Gone)永久删除;
  4. Host 头:虚拟主机时代请求必须带 Host 头,否则 400;
  5. 长连接:默认 Connection: keep-alive,一个 TCP 连接传送多个请求,减少连接建立开销;HTTP/2 在此基础上增加多路复用、头部压缩、二进制分帧等。

11 TCP 如何保证可靠性

  • 丢包重传:接收方回 ack,发送方未收到则重发;
  • 数据包校验:校验出错丢弃且不响应,超时后重发;
  • 失序数据重排序;
  • 应答机制:延迟几分之一秒确认;
  • 超时重传:启动定时器等待确认;
  • 丢弃重复数据;
  • 流量控制:可变大小滑动窗口协议,防止快主机使慢主机缓冲溢出;
  • 三次握手:传输前先建立连接;
  • 拥塞控制:拥塞窗口机制。

12 Nagle、延迟 ACK 与 TCP 粘包

  • Nagle 算法:小包合并发送,减少网络中小报文数量(有延迟风险,交互应用可关掉);
  • 延迟 ACK:接收方延迟几百 ms 合并确认;
  • TCP 粘包:TCP 是字节流,不保留应用报文边界,需应用层协议(长度字段、分隔符)自行拆包。
阅读 — · 全站 —
🎸 我的歌单 0 首