三次握手
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个数据包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,并交换 TCP 的信息。在socket编程中,客户端执行connect()时,将触发三次握手。
第一次握手
1. 第一次握手,由客户端发送请求连接即SYN = 1,TCP规定SYN=1的时候,不能够携带数据。但是需要消耗一个seq序号。因此,产生了一个序号seq = x。
第二次握手
. 第二次握手,B主机收到A主机发送的消息。向A主机发送确认。发送SYN = 1,表示请求连接已经收到,把TCP包中ACK位置为1,表示同意连接,并发送一个新的序列号seq =y。
确认好ack = x + 1;
第三次握手
3. 第三次握手,其实经过两次连接之后,双方的基本连接已经建立。但是A收到B的确认之后,还需要向B给出确认,说明自己已经收到确认包了。设置确认ACK = 1,ack = y + 1。而顺序号seq = x + 1,。双方建立稳定的连接。此时ACK报文可以携带数据。
总结
第一次握手:客户端向服务器端发送报文
:证明客户端的发送能力正常
第二次握手:服务器端接收到报文并向客户端发送报文
:证明服务器端的接收能力、发送能力正常
第三次握手:客户端向服务器发送报文
:证明客户端的接收能力正常
四次挥手
我们TCP数据建立连接的时候,需要使用3次握手,但是断开连接的时候,需要挥手四次。所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发
第一次挥手
客户端打算关闭连接,此时会发送⼀个 TCP ⾸部 FIN 标志位被置为 1 的报⽂ ,也即 FIN 报文,之后客户端 |
进⼊ FIN_WAIT_1 状态。
第二次挥手
服务端收到该报⽂后,就向客户端 发送 ACK 应答报⽂ ,接着服务端进⼊ CLOSED_WAIT (表在等待关闭示)状态。
第三次挥手
客户端收到服务端的 ACK 应答报⽂后,之后进⼊ FIN_WAIT_2 状态(等待对方的FIN报文
)。但此时服务端可能还有一些数据未处理完。 等待服务端处理完数据后,也向客户端发送 FIN 报⽂ ,之后服务端进⼊LAST_ACK 状态。
第四次挥手
客户端收到服务端的 FIN 报⽂后,回⼀个 ACK 应答报⽂,之后进⼊ TIME_WAIT (收到了对方的FIN**报文**,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态)
服务端收到了 ACK 应答报⽂后,就进⼊了 CLOSED 状态,⾄此服务端已经完成连接的关闭。
客户端在经过 2MSL ⼀段时间后,⾃动进⼊ CLOSED 状态,⾄此客户端也完成连接的关闭。
为什么要进行三次握手?
主要原因:防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误
为什么需要四次挥手?
因为不像建立连接的过程,接收方收到连接请求后可以立即发送SYN进行连接,释放资源时,接受方在收到发送方的释放连接请求后,还需要一段时间来处理未完成的发送请求,这里需要两次确认发送方的请求:第一次是未处理完,我还不能释放,但是收到了你的请求,告诉发送方一声,等等我;第二次确认表示已经处理完请求了,我也可以进行释放了。因此需要四次