请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

四次挥手

老师,在第四次挥手时,如果客户端发送一个FIN命令,他就断开输出流了,那后面当客户端收到服务端的两个回送命令时,客户端怎么可以又向服务端发送一个ACK命令

正在回答 回答被采纳积分+3

2回答

Qiujuer 2018-10-25 00:55:13

理论来说 FIN 命令发送后的一段时间内是处于等待的时间,在某些语言或者机器上会有超时机制,会等待一段时间;

在等待时间内如果客户端有回送一个命令代表收到,但是没有回送客户端关闭的话,代表此时还有数据没传输完成;此时服务器,会尝试更改其等待操作的时间,一般会改成2小时,但不是绝对。

如果客户端一句也没有回送命令,此时也会进入等待阶段,但是等待时间不会太长,一般在几分钟内得到相应。

如果没有得到响应则会尝试进行关闭操作;也有可能是抛出异常的操作。

这取决于具体的语言,与系统内部实现有所不同。


在某些极端情况下,可能在上述情况下都会出现无限等待的情况。此时就需要借助心跳包与当前客户端活跃性扫描的机制来进行强制关闭操作了。

2 回复 有任何疑惑可以回复我~
  • 看不懂在说啥,能不能直接回答一下他的问题?是不是意思就是,客户端回复第一个ACK之后,并没有断开输出流?
    回复 有任何疑惑可以回复我~ 2021-07-02 09:45:33
  • Qiujuer 回复 Mr_Rihan #2
    流其实并不存在牢固不变的链接,比如我的电脑和你的电脑之间,可能我发了一个消息后立刻就停电了,但对方并不知道我的状态,所以会发送数据过来等待我的确认;但这个等待时间是有时限的,超过时限就认为我真的断开了。
    但,假如,我发多个消息的过程中,处于一会儿断电,一会儿恢复的状态,其实对方并不会知道我时断时续;当然这个比喻有些放大时常;实际的Socket传输相互确认的时间会短很多。
    回复 有任何疑惑可以回复我~ 2021-07-16 10:37:57
g29tony 2019-09-17 11:04:57

这个问题很刁钻 哈哈

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信