3

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

谢谢。

标记

4

2 回答 2

3

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

于 2013-04-04T13:16:59.227 回答
3

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

可能是的。HTTP Pipelining使得在一个段中拥有多个请求成为可能。

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

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

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

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

于 2013-04-04T14:41:47.300 回答