Wireshark和Continuation或非HTTP流量

时间:2013-07-01 16:48:34

标签: http post http-post wireshark python-requests

我正在编写一些代码,将内部应用程序集成到DVR中以检索视频文件。由于没有任何官方文档,所以这都是逆向工程,我无法理解以下事件序列(通过使用DVR的Android应用程序捕获)。

936 72.985204   192.168.0.1     192.168.0.200   HTTP    468     POST /cgi-bin/supervisor/NetworkBk.cgi HTTP/1.1  (application/x-www-form-urlencoded)
937 72.985368   192.168.0.200   192.168.0.1     TCP     54      mit-ml-dev > 41859 [ACK] Seq=1 Ack=415 Win=65535 Len=0
938 73.933676   192.168.0.200   192.168.0.1     HTTP    275     HTTP/1.0 200 OK  (video/mpeg4)
939 73.933983   192.168.0.1     192.168.0.200   TCP     54      41859 > mit-ml-dev [ACK] Seq=415 Ack=222 Win=15544 Len=0
940 74.004433   192.168.0.200   192.168.0.1     TCP     74      [TCP segment of a reassembled PDU]
941 74.004887   192.168.0.1     192.168.0.200   TCP     54      41859 > mit-ml-dev [ACK] Seq=415 Ack=242 Win=15544 Len=0
942 74.024669   192.168.0.200   192.168.0.1     HTTP    1346    Continuation or non-HTTP traffic

HTTP POST请求视频文件,然后导致HTTP OK。我对接下来会发生什么感到困惑。收到HTTP 200后请求是否完成?那为什么它继续接收TCP数据然后获得HTTP Continuation或非HTTP流量?随后的TCP数据包包含我打算下载的视频文件。当我手动制作HTTP POST时,我得到HTTP OK响应,然后我就难倒了。

这是我用来模拟HTTP POST的代码。

import requests
dc = {"action":"download", "start_time":"2013 7 1 13 59 00", "end_time":"2013 7 14 3 0", "num":"255", "ch":"5"}
r = requests.post("http://192.168.0.200/cgi-bin/supervisor/NetworkBk.cgi", data=dc, auth=(username, password))

此代码获取HTTP 200 OK响应,如何进入Continuation或非HTTP流量?我是新手,所以不确定我是否提供了足够的细节。如果有帮助,我可以提供HTTP标头。

附录 这是HTTP OK回复的RAW响应。据我所知,没有什么可以期待额外的内容。

HTTP/1.0 200 OK
Date: Mon, 01 Jul 2013 15:01:34 GMT
nServer: Linux/2.x UPnP/1.0 Avtech/1.0
Expires: 0
Pragma: no-cache
Cache-Control: no-cache
Connection: close
Content-Type: video/mpeg4
Content-Length: 5

0
OK

1 个答案:

答案 0 :(得分:0)

  

为什么它继续接收TCP数据然后获取HTTP   是继续还是非HTTP流量?

默认情况下,当您发出请求时,会立即下载响应正文。 因此,在这种情况下,一旦成功发出POST请求,DVR将立即开始通过TCP发送视频数据 - 很可能是作为H.264字节流。这将解释您所看到的非HTTP流量。

  

此代码获取HTTP 200 OK响应,我该如何访问   是继续还是非HTTP流量?

您可以覆盖此默认行为并推迟下载响应正文,直到您使用stream参数访问Response.content属性:然后您可以使用类似r.iter_content的内容来迭代响应数据,然后写入他们到一个文件。 e.g。

import requests
url = "http://192.168.0.200/cgi-bin/supervisor/NetworkBk.cgi"
dc = {"action":"download", "start_time":"2013 7 1 13 59 00", "end_time":"2013 7 14 3 0", "num":"255", "ch":"5"}
r = requests.post(url, data=dc, auth=(username, password), stream=True)
if r.status_code == 200:
    with open(path, 'wb') as f:
        for chunk in r.iter_content():
            f.write(chunk)