hopeless-dream

导航

TCP三次握手和四次挥手

三次握手

 

 

第一次握手:客户端向服务端发送SYN报文(SYN=1),指明客户端的初始化序列号(ISN 发送数据中第一个字节的序号),即seq=x,然后客户端进入SYN-SENT状态

第二次握手:服务器接收到客户端的SYN报文,发送SYN报文响应(SYN=1),指定服务端的初始化序列号,即seq=y,回复ACK=1表示确认收到客户端的SYN报文,同时发送客户端ISN+1作为ack确认号的值,表示希望接受下一个数据,即ack=x+1,服务器此时进入SYN_RCVD

第三次握手:客户端接收到服务端的SYN报文,回复ACK=1表示确认收到服务端的SYN报文,同时发送客户端ISN+1作为ack确认号的值,表示希望接受下一个数据,即ack=y+1,指明客户端的序列号,即seq=x+1,客户端进入Established状态,服务端收到ACK报文后,也进入Established状态。

注意:ISN随时间变化,SYN=1的阶段(前两次握手)不能携带数据。

半连接队列和SYN flood攻击
前两次握手完成时,客户端和服务端处于办理按揭状态。泛洪攻击就是发生在此阶段,客户端伪造大量不存在的IP,向服务端发送SYN包,让服务端确认。因为IP地址不存在,服务端需要不断的重传直至超时。

 

 

四次挥手


第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于 FIN_WAIT1 状态,等待服务端的确认
FIN = 1,seq = u

第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。
ACK = 1,seq = w,ack= u + 1

此时TCP是半关闭状态,服务端去向应用层确认是否能关闭连接。同时,客户端接收到确认后,进入FIN_WAIT2,等待服务端发送释放报文。

第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认
FIN = 1,ACK = 1,seq = w,ack = u + 1

第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT(时间等待)状态。
ACK = 1,seq = u + 1,ack = w + 1

posted on 2022-06-01 19:23  hopeless-dream  阅读(31)  评论(0编辑  收藏  举报