TCP三次握手及原因

三次握手过程

 一开始客户端处于closed状态,服务器处于listen状态

  1. 第一次握手:客户端向服务器发送一个SYN报文,并指明客户端的初始化序列号isn_client,此时客户端处于SYN_SENT状态;
  2. 第二次握手:服务器收到客户端的SYN报文后,会返回SYN+ACK报文,其中SYN指明服务器的初始化序列号isn_server,ACK的值是客户端的初始化序列号ISN_client+1,表明已经收到了来自客户端的syn报文,此时服务器处于SYN_RCVD状态;
  3. 第三次握手:客户端收到服务器的报文后,会返回一个ACK报文,它的值是isn_server+1,之后客户端进入established状态,服务器收到ACK报文后,也进入established状态,此时双方已建立好连接。

三次握手过程中,第一次和第二次不能携带数据,第三次可以。

三次握手的原因

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
比如有这种情况,客户端发送第一次SYN报文后发生网络堵塞,服务器没有收到,客户端又发送了一个新的SYN报文,但由于种种原因,旧的syn报文先到达服务器,此时服务器就会返回一个SYN+ACK报文给客户端,客户端可以根据收到的ACK的值结合自身上下文判断这是一个历史连接,然后会发送RST报文给服务器中止这次连接。两次握手无法阻止历史连接,两次握手的情况下,服务器在第一次收到客户端的SYN报文后就进入established状态,这时候服务器就已经可以发送数据了,如果这次是历史连接,服务器此时不知情的情况下发送了数据,服务器要收到客户端的RST报文才会断开连接,就会浪费资源。
  • 同步双方的初始序列号

序列号是保证可靠传输的一个关键因素,两次握手只能保证一方的初始序列号可以被对方成功接收。

  • 避免浪费资源
如果是两次握手,服务器在收到SYN报文时就会进入established状态,当客户端的SYN阻塞了,就会重复发送多次SYN报文,服务器每次收到请求就会建立一个连接,这会得到许多无效连接,造成不必要的资源浪费。
posted @   unclejac  阅读(244)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示