有关 tcp 和 http 的问题

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

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

5530 次点击
所在节点    程序员
45 条回复
a7a2
2017-12-01 13:23:17 +08:00
你这个识别在 tcp 层面完成。。。
drzhaug
2017-12-01 13:24:40 +08:00
@a7a2 我知道啊,我问的是 how
exch4nge
2017-12-01 13:25:05 +08:00
TCP 好像没有当个报文之类的一说吧,TCP 是个流,TCP 层下面的 IP 层会处理分包吧……
wcsjtu
2017-12-01 13:25:21 +08:00
这。。。。。
content-length 啊, 就算是 chunk 编码,也有终止符号。 应用层不用关心传输层的东西,不用管它分不分包
drzhaug
2017-12-01 13:26:15 +08:00
@exch4nge 老哥你错了
momocraft
2017-12-01 13:28:26 +08:00
1. 有
2. 从 tcp 读出来的只是字节流,看不到分几个包来的
3dwelcome
2017-12-01 13:28:42 +08:00
wireshark 里,tcp 分包识别,是通过包的序列号。比如第一个是 http,那么后边的 TCP 流就都是 http 协议的子包。

只通过中间一个 payload 识别格式,那是不可能的。
drzhaug
2017-12-01 13:29:09 +08:00
@wcsjtu 你这么说我就懂了,我之前不知道怎么处理 chunk 编码的数据。 我试着用 libpcap 抓 http 包。不是在写应用层哈。。
drzhaug
2017-12-01 13:30:26 +08:00
@3dwelcome 你说的我懂,我的意思是 tcp 按序列号排序后,如何在流中捕获其中的 http payload
rrfeng
2017-12-01 13:32:49 +08:00
TCP 分片、合并都在 TCP 层完成。

HTTP 不需要关心底层如何实现。HTTP 看到的就是完整的数据
3dwelcome
2017-12-01 13:34:28 +08:00
你单独捕获中间一个 payload 是没用的。

一般 HTTP 服务器都有 GZIP 压缩功能,TCP/HTTP 流只有从头到尾按序列号,把每个包组合到一起,才能解压获取完整内容。
cabing
2017-12-01 13:35:40 +08:00
这个就涉及到 tcp 的 TCP 粘包和拆包问题,要说的很多啊,你百度下就行 ^^
xiaxiaocao
2017-12-01 13:37:53 +08:00
你要写的是不是像我这个项目的东西:
https://github.com/hsiafan/httpparse
drzhaug
2017-12-01 13:38:36 +08:00
@3dwelcome 我已经知道怎么做了,谢谢。
Mutoo
2017-12-01 13:47:03 +08:00
wireshark 有一个 follow the tcp stream 的功能,是根据 ack 编号. TCP 严格按照顺序,所以没有其它需要顾虑的。
zhujinliang
2017-12-01 13:50:09 +08:00
一般防火墙或网监只做包识别,要是流的识别需要跟踪每个 TCP 连接,甚至需要缓存一段数据,开销太大
所以有的就故意在特征处断开,绕过检测
操作系统的话,由协议栈处理,每个连接都有对应的缓冲区,每个数据包到达后,由协议栈识别 IP、端口等,写入对应的缓冲区,对于程序来说,从缓冲区里读出来的是连续的
drzhaug
2017-12-01 13:58:17 +08:00
@xiaxiaocao 我大概看了下,你的意思是抓取 http request 的 tcp 报文,然后模拟 tcp 请求,然后再处理返回的 response ?
ryd994
2017-12-01 13:59:55 +08:00
四元组
drzhaug
2017-12-01 14:00:21 +08:00
@zhujinliang 没错,我尝试写一个抓取 http 的程序,就是在模拟一个协议栈,实验性的哈。
zhangysh1995
2017-12-01 14:10:52 +08:00
计算机网络没学好吧,网络层才分段的,Internet 的网络层就是 IP,这里才会把上层打包的内容分段。。。。

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

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

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

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

© 2021 V2EX