其他分享
首页 > 其他分享> > TCP三次握手及原因

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报文,服务器每次收到请求就会建立一个连接,这会得到许多无效连接,造成不必要的资源浪费。

标签:握手,SYN,TCP,三次,服务器,序列号,报文,客户端
来源: https://www.cnblogs.com/unclejac/p/16314082.html