TCP/IP三次握手四次挥手详解
TCP((Transmission Control Protocol)传输控制协议,是一个面向连接的协议。在运用此协议进行数据传输前都会进行连接的建立工作(三次握手);当数据传输完毕,连接的双方都会通知对方要释放此连接(四次挥手)。
认识TCP标志位
tcp标志位有6种标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
TCP建立连接三次握手与断开连接四次挥手图解:
三次握手过程:
第一次握手:Client发送一个TCP标志位SYN=1、ACK=0的数据包给Server,并随机会产生一个Sequence number=3233.当host2接收到这个数据后,Server由SYN=1可知客户端是想要建立连接;
第二次握手:Server要对客户端的联机请求进行确认,向Client发送应答号ACK=1、SYN=1、
确认号Acknowledge number=3234,此值是host1的***加1,还会产生一个随机的***Sequence number=36457,这样就告诉Client可以进行连接;
第三次握手:Client收到数据后检查Acknowledge number是否是3233+1的值,以及ACK的值是否为1,若为1,Client会发送ACK=1、确认号码Acknowledge number=36457,告诉Server,你的请求连接被确认,连接可以建立。
四次挥手过程:
第一次挥手:当传输的数据到达尾部时,Client向Server发送FIN=1标志位;可理解成,Client向Server说,我这边的数据传送完成了,我准备断开了连接;
第二次挥手:因TCP的连接是全双工的双向连接,关闭也是要从两边关闭;当Server收到Client发来的FIN=1的标志位后,Server不会立刻向Client发送FIND=1的请求关闭信息,而是先向Client发送一个ACK=1的应答信息,表示:你请求关闭的请求我已经收到,但我可能还有数据没有完成传送,你再等下,等我数据传输完成了我就告诉你;
第三次挥手:Server数据传输完成,向Client发送FIN=1,Client收到请求关闭连接的请求后,Client就明白Server的数据已传输完成,现在可以断开连接了,
第四次挥手:Client收到FIND=1后,Client还是怕由于网络不稳定的原因,怕Server不知道他要断开连接,于是向Server发送ACK=1确认信息进行确认,把自己设置成TIME_WAIT状态并启动定时器,如果Server没有收到ACK,Server端TCP的定时器到达后,会要求Client重新发送ACK,当Server收到ACK后,Server就断开连接;当Client等待2MLS(2倍报文最大生存时间)后,没有收到Server的重传请求后,他就知道Server已收到了ACK,所以Client此时才关闭自己的连接。这一点我觉得设计得非常巧妙!
为什么要4次挥手?
确保数据能够完整传输。
当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。
但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,
再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。
关于三次握手与四次挥手通常都会有典型的面试题:
(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。