1. 程式人生 > >長連接,短連接

長連接,短連接

結束 復位 情況 發送數據 img 可以關閉 telnet 握手 分享

技術分享

技術分享

上面2個圖是tcp三次握手和4次握手

三次握手,第一次,服務端知道自己接受數據沒問題,第二次,客戶端知道自己自己發送數據和接受數據沒問題,第三次服務端知道自己發送數據沒問題。

然後,數據開始發送。

4次握手,第一次客戶端發送一個fin,表示自己數據發完了,服務端收到後,若是數據沒有發送完,就發送一個ack,表示,已經收到你的請求,但是服務端數據沒有發送完,

繼續發送數據,等到數據發送完了,就發送一個fin,客戶端收到後就發送一個ack,表示確認收到,服務端就可以關閉連接了。但是客戶端還是要等一個周期時間,如果客戶端發送

ack丟失了,服務端沒有收到就會繼續發送fin,直到收到信息後,才關閉,而客戶端在一定周期內沒有收到信號也關閉。

註意:為何是結束是4次握手?

數據可能沒有發送完。如果都是同時發送完了,那麽也是3次握手,3次握手是由於沒有數據傳送

註意到每一次連接都要消耗3次握手和4次握手,

故有了tcp長連接和短連接,http的長連接和短連接實際上就是tcp的,

短連接:就是一次簡單的tcp連接,數據發送完直接關閉。連接→數據傳輸→關閉連接

長連接:就是在一次連接內多次發送數據包,中間若是沒有數據那麽靠心跳保活協議維護, 連接→數據傳輸→保持連接(心跳)→數據傳輸→保持連接(心跳)→……→關閉連接

tcp保活協議:

個人計算機用戶使用TCP/IP協議通過Telnet登錄一臺主機,這是能夠說明需要使用存活定時器的一個常用例子。如果某個用戶在使用結束時只是關掉了電源,而沒有註銷(log off),

那麽他就留下了一個半打開(half-open)的連接。如果客戶端消失,留給了服務器端半打開的連接,並且服務器又在等待客戶端的數據,那麽等待將永遠持續下去。存活特征的

目的就是在服務器端檢測這種半打開連接。

keepalive工作原理:

若在一個給定連接上,兩小時之內無任何活動,服務器便向客戶端發送一個探測段。(我們將在下面的例子中看到探測段的樣子。)客戶端主機必須是下列四種狀態之一:

1) 客戶端主機依舊活躍(up)運行,並且從服務器可到達。從客戶端TCP的正常響應,服務器知道對方仍然活躍。服務器的TCP為接下來的兩小時復位存活定時器,如果在這兩

個小時到期之前,連接上發生應用程序的通信,則定時器重新為往下的兩小時復位,並且接著交換數據。

2) 客戶端已經崩潰,或者已經關閉(down),或者正在重啟過程中。在這兩種情況下,它的TCP都不會響應。服務器沒有收到對其發出探測的響應,並且在75秒之後超時。服務器將總共發送10個這樣的探測,每個探測75秒。如果沒有收到一個響應,它就認為客戶端主機已經關閉並終止連接。

3) 客戶端曾經崩潰,但已經重啟。這種情況下,服務器將會收到對其存活探測的響應,但該響應是一個復位,從而引起服務器對連接的終止。

4) 客戶端主機活躍運行,但從服務器不可到達。這與狀態2類似,因為TCP無法區別它們兩個。它所能表明的僅是未收到對其探測的回復。

服務器不必擔心客戶端主機被關閉然後重啟的情況(這裏指的是操作員執行的正常關閉,而不是主機的崩潰)。當系統被操作員關閉時,所有的應用程序進程(也就是客戶端進程)都將被終止,

客戶端TCP會在連接上發送一個FIN。收到這個FIN後,服務器TCP向服務器進程報告一個文件結束,以允許服務器檢測這種狀態。

長連接,短連接