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是多么的必要)

  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/silyvin/p/10424592.html
Copyright © 2011-2022 走看看