写点什么

TCP 三次握手

用户头像
W🌥
关注
发布于: 56 分钟前

什么是三次握手?

  • TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。

  • 所谓三次握手,只指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认链接的建立。


如图:

  • 第一次握手:客户端将标志位 SYN 置为 1,随机产生一个值 seq=J,并将该数据包发送给服务器端,客户端进入 SYN_SENT 状态,等待服务器端确认。SYN:同步序列编号(Synchronize Sequence Numbers)。

  • 第二次握手:服务器端收到数据包后由标志位 SYN=1 知道客户端请求建立连接,服务器端将标志位 SYN 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。

  • 第三次握手:客户端收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务器端,服务器端检查 ack 是否为 K+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

 

为什么需要三次握手,而不是两次?

为了防止已失效的连接请求报文段突然又传送到了服务器端,因而产生错误。

如 A(指客户端)发出连接请求,但因连接请求报文丢失而未收到确认,于是 A 再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,A 总共发出了两个连接请求报文段,其中第一个丢失,第二个到达了 B(指服务器端),但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达 B,此时 B 误认为 A 又发出一次新的连接请求,于是就向 A 发出确认报文段,同意建立连接,不采用三次握手,只要 B 发出确认,就建立新的连接了,此时 A 不理睬 B 的确认且不发送数据,则 B 一致等待 A 发送数据,浪费资源。

发布于: 56 分钟前阅读数: 2
用户头像

W🌥

关注

还未添加个人签名 2021.08.04 加入

还未添加个人简介

评论

发布
暂无评论
TCP 三次握手