TCP三次握手和四次挥手

文章类型:Javascript

发布者:hp

发布时间:2023-02-20

TCP 建立连接是三次握手,而断开连接是四次挥手

1:SYN(Synchronize Sequence Numbers),同步序列编号;

2:ACK(Acknowledge Character),确认字符;

3:SEQ(Sequence Number),序列号。

第一次握手:请求建立连接
客户端将标志位SYN置为1,随机产生序号值seq=J,保存在序列号(Sequence Number)里,指明端口,将该数据包发送给服务器端,然后进入SYN_SENT状态,等待服务器端确认。


第二次握手:确认应答并答应建立连接
服务器端收到数标志位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状态

为什么是三次握手:

1:防止重复连接,避免重复连接引起的混乱问题,比如网络问题导致的过期请求

2:同步初始化序列化,需要一个“序列号”字段来保证自己的稳定性,序列号的作用是防止数据包重复发送以及有效的解决数据包接受顺序颠倒问题。通过确认,服务端拿到可靠的序列号

四次挥手:

第一次挥手:请求断开连接

客户端发起挥手请求,向服务端发送标志位是FIN报文段,设置序列号seq,此时,客户端进入FIN_WAIT_1状态


第二次分手:针对客户端做确认应答

服务端收到了客户端发送的FIN报文段,向客户端返回一个标志位是ACK的报文段,ack设为seq加1,客户端进入FIN_WAIT_2状态。


第三次分手:请求断开连接

服务端向客户端发送标志位是FIN的报文段,请求关闭连接,同时客户端进入LAST_ACK状态。


第四次分手

客户端收到服务端发送的FIN报文段,向服务端发送标志位是ACK的报文段,然后客户端进入TIME_WAIT状态。

服务端收到客户端的ACK报文段以后,就关闭连接。

此时,客户端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,客户端也可以关闭连接了

为什么需要四次握手:

1:客户端给服务端发送时,只代表客户端不再发送数据但是可以受数据

2:服务端回应客户端时,有可能还有数据在发送,只有等不再发送数据后才能统一关闭连接

为什么要等待2MSL?

MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。

一:保证TCP协议的全双工连接能够可靠关闭,由于不可靠或者网络原因,导致服务端没有收到ACK报文,那么就会超时重新发送FIN,如果客户端已经关闭状态,

那么就找不到,出现连接错乱,所以,客户端需要保持TIME_WAIT,直到再次收到FIN,最后正确关闭连接

二:保证这次连接的重复数据段从网络中消失,如果客户端发送ACK后直接进入关闭状态,

如果再发起连接,不能保证端口不相同同,有可能前一次的老数据延迟到达,就会出现问题,导致数据包混乱