TCP/IP 网络协议面试笔记
1 IP 数据报分片的目的
适应各个物理网络不同的 MTU(最大传输单元)。当一个数据报尺寸大于所发网络的 MTU 时,路由器将 IP 数据报分成若干较小的部分(分片),再独立发送。
2 FTP/SMTP 默认端口
- FTP:21 是控制端口,20 是数据端口;
- SMTP:25。
3 TCP 三次握手与四次挥手
三次握手建立连接
- 客户端发送 SYN=1、SEQ=x 的数据包,请求建立连接;
- 服务端回复 SYN=1、ACK=1、ACK_NUMBER=x+1、SEQ=y;
- 客户端发送 ACK=1、ACK_NUMBER=y+1、SEQ=x,连接建立。
标志位含义
- SYN:同步标志,仅在三次握手中有效;
- ACK:确认标志,确认号 = 发送方序号 + 1(下一个预期序号);
- RST:复位标志,用于复位连接;
- URG:紧急标志;
- PSH:推标志,接收端不再排队而是尽快交给应用处理(telnet/rlogin 交互模式总置位);
- FIN:结束标志,对应端口仍开放,可接收后续数据。
四次挥手关闭连接
- Client 调用
close(),发送 FIN、SEQ=M; - Server 收到后返回 ACK(M+1),关闭读通道(此时 read 返回 0),状态转 CLOSE_WAIT;
- Server 调用
close()发送 FIN、SEQ=N; - Client 回复 ACK(N+1),关闭读通道进入 TIME_WAIT;Server 收到 ACK 转 CLOSED;
- Client 在 TIME_WAIT 等待 2 倍 MSL 后进入 CLOSED。
注意:TCP 是双向连接,关闭需在两个方向进行;FIN 包总带 ACK 标记,没有 ACK 仅 FIN 的包通常被视为恶意的。
4 为什么需要 TIME_WAIT
- 保证全双工连接可靠关闭:若最后的 ACK 丢失,Server 会重发 FIN,Client 必须维护状态以便重发 ACK,否则 Server 收到 RST 误以为出错;
- 保证这次连接的重复数据段从网络中消失:若直接 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:
- 断点续传:引入 range 头域,返回码 206;
- 缓存策略:1.1 引入 Entity tag、If-Unmodified-Since、If-Match、If-None-Match 等更多缓存控制头;
- 错误通知:新增 24 个错误状态码,如 409(冲突)、410( Gone)永久删除;
- Host 头:虚拟主机时代请求必须带 Host 头,否则 400;
- 长连接:默认 Connection: keep-alive,一个 TCP 连接传送多个请求,减少连接建立开销;HTTP/2 在此基础上增加多路复用、头部压缩、二进制分帧等。
11 TCP 如何保证可靠性
- 丢包重传:接收方回 ack,发送方未收到则重发;
- 数据包校验:校验出错丢弃且不响应,超时后重发;
- 失序数据重排序;
- 应答机制:延迟几分之一秒确认;
- 超时重传:启动定时器等待确认;
- 丢弃重复数据;
- 流量控制:可变大小滑动窗口协议,防止快主机使慢主机缓冲溢出;
- 三次握手:传输前先建立连接;
- 拥塞控制:拥塞窗口机制。
12 Nagle、延迟 ACK 与 TCP 粘包
- Nagle 算法:小包合并发送,减少网络中小报文数量(有延迟风险,交互应用可关掉);
- 延迟 ACK:接收方延迟几百 ms 合并确认;
- TCP 粘包:TCP 是字节流,不保留应用报文边界,需应用层协议(长度字段、分隔符)自行拆包。