最近在搭一个wifi,用小米手机测试,发现每次小米手机连上wifi时,都会自动发一个HTTP请求,抓到的包如下:GET /v2/user/0/network/bucket?type=wifi&uuid=0&s=B6DC648CAE5A5EE7FA48E545F9F0D3DD HTTP/1.1
http.useragent: xmpush
Cookie: 
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.0.4; MI 1SC MIUI/ICS24.0)
Host: 121.11.79.73
Connection: Keep-Alive
Accept-Encoding: gzip我自己用浏览器试了一下这个HTTP请求,发现得到的结果是一个JSON串,内容如下:{
    "S": "Ok", 
    "R": {
        "province": "河北", 
        "wifi": {
            "api.micloud.xiaomi.net": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "mipush": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "app": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "upload": [
                "14.17.87.217", 
                "112.90.247.43", 
                "120.197.84.251", 
                "58.68.235.172"
            ], 
            "smallfiles": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "et.xiaomi.com": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "api": [
                "121.11.79.73", 
                "112.90.33.211", 
                "120.197.84.250", 
                "58.68.235.172"
            ], 
            "download": [
                "223.202.255.21", 
                "107.23.52.182", 
                "58.68.235.172", 
                "59.151.110.254"
            ]
        }, 
        "X-Forwarded-Ip": "119.253.46.2", 
        "stat-domain": "s.mi1.cc", 
        "ip": "119.253.46.2", 
        "stat-percent": 0.05, 
        "ttl": 3600, 
        "city": "廊坊", 
        "country": "中国", 
        "isp": "", 
        "tid": -1, 
        "wap": {
            "api.micloud.xiaomi.net": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "mipush": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "app": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "upload": [
                "14.17.87.217", 
                "112.90.247.43", 
                "120.197.84.251", 
                "58.68.235.172"
            ], 
            "smallfiles": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "et.xiaomi.com": [
                "14.17.87.216", 
                "123.129.222.196", 
                "120.197.84.249", 
                "58.68.235.171"
            ], 
            "api": [
                "121.11.79.73", 
                "112.90.33.211", 
                "120.197.84.250", 
                "58.68.235.172"
            ], 
            "download": [
                "223.202.255.21", 
                "107.23.52.182", 
                "58.68.235.172", 
                "59.151.110.254"
            ]
        }
    }
}有哪位知道这是在干吗?

解决方案 »

  1.   

    http://www.miui.com/thread-1378432-1-1.html
    105楼小米开发人员的解释:
    你好,我来解释一下这个事情吧。我是小米的开发人员汪轩然,负责米聊和miui中的推送服务的开发工作。
    首先很佩服兄台的钻研精神,我们的专业测试也不过如此了,在此表示感谢。
    然后我解释一下为什么miui中需要一个长连接。当你开通了小米云,网络短信等服务时,由于需要及时收到服务器下发的推送数据(比如你的通讯录在网页端有更新,有人给你发了网络短信等),因此miui系统需要维护一个长连接,保证这些数据的实时性。
    而楼主看到的这些“莫名其妙”的http请求,其实是这个长连接中的一些数据交互。也许你会继续追问下去,长连接不一般都是基于TCP协议的吗?为什么会是http请求呢?确实,一般我们都是通过TCP来维护这个长连接的,而当碰到一些比较特殊的情况,比如网关把TCP所需访问的端口给封禁了,或者直接把我们的协议给封禁了,在这种情况下,为了让miui上的推送服务仍然工作,我们采用了使用http的long pulling来实现长连接的技术(这种技术被称为BOSH,楼主有兴趣的话可以去google一下)。因此你看到的所有的数据都是http请求。
    好吧,还有最后一个疑问,为什么会这么频繁?那是因为通常在开机的时候,系统并不知道自己不在线的这段时间,数据都有哪些变化,因此需要通过这条长连接,把自己各种数据上次更新的时间点告知服务器,然后服务器根据这些时间点,推送下相关的离线数据。由于在这条长连接上的业务比较多(通讯录,短信,通话记录等),因此你看到的请求会比较频繁。而当这些同步的请求完成之后,如果没有数据,以后的请求就不会如此频繁了,而会维持在每5分钟一个请求的频率。否则,miui用户的流量早就爆了。不知这个答案能否让楼主满意?