gpt4 book ai didi

HTTP数据包重构

转载 作者:可可西里 更新时间:2023-11-01 02:31:08 24 4
gpt4 key购买 nike

如果我有一个大的 HTTP 数据包被拆分成许多 TCP 数据包,我如何才能将它们重建回单个 HTTP 数据包?基本上,我应该在数据包的哪个位置查看 HTTP 数据包何时开始/结束?我似乎看不到 TCP header 中表示 HTTP 数据包开始或结束的任何标志/字段。

编辑:跟进响应。如果 TCP 管理流,它如何知道流何时开始和结束?那是由 socket 打开和关闭决定的吗?在某种程度上,某些协议(protocol)必须能够知道 HTTP 流/数据包何时开始和结束。这就是我想知道的。

我所处的情况是我在 C# 中使用数据包嗅探器读取 TCP 数据包,我希望能够重建 HTTP 请求/响应/等。像 wireshark 和其他各种嗅探器一样通过界面。或者,是否有任何 C# 库可以让您在更高级别接入 HTTP 流,从而让我不必自己重建 HTTP 流/数据包?

谢谢。

最佳答案

好吧,我想出了如何做到这一点(狡猾但它完成了工作)。

剥离以太网、IP 和 TCP header 很简单,留下“原始”数据消息。查看消息内部,通过查找数据包开头的“HTTP/1.1 ...”很容易检测它是否是 HTTP 数据包的开头。这表明该数据包是 HTTP 流/更大数据包/其他任何内容的开始。您也可以做一些简单的解析来读取“Content-Length”字段,它是整个 HTTP 数据包的总长度。

您还可以使用源/目标 IP 和端口号为链接形成唯一 ID。所以在收到header包之后,注意这4个东西(SRCIP, SRCPORT, DESTIP, DESTPORT)。下次您收到与此端口/ip 组合匹配的数据包时,您可以检查它是否是 HTTP 数据包的下一部分。您可以使用序列号来做一些验证和其他可能的事情,但通常数据包是有序的,所以没关系。我认为为每个 HTTP 流打开了一个新端口,因此您不应接收不属于流的随机数据包,但这可能是一个容易出错的区域。

无论如何,一旦你收到这个数据包,再次剥离标题并获得原始消息。将其添加到消息的已知部分。如果到目前为止收到的总消息长度等于从“Content-Length”字段读取的长度,则数据包完整!

这种方法显然容易出现大量错误,但我并不是在寻求一种非常可靠的方法。我想我会回答我自己的问题,以防将来其他人遇到同样的问题!祝你嗅探好运 :D

关于HTTP数据包重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1529680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com