如何防止TCP套接字的延迟回复?

5
我正在编写一个数据库库,需要智能支持超时。现在我正在研究连接池,特别担心以下情况:
1. 发送查询#1 2. 在n秒后超时。 3. 发送查询#2 4. 收到查询#1的响应
第四步可能会发生,因为查询没有标记查询ID:我只知道我收到了响应,但不知道它属于哪个查询。有人可能会认为这构成了协议上的错误,但这不是我的责任。
在发送查询#2之前,我应该对套接字做什么来避免这样的延迟响应?唯一正确的方法是shutdown(),close()和re-connect()吗?

2
你觉得在所有查询的选择中添加常量,这样你的库就可以识别哪个查询是响应的,怎么样? - T3hc13h
这是一个很棒的想法,但对于一个库来说不太好。也许可以通过插件实现... - Andres Jaan Tack
1个回答

3

很抱歉,这是唯一安全的操作连接的方式,因为没有其他方法可以在TCP上实现问题和答案之间的一对一。似乎缺少某种中间的取消功能。

这个参考资料提供了更多的见解:http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html


这是因为TCP并不知道你所谓的“查询”,“响应”或“取消”。连接的套接字只是用于传输字节的两个单向管道(Ted Stevens说得对)。如果一端写入数据而没有出现问题,那么另一端就可以读取它。因此,“查询”和“响应”的建立是一个应用级别的问题。它要么内置在定义查询/响应的协议中,要么根本不存在。 - Steve Jessop
我的意思是,我知道。 :-) 但是TCP确实有序列号,所以我希望有一些技巧可以利用。 - Andres Jaan Tack
@Andres:不幸的是,序列号仅让TCP层组装数据流——无法确定在相反方向上传输的特定字节之间经过了多长时间。请记住,仅因为您发送第一个请求以来已经过去了n秒,并不意味着对方端口已读取了n秒。因此,对方可能已经在超时之前从其角度发送了响应,但该响应在您的视角下超时后才到达。仅凭超时无法处理可靠、时间同步的连接,而TCP并非如此。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接