HTTP協議學習---(二)基礎篇

1 首次建立鏈接的過程
注意,圖中三次握手正常會走兩次或者多次,因爲http1傳輸效率比較低,所以瀏覽器一般會對一個地址利用多個端口建立多個連接,這個鏈接在開始只是被打開,但沒有傳輸數據。其中握手相關的ACK等消息都是TCP消息,不是http。
在這裏插入圖片描述

2 http協議基礎
請求整體由 起始行+請求頭+空行+實體 組成。
在這裏插入圖片描述

請求中的起始行稱爲請求行,由三部分組成:
例:GET / HTTP/1.1
①請求方法:是一個動詞,如 GET/POST,表示對資源的操作;
②請求目標:通常是一個 URI,標記了請求方法要操作的資源;
③版本號:表示報文使用的 HTTP 協議版本。
響應中的起始行成爲狀態行,也有三部分組成:
例:HTTP/1.1 404 Not Found
①版本號:表示報文使用的 HTTP 協議版本;
②狀態碼:一個三位數,用代碼的形式表示處理的結果,比如 200 是成功,500 是服務器錯誤;
③原因:作爲數字狀態碼補充,是更詳細的解釋文字,幫助人理解原因。
請求行這三個部分通常使用空格(space)來分隔,最後要用 CRLF 換行表示結束。

請求頭與響應頭注意:
①字段名不區分大小寫,例如「Host」也可以寫成「host」,但首字母大寫的可讀性更好;
②字段名裏不允許出現空格,可以使用連字符「-」,但不能使用下劃線「_」(_這個不絕對,只是規範)。例如,「test-name」是合法的字段名,而「test name」「test_name」是不正確的字段名; ③字段名後面必須緊接着「:」,不能有空格,而「:」後的字段值前可以有多個空格;
④字段的順序是沒有意義的,可以任意排列不影響語義;
⑤字段原則上不能重複,除非這個字段本身的語義允許,例如 Set-Cookie。
⑥Host 字段,它屬於請求字段,只能出現在請求頭裏,它同時也是唯一一個 HTTP/1.1 規範裏要求必須出現的字段。
⑦Server 字段是響應字段,只能出現在響應頭裏。它告訴客戶端當前正在提供 Web 服務的軟件名稱和版本號。一般選擇隱藏或者返回其他定義的值,防止利用當前版本漏洞進行攻擊
⑧Content-Length,它表示報文裏 body 的長度,也就是請求頭或響應頭空行後面數據的長度。服務器看到這個字段,就知道了後續有多少數據,可以直接接收。如果沒有這個字段,那麼 body 就是不定長的,需要使用 Transfer-Encoding: chunked 方式分段傳輸。

補充:
nginx中默認請求頭大小不能超過8K,可以使用large_client_header_buffers修改
在拼接http報文時多加了一個空行,則空行之後都被認爲是body。

3 http協議請求方式
GET/HEAD——從服務器獲取資源
HEAD和GET類似,也是從服務器獲取資源,但是不會返回請求的實體數據,只有響應頭(元信息),是GET的簡易版,如果不需要資源的話,可以避免傳輸body數據的浪費。
POST/PUT ——向服務器提交數據,數據在body裏
PUT和POST作用類似,有微妙不同,通常POST標識新建,PUT標識修改
DELETE ——刪除資源,危險性大,很少用
CONNECT——要求服務器爲客戶端和另一臺遠程服務器建立一條特殊的鏈接,這時Web服務器充當代理的角色
OPTIONS——要求服務器列出可對資源實行的操作方法,在響應頭Allow字段裏返回。目前絕大部分ajax都會利用這個來判定跨域問題
TRACE——用於對HTTP鏈路的測試或診斷,可以顯示出請求 - 響應的傳輸路徑。存在漏洞,會泄露網站的信息,所以通常也是禁止使用

4 http協議URI
URI常用的形式
scheme:// host:port path ? query
URI的完整格式
scheme:// user:[email protected] host:port path ? query #fragment
User:[email protected] : 身份信息,但是不推薦這樣使用,泄露重要信息
#fragment :片段標識符。標識URI所定位的資源內部的一個錨點,瀏覽器可以跳 轉到它指示的位置。服務器看不到#fragment
URI的編碼
直接把非ASCII 碼或特殊字符轉換成十六進制字節值,然後前面加一個「%」,中 文、日文等通常使用UTF-8 編碼後再轉義。

5 http協議狀態碼
狀態碼在響應報文裏表示了服務器對請求的處理結果;
狀態碼後的原因短語是簡單的文字描述,可以自定義;
狀態碼是十進制的三位數,分爲五類,從 100 到 599;
1xx類狀態屬於提示,是協議處理的中間狀態,少用
101 Switching Protocols表示客戶端要求更換協議,服務器同意後返回101,之後改用新的協議進行通信。
2××類狀態碼錶示成功
200表示請求成功
204與200基本相同,但是響應頭之後沒有body數據
206 斷點續傳常用,頭字段中的Content-Range用來表示獲取多少字節的內容
3××類狀態碼錶示重定向
301永久重定向,瀏覽器會緩存重定向後的地址
302臨時重定向,僅本次請求適用,瀏覽器不會緩存
304 它用於 If-Modified-Since 等條件請求,表示資源未修改,用於緩存控制。它不具有通常的跳轉含義,但可以理解成「重定向已到緩存的文件」
4××類狀態碼錶示客戶端錯誤
太多了
5××類狀態碼錶示服務器錯誤
500 服務器異常,原因多樣
501表示功能暫不支持
502表示服務器正常,但是服務器訪問其他資源時失敗
503 服務器繁忙,處理不完請求,稍後重試

6 http協議特點
HTTP 是靈活可擴展的,可以任意添加頭字段實現任意功能;
HTTP 是可靠傳輸協議,基於 TCP/IP 協議「儘量」保證數據的送達(旨在網絡正常的情況下,要保證100%可達就得用消息隊列了);
HTTP 是應用層協議,比 FTP、SSH 等更通用功能更多,能夠傳輸任意數據;
HTTP 使用了請求 - 應答模式,客戶端主動發起請求,服務器被動回覆請求;
HTTP 本質上是無狀態的,每個請求都是互相獨立、毫無關聯的,協議不要求客戶端或服務器記錄請求相關的信息。

7 http協議優缺點 HTTP 最大的優點是簡單、靈活和易於擴展; HTTP 擁有成熟的軟硬件環境,應用的非常廣泛,是互聯網的基礎設施; HTTP 是無狀態的,可以輕鬆實現集羣化,擴展性能,但有時也需要用 Cookie 技術來實現「有狀態」; HTTP 是明文傳輸,數據完全肉眼可見,能夠方便地研究分析,但也容易被竊聽; HTTP 是不安全的,無法驗證通信雙方的身份,也不能判斷報文是否被竄改; HTTP 的性能不算差,但不完全適應現在的互聯網,還有很大的提升空間。