TCP三次握手和四次挥手具体是怎么保证连接建立的
三次握手C → SSYN / S → CSYNACK / C → SACK简称“请求 — 应答请求 — 应答”四次挥手C → SFIN / S → CACK / S → CFIN / C → SACK简称“关我 — 收到 — 关你 — 收到”哈哈哈谁发明的实在太直观了TCP的握手协议主要解决两个核心问题一是确认双方的收发能力正常二是同步初始序列号ISN为后续的可靠传输打下基础。”二、三次握手建立连接—— 标准答案图解流程你用语言描述出来第一次握手SYN 1, Seq x客户端 → 服务端客户端发送一个SYN包同步序列号初始序号为x。客户端状态SYN_SENT此时客户端确认自己的发送能力正常。第二次握手SYN 1, ACK 1, Seq y, Ack x1服务端 → 客户端服务端收到后回复SYNACK包自己的初始序号为y确认号是x1。服务端状态SYN_RCVD此时服务端确认客户端的发送、接收能力正常自己的发送能力也正常。第三次握手ACK 1, Seq x1, Ack y1客户端 → 服务端客户端收到后再发一个ACK包确认序号变为x1确认号是y1。客户端状态ESTABLISHED服务端收到后也进入ESTABLISHED。此时双方确认彼此的收发能力都正常并且交换了初始序号。 面试必追问“为什么是三次而不是两次或四次”满分回答背下来防止已失效的连接请求报文段突然传到服务端产生错误主要目的。如果只有两次握手客户端发了一个SYN因网络滞留客户端超时重发了一个新SYN并建立连接传输完成后释放。此时那个滞留的旧SYN突然到达服务端服务端以为是新连接就单独建立连接半开连接白白浪费服务端资源。三次握手是最小值三次刚好能保证双方都有“发送”和“接收”的能力且同步了序号。四次没必要因为第二次握手SYNACK完全可以把服务端的SYN和对客户端SYN的ACK合在一起发减少一次交互。三、四次挥手断开连接—— 标准答案为什么是四次因为TCP是全双工的双方都要单独关闭自己的发送通道。流程第一次挥手FIN 1, Seq u客户端 → 服务端客户端说“我没数据要发了想关闭我的发送通道。”客户端状态FIN_WAIT_1。第二次挥手ACK 1, Ack u1服务端 → 客户端服务端回复“收到你的关闭请求但我可能还有数据要发你先别急。”客户端状态FIN_WAIT_2此时客户端到服务端的通道已关但服务端到客户端的还在。第三次挥手FIN 1, Seq w服务端 → 客户端服务端把剩余数据发完后说“我也没数据了关闭我的发送通道。”服务端状态LAST_ACK。第四次挥手ACK 1, Ack w1客户端 → 服务端客户端回复“好的确认关闭。”关键点客户端此时进入TIME_WAIT状态等待 2MSL最长报文段寿命后才真正关闭。 面试必追问“为什么客户端最后要等 2MSL 才关闭”满分回答第一为了保证客户端发送的最后一个ACK能被服务端收到。如果这个ACK丢了服务端会超时重发第三次挥手的FIN客户端在TIME_WAIT期间可以重传ACK。第二为了让本次连接的所有“旧报文段”在网络中彻底消失防止它们干扰下一次相同端口的新连接。四、面试加分项把前后知识串联起来在说完握手挥手后主动提一句把“可靠性”和“握手”串起来“面试官其实三次握手不仅是建立连接更重要的是同步了双方的初始序列号ISN。这个序号是后续滑动窗口、超时重传、去重的基础。如果ISN被黑客猜到就容易发生TCP序列号预测攻击会话劫持所以现代操作系统都采用随机生成ISN来保证安全性。”