1. 程式人生 > 其它 >計算機網路 - HTTP

計算機網路 - HTTP

HTTP的特點

HTTP = hypertext transfer protocol,即超文字傳輸協議。在網路分層模型裡面有說到,HTTP是應用層協議。它的主要特點如下:

  • 無狀態
    HTTP是建立在TCP協議上的,我們知道TCP協議是有狀態的。有狀態意味著內部存在一些資料結構去維護這個狀態。而HTTP是無狀態的,沒有記憶能力。
  • 請求-應答
    “一發一收,有來有回”,連線是請求方主動發起,應用方收到請求後被動答覆
  • 靈活可擴充套件
    報文的各個組成部分都沒有嚴格的語法語義限制,可以自由發揮。只規定了一些基本的,例如空格分隔單詞,換行分隔欄位,“header+body”等。
  • 可靠傳輸
    依靠TCP協議的“可靠性”
  • 明文傳輸

鍵入網址回車 - 發生了啥?

步驟如下:

  • 瀏覽器查詢域名的IP地址
    先是瀏覽器自己的快取,然後檢查系統快取(本機域名解析檔案hosts),然後查詢路由器快取,然後向根域名伺服器請求,然後遞歸向其他域名伺服器請求。這裡就會涉及到DNS解析。
  • 瀏覽器向伺服器傳送HTTP請求
    • TCP連線
    • HTTP請求
    • 收到伺服器返回的HTTP報文(HTML響應)
  • 根據HTML渲染解析頁面

狀態碼

DNS解析

DNS解析指的就是域名到IP地址的解析,如下圖所示:

圖片來源:https://segmentfault.com/a/1190000006879700

域名解析系統是一個分層級的龐大系統:

  • 本地DNS伺服器
    我們的電腦和手機裡面都設定了本地DNS伺服器,簡稱(LDNS)
  • 權威域名伺服器
  • 頂級域名伺服器
  • 根域名伺服器
    全世界有13個根DNS,10個在美國,英國瑞典1個,日本1個。但每個根都有映象,全世界有一千多個物理伺服器。我國境內對根DNS的請求,基本都由國內的映象完成了,沒有路由到國外的根伺服器上去。

相關閱讀:美國能讓俄羅斯在網路上消失嗎?

Cookie機制

Cookie是存在瀏覽器裡的,是伺服器委託瀏覽器儲存在客戶端裡的一些資料。我們知道HTTP是無狀態的,所以需要像Cookie這樣傳個小紙條,告訴伺服器我這個客戶端不是新人,以前有一些屬性,可以根據這些屬性提供個性化服務。

與之經常一起比較的是Session,Session是儲存在服務端的,一般會用記憶體或者資料庫(Redis一類的)來儲存,也是記錄使用者的狀態。例如購物車場景,通過Session標識並跟蹤這個使用者。

Nginx

參考資料
這裡只是一些科普類的感性認知:
Nginx是個“輕量級”的Web伺服器,它的CPU,記憶體佔用都很少,同樣的配置下能為更多的使用者提供服務。

“程序池+單執行緒”工作模式

啟動時預先建立好固定數量的worker程序,並繫結到獨立的CPU上,除了worker程序,還有一個master程序來管理程序池,其作用是監控worker使worker異常後能自動恢復。

I/O多路複用

多執行緒雖然可以很容易處理併發,但也存在缺點:如資料競爭,同步,模型複雜等。Nginx採用單執行緒的方式,沒有互斥鎖,減少系統消耗,其利用了Linux核心的I/O多路複用介面epoll()

Web伺服器主要是“I/O密集型”而不是“CPU密集型”。一般的單執行緒處理,就會導致CPU“停下來”等待I/O,造成浪費。epoll讓Nginx能把多個HTTP請求打散,都複用到一個單執行緒裡,不按照先來後到,只有當連線真正可讀可寫才處理。如果阻塞,就立刻切換去處理其他請求。

epoll還有個特點是,大量連線管理都是在作業系統核心做的,減輕應用程式負擔,每個連線僅僅需要很小的記憶體維護狀態。

多階段處理 - 責任鏈模式

HTTP處理的四大類模組:

  • handler 模組:直接處理 HTTP 請求;
  • filter 模組:不直接處理請求,而是加工過濾響應報文;
  • upstream 模組:實現反向代理功能,轉發請求到其他伺服器;
  • balance 模組:實現反向代理時的負載均衡演算法。