TCP的3次握手和4次挥手很好理解,但如果问一句,你思考过为什么需要这么复杂的步骤吗?
还是来回顾下这两个操作,首先明确下TCP是全双工通信(2个方向能同时通讯)
(1)3次握手
这里我用男生和女生聊天的例子来解释
男生:在干嘛(第1次握手) | |
刷微博 | :女生(第2次握手) |
男生:哦(第3次握手) | |
男生:xxxxx(开始传输局) | |
xxxxxxxx | :女生 |
客户端发送连接请求(第1次握手),服务端返回收到了该请求的确认(第2次握手)
客户端发送收到了服务端确认的确认(第3次握手),3次握手之后连接建立完成
问题来了,为什么要3次?2次握手为什么不行?
其实2次握手可以完成连接的建立,但会带来资源浪费的问题
客户端 (第2次发送请求)------------>(第1次发送请求)--------------> 服务端
假设通信道路堵塞,第1次的请求未能在限定时间内收到服务端的请求,可能堵塞也可能丢失,于是发送第2次请求
堵塞结束后,2次的请求自然建立了2个TCP连接,但问题是,第1个连接已经被客户端放弃了(因为之前的超时客户端不会在
这个连接上传输数据),而服务端开启了2个连接。此时只有第2个连接是有用的,第1个连接自然就造成了资源的浪费。
(2)4次挥手
男生:拜拜(第1次挥手) | |
哦 | :女生(第2次挥手) |
xxxxxx | :女生(第3次挥手) |
男生:哦(第4次挥手) |
这里第3次挥手是因为服务端可能存在为传输完的数据
这里服务端在第3次挥手完之后关闭服务端向客户端的连接,第4次挥手后客户端向服务端的连接关闭
所以,为什么要4次挥手?
因为TCP的连接只能由客户端开始放弃,服务端只能被动接受,客户端放弃连接后
服务端的数据可能没传输完,所以需要4次挥手才能确保全双工通信的关闭。