【问题标题】:How HTTP downloads are segmented inside TCP packets?HTTP 下载如何在 TCP 数据包内分段?
【发布时间】:2014-07-21 09:43:31
【问题描述】:

我试图弄清楚 HTTP 服务器在 http 下载期间如何编码/拆分文件。

当我使用 Wireshark 时,我可以找到四个 HTTP 标头(见下文)和一堆没有任何标头的 TCP 数据包。我想知道 tcp 数据包是如何形成的,以及是否可以从中检索任何具体数据(如文件名、任何 ID 或其他实质性内容)。

第一个标题:

GET /upload/toto.test HTTP/1.1
Host: 192.168.223.167:90
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Range: bytes=3821-3821
If-Range: "40248-5800428-4fab43ec800ce"

第二个标题:

HTTP/1.1 206 Partial Content
Date: Sat, 31 May 2014 21:25:31 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sat, 31 May 2014 15:59:21 GMT
ETag: "40248-5800428-4fab43ec800ce"
Accept-Ranges: bytes
Content-Length: 1
Content-Range: bytes 3821-3821/92275752
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive

第三:

GET /upload/toto.test HTTP/1.1
Host: 192.168.223.167:90
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Range: bytes=3821-92275751
If-Range: "40248-5800428-4fab43ec800ce"

最后一个:

HTTP/1.1 206 Partial Content
Date: Sat, 31 May 2014 21:25:31 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sat, 31 May 2014 15:59:21 GMT
ETag: "40248-5800428-4fab43ec800ce"
Accept-Ranges: bytes
Content-Length: 92271931
Content-Range: bytes 3821-92275751/92275752
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive

第四个http头后面的TCP数据包(ASCII):

PV)?FEM@@cZU:P-O"-~zLW^2&$Z$f5APzve~BuH5/}`z2MI"{lIQCBmTO-ah6O)497Kro+gS((R 8n8_lMXusDp{Qs1g?j~iZaB.ADI|yp((t3@4SA4[MV@N1(2He|a9}Dw`'=k^C;G%@KUD``Sw:KXYG1{pxP,*`BSAMO0?FlFb (~X/|Ub=H[b7Y'NAP])IARH(g*LI}AE%BzFOzN5Xf7$D|.Hw00AUh[lE)ovKAUmcSuFnzQS+T0=z7;#nKX2!>ik)p73a5{h2ZZo~etin"UCFc+ #ZjgB60y()-1{e|XRj9r:zDM(ulcSAayGeZCks7Nnz{L8(&L8Ew?J9}WA/t?^xS{sbnw8J7/%Iqt0i4_h*D6?|[&3zFngl~ku>#RVp+:`'RdtKh(", MPJqx5 tov&pZV8)'X?iW(J1d-!]FM>_Q\V=&xYH C9G?dp6& \td|k$AY!D^`HnW=OsMcbV(*(RQL-xhWPa\:C>-M'oH fGwr:0=\K7!lMoPH)fB2OSUrg89

出于好奇,此文件是 Android 的图像(问题示例)。

为 CodeCaster 编辑:

我正在尝试限制 nodejs 服务器上请求的下载生成的输出带宽,问题是我必须在网络级别(实际上使用 Iptables)而不是在代码级别执行此操作。要做到这一点,因为它是每个用户的限制,我必须收集一个重要的字符串,我可以用它来过滤数据包(ASCII 字符串或十六进制字符串)并限制用户下载带宽。我最初的问题是关于内容是如何格式化/编码的,我不想寻找另一种方式(因为我知道有)它是一个上下文约束。

【问题讨论】:

  • 我不记得协议的细节,但我强烈怀疑分段完全由 Web 服务器决定。您能够提取的唯一有用信息是来自 http 标头。
  • 请解释您的实际问题。 Tcp 数据包分段由操作系统处理,您无需担心,例如参见 stackoverflow.com/questions/756765/…。您的问题似乎与 HTTP 范围请求有关。
  • 我编辑了我的帖子给你一个解释。
  • 单个数据包很可能没有足够的信息。特别是因为您正在通过 HTTP 进行下载,其中标头将位于第一个数据包左右,其余部分将是响应正文。你确定你要求的是让你更接近你的目标吗?你读过serverfault.com/questions/154451/…吗?
  • 是的,谢谢!我想我会使用其他的东西,比如目标端口或 IP,因为没有其他方法。

标签: file http encoding wireshark


【解决方案1】:

TCP 是 OSI 模型中的一种协议,并且 PDU(也称为数据包)在 OSI 模型的每一层中进行处理。在每一层中,PDU 都有另一个头,所以当它到达传输层时,它已经有一个来自应用层的头。然后 TCP 放置它自己的标头,并且 PDU 继续到网络层进行进一步处理。

就PDU的数据大小而言,这取决于物理协议的MTU(最大传输单元),例如以太网的MTU是1500字节。

就获取数据而言,如果您是指从标头获取数据,那么编写一个搜索特定属性(如 Content-Length 或 Server)的解决方案就足够简单了。如果您打算从数据 PDU 中获取数据,这通常不是一个好主意,除非您正在寻找分析目的,在这种情况下 Wireshark 应该可以工作。 (如果我记得;我已经很久没有使用 Wireshark 了。)

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 2021-02-02
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2015-02-05
    • 2016-10-12
    • 2016-12-31
    • 2011-05-17
    相关资源
    最近更新 更多