HTTP/1.1
網上關於HTTP/1.1的討論多是基於RFC2616文檔,而IETF已更新了HTTP/1.1並將其分為六個部分,使協議變得更簡單易懂,對老版本RFC2616中模糊不清的部分做了解釋
- RFC7230-消息語法與路由
- RFC7231-語義與路由
- RFC7232-條件請求
- RFC7233-范圍請求
- RFC7234-緩存
- RFC7235-認證
RFC7230-消息語法與路由
客戶端/服務器 消息發送
HTTP是一種在傳輸層或會話層上交換消息的無狀態的請求/響應協議,HTTP使用URI來定位資源和資源間的關系,通常請求會包含請求行,請求首部和請求體,下面的例子是在"http://www.example.com/hello.txt"上進行的GET請求
客戶端請求:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com Accept-Language: en, mi
服務器響應:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
Hello World! My payload includes a trailing CRLF.
RFC7231-語義與路由
安全方法
如果請求方法語義上是只讀的,那么它被認為是安全的,根據之前定義,GET,HEAD,OPTIONS,TRACE是安全的
冪等方法
如果多個相同的請求方法對服務器的效果與單個請求對服務器的效果相同,則該請求方法是冪等的,根據定義PUT,DELETE與安全方法是冪等的
可緩存方法
當請求方法的響應允許被緩存以供未來復用時,該請求方法是可緩存的。通常,不依賴當前或權威響應的安全方法被認為是可緩存的,本規范定義GET,HEAD,POST為可緩存的,雖然大多數緩存實現只支持GET和HEAD
GET
GET是主要的信息取回機制,客戶端可以將GET語義改變為"范圍請求",請求被選定representation的一部分
HEAD
HEAD與GET方法幾乎一樣,但其響應中沒有消息體,通常被用於測試連接性,可訪問性和最近修改情況
POST
POST通常被用於提交表單,發布消息以及創建資源,添加數據到資源已存在的representation上,當有多個資源在源服務器上被創建時,源服務器應該發送201響應
POST請求的響應只有包含explicit freshness information(4.2.1 of [RFC7234])的時候才被定義為可緩存的,然而POST緩存並沒有被廣泛實現,當源服務器希望客戶端能夠緩存POST的結果以供之后的GET使用時,源服務器可能發送包含Content-Location且其值為POST的有效請求URI相同的200響應
HTTPS
RFC2818:HTTP Over TSL
HTTP與HTTPS不同
- HTTPS需要CA(Certificate Authority,數字證書認證機構) 申請證書,免費的很少
- HTTP默認80端口;HTTPS默認443端口
- HTTP使用http標識符;HTTPS使用https標識符
- HTTP是明文傳輸;HTTPS是加密傳輸
- HTTP響應比HTTPS快,因為HTTPS還需要TSL握手,所以HTTPS更耗費服務器資源
HTTP/1.1與HTTP/2.0
HTTP/1.1默認開啟Connection: keep-alive,支持長連接(持久連接)和請求Pipelining,可以在一個TCP連接上發送多個HTTP請求與響應。
- HTTP/1.x是基於文本解析的,HTTP/2.0是基於二進制解析的
- HTTP/2.0采用多路復用,很好的解決了瀏覽器限制同一個域名下的請求數量的問題
- HTTP/2.0采用Header壓縮,HTTP/1.x的header攜帶大量信息且重復,HTTP/2.0的通信雙方各執一份header fields緩存,減少了傳輸大小與重復header的傳輸
- HTTP/2.0服務端推送減少了請求次數,減少請求次數
附錄
面試問答
GET和POST有什么區別
答:
- GET參數通過URL傳遞,POST放在Request body中
- GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息
- GET是安全的且是冪等的,POST則不是
- GET產生的URL地址可以被Bookmark,而POST不可以
- GET請求會被瀏覽器主動cache,而POST不會,除非手動設置
- GET請求只能進行url編碼,而POST支持多種編碼方式
HTTP/1.x與HTTP/2.0區別
答:
- HTTP/2.0基於二進制解析,而HTTP/1.x僅支持文本解析
- HTTP/2.0支持多路復用
- HTTP/2.0支持服務端推送
- HTTP/2.0支持Header壓縮