【网络】TCP3次握手与4次挥手
2020/02/08 来源:乐潮信息
客户端与服务端的通信中步骤
1建立Tcp连接
3次握手
2再进行数据传输
3数据传输完成后,断开连接。
4次挥手
建立Tcp连接
1 Client ---> Server:(员工:老板看到我发的消息没)
设置SYN=1,seq=J,并将该数据包和SYN请求信号发送给Server,Client进入syn_sent(发送)状态,等待Server确认。
2Server --->Client :(老板:看到了,你确定下看到我消息没)
接收数据包后,设置SYN=1,ACK=1,ack=J+1 ,seq=K,发送给Client,表示确认收到了Client的请求,Server进入syn_rcvd(已收到)状态;
3 Client---> Server:(员工:我也收到你的回复的,你看下收到我的回复了没,收到说明我们通信连接成功了)
Client:检查是否 ACK=1 && ack=J+1,如果是则设置ACK=1,ack=K+1,并将数据包发送给Server;
Server:检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入established(确认)状态,三次握手完成,
注意
半连接
在三次握手过程中,Server发送SYN+ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect)
SYN攻击
在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
断开连接:
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
1 Client---> Server(数据发送完了,关闭连接吧)
Client发送一个FIN,表示Client要发送的数据已经发送完成,请求结束连接,Client进入fin_wait_1状态;
2 Server---> Client(收到你的信息,请确定你也收到我的信息)
Server收到Client的FIN后,会向Client发送一个ACK,表示收到了Client的FIN请求,确认序号为收到序号(A)+1(即ack=A+1),Server进入close_wait状态(此时Server可能没有完成向Client的数据传输);
3 Server---> Client(收到你的信息,我的信息已发送完毕,请确定收到我的信息)
当Server完成向Client的数据传输后,向Client发送一个FIN ,,表示Server已经完成发送,Client可以断开连接,Server进入last_ack状态;
4 Client---> Server(收到你的信息,我过一定就关闭了,你也关闭吧)
Client:接收到Server的FIN后,Client进入time_wait状态,并向Server发送一个ACK,确认序号为收到序号(C)+1(ack=C+1)
Server:检查客户端信息正确,Server进入closed状态,Client断开连接,Server关闭连接,四次挥手完成。
注意
在time_wait状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。
网络转载