Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 正在分析tcp连接的结束_Sockets_Tcp_Tcp Ip - Fatal编程技术网

Sockets 正在分析tcp连接的结束

Sockets 正在分析tcp连接的结束,sockets,tcp,tcp-ip,Sockets,Tcp,Tcp Ip,TCP连接可以通过多种方式结束。这是我的理解: rst:立即启动。连接完成后,立即关闭。所有进一步的通信都是“新”连接 fin:一方的请求很好。它必须是ack已确认,然后另一方发送fin表示他们已结束通话。这也必须ack确认。这些阶段可以同时发生,但必须传递一个fin和伴随它的ack 还有其他的吗?我正在查看Wireshark中的tcp流,它只发送了fin、psh、和ack位。这已确认,连接已结束。还有什么其他关闭TCP连接的方法 如果fin被acked,是否可以发送更多数据?如果是,是否需要重

TCP连接可以通过多种方式结束。这是我的理解:

rst
:立即启动。连接完成后,立即关闭。所有进一步的通信都是“新”连接

fin
:一方的请求很好。它必须是
ack
已确认,然后另一方发送
fin
表示他们已结束通话。这也必须
ack
确认。这些阶段可以同时发生,但必须传递一个
fin
和伴随它的
ack

还有其他的吗?我正在查看Wireshark中的tcp流,它只发送了
fin
psh
、和
ack
位。这已确认,连接已结束。还有什么其他关闭TCP连接的方法

如果
fin
ack
ed,是否可以发送更多数据?如果是,是否需要重新发送原始的
fin
(发送
fin
的一方的状态是否在某个点重置)

还有其他的吗

没有

我在看Wireshark中的tcp流,它只发送了fin、psh和ack位。这已确认,连接已结束

不,它只在一个方向关闭。直到两位同行都发送了FIN,这一切才结束

还有什么其他关闭TCP连接的方法

没有

如果fin已确认,是否可以发送更多数据

即使FIN未确认,也无法按照FIN发送的方向发送。它可以发送到另一个方向

如果是,是否需要重新发送原始fin(发送fin的一方的状态是否在某个点重置)


不可能发生。

确实只有两种方法可以关闭TCP连接

  • FIN 4路握手
  • RST
FIN机制是关闭TCP连接的正常方式。您必须了解TCP套接字有一个状态机。对于套接字上发生的每个操作,都会检查此状态机。插座上的闭合称为半闭合。如果你这么做,就好像告诉我再也没有什么东西要送了。套接字下的状态机将真正检查这一点,如果您仍然尝试发送,您将得到错误返回码。 我所说的状态机在这里用图纸描述得很好;-)


《TCP/IP指南》是一本在线书籍,书中还描述了可能发生的RST场景,以及滑动窗口机制、字节确认、nagle和许多其他内容。不仅仅是TCP协议,还有其他协议。

在离开毫无意义的谷歌搜索之前,请仔细阅读这个问题。结束连接的方法比图中的更多(大多数都没有提到重置!),我提到的第二点是结束连接的常用方法。我对连接失效的非标准方式感兴趣。假设存在一种,这就是状态图应该显示的。RFC 793中的真实TCP状态图清楚地表明,没有任何其他方式可以终止TCP连接。@EJP:但是,TCP连接也有其他方式会终止。计算机脱离网络(当您将计算机置于睡眠状态时,它不一定会杀死所有打开的连接)。这些是超时事件。是否有通过超时结束连接的过程?(也就是说,我在几分钟内发送了几次“你在吗”数据包,当我没有收到响应时,我会关闭连接,如果你最终出现,我会发送重置)这是标准吗?@AndrewScott这些都是网络消亡的方式。您的问题是关于TCP连接的。您提到的每一个条件都将产生重置或应用程序超时。句号。这是正确的,但TCP/IP堆栈可能不符合。一些供应商为此臭名昭著。超时或断开连接怎么办?有什么标准的方法来处理它们吗?@Andrewspot通常在TCP连接需要保持时(例如,定期发送一个小数据包)检测TCP连接。@Jason:当检测失败(未确认)时,如何断开连接@Andrewspot TCP keepalive失败将产生重置。如果是您自己的超时,或者是应用程序协议中实现的心跳,那么您只需关闭套接字,它将发送一个FIN等。