淺談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容器