Appearance
面试必问系列:用最通俗的方式讲清楚 TCP 连接建立与断开
TCP(Transmission Control Protocol):传输控制协议
简单理解:TCP 就像打电话,双方需要确认彼此都能听得到,才能开始聊天
就像两个人见面要打招呼:
A:你好,我能听到你说话吗? B:你好,我能听到你说话,你也能听到我吗? A:是的,我可以听到你说话! → 三次确认后,双方都知道彼此能正常通信
状态变化:
问题:两次不行吗?
一次:A → B:我要连接 B → A:好的,连接吧 问题:B 不知道 A 能不能听到 B 的回复
问题:四次呢?
A → B:我要连接(seq=x) B → A:好的,我准备好了(seq=y,ack=x+1) B → A:我真的准备好了(seq=y+1) A → B:好的,我知道你准备好了 → 三次就够了,四次浪费
就像打电话结束时要挂断:
A:我说完了,再见! B:好的,我知道了。等一下,我还有最后一点要说... B:我也说完了,再见! A:好的,再见! → 需要四次交互,确保双方数据都传输完毕
MSL(Maximum Segment Lifetime):最大报文存活时间
问题:最后一次 ACK 发送到服务器后,客户端为什么不直接关闭?
解决:等待 2MSL(通常是 1-4 分钟),确保服务器重传的 FIN 都能被正确处理
问题:三次不行吗?
A → B:FIN(我要断开) B → A:ACK(好的) B → A:FIN(我也断开) A → B:ACK(好的) → 可以!但是第二次和第三次不能合并
两次握手问题: - 客户端发送的第一个 SYN 包可能滞留网络中 - 服务器收到旧的 SYN 包,会建立无效连接 - 客户端不认可这个连接,浪费服务器资源 三次握手: - 第三次握手时,客户端确认了服务器能收到自己的消息 - 避免了无效连接建立
- 第二次挥手后,服务器可能还有数据要发送 - 必须等数据发完才能发送第三次挥手 - 无法像三次握手那样合并
攻击原理: - 黑客发送大量 SYN 包,但不完成第三次握手 - 服务器等待超时过程中,占用大量连接资源 - 正常用户无法连接 防御措施: - SYN Cookie:服务器不立即分配资源,而是计算一个 cookie - 缩短 SYN Timeout 时间 - 增加半连接队列长度
一句话总结: