有关 tcp 和 http 的问题

2017-12-01 13:20:45 +08:00
 drzhaug

我在思考一个问题,希望各位能给我解答下。 有没有可能一个 http 的 response 数据过长,超过了单个 tcp 的 payload,然后被分割在多个 tcp 报文中? 如果是这样的话,假设被分割到两个 tcp 报文当中了,如何识别第二个报文的 payload 是 http 数据?(因为可能无法通过 HTTP / 1.1 识别了)

5537 次点击
所在节点    程序员
45 条回复
msg7086
2017-12-02 03:40:42 +08:00
先搞明白网络分层问题。

物理层 绳子
链路层 以太网
网络层 IP
传输层 TCP
应用层 HTTP

上层是 HTTP 数据,到了下层 TCP 的时候,几乎一定是会拆包的。
通常 TCP 包不到 2KB,你有多少 HTTP 流量是前后加起来少于 2KB 的。

如果你能拿到所有的 TCP 豹纹,那就按照 TCP 协议拆包解码成流就行了。
根据 IP 和端口找到对应的 TCP Session,排好序以后拆包得到完整的流就行了。
如果只能偶尔拿到一两个包,那是没法直接判断 HTTP 请求的,最多靠猜。
cabing
2017-12-02 09:07:35 +08:00
@luxin88 恩。
fivestrong
2017-12-02 09:54:19 +08:00
go 语言有个 google 提供的 gopacket 包,里面有一些 tcp 流重装的例子,我之前也想抓包获取 http 请求的内容,可惜学艺不精,只能找到 ip 端口,再往下就不知道怎么解析 http 数据了。
cy18
2017-12-02 10:19:02 +08:00
@zhujinliang 现在 sni 代理好像被认证了,没法用。能不能用这个思路在适当的地方把 TCP 包截断从而避开 sni 被认证的问题?感觉大墙可能还没有做到跟踪每一个 TCP 链接。
q397064399
2017-12-02 17:20:25 +08:00
流..

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/411096

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX