三次握手和四次挥手

226 阅读3分钟

最近找实习,在面试过程中遇到了经典面试题:你能讲一下三次握手和四次挥手吗?

面试过程中感觉讲的不是很清楚,遂写下该文,增加理解

三次握手

在TCP建立连接时,客户端和服务端一共需要发送三个包,所以叫三次握手

第一次,客户端发送给服务端,SYN=1,Seq=X,将SYN标志位置1,X为客户端选择的序列号,发送之后客户端进入SYN SEND状态

第二次,服务端接收到客户端发来的包,回了一个包,SYN=1,ACK=1,ACKNum=X+1,Seq=Y,将SYN和ACK位都置1,客户端发来的Seq+1之后作为ACKNum返回,同时选择一个序列号作为Y发送给客户端,此时可以确定客户端的发送能力(因为服务端接受到了客户端的包),至此服务端进入SYN RCVD状态,此时的TCP连接为半连接状态

第三次,客户端接收到服务端的回复后,可以确定服务端的接收能力和发送能力,此时再发一个包回复给服务端,ACK=1,ACKNum=Y+1,如果服务端接收到了客户端的第三次发包,则可以确定客户端的接收能力,客户端发送后进入ESTABLISH状态,服务端接收后进入ESTABLISH状态。

至此,通信双方的发送和接收能力都确认,连接建立成功

three-way-handshake

注意

  1. SYN:同步序列编号(Synchronize Sequence Numbers),该标志仅在TCP的三次握手中有效,提示服务端检查序列编号
  2. ACK:确认编号(Acknowledgement Number),提示远端系统已经成功接收,ACKNum为X+1和Y+1的作用是方便对方验证。在四次挥手中亦然。
  3. 在第三次发包时可以携带数据
  4. SYN攻击:攻击者伪造大量虚假IP,不断发送(SYN=1,Seq=X)包,服务端接收到之后回复ACK包,但是由于IP地址是虚假地址,无法接收到回复,所以会长时间占用资源,导致服务器网络拥堵,无法进行正常的业务。该攻击无法杜绝,只能检测和降低损失。

四次挥手

关闭TCP连接时需要发送四个包,所以叫四次挥手

第一次挥手:客户端发送给服务端,FIN=1,Seq=X,表示客户端已经不会在发送数据了,但是还可以接收数据。

第二次挥手:服务端发送给客户端,ACK=1,ACKNum=X+1,表示已经接收到客户端的关闭请求

-- 此时会等待服务端处理之前未处理完的数据。。。

第三次挥手:服务端发送给客户端,FIN=1,Seq=Y,表示服务端已经不会再发送数据了

第四次挥手:客户端发送给服务端,ACK=1,ACKNum=Y+1,表示客户端接收到了服务端的关闭请求,此时会等待2倍MSL的时间。

至此,完成TCP的关闭。

four-way-handshake

注意

  1. FIN:结束(Finish),表示关闭连接。

  2. MSL:报文段最大生存时间(Maximum Segment Lifetime)。

    等待两倍MSL的原因:服务端如果没接收到在第四次挥手时客户端的ACK包,此时客户端会重新接收到服务端发来的FIN包,如果等待过程中没接收到服务端重新发送的FIN包则意味着服务端接收到了客户端的ACK包。

  3. 在第二次挥手之后的等待:这段时间服务端要处理一些之前未处理完的,未发送完的数据。