1. 为什么每个程序员都要懂TCP握手与挥手
第一次被面试官问到"描述下TCP三次握手过程"时,我支支吾吾半天没答上来。后来成为面试官才发现,这简直是检验候选人网络基本功的必问题——就像医生必须知道血液循环系统一样,我们搞开发的必须清楚数据是怎么在网络中流动的。
TCP作为传输层的核心协议,承载着HTTP、MySQL、Redis等所有应用层协议的通信基础。当你在浏览器输入网址时,当你的手机APP刷新动态时,背后都是TCP在默默建立连接、传输数据、释放连接。理解这个过程,不仅能帮你在面试中游刃有余,更能让你:
- 快速定位网络超时、连接池耗尽等生产问题
- 合理设置Keepalive等关键参数
- 优化高并发场景下的连接管理策略
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. TCP连接建立:三次握手全解析
2.1 握手背后的设计哲学
想象你要给异地的朋友寄重要文件。直接寄出风险太大,于是你们约定:
- 你先打电话问:"能收文件吗?"
- 朋友回答:"可以,你那边准备好了吗?"
- 你确认:"我这边OK,马上寄出"
这就是三次握手的本质——通过确认双方的收发能力来建立可靠连接。具体到TCP协议:
plaintext复制客户端 服务端
|-------- SYN=1, seq=x ------->|
|<------- SYN=1, ACK=1, seq=y, ack=x+1 ----|
|-------- ACK=1, seq=x+1, ack=y+1 ------->|
2.2 关键字段深度解读
-
序列号(seq):就像快递单号,解决"数据乱序"问题。初始值并非从0开始,而是基于时钟的随机数(防黑客猜测)
-
SYN标志位:值为1时表示这是握手包,就像电话里说"我们开始确认流程吧"
-
ACK确认号:告诉对方"我这边已经收到xxx之前的所有数据",ack=x+1表示期望下次收到x+1编号的数据
常见误区:第二次握手时服务端是把ACK和SYN合并发送的,这实际上是两个动作的合并(确认客户端SYN + 发送自己的SYN)
2.3 为什么不是两次或四次?
- 两次握手的风险:如果客户端第一次握手因网络延迟重发,服务端会建立多余连接
