HTTP無狀態協議和Connection長 短連線

2021-09-13 04:03:24 字數 3550 閱讀 9023

目錄

http無狀態協議

connection

短連線:

長連線:

1、定義:無狀態是指協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。從另一方面講,開啟乙個伺服器上的網頁和你之前開啟這個伺服器上的網頁之間沒有任何聯絡。

2、優點:伺服器不用為每個客戶端連線分配記憶體來記憶大量狀態,也不用在客戶端失去連線時去清理記憶體,以更高效地去處理web業務。

3、缺點:客戶端的每次請求都需要攜帶相應引數,伺服器需要處理這些引數,耗費時間。

4、注意:http是乙個無狀態的協議,無狀態不代表http不能保持tcp連線。

http 1.0中預設是關閉的:connection: close    /     http 1.1中預設是啟用的:connection: keep-alive

http是無連線的 ,也就是說,瀏覽器和伺服器每進行一次http操作,就建立一次連線,但任務結束就中斷連線。如果瀏覽器或者伺服器在其請求頭部加入了 connection:keep-alive ,那麼tcp連線在傳送後仍然保持開啟狀態,這樣瀏覽器就可以繼續通過相同的連線傳送請求,保持連線節省了為每個請求建立新連線所需的時間,還節約了頻寬。

1、定義:

我們知道http協議採用「請求-應答」模式,當使用普通模式,即非keep-alive模式時,每個請求/應答客戶和伺服器都要新建乙個連線,完成之後立即斷開連線(http協議為無連線的協議)。

2、分析:

http是無狀態的的短鏈結,瀏覽器和伺服器每進行一次http操作,就建立一次連線,但任務結束就中斷連線。 具體就是 瀏覽器client發起並建立tcp連線 -> client傳送httprequest報文 -> 伺服器server接收到報文->伺服器server handle並傳送httpresponse報文給前端,傳送完畢之後立即呼叫socket.close方法->瀏覽器client接收response報文->client最終會收到server端斷開tcp連線的訊號->瀏覽器client 端斷開tcp連線,具體就是呼叫close方法。 

短連線是指socket連線後,傳送接收完資料後馬上斷開連線。 因為連線後接收了資料就斷開了,所以每次資料接受處理不會有聯絡。 這也是http協議無狀態的原因之一。

3、應用場景:

web**的http服務一般都用短連線,因為長連線對於服務端來說會耗費一定的資源,而像web**這麼頻繁的成千上萬的客戶端的連線用短連線會更省一些資源,如果用長連線,而且同時有成千上萬的使用者,如果每個使用者都占用乙個連線的話,那花費的資源可想而知。所以多應用於併發量大但每個使用者無需頻繁操作的情況下。

1、定義:

當使用keep-alive模式時,keep-alive功能使客戶端到伺服器端的連線持續有效,當出現對伺服器的後繼請求時,keep-alive功能避免了建立或者重新建立連線。(一條連線發起多次請求)

2、分析:

連線->傳輸資料->保持連線 -> 傳輸資料-> ………..->直到一方關閉連線,多是客戶端關閉連線。 長連線指建立socket連線後不管是否使用都保持連線,但安全性較差。

3、應用場景:

多用於操作頻繁,點對點的通訊,而且連線數不能太多情況。

例如:資料庫的連線用長連線, 如果用短連線頻繁的通訊會造成socket錯誤,而且頻繁的socket 建立也是對資源的浪費。

4、注意:

在http早期,每個http請求都要求開啟乙個tpc socket連線,並且使用一次之後就斷開這個tcp連線。

使用keep-alive可以改善這種狀態,即在一次tcp連線中可以持續傳送多份資料而不會斷開連線。通過使用keep-alive機制,可以減少tcp連線建立次數,也意味著可以減少time_wait狀態連線,以此提高效能和提高httpd伺服器的吞吐率(更少的tcp連線意味著更少的系統核心呼叫,socket的accept()和close()呼叫)。

但是,keep-alive並不是免費的午餐,長時間的tcp連線容易導致系統資源無效占用。配置不當的keep-alive,有時比重複利用連線帶來的損失還更大。所以,正確地設定keep-alive timeout時間非常重要。

httpd守護程序,一般都提供了keep-alive timeout時間設定引數。比如nginx的keepalive_timeout,和apache的keepalivetimeout。這個keepalive_timout時間值意味著:乙個http產生的tcp連線在傳送完最後乙個響應後,還需要hold住keepalive_timeout秒後,才開始關閉這個連線。

當httpd守護程序傳送完乙個響應後,理應馬上主動關閉相應的tcp連線,設定 keepalive_timeout後,httpd守護程序會想說:」再等等吧,看看瀏覽器還有沒有請求過來」,這一等,便是keepalive_timeout時間。如果守護程序在這個等待的時間裡,一直沒有收到瀏覽發過來http請求,則關閉這個http連線。

tcp keepalive保鮮定時器,支援三個系統核心配置引數:

1 echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time      //首次傳送 keepalive 報文的時間間隔1800s

2 echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl           //兩次重試報文的時間間隔15s

3 echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes       //重試 5 次

keepalive是tcp保鮮定時器,當網路兩端建立了tcp連線之後,閒置idle(雙方沒有任何資料流傳送往來)了tcp_keepalive_time後,伺服器核心就會嘗試向客戶端傳送偵測包,來判斷tcp連線狀況(有可能客戶端崩潰、強制關閉了應用、主機不可達等等)。如果沒有收到對方的回答(ack包),則會在 tcp_keepalive_intvl秒後再次嘗試傳送偵測包,直到收到對對方的ack,如果一直沒有收到對方的ack,一共會嘗試 tcp_keepalive_probes次,每次的間隔時間在這裡分別是15s, 30s, 45s, 60s, 75s。如果嘗試tcp_keepalive_probes次後,依然沒有收到對方的ack包,則會丟棄該tcp連線。tcp連線預設閒置時間是2小時,一般設定為30分鐘足夠了。

簡單來說,http keep-alive相當於延緩tcp的生命,tcp keepalive是一種檢測tcp連線狀況的保鮮機制實現了保活。

HTTP協議 無狀態

blog 個人 目錄cookie和session http是一種不儲存狀態,即無狀態 stateless 協議。http協議自身不對請求和響應之間的通訊狀態進行儲存。也就是說在http這個級別,協議對於傳送過的請求或響應都不做持久化處理。可以理解為,瀏覽器傳送請求給伺服器時,伺服器響應請求 但同乙個...

HTTP無狀態協議詳解

概述 http協議是無狀態的。無狀態是指協議對於事務處理沒有記憶能力,這意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。無狀態的根本原因是 瀏覽器與伺服器是使用socket套接字進行通訊的,伺服器將請求結果返回給瀏覽器之後,會關閉當前的socket連線,而且伺服...

http協議 無連線 無狀態

無連線的含義是限制每次連線只處理乙個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。早期這麼做的原因是 http 協議產生於網際網路,因此伺服器需要處理同時面向全世界數十萬 上百萬客戶端的網頁訪問,但每個客戶端 即瀏覽器 與伺服器之間交換資料的間歇性較大 ...