天天看點

HTTP協定詳解

                                      HTTP協定相關詳解

--------------------------------------------------------------------------------------------------------------------------------------------

一、

ARPAnet是網際網路的前身

1987年錢天白建立起一個網絡節點,通過國際長途電話撥接上網國際網際網路

1990年錢天白代表中國正式在國際網際網路絡資訊中心的前身DDN-NIC注冊等急了我國的頂級域名CN,并且從此開通了使用裝過頂級域名CN的國際電子郵件服務

1993年3月租用AT&T公司的64K專線正式開通,這條專線是我國部分連入Internet的第一根專線

1994年實作與網際網路的全功能連接配接,被國際上正式承認為有網際網路的國家

1996年開始提供服務

二、

HTTP協定詳解

三、跨Ineternet的主機間通訊

1、在建立通信連接配接的每一端,程序間的傳輸要有兩個标志

2、ip位址和端口号,合稱為套接字位址socket address

3、客戶機套接字位址定義了一個唯一的客戶程序

4、伺服器套接字位址定義了一個唯一的伺服器程序

5、httpd預設80端口

四、socket套接字

1、Socket:套接字,程序間通信IPC的一種實作,允許位于不同主機(或同一主機)上不同程序之間進行通信和資料交換

2、Socket API:封裝了核心中所提供的socket通信相關的系統調用

3、Socket Domain:根據其所使用的位址

    AF_INET:Address Family,IPv4

    AF_INET6:IPv6

    AF_UNIX:同一主機上不同程序之間通信時使用

4、Socket Type:根據使用的傳輸層協定

    SOCK_STREAM:流,tcp套接字,可靠地傳遞、面向連接配接

    SOCK_DGRAM:資料報,udp套接字,不可靠地傳遞、無連接配接

    SOCK_RAW: 裸套接字,無須tcp或udp,APP直接通過IP包通信

5、Socket套接字函數

HTTP協定詳解

6、套接字相關的系統調用:

    socket(): 建立一個套接字

    bind(): 綁定IP和端口

    listen(): 監聽

    accept(): 接收請求

    connect(): 請求連接配接建立

    write(): 發送

    read(): 接收

    close(): 關閉連接配接

五、再次說明端口号

HTTP協定詳解

是以某些服務端口号比較小,小于1023時候,普通使用者無法直接開啟

六、HTTP服務通信過程

1、HTTP服務通信:上網打開一個網頁時,當網頁打開後将斷開,釋放伺服器資源,這樣可以達到更多的網站通路

2、解封裝流程

HTTP協定詳解

七、HTTP術語

http:Hyper Text Transfer Protocol,超文本傳輸協定,tcp 80端口

html:Hyper Text Markup Language,超文本标記語言,程式設計語言

CSS:Cascading Style Sheet,層疊樣式表,定義某個标準,可以應用到很多網頁上,按照它定義的标準執行

js:javascript,和java沒關系

MIME:Multipurpose Internet Mail Extensions,多用途網際網路郵件擴充,支援視訊圖檔等多媒體格式,檢視檔案位置/etc/mime.types

八、HTTP協定

1、http/0.9:1991,原型版本,隻有一個指令GET

2、http/1.0:1996年,支援cache,MIME,method,引入了POST指令和HEAD指令

3、http/1.1:1997年,支援持久連接配接,現在主流

    (1)持久連接配接:TCP連接配接預設不關閉,可以被多個請求複用,對于同一個域名,大多數浏覽器允許同時建立6個持久連接配接

    (2)引入了管道機制(pipelining),即在同一個TCP連接配接裡,用戶端可以同時發送多個請求,進一步改進了HTTP協定的效率

    (3)同一個TCP連接配接裡,所有的資料通信是按次序進行的。伺服器隻能順序處理回應,前面的回應慢,會有許多請求排隊,造成"隊頭堵塞"(Head-of-line blocking)

    (4)為避免上述問題,兩種方法:一是減少請求數,二是同時多開持久連接配接。網頁優化技巧,如合并腳本和樣式表、将圖檔嵌入CSS代碼、域名分片(domain sharding)等

    (5)HTTP 協定不帶有狀态,每次請求都必須附上所有資訊。請求的很多字段都是重複的,浪費帶寬,影響速度

4、Spdy:2009年,谷歌研發解決http/1.1效率不高的問題

5、http/2.0:2015年

    (1)頭資訊和資料體都是二進制,稱為頭資訊幀和資料幀

    (2)複用TCP連接配接,在一個連接配接裡,用戶端和浏覽器都可以同時發送多個請求或回應,且不用按順序一一對應,避免了“隊頭堵塞“,此雙向的實時通信稱為多工(Multiplexing)

    (3)引入頭資訊壓縮機制(header compression),頭資訊使用gzip或compress壓縮後再發送;用戶端和伺服器同時維護一張頭資訊表,所有字段都會存入這個表,生成一個索引号,不發送同樣字段,隻發送索引号,提高速度

    (4)HTTP/2 允許伺服器未經請求,主動向用戶端發送資源,即伺服器推送(server push)

九、HTTP工作機制

1、工作機制

    http請求:http request

    http響應:http request

    一次http事務:請求<-->響應

    工作在應用層,基于tcp協定

2、Web資源:web resource

一個網頁由多個資源構成,打開一個頁面,會有多個資源展示出來,但是每個資源都要單獨請求。是以,一個“Web 頁面”通常并不是單個資源,而是一組資源的集合

    (1)靜态檔案:無需服務端做出額外處理,檔案字尾:.html, .txt, .jpg, .js, .css, .mp3, .avi

    (2)動态檔案:服務端執行程式,傳回執行的結果,檔案字尾:.php, .jsp ,.asp

3、提高HTTP工作性能

    (1)并行連接配接:通過多條TCP連接配接發起并發的HTTP請求

    (2)持久連接配接:keep-alive,長連接配接,重用TCP連接配接,以消除連接配接和關閉的時延,以事務個數和時間來決定是否關閉連接配接,隻建立一次TCP連接配接,一次三次握手和四次揮手,但後續會傳很多資源

    (3)管道化連接配接:通過共享TCP連接配接發起并發的HTTP請求

    (4)複用的連接配接:交替傳送請求和響應封包(實驗階段)

HTTP協定詳解

十、URI

URI: Uniform Resource Identifier 統一資源辨別,分為URL和URN

    (1)URN: Uniform Resource Naming,統一資源命名,比如說, P2P下載下傳(類似人人為我,我為人人)使用的磁力連結是URN的一種實作,下載下傳磁力連結生成的種子時候,會搜尋網絡上其它主機誰有該資源,進行并行下載下傳

    (2)URL: Uniform Resorce Locator,統一資源定位符,用于描述某伺服器某特定資源位置

    (3)兩者差別:URN如同一個人的名稱,而URL代表一個人的住址。換言之,URN定義某事物的身份,而URL提供查找該事物的方法。URN僅用于命名,而不指定位址

十一、URL

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

1、scheme:scheme,驗證,方案,通路伺服器以擷取資源時要使用哪種協定

2、user:使用者,某些方案通路資源時需要的使用者名

3、password:密碼,使用者對應的密碼,中間用:分隔

4、Host:主機,資源宿主伺服器的主機名或IP位址

5、port:端口,資源宿主伺服器正在監聽的端口号,很多方案有預設端口号

6、path:路徑,伺服器資源的本地名,由一個/将其與前面的URL元件分隔

7、params:參數,指定輸入的參數,參數為名/值對,多個參數,用;分隔

8、query:查詢,傳遞參數給程式,如資料庫,用?分隔,多個查詢用&分隔

9、frag:片段,一小片或一部分資源的名字,此元件在用戶端使用,用#分隔

十二、網址通路量

1、IP(獨立IP):即Internet Protocol,指獨立IP數。一天内來自相同客戶機IP位址隻計算一次,記錄遠端客戶機IP位址的計算機通路網站的次數,是衡量網站流量的重要名額

2、PV(通路量): 即Page View, 頁面浏覽量或點選量,使用者每次重新整理即被計算一次,PV反映的是浏覽某網站的頁面數,PV與來訪者的數量成正比,PV并不是頁面的來訪者數量,而是網站被通路的頁面數量

3、UV(獨立訪客):即Unique Visitor,通路網站的一台電腦為一個訪客。一天内相同的用戶端隻被計算一次。可以了解成通路某網站的電腦的數量。網站判斷來訪電腦的身份是通過來訪電腦的cookies實作的。如果更換了IP後但不清除cookies,再通路相同網站,該網站的統計中UV數是不變的

4、網站統計:http://www.alexa.cn/rank/

5、QPS:request per second,每秒請求數

6、PV,QPS,并發連接配接數換算公式

    (1)QPS=PV*頁面衍生連接配接次數/統計時間(86400)

        頁面衍生連接配接次數:頁面上的圖檔視訊等資源數

    (2)并發連接配接數=QPS*http平均響應時間

7、峰值時間:每天80%的通路集中在20%的時間裡,這20%時間為峰值時間,二八法則

8、峰值時間每秒請求數(QPS)=(總PV數*頁面衍生連接配接次數*80%/(每天秒數*20%)

十三、web服務請求處理步驟

1、用戶端向伺服器發起請求,請求裡帶有資料封包頭部,request httpd header,而請求封包頭部裡會帶有method方法(GET、POST、PUT、HEAD、DELETE等)

HTTP協定詳解
HTTP協定詳解

2、一次完整的http請求處理過程

    (1)建立連接配接:接收或拒絕連接配接請求

    (2)接收請求:接收用戶端請求封包中對某資源的一次請求的過程

    Web通路響應模型(Web I/O)

        單程序I/O模型:啟動一個程序處理使用者請求,而且一次隻處理一個,多個請求被串行響應

        多程序I/O模型:并行啟動多個程序,每個程序響應一個連接配接請求

        複用I/O結構:啟動一個程序,同時響應N個連接配接請求

        實作方法:多線程模型和事件驅動

        多線程模型:一個程序生成N個線程,每線程響應一個連接配接請求

        事件驅動:一個程序處理N個請求

        複用的多程序I/O模型:啟動M個程序,每個程序響應N個連接配接請求,同時接收M*N個請求

HTTP協定詳解

    (3)處理請求:伺服器對請求封包進行解析,并擷取請求的資源及請求方法等相關資訊,根據方法,資源,首部和可選的主體部分對請求進行處理。注:HTTP常用請求方式,Method:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

    (4)、通路資源:伺服器擷取請求封包中請求的資源web伺服器,即存放了web資源的伺服器,負責向請求者提供對方請求的靜态資源,或動态運作後生成的資源。注:web伺服器資源路徑映射方式:docroot、alias、虛拟主機docroot、使用者家目錄docroot

    (5)建構響應封包:一旦Web伺服器識别除了資源,就執行請求方法中描述的動作,并傳回響應封包。響應封包中包含響應狀态碼、響應首部,如果生成了響應主體的話,還包括響應主體

        1)響應實體:如果事務處理産生了響應主體,就将内容放在響應封包中回送過去。響應封包中通常包括:

            描述了響應主體MIME類型的Content-Type首部

            描述了響應主體長度的Content-Length

            實際封包的主體内容

        2)URL重定向:web服務建構的響應并非用戶端請求的資源,而是資源另外一個通路路徑

        3)MIME類型:

            Web伺服器要負責确定響應主體的MIME類型。多種配置伺服器的方法可将MIME類型與資源管理起來

            魔法分類:Apache web伺服器可以掃描每個資源的内容,并将其與一個已知模式表(被稱為魔法檔案)進行比對,以決定每個檔案的MIME類型。這樣做可能比較慢,但很友善,尤其是檔案沒有标準擴充名時

            顯式分類:可以對Web伺服器進行配置,使其不考慮檔案的擴充名或内容,強制特定檔案或目錄内容擁有某個MIME類型

            類型協商:有些Web伺服器經過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置Web伺服器,使其可以通過與使用者的協商來決定使用哪種格式(及相關的MIME類型)"最好"

    (6)發送響應封包

    Web伺服器通過連接配接發送資料時也會面臨與接收資料一樣的問題。伺服器可能有很多條到各個用戶端的連接配接,有些是空閑的,有些在向伺服器發送資料,還有一些在向用戶端回送響應資料。伺服器要記錄連接配接的狀态,還要特别注意對持久連接配接的處理。對非持久連接配接而言,伺服器應該在發送了整條封包之後,關閉自己這一端的連接配接。對持久連接配接來說,連接配接可能仍保持打開狀态,在這種情況下,伺服器要正确地計算Content-Length首部,不然用戶端就無法知道響應什麼時候結束了

    (7)記錄日志

    最後,當事務結束時,Web伺服器會在日志檔案中添加一個條目,來描述已執行的事務

十四、http協定

伺服器無法持續追蹤通路者來源

解決http協定無狀态方法

cookie 用戶端存放,一個cookie檔案4K,裡面的東西是鍵值對(name:value)

胖cookie:把所有資訊全放在cookie裡

瘦cookie:隻放關鍵的資訊,唯一的id資訊,根據id資訊從伺服器端的session中查找

session 服務端存放

十五、HTTP請求封包

HTTP協定詳解

十六、HTTP響應封包

HTTP協定詳解

十七、封包解釋

封包文法格式:

1、request封包

<method> <request-URL> <version>

<headers>

<entity-body>

2、response封包

<version> <status> <reason-phrase>

3、method: 請求方法,标明用戶端希望伺服器對資源執行的動作

GET、HEAD、POST等

4、version:

HTTP/<major>.<minor>

5、status:

三位數字,如200,301, 302, 404, 502; 标記請求處理過程中發生的情況

6、reason-phrase:

狀态碼所标記的狀态的簡要描述

7、headers:

每個請求或響應封包可包含任意個首部;每個首部都有首部名稱,後面跟一個冒号,而後跟一個可選空格,接着是一個值

8、entity-body:請求時附加的資料或響應時附加的資料

9、Method 方法:

GET:從伺服器擷取一個資源

HEAD:隻從伺服器擷取文檔的響應首部

POST:向伺服器輸入資料,通常會再由網關程式繼續處理

PUT:将請求的主體部分存儲在伺服器中,如上傳檔案

DELETE:請求删除伺服器上指定的文檔

TRACE:追蹤請求到達伺服器中間經過的代理伺服器

OPTIONS:請求伺服器傳回對指定資源支援使用的請求方法

10、協定檢視或分析的工具:tcpdump, wireshark,tshark

十八、常見狀态碼

1、狀态碼分類

1xx:100-101資訊提示

2xx:200-206成功

3xx:300-305重定向

4xx:400-415錯誤類資訊,用戶端錯誤

5xx:500-505錯誤類資訊,伺服器端錯誤

2、常用狀态碼

200:成功,請求資料通過響應封包的entity-body部分發送;OK

301:請求的URL指向的資源已經被删除;但在響應封包中通過首部Location指明了資源現在所處的新位置;Moved Permanently,永久重定向,該域名将被淘汰

302:響應封包Location指明資源臨時新位置Moved Temporarily,臨時重定向,域名保留

304:用戶端發出了條件式請求,但伺服器上的資源未曾發生改變,則通過響應此響應狀态碼通知用戶端;Not Modified,利用浏覽器自身的緩存進行響應

401:需要輸入賬号和密碼認證方能通路資源;Unauthorized

403:請求被禁止;Forbidden

404:伺服器無法找到用戶端請求的資源;Not Found

500:伺服器内部錯誤;Internal Server Error

502:代理伺服器從後端伺服器收到了一條僞響應,如無法連接配接到網關;Bad Gateway

503:服務不可用,臨時伺服器維護或過載,伺服器無法處理請求

504:網關逾時

十九、HTTP首部字段

1、HTTP 首部字段包含的資訊最為豐富。首部字段同時存在于請求和響應封包内,并涵蓋HTTP 封包相關的内容資訊。使用首部字段是為了給客服端和伺服器端提供封包主體大小、所使用的語言、認證資訊等内容

2、首部字段結構HTTP 首部字段是由首部字段名和字段值構成的,中間用冒号“:”分隔

3、字段值對應單個HTTP 首部字段可以有多個值

4、封包首部中出現了兩個或以上具有相同首部字段名的首部字段時,在規範内尚未明确,根據浏覽器内部處理邏輯的不同,優先處理的順序可能不同,結果可能并不一緻

二十、HTTP協定首部

1、首部的分類:

(1)通用首部:請求封包和響應封包兩方都會使用的首部

(2)請求首部:從用戶端向伺服器端發送請求封包時使用的首部。補充了請求的附加内容、用戶端資訊、請求内容相關優先級等資訊

(3)響應首部:從伺服器端向用戶端傳回響應封包時使用的首部。補充了響應的附加内容,也會要求用戶端附加額外的内容資訊

(4)實體首部:針對請求封包和響應封包的實體部分使用的首部。補充了資源内容更新時間等與實體有關的的資訊

(5)擴充首部

2、通用首部:

Date: 封包的建立時間

Connection:連接配接狀态,如keep-alive, close

Via:顯示封包經過的中間節點(代理,網關)

Cache-Control:控制緩存,如緩存時長

MIME-Version:發送端使用的MIME版本

Warning:錯誤通知

二十一、http協定

1、請求首部:

Accept:通知伺服器自己可接受的媒體類型

Accept-Charset:用戶端可接受的字元集

Accept-Encoding:用戶端可接受編碼格式,如gzip

Accept-Language:用戶端可接受的語言

Client-IP: 請求的用戶端IP

Host: 請求的伺服器名稱和端口号

Referer:跳轉至目前URI的前一個URL

User-Agent:用戶端代理,浏覽器版本

2、條件式請求首部:

Expect:允許用戶端列出某請求所要求的伺服器行為

If-Modified-Since:自從指定的時間之後,請求的資源是否發生過修改

If-Unmodified-Since:與上面相反

If-None-Match:本地緩存中存儲的文檔的ETag标簽是否與伺服器文檔的Etag不比對

If-Match:與上面相反

3、安全請求首部:

Authorization:向伺服器發送認證資訊,如賬号和密碼

Cookie: 用戶端向伺服器發送cookie

4、代理請求首部:

Proxy-Authorization: 向代理伺服器認證

5、響應首部:

資訊性:

Age:從最初建立開始,響應持續時長

Server:伺服器程式軟體名稱和版本

協商首部:某資源有多種表示方法時使用

Accept-Ranges:伺服器可接受的請求範圍類型

Vary:伺服器檢視的其它首部清單

安全響應首部:

Set-Cookie:向用戶端設定cookie

WWW-Authenticate:來自伺服器對用戶端的質詢清單

6、實體首部:

Allow: 列出對此資源實體可使用的請求方法

Location:告訴用戶端真正的實體位于何處

Content-Encoding:對主體執行的編碼

Content-Language:了解主體時最适合的語言

Content-Length: 主體的長度

Content-Location: 實體真正所處位置

Content-Type:主體的對象類型,如text

緩存相關:

ETag:實體的擴充标簽

Expires:實體的過期時間

Last-Modified:最後一次修改的時間

二十二、APR

APR:apache運作的可移植庫,apache基于apr開發,不直接面對作業系統,各系統針對各系統開發各自APR,他們最後開發出來了一個共同的APR的API接口,apache就基于這個APR的API接口之上,apache的其他應用軟體也在這個接口上