阿里灵灵 发表于 2021-3-29 22:05

JAVA面试-计算机网络-TCP四次挥手

本帖最后由 阿里灵灵 于 2021-3-31 11:32 编辑

## 学习原因
TCP四次挥手是常面试的考点,所以要好好掌握。

## 通俗示例
小明和小红是网上认识的网友,两个人关系非常好。

小明喜欢吃土鸡蛋,所以小红经常给小明寄家里的土鸡蛋,小红喜欢吃苹果,所以小明经常给小红寄家里种的苹果。

这一次,由于小红家要搬去外国,以后没办法再寄鸡蛋了,小红就发消息跟小明说,“我全家都要搬去国外了,我发完最后这一框鸡蛋后,我就不再给你寄鸡蛋了。”,发完信息后,小红寄完最后的鸡蛋后,就不再寄鸡蛋了。这是第一次信息交互,小红发送完最后的数据,同时让小明知道她要搬家了,以后不再寄鸡蛋了。这就是第一次挥手,客户端向服务端发送完最后数据后,停止发送数据,并发送消息让服务端知道。


注意:第一次挥手后,客户端但是仍然可以进行信息交互,接收数据和发送数据,不是不能发送数据,只是不发数据;服务端依旧可以发送、接收数据,同时可以进行信息交互。

小明接收到小红的消息后,并不会立即回复消息,而是等接收到到小红最后寄来的鸡蛋后,就给小红回个消息,“你最后的鸡蛋我收到了,但是我家里的还有很多苹果没有寄过去,你先别搬家,等我寄完了,我会和你说一声的”。这就是第二次信息交互,是小明回应小红的答复,同时跟小红表达,自己还寄了很多苹果过去,先别搬家。这就是第二次挥手,在接收客户端停止发送数据的请求和接收完最后的数据后,服务端向客户端发送请求表示已经知晓客户端停止发送数据了。但是服务端还有数据给客户端发送过去,所以,服务端在第二次挥手的时候同时也会表示,自己的数据还没发送完毕,所以先不要关闭数据接收功能。

注意:第二次挥手后,客户端可以进行信息交互,和接收数据,但是不可以发送数据;服务端依旧可以发送、接收数据,同时可以进行信息交互。

一个月过后,小明家里的苹果也没有了,这时候小明停止发送苹果,并给小红发送消息说,“小红,我家里的苹果没有了,所以我之后不会再给你发苹果了,你可以去国外了。”。这就是第三次信息交互,小明的苹果发完了,并且同时让小红可以离开了。这也是第三次挥手的作用,在服务端发送完所有请求后,就停止发送数据,并通知客户端不用再接收数据了。

注意:第三次挥手后,客户端仍然可以进行信息交互,和接收数据;服务端不能再发送数据,但是可以接收数据和进行信息交互。

小红接收到小明的信息后,就给小明发送消息,“我接收到你最后的苹果了,谢谢你,再见。”,小明看到消息后,就不再发送信息了,而小红也不再发送信息,搬家去了国外。这就是第四次信息交互,小红让小明知道她已经收到小明不再寄苹果的消息。这就是第四次挥手,客户端确认服务端没有数据发送后,就向服务端发送断开连接的请求,服务端接收到后,断开连接,客户端在没有接收到数据后也断开连接。

注意:第四次挥手之后,双方断开连接,都无法互相发送数据和信息。除非重新发起请求,进行三次握手,才能再互相发送数据。
![未命名文件.png](https://i.loli.net/2021/03/31/96DMlzcm831gbnu.png)

**为什么不可以把第二次和第三次挥手合并成一次发送,毕竟都是同一个端发送的信息?
**
其实在清楚了解四次挥手的原理和机制之后,我们就可以清楚的明白为什么不可以把第二次和第三次挥手合并。

客户端虽然停止发送数据,但是服务端还有数据要发送,所以第二次只是通知客户端要继续接收数据;而服务端发送完数据后,就发送第三次挥手,停止发送数据。就比如小红虽然停止寄鸡蛋,但是小明还有苹果没给小红寄过去,所以第二次是为了提醒小红还有苹果没有传过去,所以先不要搬家,再寄完苹果后,小明又发送信息通知小红说没有苹果了,我也不寄了。这个也是面对这个问题的时候常用的解释。

**那如果先不发送第二次挥手,而是等到服务端也发送完数据后,直接发送第三次挥手信息给客户端,这不就即可以实现三次挥手,又可以保证服务端数据可以全部发送完毕?**

可以的,这在理论上是可行的,通过延迟确定,可以让服务端的第二次请求延迟,等到数据发送完毕后,直接发送第三次挥手一块发送给客户端。从而实现三次握手。但是这样导致的一个问题就是,如果第三次挥手迟迟未到,客户端发送数据功能迟迟不能关闭,可能导致资源浪费。因为客户端要在接收到服务端的第二次挥手才停止发送数据功能。

**四次挥手只能是客户端发起吗?**

很显然不是,TCP中断的请求,任意一方都可以发起,所以四次挥手的发起任意一方都可以先进行。

## 结语
以上就是四次挥手的知识点讲解。四次挥手在是否能实现三次挥手的问题上是可以进行探讨,之后会继续补充,如果哪位小伙伴有什么奇思妙想和建议,可以提出,我会及时收集和改正。

阿里灵灵 发表于 2021-3-29 22:46

zd14785 发表于 2021-3-29 22:45
我好像还没被问过这问题……

好家伙,我当初找实习的时候就被问了。

leileiwoaini 发表于 2021-3-29 22:17

都是高手,厉害了

阿里灵灵 发表于 2021-3-29 22:35

leileiwoaini 发表于 2021-3-29 22:17
都是高手,厉害了

谢谢捧场:handshake

zd14785 发表于 2021-3-29 22:45

我好像还没被问过这问题……

cixihpf 发表于 2021-3-29 23:23

看的有点累,
就不能弄一张结构逻辑图表达一下吗?

masaminaomi 发表于 2021-3-30 00:47

很清晰,小白看懂了

wr01020304 发表于 2021-3-30 03:41

感谢总结

wenweiqun 发表于 2021-3-30 16:28

很清晰,小白看懂了

bandishui 发表于 2021-3-30 19:21

解释的意思,
页: [1] 2
查看完整版本: JAVA面试-计算机网络-TCP四次挥手