三次握手与四次握手

概述

在详细说明三次握手与四次握手之前,我们先需要思考以下三个问题:

  • 什么是三次握手与四次握手
  • 三次握手与四次握手是怎么实现的
  • 为什么需要三次握手与四次握手

回答完着三个问题之后我们对三次握手与四次握手的理解就会比较深刻了。

三次握手与四次握手的定义

什么是三次握手

在客户端与服务器端之间需要建立可靠连接时,我们就需要使用TCP三次握手,来确保客户端与服务器端之间接受能力和发送能力是否正常。

什么是四次握手

在客户端与服务器端数据传输结束完,需要断开彼此之间的连接时,需要使用TCP四次握手,以确保需要传输的信息都传输到位,并且安全的关闭连接。

  • 总体来说,三次握手是为了建立连接,而四次握手是为了断开连接

三次握手与四次握手的实现

三次握手的实现

在这里插入图片描述
三次握手分为了三个步骤:

  • 客户端发送SYN报文给服务器端,其中SYN报文的序列号seq=x;
  • 服务器端收到客户端发送的SYN报文后,为了确认收到报文,会向客户端发送SYN报文+ACK报文,其中SYN报文序列号seq=y,ACK报文中ack=x+1;
  • 客户端收到服务器端的SYN+ACK报文后,通过ACK报文中判断序列号是否正确,确认收到并发送ACK报文给服务器端,其中ACK报文中ack=y+1;

四次握手的实现

在这里插入图片描述
四次握手分为了以下4个步骤:

  • 客户端发送完所有数据后,为了关闭连接,发送FIN报文+ACK报文给服务器端,其中FIN报文中seq=x+2,ACK报文中ack=y+1;
  • 服务器端接收到客户端发送的FIN报文后,会发送ACK报文,来确认FIN报文已经收到,但是有可能服务器端还有信息还未发送到客户端,因此这一步握手只发送确认报文,ACK报文中ack=x+3;
  • 服务器端发送完所有信息后,发送FIN报文,告知客户端我已经没有信息需要发送给你了,可以关闭连接了,其中FIN报文中seq=y+1;
  • 客户端收到FIN报文后,会发送ACK报文进行确认,其中ACK报文中ack=y+2;

为什么需要三次握手与四次握手

为什么需要三次握手

三次握手主要是为了确认连接是否正确,其中包括了:

  • 确认连接是否是历史连接,客户端长时间没有收到服务器端的回复时,会重新发送SYN报文,之前发送的报文可能成为历史连接被服务器端确认。
  • 确认初始序列号正确,无论客户端和服务器端收到SYN报文时都会回复ACK报文来确认通信时初始序列号的正确性。

为什么需要四次握手

四次握手可以分为两次两次握手,先是客户端的请求断开进行握手,后是服务器端请求断开进行握手。主要原因是客户端发送完所有信息后,可能服务器端还有信息需要发送给客户端,因此服务器端需要等到所有信息都发送完再和客户端进行以此握手来最终关闭连接。

其他

TIME_WAIT

在四次握手之后,客户端需要等待TIME_WAIT的时间之后才会关闭连接。一般来说 TIME_WAIT = 2 MSL。
MSL(Maximum Segment Lifetime)报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
2MSL的时间是从客户端接收到FIN后发送ACK开始计时的。如果在TIME-WAIT时间内,因为客户端的ACK没有传输到服务端,客户端又接收到了服务端重发的FIN报文,那么2MSL 时间将重新计时。

为什么需要TIME_WAIT

  • 保证最后的ACK能让被动关闭方接收
  • 如果不等待TIME_WAIT就断开了连接,有相同端口的TCР连接被复用后,被延迟的相同四元组的数据包抵达了客户端。

TODO:TIME_WAIT过长会带来的问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值