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 有啥區別,你回答說這倆在傳輸層上發送數據的時候不一樣,確定別人不會揍你?^_^

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