能力值:
( LV2,RANK:10 )
|
-
-
2 楼
HTTP头中包含Content-Length字段
这样你就能读取每个包中的数据并组装了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
http报文要依靠TCP来保证数据的安全传输。我个人觉得,解包依据TCP段头中序号字段来,重组的。
我查了TCP/IP详解,http报文组成是:
请求行,报头,空白行,正文。
这几个部分中,都没有重组的内容。
楼上说的Content-length字段:规定了一个请求或响应报文中正文字段的长度。(tcp/ip详解中的解释)
根据这个似乎不能重组吧!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
以我对楼主所描述的情况下看,应该要的就是响应报文中的正文字段,所以很自然地想到取HTTP包头里的Content-length字段来重组。
从HTTP层的角度来看,TCP层已经完成了底层的纠错,所以TCP包头里的序号字段应该可以无视,就如同,从TCP层的角度来看,IP层的纠错也可以无视。
当然,楼主的描述还不够清楚,我们都是在猜
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
呵呵,可能是咱们理解楼主角度不同,仔细想了下,又查了些资料,再把楼主的意思缕缕:
由于底层软件对网络数据包大小的限制,所以经常将一个有意义的数据分割在若干数据包中发送,接受到后再重组(楼主的问题就在这,根据什么重组?),在这部分重组时,一个重要的依据是数据包中的序号,序号表明了数据包在这个有意义数据中的位置。
在进行重组时,需要考虑几个问题:
(1)如何将无序的数据包有序化
依据TCP段的序号和缓冲队列(我的观点)
(2)如何判断这个有意义数据的起始数据包和结束数据包
依据Content-length字段,并依据它来取出正文内容。(楼上)
我和楼上的加起来应该能解决楼主问题了吧!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
您说的是对的,我就是这意思,应用层的数据已经看不到TCP头了,数据包的无序,怎么确保我用Content-length组起来的数据是正确的
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
socket接收已经看不到TCP头部了,怎么组呢,会不会有错序的问题
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
不会有错序的问题了,TCP包头里带序号的,等你看到HTTP数据的时候,TCP协议已经帮你完成了这方面的纠错,你只要处理好HTTP层的数据就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
这个问题明白了,协议搞不清,这些就转不过来,还有个问题,我用socket接收HTTP的数据包,对方数据发完了,自动发了FIN请求(wininet编程),我这边怎么获取这个信息。
最近头都给搞大了,问题比较多,方便的话留个QQ,想多问你几个问题
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
不用QQ,不好意思。
你是HTTP层的编程,关心这么底层的协议干嘛?如果你要关注FIN,那ACK、SYN要不要关心呢(这些才是同一层面的东西哦)?
HTTP层的数据发完了,自然会有HTTP层的相应事件发生,你不应在TCP层甚至IP层寻找答案,这样只会让你的程序变得非常不稳定
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
还是好奇一下,为何要关心FIN这样相对底层的事件呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
数据发送方到底发了多少个数据包我是不确定的,怎么知道它是否发完
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
HTTP协议里有相应的事件的,没必要去TCP层去找答案
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
楼主的东东最好了没?还在做吗?
|
|
|