使用http的chunked模式下载文件网络详解

基础知识:
TCP的三次握手。
TCP的ACK机制。
IP协议的MTU。
HTTP协议。
LF的ASCII编码为10(10进制),0A(16进制)。
CR的ASCII编码为13(10进制),0D(16进制)。
数字0的ASCII编码为48(10进制),30(16进制)。

使用http的chunked模式下载文件。

这里使用抓包工具监控一个小文件下载的全过程。


网络包概览:
[img]http://dl.iteye.com/upload/attachment/0078/6413/190da322-911f-318d-9d55-82d0861d9987.jpg[/img]


2104
[img]http://dl.iteye.com/upload/attachment/0078/6425/4b856d0b-2dbe-341c-8077-89172ff33fbc.jpg[/img]
client -> server (http)
MTU=1500,以太网一般都是1500。
减掉IP header和TCP header。1500-20-20=1460Bytes, 这个地方payloadlen=1460。


2105
[img]http://dl.iteye.com/upload/attachment/0078/6427/3738f019-d362-3717-8367-6762243312a6.jpg[/img]
Clinet -> Server (TCP)

由于一个TCP的payload没有发完所有的http请求,tcp协议再发一次,104Bytes。
注意这里的Push标识。
对于发送端,使tcp cache中的数据都发送出去。对于服务端,提交cache的数据到高一层的协议处理。这里,就是服务端的http协议层处理。


2109
[img]http://dl.iteye.com/upload/attachment/0078/6429/3bdcd04d-e24b-378e-8e4b-29e274e18bad.jpg[/img]
Server -> Client (TCP)
服务端给了一个ACK。


2110
[img]http://dl.iteye.com/upload/attachment/0078/6431/aec14f34-aea8-3137-9717-1c11f1493bcf.jpg[/img]
Server -> Client (TCP)
服务端又给了一个ACK。这个ACK和前一个比增大了3911564407 - 3911564303 =104


2195

[img]http://dl.iteye.com/upload/attachment/0078/6433/45118750-d4ca-32f2-83e2-a268894e70e6.jpg[/img]
Server -> client (Http)
这里2809就是下载文件的大小。
Chunked模式下载。第1个chunk的第1块数据。

[img]http://dl.iteye.com/upload/attachment/0078/6445/1621e2b4-f122-3e1e-ad0e-248a9f7d7c0f.jpg[/img]
一个简单的理解,可以认为chunk的模式为。
[Chunk大小]
[CR LF]
[Chunk数据体]
[CR LF]

[Chunk大小]
[CR LF]
[Chunk数据体]
[CR LF]

....

[0] //最后一个块。
[CR LF]

这次传输了1058bytes数据。(这个值是看不到的,可以通过抓包结果计算。找到 [Chunk大小] [CR LF] ,之后的字节就是实际的数据。


2196
[img]http://dl.iteye.com/upload/attachment/0078/6435/ebb3eacd-4353-3233-924b-ee210df8c1f3.jpg[/img]
Server -> client (Tcp)
Chunked模式下载。第1个chunk的第2块数据。
这次传输了1460bytes数据。


2197
[img]http://dl.iteye.com/upload/attachment/0078/6437/18eaae77-be20-3656-b406-65681f12106d.jpg[/img]
Client -> server (Tcp)
一个Ack。

2198
[img]http://dl.iteye.com/upload/attachment/0078/6439/8a0d980f-2f9f-3645-856a-ebcf0443926a.jpg[/img]
Server -> client (Tcp)
Chunked模式下载。第1个chunk的第3块数据。
2809-1058-1460=291
291+2(CR LF所占用的2个bytes)=293(该payload的大小)


2199
[img]http://dl.iteye.com/upload/attachment/0078/6441/d63acde8-afdb-3b24-afbf-c8c926c6d160.jpg[/img]


[img]http://dl.iteye.com/upload/attachment/0078/6449/3c895ed5-77cd-3cb3-b104-42b7b1313405.jpg[/img]


30是数字0.
这里实际上是:
[Chunk大小] 0
[CR LF] 0D 0A

这是实际上是第2个chunk,同时也是end chunk。标示chunk模式结束。

Server -> client (http)
Chunked模式下载完成。


2200
[img]http://dl.iteye.com/upload/attachment/0078/6443/fc1a76b4-2765-3ea4-b819-b9163c2e1bcb.jpg[/img]

client->server (TCP)
ACK

下载完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值