TCP三次握手,四次挥手

三次握手过程:三次握手的最主要目的是保证连接是双工的,(“可靠”更多的是通过重传机制来保证的)

问题1:为什么建立连接是三次握手,四次不可以吗

第一次握手:

    Client什么都不能确认   
    Server确认了对方发送正常


第二次握手:

     Client确认:自己发送/接收正常,对方发送/接收正常
     Server确认:自己接收正常 ,对方发送正常

第三次握手:

    Client确认:自己发送/接收正常, 对方发送/接收正常
    Server确认:自己发送/接收正常,对方发送/接收正常

所以通过三次握手确认双方收发功能都正常,四次也可以但是显得比较多余

TCP三次握手,如果两次握手会怎么样

有这样一种情况,当A发送一个消息给B,但是由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,A会认为这个消息丢失了,然后重新发送消息。

当A和B通信完成后,这个被A认为失效的消息,到达了B
对于B而言,以为这是一个新的请求链接消息,就向A发送确认,
对于A而言,它认为没有给B再次发送消息(因为上次的通话已经结束)所有A不会理睬B的这个确认,但是B则会一直等待A的消息

这就导致了B的时间被浪费(对于服务器而言,CPU等资源是一种浪费),这样是不可行的,这就是为什么不能两次握手的原因了


四次挥手过程:

第一次挥手:

Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:

Server收到FIN后,发送一个ACK给Client, Server进入CLOSE_WAIT状态;Client进入FIN_WAIT_2.

第三次挥手:

Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:

Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。


问题:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

建立连接

因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

关闭连接

当收到对方的FIN报文时,仅表示对方不再发送数据但还能接收收据,我们也未必把全部数据都发给了对方,所以我们可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方表示同意关闭连接。因此我们的ACK和FIN一般会分开发送。

posted @ 2019-04-03 10:19  cecelia  阅读(186)  评论(0编辑  收藏  举报