我正在试图弄清楚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字符串或六进制字符串)并限制用户下载带宽。我最初的问题是关于如何格式化/编码内容,我不是试图找到另一种方式(因为我知道有),这是一个上下文约束。
答案 0 :(得分:1)
TCP是OSI模型中的协议,并且在OSI模型的每一层中处理PDU(也称为数据包)。在每一层中,PDU获得另一个头,因此当它到达传输层时,它已经有一个来自应用层的头。然后TCP放置自己的头,PDU继续进入网络层进行进一步处理。
就PDU的数据大小而言,这取决于物理协议的MTU(最大传输单元)。例如,以太网的MTU是1500字节。
就获取数据而言,如果您从标题中指出,它很简单,可以编写搜索特定属性(如Content-Length或Server)的解决方案。如果您的意思是从数据PDU获取数据,除非您正在寻找分析目的,否则这通常不是一个好主意,在这种情况下,Wireshark应该可以工作。 (如果我记得;自从我使用Wireshark以来已经很长时间了。)