我正在实现一个http解析器;作为http数据的指标我正在搜索'HTTP / 1。? CRLF'在流中。 TCP层可以将应用程序提供的缓冲区切割成适合通过网络传输的块。是否有可能在TCP标头之后立即跟踪http数据(例如GET http://www.google.com/index.html HTTP / 1.1 CRLF)?另外,是否可以将例如'GET ..'查询拆分为TCP段?
感谢。
标记
答案 0 :(得分:3)
使用TCP,你需要基本上假设分割可以在任何地方发生。在设计解析堆栈时必须考虑这一点。您无法读取一个片段并假设您有足够的内容来阅读。所以明智的方法是将TCP视为一个流并将其放在你的词法分析器下面。您只需要适应对解析器/词法分析器的调用可能需要更长时间或故障的事实。
答案 1 :(得分:3)
是否可以在TCP标头之后立即跟踪http数据(例如GET http://www.google.com/index.html HTTP / 1.1 CRLF)?
可能是的。 HTTP Pipelining可以在一个细分中提供多个请求。
此外,是否有可能将“GET ..”查询拆分为TCP段?
是。请求大小可能大于段大小。此外,TCP段的碎片可能发生在IP层。
这可能是一种罕见的自然现象,但可能是故意逃避的一部分。
确保唯一的方法是重新组合流,但这在处理和内存方面是昂贵的。如果您非常关心,最好使用透明的HTTP代理。