ranran
V2EX  ›  问与答

HTTP 协议 服务区发送数据给客户端可以 GZIP 压缩 那么反过来也可以?

  •  1
     
  •   ranran · Aug 20, 2016 · 7262 views
    This topic created in 3731 days ago, the information mentioned may be changed or developed.
    就是 POST 请求是否也可以采用 gzip 压缩,然后服务器自行解压?
    16 replies  •  2016-08-22 14:44:03 +08:00
    ranran
    ranran
    OP
    Aug 20, 2016
    1
    一般服务器不支持吧?只能自行实现?
    skydiver
    skydiver
    Aug 20, 2016 via iPad❤️1
    2
    为什么不可以呢,以及为什么不试一下呢
    ranran
    ranran
    OP
    Aug 20, 2016
    3
    @skydiver 记得 post 文件的时候 都是 base64 编码 base64 会让内容变长好多 我突然很疑惑 为什么不用 gzip 这样的压缩算法呢

    我说的场景是基于浏览器的 而不是自己写程序纯传输用 如果纯传输用 自行拓展一下也是毫无疑问的不是么……

    老的 HTTP 协议那时候可能没考虑压缩…… 不知道 HTTP2 有没有相关的,毕竟 HTTP2 不是老协议了。

    @qgy18 来来来聊聊
    Zzzzzzzzz
    Zzzzzzzzz
    Aug 20, 2016❤️2
    4
    post 数据只是做 url 编码, 并不会 gzip, 而且上传数据(multipart/form-data)连 url 编码都不会做.

    如果 post 的数据不大, 或者上传的是图片或者压缩文件一类, 这类情况 gzip 不仅不会压小, 还可能会变大,

    客户端是不可信任的, 理论上可以用简单的结构构造出一个压缩后极小但是解压后极大的数据来爆服务器内存.
    Zzzzzzzzz
    Zzzzzzzzz
    Aug 20, 2016❤️1
    5
    "post 数据只是做 url 编码, 并不会 gzip, 而且上传数据(multipart/form-data)连 url 编码都不会做. "

    =>

    "post 数据只是做 url 编码, 并不会 base64, 而且上传数据(multipart/form-data)连 url 编码都不会做. "
    vibbow
    vibbow
    Aug 20, 2016❤️1
    6
    post 数据可以压缩的
    vibbow
    vibbow
    Aug 20, 2016❤️1
    7
    关键字:
    Content-Encoding: gzip
    fcicq
    fcicq
    Aug 20, 2016❤️1
    8
    传统上某些 8-bit byte 会被砍掉首位所以只能传输 7-bit byte. url encode 和 base64 都能完成这个变换. 但是指定 content-type 为一种私有或者二进制类型很不好看, 推荐用 multipart 上传的方式, 稍微浪费一个头的空间还不算太离谱.
    qgy18
    qgy18
    Aug 20, 2016❤️3
    9
    当然可以!而且我以前就写过相关文章:

    https://imququ.com/post/how-to-compress-http-request-body.html
    如何压缩 HTTP 请求正文
    qgy18
    qgy18
    Aug 20, 2016❤️1
    10
    aprikyblue
    aprikyblue
    Aug 20, 2016 via Android❤️1
    11
    @Zzzzzzzzz 按照最后这样逻辑的话,服务器也可以用简单的结构构造出一个压缩后极小但是解压后极大的数据来爆访问者内存?
    laoyur
    laoyur
    Aug 20, 2016❤️1
    12
    如果服务端和客户端都是你做的,那你非要这么做当然可以,但是,一般的情况下服务端不是你控制的,
    你都不知道服务端支持不支持 gzip ,就直接传了压缩过的数据过去,让人家怎么处理?
    还有就是 4 楼提到的安全问题,如果服务端接受压缩过的数据,客户端扔一个 zip 炸弹上来,解压出来几十 G ,服务器处理不好的话岂不嗝儿屁
    julyclyde
    julyclyde
    Aug 21, 2016
    13
    @fcicq HTTP 没这个传统。砍掉高位的那是传说中的古代 SMTP
    fcicq
    fcicq
    Aug 21, 2016
    14
    @julyclyde 不过想一下在 UTF-8 以前也没啥压缩, 文本内容砍了高位根本没事. FTP 还分 text 和 binary...
    sivacohan
    sivacohan
    Aug 21, 2016 via Android❤️3
    15
    @aprikyblue 你说的对,有一个反扒技术就是这样。利用 gzip 压缩一个 TB 级别的都是 0 的文件。目前浏览器对这种情况有拦截,不会出大问题。但一般爬虫不考虑这个,直接把磁盘爆掉。
    Zzzzzzzzz
    Zzzzzzzzz
    Aug 22, 2016❤️2
    16
    @aprikyblue 有啊, gzip bomb, 但最多让浏览器崩一下, 主要用途倒是像楼上说的,对二三线爬虫有奇效.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1638 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 10:53 · PVG 18:53 · LAX 02:53 · JFK 05:53
    ♥ Do have faith in what you're doing.