zoukankan      html  css  js  c++  java
  • 3+再议get与post区别(nagle+delayed ack)

    https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=100002489&idx=5&sn=b5d364d6150336b8c523041732b00173&chksm=7a4975084d3efc1eba31f375b4c08670a2594e647ac7ac434e03bf0faeb779264b55319439a9&mpshare=1&scene=1&srcid=02020bfrlw2aegyhHH4mdjTY&key=d1dd5c9a0a50c21a83462e8ec5c3bcc596bf68b5dec5e79a70fa4d4f5ed31fd590828b60058af47eb4e81a55e3ee5edd867935bad052f05c4e5150782190a00cff6c76b2b16aa8ad20be0e08c5eb0efe&ascene=0&uin=MTA2NzUxMDAyNQ%3D%3D&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F2511)&version=11020012&lang=zh_CN&pass_ticket=sv4l%2BGEe3jDMSGyGy8HbXOjLuiqF00ftuchHsiP4ANQLuOaLo%2FLBiGBEJRndwZZ5

    你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。

    HTTP只是个行为准则

    由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

     

     

    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

     

    而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

     

    如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。

     

     

    所以对于get请求来说,标准中,content-type是无意义的,因为参数跟在url后面,body里面是没有东西的,服务器一般不会去读body

    1.0版规定,头信息必须是 ASCII 码(这也是为什么请求,特别是get请求url中有中文要encode的原因,get请求一般参数跟在url后面,在http中,而不是像post那样在body中),后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用。

    如text/html   、application/json;charset=UTF-8   (http协议简史

     

    2019.12.2避谣:

    https://blog.csdn.net/zerooffdate/article/details/78962818

    HTTP POST请求发送两个TCP包?

    作者抓包验证了一下

    postman http的一个post请求只发了一个tcp包

    浏览器——同样一个包

    那么什么时候出现两个包?

    1)发两个包的浏览器

    2)发两个包的http client——Ruby's Net::HTTP splits POST requests across two TCP packets - one for the headers, and another for the body. 关于tcp delayedack实践(三)服务间调用

     

    而且也不是因为“浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok”

     

    另外,为表诚意,我仔细搜索了相关内容,发现确实是有发两个包的情况的,但是并不是跟作者说的那样,先发post的header,返回一个100继续,而是先发一个tcp包,把header发过去,然后因为nagle算法的原因,就等待一个tcp的ack,然后再发剩下的包。

    blog > images > haproxy-200ms-diagram.svg

    原文章在这里(https://gocardless.com/blog/in-search-of-performance-how-we-shaved-200ms-off-every-post-request/),主要内容是作者发现post比get多200ms,然后深入研究,发现ruby的net::HTTP库,会将一个http请求拆分,先发送header部分。另外,由于没有设置TCP_NODELY,所以第一个包之后要等待ack,才发下一个包,导致了一个请求有200ms的延迟。有一个中文博客引用了这篇文章(https://www.zybuluo.com/babydragon/note/225651)。不过我没用过ruby,不能直接测试,也不清楚是不是真的如此,或者这个问题已经被修复,有测试过的朋友请一定告诉我。

    (取自https://www.zybuluo.com/babydragon/note/225651 懂一点TCP是多么的必要)

  • 相关阅读:
    WIN10安装python及numpy等第三方库以及卸载
    学习Python一年,基础忘记了,看看面试题回忆回议,Python面试题No3
    包含了 java环境,mysql,nginx,redis docker 镜像
    Docker的镜像制作与整套项目一键打包部署
    RedHat Enterprise Linux 5.8 升级openssl
    RedHat Enterprise Linux 5.8 升级openssl
    RedHat Enterprise Linux 5.8 升级openssl
    log4net进阶手札(二):基本用法
    log4net进阶手札(二):基本用法
    log4net进阶手札(二):基本用法
  • 原文地址:https://www.cnblogs.com/silyvin/p/10424592.html
Copyright © 2011-2022 走看看