TCP分段带有HTTP数据

3
我正在实现一个 HTTP 解析器;作为 HTTP 数据的指示,我在流中搜索 'HTTP/1.? CRLF'。TCP 层可能会将应用程序提供的缓冲区分成适合在网络上传输的块。是否有可能出现 HTTP 数据(例如 GET http://www.google.com/index.html HTTP/1.1 CRLF),其不紧随于 TCP 标头之后?此外,例如 'GET ...' 查询是否可能跨越多个 TCP 段?
谢谢。
马克

你是在实现一个HTTP解析器还是TCP/IP协议栈? - NPE
你的解析器是低级的吗?如果不是,可以直接使用Linux下的tshark或Windows下的WinPcap。 - KBart
什么是HTTP解析器? - MattH
@NPE,它是HTTP解析器。 - Mark
@MattH,通过“http解析器”我指的是一种能够查找协议特定命令、标记等的软件片段。 - Mark
@KBart,这是使用网络处理器的类似汇编语言实现的低级解析器。 - Mark
2个回答

3
使用TCP,您需要假设分段可以发生在任何地方。设计解析堆栈时必须考虑到这一点。您不能读取一个分段并假设您已经有足够的内容来读取某些信息。因此,明智的方法是将TCP视为流并将其放置在词法分析器之下。您只需要适应调用解析器/词法分析器可能需要更长时间或出现故障的事实即可。

感谢您的评论。因此,“GET http://www.google.com/index.html HTTP/1.1 CRLF”可以分为三个部分发送: “GET http:”,“//www.google.com”和“/index.html HTTP/1.1 CRLF”,并在三个不同的TCP段中发送。 - Mark
1
很难以那种方式获取数据,因为分段大小大约在512-1024字节之间。但理论上每个数据包可以获得一个字节(char)。在某些奇怪的网络中,可能会出现“GE”“T google”“。”“c”“om”等情况...你明白了吧。 - rioki

3

有没有可能在TCP头之后不立即跟随http数据(例如GET http://www.google.com/index.html HTTP/1.1 CRLF)?

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

另外,例如“GET...”查询是否可能分割成TCP段?

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

这将是一种罕见的自然现象,但可能是有意回避的一部分。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接