首页 > 解决方案 > TCP“连接”是如何维护的,HTTP Keep-Alive 是如何影响它的?

问题描述

我是一名应用程序开发人员,希望更多地了解我这些年来一直在提出的请求的传输层。我也一直在学习更多的后端知识,并正在使用 websockets 构建我自己的实时数据服务,这让我很好奇数据实际上是如何移动的。

因此,我了解了 TCP,并且了解它是如何工作的,但仍然有一个术语让我感到困惑——“TCP 连接”。我到处都看到过,实际上有一个线程打开了完全相同的问题......但正如 OP 在评论中所说,实际上没有人回答这个问题: TCP vs UDP - 什么是 TCP 连接?

“当我们说在两台主机之间建立了连接时,这是什么意思?如果我能得到一个神奇的显微镜并检查服务器或客户端,然后 - 啊哈! - 找到连接,我会看什么在?操作系统代码分配的一些变量?某种表中的一些条目?它是如何以及何时到达那里的,以及如何以及何时从那里删除“

我一直在阅读试图自己解决这个问题,
这是一个很好的资源,详细介绍了 HTTP 流,还提到了“TCP 连接” https://blog.catchpoint.com/2010/09/17/anatomyhttp/

这是关于 HTTP Keep-alive 的另一个线程,相同的“TCP 连接”: HTTP Keep Alive 和 TCP keep alive


我的理解:
当客户端想要来自服务器的数据时,会发生 SYN/ACK 握手,建立这个“连接”,并且双方就起始序列号、最大数据包大小等达成一致。

只要这个“连接”仍然打开,客户端就可以请求/接收数据而无需再次握手。TCP Keep-alive 发送心跳以保持此“连接”打开

1) 不知何故,HTTP 标头“保持活动”也使此 TCP“连接”保持打开状态,即使 HTTP 标头是数据包有效负载的一部分,而且 TCP 层解析 HTTP 标头似乎没有意义?

对我来说,从字面上看,两台机器之间的“连接”似乎永远无法关闭,因为客户端总是可以随意使用数据包访问服务器(例如第一个 SYN 数据包)

2)TCP“连接”只是客户端和服务器从对方的IP地址保存序列号吗?也许这只是一个标志,上面写着“嘿,这个客户很酷,无需握手就可以接受他们的消息”?那么关闭连接是否会从内存中清除该数据?

标签: httptcpconnection

解决方案


... 双方就起始序号达成一致

不,他们不“同意”一个数字。每个方向都有自己的序号。因此,客户端在 SYN 中向服务器发送从客户端到服务器的数据的初始序列号 (ISN),服务器在其 SYN 中发送从服务器到客户端的数据的 ISN。

不知何故,HTTP 标头“保持活动”也使此 TCP“连接”保持打开...

并不真地。使用 HTTP keep-alive,客户端只是很好地要求服务器在发送 HTTP 响应后不要关闭连接,以便可以使用相同的 TCP 连接发送另一个 HTTP 请求。服务器可能会决定是否遵循客户端的意愿。

对我来说,从字面上看,两台机器之间的“连接”似乎永远无法关闭,

每一方都可以发送一个带有 FIN 标志的数据包,以表明它将不再发送任何数据。如果双方都发送了 FIN,则认为连接已关闭,因为没有人会发送任何内容,因此无法接收任何内容。如果一方决定它不想再接收任何数据,它可以发送一个带有 RST 标志的数据包。

TCP“连接”只是客户端和服务器从对方的IP地址保存序列号吗?

有点儿。每一方都保存连接的当前状态,即所涉及的 IP 和端口、当前预期的接收序列号、当前发送序列号、尚未确认的未完成字节......如果没有这样的状态(例如一个站点崩溃)然后没有连接。

...也许它只是一个标志,它在说“嘿,这个客户很酷,无需握手即可接受来自他们的消息”

如果收到符合现有状态的数据包,则将其视为连接的一部分,即将对其进行处理并更新状态。

那么关闭连接是否会从内存中清除该数据?

关闭是告诉对方不再发送数据(使用 FIN),如果双方都完成了,基本上都可以删除状态,然后就没有连接了。


推荐阅读