V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qianguozheng
V2EX  ›  分享发现

如何看待淘宝 APP 采用 80 端口传输非 http 协议?

  •  
  •   qianguozheng · 2017-03-20 10:51:24 +08:00 · 12604 次点击
    这是一个创建于 2586 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我就想问,他们难道不知道有个东西叫 http 代理吗?

    https://www.zhihu.com/question/57350923?guide=1

    第 1 条附言  ·  2017-03-21 14:41:53 +08:00
    喷点倒是没有。主要是看到了大家的思维习惯。

    从用户角度来讲:如果我的网络可以访问新浪,腾讯等 APP,为什么不能访问淘宝?你淘宝的 APP 做的兼容性不好。
    从各位技术角度来看: 所谓 80,443 等默认端口,是可以传输任何我想传输的数据的,我没错。

    我的观点是: 你淘宝一个这么大的企业,用户肯定有好几个亿,而这些人中懂技术,能知道这个 http 代理会导致软件不能用的,我想除了评论的各位外,全国肯定有更多。他们无法避免你所使用的网络中不存在 http 代理,也就无法避免遇到类似的问题。

    谁的问题?

    我觉得技术上可以解决这种问题,技术目前没有做错,但是做得不够好。
    第 2 条附言  ·  2017-03-27 13:52:45 +08:00
    事实上我们可以找到使用 HTTP 包裹 DNS 的标准

    https://tools.ietf.org/html/draft-ietf-dnsop-dns-wireformat-http-00
    第 3 条附言  ·  2017-03-28 09:52:18 +08:00
    http://lists.squid-cache.org/pipermail/squid-dev/2017-March/008331.html

    >> What if the protocol is not http, but using 80 port, can squid relay it to its target server?

    That is the job of a TCP relay, Squid is an HTTP proxy. It is designed
    in part to reject non-HTTP protocols.

    Port 80 is a "reserved port". Like all such ports (0-1024) there is a
    defined set of things which are possible, and the remainder is not. For
    something to be possible on port 80 it has to have a structure and
    behaviour matching HTTP/0.9, HTTP/1 or HTTP/2.

    I'm aware that almost no software coming out of China these days works
    properly when faced with real Internet networks - just because of how
    they ignore reserved ports existing protocols. The solution to that is
    *not* to make other software ignore the problem.
    第 4 条附言  ·  2017-03-28 09:53:33 +08:00
    不得不说,下面为 80 端口和 http 协议没关系的人没有遵从网络公约的习惯,国内的环境给你们搞坏了
    82 条回复    2017-03-21 15:21:56 +08:00
    LevineChen
        1
    LevineChen  
       2017-03-20 11:00:57 +08:00 via iPhone
    防止中间人攻击和业务逻辑暴露有什么问题么
    lfk0000
        2
    lfk0000  
       2017-03-20 11:01:33 +08:00
    我最近安卓机上的淘宝 app 点啥都没反应。。。难道也是这个原因...
    hjc4869
        3
    hjc4869  
       2017-03-20 11:04:09 +08:00
    80 端口也不一定要走 http 代理啊。
    helone
        4
    helone  
       2017-03-20 11:04:41 +08:00
    如果我没猜错应该是 httpdns
    mhycy
        5
    mhycy  
       2017-03-20 11:08:58 +08:00
    走私有协议有什么不对的么? HTTP 代理和 80 端口有什么关系?
    xialdj
        6
    xialdj  
       2017-03-20 11:15:04 +08:00 via iPhone   ❤️ 1
    80 端口和 http 协议有必然关系吗? 我把 sshd 开在 80 端口 squid 开在 22 端口 楼主你有问题吗 不要抓着个事就搞大新闻
    choury
        7
    choury  
       2017-03-20 11:21:56 +08:00
    @hjc4869 #3
    @mhycy #5
    淘宝没有考虑有的网络必须配置代理才能访问外网的情况
    mooncakejs
        8
    mooncakejs  
       2017-03-20 11:25:37 +08:00
    网络代理和 80 端口有什么关系, 代理是 应当是软件自己设置的。
    哦,是没考虑劫持 80 端口的代理吧。那么,为什么要考虑?
    ooxxcc
        9
    ooxxcc  
       2017-03-20 11:31:27 +08:00
    @choury HTTP CONNECT 没啥问题吧
    Shura
        10
    Shura  
       2017-03-20 11:32:14 +08:00 via Android   ❤️ 1
    需求分析时一般只考虑大部分都普通用户的需求。
    hjc4869
        11
    hjc4869  
       2017-03-20 11:33:51 +08:00   ❤️ 1
    @choury 需要代理的时候应该在手机上配置而不是在路由器上无脑劫持 80 端口,这种情况下应该应用程序自己实现走 HTTP CONNECT 代理。
    另外 Telegram 之类的 app 也有在 80/443 端口上传输非 http/tls 的私有协议。
    mhycy
        12
    mhycy  
       2017-03-20 11:34:27 +08:00
    @choury
    APP 不认识 HTTP 代理而已,使用 80 端口传输非 HTTP 协议数据不是问题。
    难道 APP 还要考虑被劫持了还能正常访问?
    choury
        13
    choury  
       2017-03-20 11:38:01 +08:00
    @hjc4869 #10
    @mhycy #11
    我不是楼主,我不知道他是用劫持的方式实现还是用配置的方式实现,但是的确是有应用是不检测代理,直接跑的,我不知道淘宝这个是不是也这样
    wwqgtxx
        14
    wwqgtxx  
       2017-03-20 11:52:52 +08:00 via iPhone
    我只想说,他们为什么要考虑 http 代理
    nfroot
        15
    nfroot  
       2017-03-20 11:56:14 +08:00
    腾讯 QQ 也是这样的,有啥问题?
    zwh8800
        16
    zwh8800  
       2017-03-20 12:00:12 +08:00 via iPhone
    好像和之前某些运营商封禁非 80 端口有关系
    Zzzzzzzzz
        17
    Zzzzzzzzz  
       2017-03-20 12:26:29 +08:00
    LS 正解, 关键词, cmwap 、 uniwap
    RobertYang
        18
    RobertYang  
       2017-03-20 12:30:57 +08:00 via Android
    听说淘宝移动端使用的是基于 TLS1.3 的协议
    quicknight
        19
    quicknight  
       2017-03-20 12:40:18 +08:00
    如果是识别到数据被劫持而拒绝服务,我觉得淘宝这样做是对的。
    gamexg
        20
    gamexg  
       2017-03-20 12:44:24 +08:00 via Android
    楼上回答的没人用全局翻墙?
    80 跑非 http 就废掉了直接重定向做法,需要用转 socks5 了。
    jych1224
        21
    jych1224  
       2017-03-20 12:44:41 +08:00
    现在 V2EX 也开始有这种如何看待了,要被某乎同化么
    XDA
        22
    XDA  
       2017-03-20 12:50:00 +08:00
    微信公众平台还强制接口走 80 呢
    iVeego
        23
    iVeego  
       2017-03-20 12:50:32 +08:00
    我问下,有时候用小飞机“绕过大陆和局域网地址”的模式,打开阿里系的软件(淘宝,天猫,支付宝)没有网络连接,关闭小飞机就好了,也是因为这个原因吗?
    iyaozhen
        24
    iyaozhen  
       2017-03-20 13:06:58 +08:00 via Android
    很正常啊。有时候为了突破一些特殊网络的限制(各种墙), tcp 私有协议经常走 80 、 443 等常用端口。

    而且为什么要考虑这种非常极端的用户场景?
    simpx
        25
    simpx  
       2017-03-20 13:58:36 +08:00
    80 端口最保险,为什么不用 80 端口。 zhihu 问题描述的很不友好

    利益相关,参与过淘宝 app 网络部分的开发
    Tink
        26
    Tink  
       2017-03-20 14:21:26 +08:00
    每 get 到喷点。。。
    mozutaba
        27
    mozutaba  
       2017-03-20 14:23:23 +08:00
    @iVeego 是的,不过更常见的是太慢啦
    sobigfish
        28
    sobigfish  
       2017-03-20 15:59:52 +08:00
    @simpx #25
    淘宝 app 的别跑,让我吐个槽点:有时候弹出的那个评价淘宝的 app 的提醒为啥点了去评价还不消失(所以下次仍会出现---也有点频繁)
    qianguozheng
        29
    qianguozheng  
    OP
       2017-03-20 17:05:18 +08:00
    @simpx 你是保险了,我们这些做运营商的在路由器 /网关上架设 HTTP 代理,你的软件就不玩了。

    用户找的是我们,不是你们哦。。。
    simpx
        30
    simpx  
       2017-03-20 17:07:25 +08:00
    @qianguozheng #29 所以应该怎么做更合适呢?
    qianguozheng
        31
    qianguozheng  
    OP
       2017-03-20 17:07:48 +08:00
    @LevineChen
    防止有中间人的方法很多,没必要非走 80 啊,业界默认 80 都是 HTTP 协议。
    换个角度想,这个 APP 的开发者对于网络环境的考虑不全面。抑或是图省事?
    qianguozheng
        32
    qianguozheng  
    OP
       2017-03-20 17:08:17 +08:00
    @lfk0000 你用的啥网络?
    qianguozheng
        33
    qianguozheng  
    OP
       2017-03-20 17:09:30 +08:00
    @simpx 我觉得吧,简单点,外面包层 http 协议,让数据更通用。
    qianguozheng
        34
    qianguozheng  
    OP
       2017-03-20 17:10:30 +08:00
    @helone 还有这东西?没玩过
    qianguozheng
        35
    qianguozheng  
    OP
       2017-03-20 17:11:25 +08:00
    @mhycy 问题是在有 http 代理的环境下, app 无法使用。
    mhycy
        36
    mhycy  
       2017-03-20 17:11:58 +08:00
    @qianguozheng 你这个 HTTP 代理是劫持形式实现还是手机端配置 HTTP 代理实现?
    qianguozheng
        37
    qianguozheng  
    OP
       2017-03-20 17:17:49 +08:00
    @XDA 我只能说设计傻逼
    qianguozheng
        38
    qianguozheng  
    OP
       2017-03-20 17:19:11 +08:00
    @mhycy 肯定是劫持啦, squid 作为透明代理, 通过 iptables 的 REDIRECT 功能实现重定向数据报文。
    simpx
        39
    simpx  
       2017-03-20 17:22:07 +08:00
    @qianguozheng #33
    1. 多了额外的 overehead
    2. 为了包 http 头,得切分我的二进制流式数据,暂时没想到很好的规则来做这件事
    3. 用了 80 端口 不一定是 HTTP 数据,不少防火墙识别里面的具体协议来区分是否应该当 HTTP 连接处理,我参与的时候,有一个版本隐藏掉这些信息,避免被错误识别为 HTTP 了
    4. 接上一条,如果有明显的 http 标识,反而可能被有些运营商插广告
    mhycy
        40
    mhycy  
       2017-03-20 17:24:59 +08:00   ❤️ 1
    @qianguozheng
    既然你明确了是劫持,那么只能说是你的劫持没做好。
    别把帽子扣在 APP 上面。。。

    对于劫持,靠谱的劫持是必须做封包分析判断协议类型的。
    weyou
        41
    weyou  
       2017-03-20 17:25:42 +08:00   ❤️ 1
    @iVeego 不是同一个原因,小飞机是 socks5 代理,代理的是底层的传输层协议。而这个 squid 是 http 代理,是代理的应用层协议。 socks5 代理是不管上层协议的具体内容的,换句话说, app 用任何端口传输的任何内容都会原封不动的转发出去。
    iVeego
        42
    iVeego  
       2017-03-20 17:28:31 +08:00
    @weyou #41 那阿里系的软件出现这样的问题有办法解决吗?即使加入白名单直连,还是不行。
    qianguozheng
        43
    qianguozheng  
    OP
       2017-03-20 17:28:48 +08:00
    @simpx
    兼容性嘛,肯定要耗费一些人力物力来解决的。
    简单点,直接换成 443 喽, 反正劫持也只能搞 80 端口的 http 数据, https 加密的一般没有运营商会乱搞。

    这样你的担忧就全没了,哈哈
    weyou
        44
    weyou  
       2017-03-20 17:30:38 +08:00
    楼主这个问题真不关 app 的事儿。 80 端口没有谁规定只能传输 http 的 stream 啊。你自己要代理 http ,你就得自己处理好代理之外的各种异常,没有深入用过 squid 透明代理,我不知道它是否有参数能够将不能识别的封包直接透传过去,楼主可以去查一查。
    biaobiaoqi
        45
    biaobiaoqi  
       2017-03-20 17:32:31 +08:00 via iPhone
    这口锅,感觉不应该淘宝 app 背。
    simpx
        46
    simpx  
       2017-03-20 17:33:25 +08:00
    @qianguozheng #43

    兼容性当然考虑了

    你的代理是不是返回了什么异常 response

    如果访问失败,是会降级用普通 http 的
    weyou
        47
    weyou  
       2017-03-20 17:33:34 +08:00
    @iVeego 阿里系是有全球站点的,你从小飞机出去上淘宝,可能会定向到淘宝的国际站点。不知道是不是这个原因。 反正我的小飞机是分应用代理的,阿里系不在代理的名单里面。
    weyou
        48
    weyou  
       2017-03-20 17:35:09 +08:00
    @iVeego 我用白名单没有出过问题,你看看是不是该更新一下小飞机了。
    qianguozheng
        49
    qianguozheng  
    OP
       2017-03-20 17:36:03 +08:00
    @simpx 那就不对了,你看到我的数据报截图了没, 400 Bad Request, 然后我在淘宝 App 里面点击天猫 直接提示网络不可用之类的,没有你说的降级这个(可能没做好),如果有的话,我多试几次应该就正常了,对吧。
    qianguozheng
        50
    qianguozheng  
    OP
       2017-03-20 17:36:45 +08:00
    @biaobiaoqi 我这也是希望淘宝 App 越做越好,哈哈
    qianguozheng
        51
    qianguozheng  
    OP
       2017-03-20 17:37:51 +08:00
    @simpx 要不你把跟淘宝 App 通信的那几个服务器地址告诉我?我把他们加到白名单里
    qianguozheng
        52
    qianguozheng  
    OP
       2017-03-20 17:40:40 +08:00
    @weyou 还是你回答的靠谱。
    端口可以随便用,没错。
    我是找过 squid 没有相应的处理方法,所以来这么一问的,这么大的企业应该考虑各种情况,让用户用的舒心,用的方便,因为网络环境本就是复杂的,发现一种问题,就解决这种问题,越做越好嘛。
    simpx
        53
    simpx  
       2017-03-20 17:43:00 +08:00
    @qianguozheng #51 IP 是 httpdns 获取到的,不一定的。当然,也不会经常变,抓包到就是了
    akira
        54
    akira  
       2017-03-20 17:43:53 +08:00
    有些公司会限制 只能访问外网特定端口。。
    maplerecall
        55
    maplerecall  
       2017-03-20 18:13:11 +08:00
    @qianguozheng 没毛病,端口本身和协议无关, 80 端口传其它协议业界里挺常见吧,就连 skype 这么大牌国际化的程序也会用 80 端口来保证在一些环境下的通信,虽然也被一些人吐槽,但既然微软都这样做了一定程度上可以说明其做法并不能说是不合理的,甚至说对大多数用户来说是合理的。

    所以我觉得这锅还是得劫持者来背……
    qianguozheng
        56
    qianguozheng  
    OP
       2017-03-20 19:18:46 +08:00
    @simpx 你们那个走 80 端口的是 httpdns 请求阿?
    qianguozheng
        57
    qianguozheng  
    OP
       2017-03-20 19:20:25 +08:00
    @maplerecall

    锅由劫持者来背我也不反对。
    但是,受影响的是用户阿,如果产品设计考虑到这些可能的问题,对于用户体验来说也是一种提升,你觉得呢
    qianguozheng
        58
    qianguozheng  
    OP
       2017-03-20 19:24:55 +08:00
    @nfroot

    @simpx

    腾讯的 httpdns 貌似是正常的 http 请求封装的。

    https://www.qcloud.com/document/product/379/3524
    maplerecall
        59
    maplerecall  
       2017-03-20 19:49:00 +08:00
    @qianguozheng 就是为了用户考虑啊,比如有 100 个用户的网络只能通过 80 端口正常通信,而有 10 个用户需要或者会被不正确的劫持 80 端口,两者的需求是冲突的,那只能照顾人数更多的用户……
    qianguozheng
        60
    qianguozheng  
    OP
       2017-03-20 21:53:23 +08:00
    @maplerecall 这句话说到正点了。

    不正确的劫持- 可以不考虑。 但是正常的 http 代理也没有考虑就不太好了吧。

    而且人家腾讯的 httpdns 是通过 http 的协议来实现的,如果是这样也没问题啊。现在的问题是它并没以 http 协议的形式封装 httpdns,导致了现在的问题。
    hiboshi
        61
    hiboshi  
       2017-03-20 23:35:10 +08:00   ❤️ 1
    我个人觉得走 80 的唯一目的就是防止运营商对端口封锁,很多地区的小运营商针对非 80 , 443 端口进行屏蔽,比如 21 , 22 很多地方长宽、广电都屏蔽了,如果这些还走非 80 的话势必整个 APP 都废了,所以 ali 采用了 80 ,总不至于我网页都不能访问吧,既然用了 80 用了非 HHTP 协议,以 ali 的数据量和 http 报文长度 估计压力什么的很难满足吧!
    mhycy
        62
    mhycy  
       2017-03-20 23:47:40 +08:00   ❤️ 2
    说句不好听的明明是自己技术不过关劫持不做封包分析,为何这口锅要扣在 APP 上面呢?

    服务端返回 400 更多的是安全上的迷惑作用, 80 端口按常理是 HTTP 协议应用,但实际上是私有协议。
    HTTP 代理做劫持的时候必然需要做双向的封包分析以确定数据流是可处理的。
    这点都做不好的话别怪 APP 服务器不支持。

    另:劫持形式实现的 HTTP 代理不是正常的 HTTP 代理
    jhdxr
        63
    jhdxr  
       2017-03-20 23:57:59 +08:00   ❤️ 1
    1. 用 80 端口(的原因之一)是在部分网络环境下只有 80 端口能用,对, 443 也不行
    2. 曾经有过一个串号的故障,经过排查就是某小运营商无视 cookie 针对 get 请求做了缓存, GG

    以我个人观点,在被劫持的情况下,提示不可用让用户意识到自己的网络环境可能存在问题也是正当的方案之一。
    利益相关:前手淘开发
    firefox12
        64
    firefox12  
       2017-03-21 00:04:49 +08:00 via iPhone
    @qianguozheng http 代理和这个有什么关系, app 客户端又没要求走 http 代理。是你们强行把别人的请求走了 80 代理吧
    cppgohan
        65
    cppgohan  
       2017-03-21 01:20:04 +08:00
    个人理解是为了提高连通率, 有些奇葩的网络环境, 防火墙只给过 80 端口的也是有的.
    incompatible
        66
    incompatible  
       2017-03-21 02:05:43 +08:00
    @qianguozheng 哪个业界默认 80 都是 HTTP 协议了?
    默认走 HTTP 协议以便你们运营商🐶做劫持?
    iyaozhen
        67
    iyaozhen  
       2017-03-21 02:19:40 +08:00 via Android
    @hiboshi
    @jhdxr
    @cppgohan
    赞同,都是被逼的。我们也不想走 80 端口呀。其它端口经常不能使啊
    正常服务端会下发几个 ip(一般通过 httpdns),一个 ip 还会有几个端口,客户端会把几个 ip+端口都探测一轮,往往可能就是 80 端口响应最快。当然 80 端口有问题会切换,更近一步服务降级使用 http 协议。当然这是理想情况有时候并不能很好的切换
    wavingclear
        68
    wavingclear  
       2017-03-21 04:16:08 +08:00
    原来手机支付宝 app 总是掉线是这个原因……
    mengzhuo
        69
    mengzhuo  
       2017-03-21 09:52:28 +08:00
    没毛病,我国的网络搞得我们做游戏的都得用 80 443
    skylancer
        70
    skylancer  
       2017-03-21 10:10:42 +08:00
    用 80 是主要考虑到了比如移动这种运营商经常玩劫持而考虑的,我搜了下工单劫持基本都是移动,相当醉
    另外端口和业务不一定相关的啊... 这个喷点没意思
    skylancer
        71
    skylancer  
       2017-03-21 10:13:44 +08:00
    我搜了下工单,第一页, 42 条记录,从 3 月 12 日到今天
    2 条联通劫持记录,剩下的 39 条全是移动

    啧啧啧
    hslx111
        72
    hslx111  
       2017-03-21 10:18:44 +08:00
    400 是 squid 无法识别请求返回的吧 这锅真心不是淘宝 app 的
    zpf124
        73
    zpf124  
       2017-03-21 10:45:45 +08:00
    @qianguozheng 巧了,我反倒是喜欢在 80 上代理 3389 端口,因为只有这样我才不会被各种各样的防火墙网关之类的弄掉。

    从来没有过任何一个组织制定过标准规定哪些端口是干什么的,都是协议中约定俗成的,并不代表其他产品不能占用这些端口。
    mokeyjay
        74
    mokeyjay  
       2017-03-21 10:48:11 +08:00 via Android
    @iVeego 巧了,我也是
    iVeego
        75
    iVeego  
       2017-03-21 10:59:26 +08:00
    @mokeyjay #74 这非常影响体验,不过后来我用曲线救国的方式搞定了。我用了 island 这个软件,一来限制阿里系的后台流氓行为,二来它直接连国内,正好。这是在酷安里面某个评论看到的。用下来体验非常不错。
    RqPS6rhmP3Nyn3Tm
        76
    RqPS6rhmP3Nyn3Tm  
       2017-03-21 11:51:43 +08:00
    http 默认 80 ,不代表 http 当且仅当 port 80
    JackWindows
        77
    JackWindows  
       2017-03-21 13:32:13 +08:00 via iPhone
    估计楼主没听说过 web socket
    qianguozheng
        78
    qianguozheng  
    OP
       2017-03-21 14:29:05 +08:00
    @JackWindows 我还真听说过,而且用过,搭建过,让你失望了
    qianguozheng
        79
    qianguozheng  
    OP
       2017-03-21 14:45:07 +08:00
    @mhycy 确实,要是我能解决这个问题,也不会在这里发牢骚了,哈哈。
    mhycy
        80
    mhycy  
       2017-03-21 14:54:42 +08:00
    @qianguozheng
    Python 写个代理滤一遍~
    qianguozheng
        81
    qianguozheng  
    OP
       2017-03-21 14:56:42 +08:00
    @mhycy 设备性能差,没有安装 Python 环境
    mhycy
        82
    mhycy  
       2017-03-21 15:21:56 +08:00
    @qianguozheng 去淘宝搞个 3215
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1064 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 22:44 · PVG 06:44 · LAX 15:44 · JFK 18:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.