本文主要参考博客:here。
TCP协议是面向连接的、可靠的传输层协议,采用全双工通信(也就是建立连接的两个对象可以同时发送和接收信息)。
本文使用A和B表示建立连接的两个对象。
三次握手
三次握手的目的是为了确认A和B都有发送和接受信息的能力,其过程如下:
1 A向B发起连接请求:A->B;
2 B收到A的请求,并返回确认信息:B->A;
3 A收到B的确认信息,并返回确认信息:A->B。
我们使用表格来记录三次握手确认的信息有哪些。在建立连接之前,我们的状态如下:
A | B | ||
收 | 发 | 收 | 发 |
在第一次握手后我们可以确认A可以发送数据:
A | B | ||
收 | 发 | 收 | 发 |
1 |
在第二次握手后,我们可以确认B可以同时接收和发送信息:
A | B | ||
收 | 发 | 收 | 发 |
1 | 2 | 2 |
在第三次握手后,我们可以确认A可以接受信息:
A | B | ||
收 | 发 | 收 | 发 |
3 | 1 | 2 | 2 |
由上面的过程可知,经过三次握手后,我们知道了A和B都具有接收和发送信息的能力,从而保证能够全双工通信。三次是能够确认A和B能够进行全双工通信的最小次数。
四次挥手
四次挥手的目的是关闭连接,而关闭连接后的状态需要A和B双方都不再发送信息(也就意味这双方不会再接受信息),其过程如下:
1 A向B发送信号,表示没有数据发送了:A->B;
2 B收到A的信号,确认关闭连接请求:B->A;
3 B向A发送信息,表示没有数据发送了:B->A;
4 A收到B的信息,确认关闭连接:A->B。
同三次握手一样,我们同样使用表格来记录我们的挥手过程,表格初始状态如下:
A | B | ||
不收 | 不发 | 不收 | 不发 |
第一次挥手后,我们知道A不会发送信息了:
A | B | ||
不收 | 不发 | 不收 | 不发 |
1 |
第二次挥手后,我们确认B不需要接收信息:
A | B | ||
不收 | 不发 | 不收 | 不发 |
1 | 2 |
第三次挥手后,我们知道B不会发送信息:
A | B | ||
不收 | 不发 | 不收 | 不发 |
1 | 2 | 3 |
第四次挥手后,我们知道A不会再接受信息:
A | B | ||
不收 | 不发 | 不收 | 不发 |
4 | 1 | 2 | 3 |
至此,A和B两个对象都不发送也不接受信息了,连接关闭。
为什么挥手比握手多一次?
由上面的分析可知,在握手的时候,第二次握手可以同时确认B可以接受和发送信息;而在挥手的时候,B接收到A的挥手信号,并不意味着B也需要立刻停止数据传送,所以B在停止发送数据时还需要再一次发送挥手信号。
概括着讲,握手是确认A和B的数据接收和发送能力,而挥手需要考虑A和B停止数据传输的先后顺序。于是,挥手比握手要多考虑一步。