【问题标题】:TCP segments with HTTP data带有 HTTP 数据的 TCP 段
【发布时间】:2013-04-04 22:41:47
【问题描述】:

我正在实现一个 http 解析器;作为 http 数据的指示符,我正在搜索“HTTP/1.? CRLF' 在流中。 TCP 层可以将应用程序提供的缓冲区切割成适合通过网络传输的块。是否有可能在 TCP 标头之后不紧跟 http 数据(例如 GET http://www.google.com/index.html HTTP/1.1 CRLF)?此外,是否可以在 TCP 段之间拆分例如“GET ..”查询?

谢谢。

标记

【问题讨论】:

  • 您是在实现 HTTP 解析器还是 TCP/IP 堆栈?
  • 你的解析器是低级的吗?如果没有,只需在 Linux 上使用 tshark 或在 Windows 上使用 WinPcap。
  • 你说的HTTP解析器是什么意思?
  • @NPE,它是 http 解析器。
  • @MattH,我所说的 http 解析器是指能够通过流查找协议特定命令、令牌等的软件。

标签: parsing http tcp


【解决方案1】:

是否可以在 TCP 标头之后不紧跟 http 数据(例如 GET http://www.google.com/index.html HTTP/1.1 CRLF)?

可能是的。 HTTP Pipelining 使单个段中可以有多个请求。

另外,是否可以在 TCP 段之间拆分例如“GET ..”查询?

是的。请求大小可以大于段大小。此外,TCP 段的碎片可能发生在 IP 层。

这将是一种不常见的自然事件,但可能是故意逃避的一部分。

唯一确定的方法是重新组装流,但这在处理和内存方面是昂贵的。如果您非常在意,最好使用透明的 HTTP 代理。

【讨论】:

    【解决方案2】:

    使用 TCP,您需要基本假设分段可以发生在任何地方。在设计解析堆栈时,您必须考虑这一点。您不能阅读一个片段并假设您有足够的阅读量。因此,明智的做法是将 TCP 视为流并将其放在词法分析器下方。您只需要适应对解析器/词法分析器的调用可能需要更长的时间或错误的事实。

    【讨论】:

    • 感谢您的评论。因此可以将“GET google.com/index.html HTTP/1.1 CRLF”分成三部分:“GET http:”、“//www.google.com”、“/index.html HTTP/1.1 CRLF”并发送在三个不同的 TCP 段中?
    • 您不太可能以这种方式得到它,因为分段大约是 512 - 1024 字节。但理论上每个数据包可以获得一个字节(char)。在奇怪的网络上,可能会得到GE T google . c om ...你明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2016-03-30
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多