什么是TCP半开放连接和TCP半封闭连接


17

我试图了解TCP Half Open Connection和TCP Half Close Connection之间的区别是什么,谁能说出它们到底是什么?

Answers:


26

这篇文章在半封闭连接上展开。对于半开连接,请参见KContreau的正确说明。

什么是半封闭连接?或者:这不是错误,而是功能!

每个TCP连接都包含两个彼此独立关闭的半连接。因此,如果一端发送FIN,则另一端可以自由地仅对FIN进行ACK(而不是FIN + ACK),这向FIN发送端发出信号,表明它仍有数据要发送。因此,除了ESTABLISHED之外,两端都处于稳定的数据传输状态,即FIN_WAIT_2(用于接收端)和CLOSE_WAIT(用于发送端)。据说这种连接是半封闭的,TCP实际上是为支持这些方案而设计的,因此半封闭连接是TCP的功能。

半封闭连接的历史

尽管RFC 793仅描述了原始机制,甚至没有提到术语“半封闭”,但RFC 1122在4.2.2.13节中对此进行了详细说明。您可能想知道到底谁需要该功能。TCP的设计者还为Unix系统实现了TCP / IP,并且像每个Unix用户一样,都喜欢I / O重定向。根据W.Stevens(TCP / IP,请参见第18.5节),对I / O重定向TCP流的需求是引入该功能的动机。它允许FIN ack充当EOF或将其翻译为EOF。因此,从根本上讲,它是一项功能,可让您在应用程序层上随意创建即兴的请求/响应式交互,其中FIN表示“请求结束”。


10

其他人在描述实际上半打开和半关闭的连接方面做得相当不错,但是在他们是一个问题的情况下,也经常会寻求半打开连接的想法。

互联网上有关于“半开”或“半闭”术语应代表什么的争论,但是就我而言,术语只是语义。有人说“半打开”连接是一个“问题”,而“半关闭”连接是一种设计功能,通过该功能,您可以在文件下载以半关闭状态结束之前关闭发送流,从而关闭发送流(如其他用户所述)。

但是,关于另一个...“问题”:打开TCP连接需要3次握手,而关闭它需要4次握手。

TCP存在一个漏洞,即当实际意图完全关闭连接时,路由器/网络可能会丢弃发送到客户端的最终FIN数据包,从而导致连接处于半打开状态。这种方法和类似方法已成为流行的拒绝服务攻击类型,因为它们不需要大量带宽,但是根据服务器的实现,它们可能会消耗宝贵的句柄,套接字和线程,但它们也可能在现实世界中发生。由于我们的劣质无线运营商,频率越来越高。

操作系统已尝试通过限制给定时间在操作系统中可以出现的半开/关闭连接的数量,并引入连接可以保留在操作系统中的最大时间长度来对抗半开式DDoS攻击。半开/关状态。上次我亲自检查了一下,但是Windows上的时间限制非常高(如果我记得的话,是2天)。

TCP保持活动的可选性质进一步加剧了这种情况,TCP保持活动的可选性质(如果完全实现的话)旨在作为协议级(与应用程序级相反)的解决方案来检测无效/僵尸连接。但是,在设计TCP时,带宽比现在更加宝贵,并且有人担心,TCP的强制性保持活动计时器太“闲谈”了。因此,保持活动是可选的,通常不使用,并且不能保证根据RFC1122由路由器传输。因此...即使您在TCP层启用了保持活动以尝试检测/处理该方案,您也可能会发现,随着您的流量在世界范围内传播,某些路由器会丢弃保持活动数据包...潜在的另一个罕见场景需要测试。

半开放式连接给编写基于TCP的服务器的编码人员带来了工程上的挑战,特别是因为半开放连接可能无意间随机出现,在高负载期间……通常在生产服务器上……并且可以在Alpha / Beta测试阶段很难注意到。以我的经验,我发现它们发生在每天处理250万个连接的服务器上,每40,000个连接中就有1个发生,但是这些数字将根据您的流量状况以及服务器与客户端之间互联网每一段的流量状况而变化。 。

作为工程师,可能很难仅在已部署的实时服务器上跟踪很少发生的问题,因此在编写TCP服务器代码以分析服务器在响应时的反应方式时,尝试模拟这种罕见的连接状态非常重要。面对这种情况。例如,如果您的TCP服务器使用静态数量的工作线程,则在部署到生产环境时,您可能会发现所有这些线程都被僵尸连接消耗。如果连接需要大量的工作内存,则最终结果可能类似于内存泄漏。等等等

如果没有100%可行的Keep-alive解决方案,TCP会将其留给用户层来确定如何处理半开/关闭连接,因此您的代码必须具有计划/机制以进行检测,超时和清除。当发生这种情况时,将占用资源...也就是说,假设这是您发明的协议,而不是程序员通常使用的许多(不良)开放标准之一。当然,我指的是仅在TCP上运行的协议,例如HTTP。这些程序员认为这些协议被高估了。

聪明的公司意识到TCP的弱点及其在传输HTTP / Web流量方面的不幸流行,因此寻求替代方案。例如,谷歌尝试了一种称为QUIC的协议,该协议通过UDP传输HTTP。还有一个称为TSCP的开放协议。但是,这些协议都没有被广泛采用。

通常,我会构建所有自己的服务器,以专门基于我自己的基于UDP的协议进行通信。UDP比您想象的要棘手,我感觉我一直在调整它,使其变得更快,更智能,更低延迟,更低拥塞……但是至少我不再需要处理半开放连接; )


9

TCP建立连接时,由于发生了握手,因此被认为是有保证的:

  1. 启动计算机发送连接请求,发送一个SYN
  2. 响应的计算机授予请求,并以SYN-ACK进行响应
  3. 发起计算机发送确认,并以ACK答复

到那时,连接建立,数据开始流动。相反,不能保证UDP数据包,只是为了希望它到达而发送。

http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_ Establishmentment

在此处输入图片说明

正式地,根据RFC,半开放的TCP连接是指已建立的连接的一侧已崩溃,并且未发送连接即将终止的通知。这不是今天的常用用法。

非官方地,如果可以指胚胎的联系,那是建立过程中的联系。

http://en.wikipedia.org/wiki/Embryonic_connection

半封闭式与该非正式定义相反。这是中间位置的某个状态,计算机在断开建立的连接。


4
您对半开半合的误导言论
artistoex

0

TCP连接终止的最佳说明

在TCP三向握手过程中,我们研究了如何使用SYN位段在传输控制协议(TCP)中在客户端和服务器之间建立连接。在本文中,我们将研究如何在客户端和服务器之间建立TCP关闭连接。在这里,我们还需要将FIN位设置为1的位段发送到服务器。

11 在此处输入图片说明

机制如何在TCP中起作用:

Step 1 (FIN From Client) – Suppose that the client application decides it wants to close the connection. (Note that the server could also choose to close the connection). This causes the client send a TCP segment with the FIN bit set to 1 to server and to enter the FIN_WAIT_1 state. While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment (ACK).
Step 2 (ACK From Server) – When Server received FIN bit segment from Sender (Client), Server Immediately send acknowledgement (ACK) segment to the Sender (Client).
Step 3 (Client waiting) – While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment. When it receives this segment, the client enters the FIN_WAIT_2 state. While in the FIN_WAIT_2 state, the client waits for another segment from the server with the FIN bit set to 1.
Step 4 (FIN from Server) – Server sends FIN bit segment to the Sender(Client) after some time when Server send the ACK segment (because of some closing process in the Server).
Step 5 (ACK from Client) – When Client receive FIN bit segment from the Server, the client acknowledges the server’s segment and enters the TIME_WAIT state. The TIME_WAIT state lets the client resend the final acknowledgment in case the ACK is lost.The time spent by client in the TIME_WAIT state is depend on their implementation, but their typical values are 30 seconds, 1 minute, and 2 minutes. After the wait, the connection formally closes and all resources on the client side (including port numbers and buffer data) are released.

有关更多信息:https : //www.geeksforgeeks.org/tcp-connection-termination/


-1

半封闭连接是服务器和客户端的一端打算终止连接时建立的过程。TCP是一个面向连接的过程,因此每个套接字都为特定的应用程序打开。在TCP中,没有终止应用程序的压力。因此,面向连接的过程延长了等待信号的终止时间。这在TCP中称为半封闭(连接)


1
半封闭连接不是“过程”。TCP不是“面向连接的”进程。TCP与应用程序终止无关。TCP中没有“等待信号”。这是令人困惑和错误的。
Johannes Overmann '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.