本文最后更新于40 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
可以把 TCP 想成两个人打电话:
- 三次握手:先确认“能不能通话”
- 四次挥手:再确认“能不能安全挂电话”
三次握手:建立连接
A 要和 B 通话。
- A → B:
SYN- “你在吗?我想连接你。”
- B → A:
SYN + ACK- “我在,收到了你的请求;我也准备好了,你能听到我吗?”
- A → B:
ACK- “能听到,连接建立。”
之所以不是两次,是因为两次只能证明:
- A 能发到 B
- B 能收到 A
但还不能可靠证明 B 发回去的确认,A 是否真的收到。第三次确认补上了这点。
口诀:请求 → 同意并反问 → 确认。
四次挥手:关闭连接
TCP 是全双工的:A、B 两边都可以独立发送数据。所以“我不发了”不等于“你也不发了”。
- A → B:
FIN- “我这边没数据要发了,准备关闭。”
- B → A:
ACK- “收到。不过我可能还有数据没发完。”
- B → A:
FIN- “现在我也发完了,可以关闭。”
- A → B:
ACK- “收到,正式结束。”
口诀:我不发了 → 收到 → 我也不发了 → 收到。
为什么握手三次、挥手四次?
握手时,B 的“确认收到”与“我也要建立连接”通常可以合在一条 SYN + ACK 里。
挥手时,B 收到 A 的 FIN 后,可能还有剩余数据,因此只能先回 ACK;等它发完数据,才能另发 FIN。于是通常是四次。
补充一个常见点:主动关闭的一方最后会等一小段时间(TIME_WAIT),避免最后的确认包丢失,并让网络中延迟的旧报文自然消失。