【问题标题】:Question about TCP and how to assemble TCP segments meaningfully关于 TCP 以及如何有意义地组装 TCP 段的问题
【发布时间】:2010-10-27 22:35:03
【问题描述】:

当诸如网络服务器之类的应用程序向网络浏览器发送 HTTP 数据时,浏览器如何知道它何时收到了所有数据,以便它可以开始使用它而不是等待更多? TCP 没有在任何地方指定分段消息的大小。

现在我认为这取决于应用程序层,例如 HTTP 的 Content-Length 标头。但似乎即使是该标头也可以拆分为第二个或第三个数据包。

【问题讨论】:

    标签: networking tcp


    【解决方案1】:

    TCP/IP 是一种面向连接的协议。因此,当浏览器使用 TCP/IP 执行 HTTP 连接时,网络堆栈保证流将按照发送者预期的顺序到达。

    因此,在处理 TCP 时,没有 数据包 的概念。 TCP 是通过套接字到达的有序字节流。根本不需要担心数据包。这就是协议栈的美妙之处:每一层都做自己的工作,并将其上一层抽象出它所解决的问题的潜在复杂性。

    【讨论】:

    • TCP 具有“帧”的概念,而不是数据包。特定帧(由大量 IP 数据包组成)交付完整。
    • 是的,TCP 旨在将数据作为流传输。但是从应用程序的角度来看,我看不到任何方法能够区分两个文件,例如,在同一个 TCP 会话中发送,除非应用程序协议(如 HTTP)像 bmargulies 所说的那样处理这个问题.
    • @Michael Mullaney:TCP 有 'segment' 的概念, 不是数据包,但 API 中不支持它。应用程序只看到一个字节流。
    • 啊,我的术语弄错了,我太久没有做网络了!
    【解决方案2】:

    确实是内容长度,除非客户端读取直到由于另一端关闭连接而获得文件结束指示。当然,在 HTTP 中,'RSVP',所以这不会发生。

    没有内容长度,它必须在内容中寻找</html> 或其他一些分隔符。浏览器根本看不到数据包。连接看起来像一个流,没有边界,由两端来制定协议。

    【讨论】:

    • HTTP 和 HTML 是不同的。除了 HTML 之外,HTTP 还用于许多其他事情。尤其是 CSS 和图像等资产,还有 Web 服务和 AJAX/JSON 数据。
    • 是的,但必须有一种方法来确定文件的结尾,因为 TCP 以流的形式到达(至少据我所知,基于目前的答案)无法确定何时结束。在 HTML 的情况下,它会通过寻找
    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2011-10-17
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2011-01-29
    相关资源
    最近更新 更多