2016-01-09 37 views
0

本地主机上的TCP套接口是否可以接收来自先前连接的数据包?如果是这样,那么任何假定这种情况不会发生的程序都会被破坏。特别是,任何假定localhost上的套接字永远不会从它应该连接的对等体之外的任何其他数据接收任何数据的程序都会中断。本地主机上的套接字是否可以接收来自先前连接的数据包?

编辑:我知道这不是假设发生。但是,我认为如果以前的套接字不在TIME_WAIT中足够长时间,它会发生可能的。我正在处理的应用程序要求此绝不会发生在本地主机上 —否则,它受制于任意代码执行漏洞。

回答

-1

不,TCP套接字是基于连接的。

一旦连接,TCP套接字只能从 远程机器发送和接收到/。这意味着您的应用程序中每个 客户端都需要一个TCP套接字。

Source

+0

无关和非规范性的参考。 “TCP套接字是基于连接的”这一事实并没有真正回答这个问题,即关于连接的问题。 – EJP

+0

报价答案。一旦连接,它们只能发送/接收来自特定的远程机器。我不明白这怎么回答不了这个问题。 – GAntoine

+1

您似乎并不了解TIME_WAIT的目的,以及为什么这是必要的,这里不是向您解释它的地方。只要说它是*必须提供*关于connecton完整性的保证,你只是断言是这种情况。这就是OP在他的问题中提到的原因。如果TIME_WAIT期间太短,则无法提供担保,您的回答和引用将是错误的。事实上,他们只是挥手致意。 – EJP

2

如果您还没有与TIME_WAIT设置好惹的,并把它忘在它的默认值,它是两次最大段生存时间(MSL),并且因此不可能从段先前的连接要在网络中持续足够长的时间才能通过同一端口上的新套接字接收。

TCP将初始序列号随机化的事实是另一个防御。陈旧分段的序号很可能不适合当前的接收窗口。

+0

最大段寿命是任意的。我如何知道内核将在本地主机上处理当时的所有流量? – Demi

+0

@Demetri MSL不是任意的。它在[RFC 793](https://tools.ietf.org/html/rfc793)中规定为2分钟。 – EJP

+0

我知道它是这样指定的。我不知道内核的TCP堆栈保证在这段时间内完成所有的数据包处理 - 我需要在这里保证。 – Demi

相关问题