【问题标题】:What indicates the end of a TCP stream?什么表示 TCP 流的结束?
【发布时间】:2018-05-18 11:17:50
【问题描述】:

我正在尝试制作一个低级的数据包阅读器,有点像wireshark,用于学习和娱乐。

在进行http解析时,我很快发现有这些TCP流,而且这些数据并不是都在一个数据包中。

编辑:我认为我被告知的流不是正确的术语。 David Schwartz 将其称为 Query,将 EJP 称为 Sequence of Segments

所以我在 TCP 上做了一些阅读,我到处阅读了关于 sequenceacknowledgement 数字,它们如何增加和环绕等。
我已经知道连接的建立和终止。

说实话,我从来都不擅长解释或使用 google,但我已经有一段时间了,我似乎无法理解服务器/客户端 如何结束 一个 TCP 流。

我问这个是因为,在发送了全部 http 请求后,服务器会立即回复该页面,所以,因为我一直在通过wireshark 中的数据包来回转发,但我似乎找不到是什么界定了这个流(任何指示第一个数据包的长度或倒数第二个数据包和最后一个数据包之间的差异)。

TCP中没有实际的分隔符,你只是从http头的Content-Length得到总长度?

如此处所示,前 3 个数据包是连接建立。
之后的 3 个是 http 请求的发送(第一个是 ACK(选择的),最新的 2 个是 PSH 和 ACK)。 后面的两个是来自服务器的 ACK,然后是整个响应。
最后一个是我的 ACK,在我“记录”的时间里,连接永远不会关闭。

谢谢。

【问题讨论】:

  • 这能回答你的问题吗? en.wikipedia.org/wiki/…
  • @OliverCharlesworth Connection establishment and termination I already had knowledge of.
  • HTTP 规范解释了如何查找查询的结尾。您必须将 TCP 接收流连接到 HTTP 解析器的输入。

标签: http networking tcp


【解决方案1】:

TCP 流的结束由发送了 FIN 位的段标记。

但这不是您真正问题的答案,即关于 HTTP 请求或响应的结束,这取决于:

  1. 内容长度(如果存在)或
  2. 分块传输中的最后一个块(如果使用),或者
  3. FIN

如果有正文,则在下面@Barmar 指出的标题后的空白行。

【讨论】:

  • 这仅适用于包含正文的请求,如POSTPUT 请求。 GET没有body,请求在header后面的空行结束。
  • 那么“流”和“连接”是同一个意思吗?从我在 HTTP 请求/响应之类的东西中看到的情况来看,可以有多个段,这就是我认为的流,因为连接可以保持活动状态。我要问的是关于“最后一块”。我怎么知道它是最后一个块?
  • @TrisT 是的,它们是一回事。如果我没记错的话,最后一个块的长度为零。这一切都在 RFC 2616 中。但是 GET 请求中没有块,因为没有请求正文来块。
  • @EJP 那么您将如何称呼用于传输文件的序列的收集?我已经编辑了我的问题以包含一个图像,该图像显示了一个连接,其中 http 请求以 3 个不同的数据包发送,并且最终不会被终止。 (最后一个数据包的长度也不是 0,它实际上包含 post 数据,其中第二个数据包包含 cookie 的一部分)
  • 我将其称为片段序列。但是从用户的角度来看,TCP 只是一个字节流。
猜你喜欢
  • 2015-05-25
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2016-02-17
相关资源
最近更新 更多