GET产生一个TCP数据包,POST产生两个TCP数据包

火焰课堂专注于分布式架构、高并发解决方案、JVM性能优化、Linux高可用集群部署、底层源码分析的高端Java视频课程, 成为全网最火的Java视频学习平台。拥有完整的Java互联网高并发与分布式架构课程,帮助大家少走弯路。

文章来自于:http://www.huoyankt.com/

HTTP的底层是TCP/IP,所以GET和POST底层也是TCP/IP,也就是说GET和POST都是TCP链接。GET和POST能做的事情是一样的。你要给GET加上request body或者给POST带上url参数技术上是完全行的通的。

GET/POST误解

传统上,很多人认为get是通过url传输数据,post是通过response body传输数据;get的传参大小是2K,post是64K;post比get安全等等,这些都是错误的理解。其实Get和Post就是TCP连接,通过一定的技术手段,Get也可以通过response body传参,Post也可以通过url传参。

GET和POST两者在tcp传输中并无不同

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务端响应200,请求成功。

对于POST方式的请求,浏览器会先发送http header给服务端,告诉服务端等一下会有数据过来,服务端响应100 continue,告诉浏览器我已经准备接收数据,浏览器再post发送一个data给服务端,服务端响应200,请求成功。

但是上面所说的post会比get多一个tcp包其实不太严谨。多发的那个expect 100 continue header报文,是由客户端对http的post和get的请求策略决定的,目的是为了避免浪费资源,如带宽,数据传输消耗的时间等等。所以客户端会在发送header的时候添加expect 100去探探路,如果失败了就不用继续发送data,从而减少了资源的浪费。所以是否在发送一个包取决了客户端的实现策略,和get/post并没什么关系。有的客户端比如fireFox就只发送一个包。

从另一个角度说,TCP 是传输层协议。别人问你应用层协议里的 GET 和 POST 有啥区别,你回答说这俩在传输层上发送数据的时候不一样,确定别人不会揍你?^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章