經過wireshark抓包來說解HTTP中Connection: keep-alive頭部的做用

今天週末時間,有空給你們講解一個小知識點,即HTTP的keep-alive頭部。我使用wireshark來抓取網絡包來在實戰中講解。但願能讓你們更容易、更直觀的理解!服務器

HTTP中keep-alive頭部的做用是爲保持TCP鏈接,這樣能夠複用TCP鏈接不須要爲每一個HTTP請求都創建一個單獨的TCP鏈接。這樣既能夠節省操做系統資源,也可以保持HTTP請求的高效性。網絡

咱們經過wireshark抓的包來分析一下:socket

下面的例子中128.14.154.105是HTTP服務器,192.168.1.6是客戶端。spa

當服務器處理完一個HTTP請求時,會主動發起斷開鏈接,以下圖所示(四次揮手):操作系統

當服務器最後發送一個ACK包後進入TIME_WAIT狀態,此狀態將會持續2MSL(Maximum Segment Lifetime),一個MSL通常爲2分鐘,因此TIME_WAIT通常持續4分鐘。在此期間仍是能夠接受客戶端的數據的。3d

此時客戶端爲了複用TCP鏈接,將會發送一個心跳包(keep-alive)來保持鏈接。blog

上面的例子中,共發送了2次心跳包。若是在此期間尚未新的HTTP請求那麼服務器會再次主動斷開。資源

此後,客戶端不會再發送心跳包了。請求

在最後給你們說下,爲何主動發起斷開鏈接的一方在發送最後一個ACK包後須要進入TIME_WAIT狀態2MSLim

1)咱們先假設發送完最後一個ACK包後直接斷開的話,若是因爲某種緣由對端沒有收到的話,對端會再次發送一個FIN包(TCP的重傳機制),因爲此時另外一端已經關閉了對應的socket,因此TCP協議棧會

發送一個RST包。這個包表示的是一種錯誤。(好比,請求的TCP鏈接的端口沒有在監聽狀態下),那麼TCP鏈接就是因錯誤而被迫斷開,因此TCP中工做沒有正常完成。

2)第二個緣由是讓老的重複包在網絡中消失,解釋一下這句話的意思:若是咱們的TCP斷開以後,立馬有一個新的TCP鏈接和以前的鏈接的IP和端口都同樣的話,那麼殘留在網絡中的包到達後會被誤解爲是新的

鏈接中的包。這樣就會出現問題。若是咱們使用了TIME_WAIT,在這個狀態下是不容許創建新的IP和端口都同樣的TCP鏈接的,並且它會維持2MSL時間, 這足夠讓網絡中的舊包消失掉。

 

最後歡迎你們評論指正!^_^

相關文章
相關標籤/搜索