关于 ACK
、FIN
、SYN
状态码的含义
ACK
用于确认,表示通知对方,我已经收到你发来的信息了。FIN
用于结束,表示告知对方,我这边已经结束,数据全部发送完毕,没有后续输出,请求终止连接。SYN
用于同步和建立连接,表示告知对方,我这边请求同步建立连接。
三次握手(简易版)
- 客户端向服务端发送一个连接请求
SYN
报文,表示想要与服务器建立连接 - 服务端接受到请求,首先表示确认再向客户端发送连接请求,同时发送一个
ACK
和SYN
- 客户端收到请求,发送
ACK
发送确认请求,两者达成建立
为什么是三次不能是两次,不能在服务器发送确认和请求后也就是第二次握手后就直接确认连接呢?
因为很多不可控的因素,不如网络原因,客户端发送请求后,由于网络延迟,服务器不能及时收到请求。此时客户端响应了很久也没有得到反馈,就将这个请求废弃掉了,便开始下一次请求。但是过了一会儿服务器又收到了这姗姗来迟的请求,他并不知道他花了多久来的,只知道他来了,便确认了请求。
如果此时直接建立连接,那么这个连接是无效的,因为客户端已经废弃了这个请求,但是服务器不知道废弃了,知识傻傻的挂载那里消耗资源来维护它。
所以此时就体现了第三次握手的重要性,服务器需要知道这个连接是否还有用,因此需要客户端再发送一次请求,来表示这个请求的确是需要用的,并没有失效
四次挥手(简易版)
-
客户端发送
FIN
,表示请求可以结束了 -
服务器表示收到,并发送
ACk
2,3中间服务器可能还有一些没发送完成的数据可以继续发送
-
服务器再发送一个
FIN
,表示我的数据发送完了可以结束了 -
客户端表示收到发送
ACK
,连接断开
可以看成下面这段对话
- 客户端:喂,我好了。
- 服务端:噢,你好了是吧,我知道了,我还没好,你等一哈。
- 服务端:OK,现在我也好了。
- 客户端:收到,这次玩的很开心,我们下次再约。
为什么断开连接有四次
服务端收到来自客户端的FIN
时,只是表示客户端不再发送数据了,但是还能接收数据,而且这会儿服务端可能还有数据没有发送完,不能马上发送 FIN
报文,只能先发送 ACK
报文,先响应客户端,在确认自己这边所有数据发送完毕以后,才会发送 FIN
。 所以,在断开连接时,服务器的 ACK
和 FIN
一般都会单独发送,这就导致了断开连接比请求连接多了一次发送操作。
这个文章讲的挺好的:
链接:https://juejin.cn/post/6844903938232156167