淺談HTTP服務

Socket套接字

在建立通信連接的每一端,進程間的傳輸要有兩個標誌:

  • IP地址和端口號,合稱爲套接字地址(socket address)
  • 客戶機套接字地址定義了一個唯一的客戶進程
  • 服務器套接字地址定義了一個唯一的服務器進程
    在這裏插入圖片描述
    Socket:套接字,進程間通信(IPC)的一種實現,允許位於不同主機(或同一主機)上不同進程之間進行通信和數據交換
  • Socket API:封裝了內核中所提供的socket通信相關的系統調用
  • Socket Domain:根據其所使用的地址
    • AF_INET:Address Family,IPv4
    • AF_INET6:IPv6
    • AF_UNIX:同一主機上不同進程之間通信時使用
  • Socket Type:根據使用的傳輸層協議
    • SOCK_STREAM:流,TCP套接字,可靠地傳遞、面向連接
    • SOCK_DGRAM:數據報,UDP套接字,不可靠地傳遞、無連接
    • SOCK_RAW:裸套接字,無須TCP或UDP,應用直接通過IP包通信
  • Socket位於傳輸層與應用層之間,連接了應用層細節與通信細節,負責用戶進程與系統內核的交互

HTTP超文本傳輸協議

瀏覽器如何訪問網站

在這裏插入圖片描述

HTTP協議通信過程

  • HTTP(HyperText Transfer Protocol,超文本傳輸協議)是一種用於分佈式、協作式和超媒體信息系統的應用層協議。
  • HTTP是萬維網的數據通信的基礎設計HTTP最初的目的是爲了提供一種遠距離共享知識的方式,藉助多文檔進行關聯實現超文本,連成相互參閱的WWW
    在這裏插入圖片描述

HTTP協議分層

在這裏插入圖片描述

HTTP相關術語

  • http(hyper text transfer protocol):超文本傳輸協議,TCP連接端口80

  • html(hyper text markup language):超文本標記語言,一種描述網頁結構的編程語言

    • http與html的關係:http協議傳輸的文本文件依據使用的編程語言,可以分爲html, css, javascript文件等
  • MIME(Multipurpose Internet Mail Extensions):多用途互聯網郵件拓展,支持在互聯網上傳輸各種格式的文件

    • 在文件/etc/mime.types中詳細列舉了支持的文件類型
    • 格式:major/minor ,一級類型/二級類型,如:
      text/html, image/jpeg, video/mp4

HTTP協議發展版本差異

  • http/0.9,1991年發佈,只有GET命令GET /index.html ,服務器只能迴應HTML格式字符
    串,不能迴應別的格式

  • http/1.0,1996年5月發佈,增加了POST, HEAD命令

    • 支持cache, MIME, method
    • 每個TCP連接只能發送一個請求
    • 頭信息是ASCII 碼,後面數據可爲任何格式
    • Content-Type字段說明數據格式,包含在MIME中
  • http/1.1(目前最普遍),1997年1月發佈,新增命令PUT, PATCH, OPTIONS, DELETE

    • 持久連接(persistent connection):TCP連接默認不關閉,可以被多個請求複用
    • 管道機制(pipelining):同一個TCP連接裏可以同時發送多個請求
    • 隊頭堵塞(Head-of-line blocking):服務器順序處理請求,前方請求迴應慢,造成很多請求排隊
    • http協議不帶狀態,連接斷開後服務器將失去客戶端信息,每次請求需發送相同信息,浪費帶寬
      在這裏插入圖片描述
  • HTTP1.0和1.1的問題

    • HTTP1.x在傳輸數據時,每次都需要重新建立連接,無疑增加了大量的延遲時間,特別是在移動端更爲突出
    • HTTP1.x在傳輸數據時,所有傳輸的內容都是明文,客戶端和服務器端都無法驗證對方的身份,無法保證數據的安全性
    • HTTP1.x在使用時,header裏攜帶的內容過大,增加了傳輸的成本,並且每次請求header基本不怎麼變化,尤其在移動端增加用戶流量
    • 雖然HTTP1.x支持了keep-alive,來彌補多次創建連接產生的延遲,但是keep-alive使用多了同樣會給服務端帶來大量的性能壓力,並且對於單個文件被不斷請求的服務(例如圖片存放網站),keep-alive可能會極大的影響性能,因爲它在文件被請求之後還保持了不必要的連接很長時間
  • HTTP2.0協議2015年,HTTP2.0是谷歌SPDY的升級版

    • 頭信息和數據體都是二進制,稱爲頭信息幀和數據幀
    • 複用TCP連接,在一個連接裏,客戶端和瀏覽器都可以同時發送多個請求或迴應,且不用按順序一一對應,避免了“隊頭堵塞“,此雙向的實時通信稱爲多工(Multiplexing)
    • 引入頭信息壓縮機制(header compression),頭信息使用gzip或compress壓縮後再發送;客戶端和服務器同時維護一張頭信息表,所有字段都會存入這個表,生成一個索引號,不發送同樣字段,只發送索引號,提高速度
    • HTTP/2 允許服務器未經請求,主動向客戶端發送資源,即服務器推送(server push)

HTTP工作機制

  • 事務:包含http請求和http響應

  • web資源:多個資源組成一個網頁

    • 靜態文件:無需服務端做出額外處理
    • 文件後綴:.jpg, .html, .txt, .js, .css, .mp3, .avi
    • 動態文件:服務端執行程序,返回執行的結果
    • 文件後綴:.asp, .php, .jsp
  • 提高HTTP連接性能的方法

    • 並行連接:通過多條TCP連接發起併發的HTTP請求
    • 持久連接:重用TCP連接,以消除連接和關閉的時延,以事務個數和時間來決定是否關閉連接
    • 管道化連接:通過共享TCP連接發起併發的HTTP請求
    • 複用的連接:交替傳送請求和響應報文(實驗階段)
  • 傳統HTTP連接:串行連接,每個事務都需要建立和斷開連接一次
    在這裏插入圖片描述

  • 並行連接:同時進行多個事務,事務之間並行運行
    在這裏插入圖片描述

  • 持久連接: 一個連接過程依次完成多個事務,減少了建立和斷開連接的時間
    在這裏插入圖片描述

  • 管道連接: 一個連接過程同時進行多個事務,進一步減少了時間開銷
    在這裏插入圖片描述

URI和URL

  • URI(Uniform Resource Identifier):統一資源標識,分爲URN和URL
  • URN(Uniform Resource Naming):統一資源命名,用於給資源定義一個唯一的命名
  • URL(Uniform Resource Locator):統一資源定位,用於描述某服務器某特定資源的位置
  • URL的組成:
    在這裏插入圖片描述

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

  • scheme:方案,指定連接服務器使用的協議
  • user:用戶名
  • password:密碼
  • host:服務器的主機名或IP地址
  • port:端口號
  • path:服務器資源本地名
  • params:參數,參數爲名/值對,多個參數用";"分隔
  • query:查詢,用"?“分隔,多個查詢用”&"分隔
  • frag:片段,在客戶端使用,用"#"分隔

HTTP 請求訪問的完整過程

在這裏插入圖片描述
1️⃣建立連接:
接收或拒絕連接請求
2️⃣接受請求:
接收客戶端請求報文中對某資源的一次請求的過程
在這裏插入圖片描述
Web訪問響應模型(Web I/O)

  • 單進程I/O模型:啓動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
  • 多進程I/O模型:並行啓動多個進程,每個進程響應一個連接請求
  • 複用I/O結構:啓動一個進程,同時響應N個連接請求
    • 實現方法:多線程模型和事件驅動
    • 多線程模型:一個進程生成N個線程,每線程響應一個連接請求
    • 事件驅動:一個進程處理N個請求
  • 複用的多進程I/O模型:啓動M個進程,每個進程響應N個連接請求,同時接收M*N個請求

3️⃣處理請求:
服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資
源,首部和可選的主體部分對請求進行處理

  • 常用請求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

4️⃣訪問資源:
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源

  • web服務器資源路徑映射方式:
    • docroot
    • alias
    • 虛擬主機docroot
    • 用戶家目錄docroot

5️⃣構建響應報文:
服務器執行請求方法中描述的動作,並返回響應報文。響應報文中包含有響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體。

  • 響應報文通常包括:

    • Content-Type:響應首部元素,描述響應主體的MIME類型
    • Content-Length:響應首部元素,描述響應主體的長度
  • 識別MIME類型的策略:

    • 魔法分類:服務器掃描資源的內容,並將其與一個已知模式表(被稱爲魔法文件)進行匹配
    • 顯示分類:強制特定文件或目錄內容擁有某個MIME類型
    • 類型協商: 有些Web服務器經過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置Web服務器,使其可以通過與用戶的協商來決定使用哪種格式(及相關的MIME類型)“最好”
    • 默認先根據文件的後綴名判斷MIME類型,如果沒有後綴名再通過魔法分類識別

6️⃣發送響應報文:

  • 非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連接。
  • 持久連接來說,連接可能仍保持打開狀態。

7️⃣記錄日誌
最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務

8️⃣http服務器應用

  • http服務器程序
    httpd apache
    nginx
    lighttpd
  • 應用程序服務器
    IIS .asp
    tomcat .jsp
    jetty 開源的servlet容器,基於Java的web容器

發佈了107 篇原創文章 · 獲贊 20 · 訪問量 6361
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章