1. 程式人生 > >TCP長連線和短連線

TCP長連線和短連線

自己在網路通訊和協議這些方面其實真的是顯得比較弱,對很多知識都不是很瞭解,這兩天看了下長連線的問題,把看的內容記錄一下,後面等到實踐的時候,再補充。

這裡說一下,http是應用層的,而socket是應用層和傳輸層之間的抽象層。所以說長連線短連線雖然可以說,但本質上只tcp的長連線和短連線。

長連線

首先一般說長連線說的是TCP的長連線,有時候也會說http長連線或者socket長連線,但是這些都是建立在tcp的基礎上的,因為http是在應用層,而tcp是在傳輸層,應用層不涉及到資料的傳送和接受,只是表現出來的。

TCP連線是一個雙向通道,能夠保持一段時間不會關閉,因此就區分了長連線和短連線。而http來說就是把頭部的Connection

設定為keep-alive。要伺服器上同樣設定為keep-alive

長連線的好處

為什麼要用長連線呢?長連線最重要的是可以服用TCP連線,這樣減少了每次建立連線和斷開連線的開銷。所以現在大部分都是長連線,例如一個頁面有很多檔案,JS檔案,CSS檔案等等,不能每次都要建立一次連線,所以長連線是比較好的解決辦法。

長連線不會長時間保持的,如果長時間沒有響應,超時會自動斷開的。

但是如果都保持連線,那麼伺服器會爆掉,所以TCP連線數量是有限制的。

使用長連線之後,客戶端、服務端怎麼知道本次傳輸結束呢?兩部分:1是判斷傳輸資料是否達到了Content-Length指示的大小;2動態生成的檔案沒有Content-Length,它是分塊傳輸(chunked),這時候就要根據chunked編碼來判斷,chunked編碼的資料在最後有一個空chunked塊,表明本次傳輸資料結束。

短連線

那麼與長連線對應的就是短連線,在Htpp 1.0之前是沒有長連線的,現在在http 1.1才開始有長連線,並且大部分都是長連線。短連線的流程就是:建立連線->傳送資料->斷開連線。一次傳送之後立即斷開連線。

短連線的好處

既然有長連線了,為什麼還需要用短連線的,因為短連線雖然是之前一直使用的,但是長連線保持了連線不被斷開,那麼如果併發量很好的時候,就會出現問題,所以短連線不用一直佔用伺服器資源,可以讓伺服器空出資源來解決其他的連線。

銀行一般使用短連線。好像是因為:管理起來比較簡單,存在的連線就是有用的。

資料傳送接收方式

  1. 非同步

    • 非同步雙工:接收和傳送時在同一個程序中,有兩個不同的子程序分別負責傳送和接收
    • 非同步單工:接收和傳送用兩個不同的程式來完成。
  2. 同步
    報文的傳送和接收是同步進行的,也就是傳送完之後,就等待返回,考慮超時,這樣就保證了不會無限等待。

短輪詢

輪詢比較好理解,就是向伺服器傳送請求,伺服器返回請求結果。不斷的操作,就叫輪詢。

短輪詢比較好理解,就是說我不斷的輪詢的時候,每次都是即時傳送即時回覆,這樣來更新前端的資料,用來保證資料的前後臺同步。

比如電商網站,每個物品的庫存,是要不斷更新的,就會在前段不斷的發起請求,保證資料同步。

但這樣有個缺點,就是浪費了大量的資源,假如有很多人在瀏覽這個物品,但是暫時都沒有下單,大量的請求可能已經佔用了伺服器的所有資源。

長輪詢

長輪詢就是為了解決這個問題來設計的,長輪詢的操作都是一樣的,前段傳送請求給後端,後臺接收到請求來返回,但是中間有一點不一樣不是瞬間返回。也就是看是否後臺的資料有更新,假如後臺資料還沒有更新,可以把請求暫時掛起來,這樣就不會造成頻繁請求堵塞伺服器了。

假如一直沒更新,那麼就把資料超時返回就可以了。

注意事項

TCP的keep alive是檢查當前的tcp連線是否還是活著的,而HTTP的keep-alive是設定讓當前的tcp連線可以保持活著的狀態。

當TCP連線一段時間沒有進行資料通訊的時候,一方會發出一個心跳包keep alive包來檢測當前連線是否有效,繼續監控。這個間隔時間是可以設定的。