HTTP POST请求发送两个TCP包?
2018-01-03 16:39
323 查看
今天瞎逛的时候看到有一篇16年的文章,说99%的人理解错了HTTP中GET与POST的区别。前面大部分文章都没问题,但是最后有一个,被作者奉为大boss的区别:
我读得书少,你不要骗我。于是我随手拿公司的http服务,做了一次post请求然后用wireshark抓了个包,结果:
好了,http的一个post请求只发了一个tcp包,不用怀疑。
然后为了不愿望作者,我仔细看了原文,后面还提到,浏览器先发送header,然后发送body。。。嗯,难道意思是浏览器做了这个动作,而用postman发送就没有?于是我又进一步测试一下网站里有没有post请求。所以我在一个网页上做了一个post请求,结果:
可以看到,一个post请求,实际上,还是只有一个tcp包,整个就给他打包过去了, 先发送header什么的,至少在我的测试里面不存在的。
那么真的不存在一个post请求分两个tcp包过去的情况吗?我不知道,至少在我知道的范围内,没看过。
另外,为表诚意,我仔细搜索了相关内容,发现确实是有发两个包的情况的,但是并不是跟作者说的那样,先发post的header,返回一个100继续,而是先发一个tcp包,把header发过去,然后因为nagle算法的原因,就等待一个tcp的ack,然后再发剩下的包。
原文章在这里,主要内容是作者发现post比get多200ms,然后深入研究,发现ruby的net::HTTP库,会将一个http请求拆分,先发送header部分。另外,由于没有设置TCP_NODELY,所以第一个包之后要等待ack,才发下一个包,导致了一个请求有200ms的延迟。有一个中文博客引用了这篇文章。不过我没用过ruby,不能直接测试,也不清楚是不是真的如此,或者这个问题已经被修复,有测试过的朋友请一定告诉我。
我读得书少,你不要骗我。于是我随手拿公司的http服务,做了一次post请求然后用wireshark抓了个包,结果:
好了,http的一个post请求只发了一个tcp包,不用怀疑。
然后为了不愿望作者,我仔细看了原文,后面还提到,浏览器先发送header,然后发送body。。。嗯,难道意思是浏览器做了这个动作,而用postman发送就没有?于是我又进一步测试一下网站里有没有post请求。所以我在一个网页上做了一个post请求,结果:
可以看到,一个post请求,实际上,还是只有一个tcp包,整个就给他打包过去了, 先发送header什么的,至少在我的测试里面不存在的。
那么真的不存在一个post请求分两个tcp包过去的情况吗?我不知道,至少在我知道的范围内,没看过。
2018年1月5日补充:
嗯,有朋友提到,人家最后确实写了firefox抓到的包是一个。是我批判过急了。我原文也说的是不确定是不是就没有发两个包的浏览器。另外,为表诚意,我仔细搜索了相关内容,发现确实是有发两个包的情况的,但是并不是跟作者说的那样,先发post的header,返回一个100继续,而是先发一个tcp包,把header发过去,然后因为nagle算法的原因,就等待一个tcp的ack,然后再发剩下的包。
原文章在这里,主要内容是作者发现post比get多200ms,然后深入研究,发现ruby的net::HTTP库,会将一个http请求拆分,先发送header部分。另外,由于没有设置TCP_NODELY,所以第一个包之后要等待ack,才发下一个包,导致了一个请求有200ms的延迟。有一个中文博客引用了这篇文章。不过我没用过ruby,不能直接测试,也不清楚是不是真的如此,或者这个问题已经被修复,有测试过的朋友请一定告诉我。
相关文章推荐
- java代码发送JSON格式的httpPOST请求
- Java使用HttpURLConnection发送Get及Post请求简单过程
- 使用Java原生API编写发送HTTP_POST请求的工具类
- HttpCilent 发送 POST Http以及Https请求,简单封装
- HttpWebResponse发送post请求并接收
- 通过HttpWebRequest 发送 POST 请求实现自动登陆
- 使用HttpURLConnection向服务器发送post和get请求
- 发送HTTP和HTTPS(单向验证)请求(包含POST请求)
- java发送http的get、post请求
- angular的$http发送post,get请求无法传送参数的问题
- 使用java代码发送HTTP Post请求
- java发送http的get、post请求
- java发送http的get、post请求
- [导入]C#实现通过HttpWebRequest发送POST请求实现网站自动登陆
- 使用HttpURLConnection向服务器发送post和get请求
- HttpUrlConnection用get和post请求发送参数
- c++如何使用SOCKET 发送HTTP1.1 GET POST请求包
- http请求远程接口获得JSON数据(1) --- 利用HttpURLConnection发送post/get请求
- java 发送带Basic Auth认证的http post请求实例代码
- C#模拟http 发送post或get请求