首页
社区
课程
招聘
有关HTTP数据包组包问题
2011-2-23 09:15 14758

有关HTTP数据包组包问题

2011-2-23 09:15
14758
用HTTP实现通信,发送方应用层直接把大的报文拆分了,接收方这些碎片都收到了,但是重组时应该依据什么字段

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (13)
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Lodd 2011-2-23 20:54
2
0
HTTP头中包含Content-Length字段
这样你就能读取每个包中的数据并组装了
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
门前小雪 2011-2-25 19:26
3
0
http报文要依靠TCP来保证数据的安全传输。我个人觉得,解包依据TCP段头中序号字段来,重组的。
我查了TCP/IP详解,http报文组成是:
请求行,报头,空白行,正文。
这几个部分中,都没有重组的内容。
楼上说的Content-length字段:规定了一个请求或响应报文中正文字段的长度。(tcp/ip详解中的解释)
根据这个似乎不能重组吧!
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Lodd 2011-2-25 20:16
4
0
以我对楼主所描述的情况下看,应该要的就是响应报文中的正文字段,所以很自然地想到取HTTP包头里的Content-length字段来重组。

从HTTP层的角度来看,TCP层已经完成了底层的纠错,所以TCP包头里的序号字段应该可以无视,就如同,从TCP层的角度来看,IP层的纠错也可以无视。

当然,楼主的描述还不够清楚,我们都是在猜
雪    币: 31
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
门前小雪 2011-2-27 12:53
5
0
呵呵,可能是咱们理解楼主角度不同,仔细想了下,又查了些资料,再把楼主的意思缕缕:
由于底层软件对网络数据包大小的限制,所以经常将一个有意义的数据分割在若干数据包中发送,接受到后再重组(楼主的问题就在这,根据什么重组?),在这部分重组时,一个重要的依据是数据包中的序号,序号表明了数据包在这个有意义数据中的位置。

在进行重组时,需要考虑几个问题:
(1)如何将无序的数据包有序化
     依据TCP段的序号和缓冲队列(我的观点)
(2)如何判断这个有意义数据的起始数据包和结束数据包
     依据Content-length字段,并依据它来取出正文内容。(楼上)

我和楼上的加起来应该能解决楼主问题了吧!
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
funnyf 2011-3-7 14:49
6
0
您说的是对的,我就是这意思,应用层的数据已经看不到TCP头了,数据包的无序,怎么确保我用Content-length组起来的数据是正确的
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
funnyf 2011-3-7 14:55
7
0
socket接收已经看不到TCP头部了,怎么组呢,会不会有错序的问题
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Lodd 2011-3-7 16:27
8
0
不会有错序的问题了,TCP包头里带序号的,等你看到HTTP数据的时候,TCP协议已经帮你完成了这方面的纠错,你只要处理好HTTP层的数据就可以了
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
funnyf 2011-3-7 22:29
9
0
这个问题明白了,协议搞不清,这些就转不过来,还有个问题,我用socket接收HTTP的数据包,对方数据发完了,自动发了FIN请求(wininet编程),我这边怎么获取这个信息。
    最近头都给搞大了,问题比较多,方便的话留个QQ,想多问你几个问题
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Lodd 2011-3-8 00:08
10
0
不用QQ,不好意思。

你是HTTP层的编程,关心这么底层的协议干嘛?如果你要关注FIN,那ACK、SYN要不要关心呢(这些才是同一层面的东西哦)?

HTTP层的数据发完了,自然会有HTTP层的相应事件发生,你不应在TCP层甚至IP层寻找答案,这样只会让你的程序变得非常不稳定
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Lodd 2011-3-8 00:12
11
0
还是好奇一下,为何要关心FIN这样相对底层的事件呢?
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
funnyf 2011-3-8 08:39
12
0
数据发送方到底发了多少个数据包我是不确定的,怎么知道它是否发完
雪    币: 1240
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Lodd 2011-3-8 13:18
13
0
HTTP协议里有相应的事件的,没必要去TCP层去找答案
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kongfei 2011-8-16 20:47
14
0
楼主的东东最好了没?还在做吗?
游客
登录 | 注册 方可回帖
返回