HTTP
HTTP的特性
- HTTP協(xié)議構(gòu)建于TCP/IP協(xié)議之上,是一個應(yīng)用層協(xié)議,默認(rèn)端口號是80
- HTTP是無連接無狀態(tài)的
HTTP報文
請求報文
HTTP協(xié)議是以ASCII碼傳輸,建立在TCP/IP協(xié)議之上的應(yīng)用層規(guī)范。
規(guī)范把HTTP請求分為三個部分:狀態(tài)行、請求頭、消息主體
<method> <request-URL> <version>
<headers>
<entity-body>
HTTP定義了與服務(wù)器交互的不同方法,最基本的方法有四種
分別是GET/POST/PUT/DELETE
一個URL地址用于描述一個網(wǎng)絡(luò)上的資源,而HTTP以上的四種方法對應(yīng)這對這個資源的查、增、改、刪四種操作
-
GET用于信息獲取,而且應(yīng)該是安全的和冪等的
安全意味著該操作用于獲取信息而非修改信息。
冪等意味著對同一URL的多個請求應(yīng)該返回相同的結(jié)果GET請求報文示例:
GET /books/?sex=man&name=Professional HTTP/1.1 Host:www.example.com User-Agent:Mozilla/5.0(Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection:Keep-Alive -
POST代表一個可能會改變服務(wù)器資源的請求
POST / HTTP/1.1 Host:www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type:application/x-www-form-urlencoded Content-Length: 40 Connection:Keep-Alive sex=man&name=Professional -
ATTENTION:
- GET可提交的數(shù)據(jù)量受到URL長度的限制,HTTP協(xié)議規(guī)范沒有對URL長度進(jìn)行限制。這個限制是特定的瀏覽器和服務(wù)器對它的限制
- 理論上說,POST是沒有大小限制的,HTTP協(xié)議規(guī)范也沒有進(jìn)行大小限制,處于安全考慮服務(wù)器在實現(xiàn)時會做一定限制
POST提交數(shù)據(jù)的方式
HTTP協(xié)議規(guī)定POST提交的數(shù)據(jù)必須在body部分中,但是協(xié)議中沒有規(guī)定數(shù)據(jù)使用哪種編碼方式或者數(shù)據(jù)格式。實際上,開發(fā)者完全可以自己決定消息主體的格式,只要最后發(fā)送的HTTP請求滿足上面的格式即可。
但是數(shù)據(jù)發(fā)送出去,還要服務(wù)端解析成功才有意義。服務(wù)端通常根據(jù)請求頭(headers)中的Content-Type字段來獲取請求中的消息主體的編碼方式,再對主體進(jìn)行解析。POST提交數(shù)據(jù)方案,包含了Content-Type和消息主題編碼方式兩部分
-
application/x-www-form-urlencoded
這是最常見的POST數(shù)據(jù)提交方式。瀏覽器的原生<form>表單,如果不設(shè)置enctype屬性,那么最終就會以 application/x-www-form-urlencoded方式提交數(shù)據(jù) -
multipart/form-data
這是另一種常見的POST數(shù)據(jù)提交方式。我們使用表單上傳文件時,必須讓<form>表單的enctype等于multipart/form-data。示例如下:
HTTP1.0與HTTP1.1的區(qū)別
- 緩存處理:
- HTTP1.0 使用if-Modified-Since,Expired來作為緩存判斷的標(biāo)準(zhǔn)
- HTTP1.1 使用Entity tag, if-Unmodified-Since, if-Match, if-None-Match控制緩存
- 帶寬優(yōu)化及網(wǎng)絡(luò)連接的使用
- HTTP1.0 存在帶寬浪費的現(xiàn)象,不支持?jǐn)帱c續(xù)傳
- HTTP1.1 引入range頭域,允許只請求資源的某個部分
- 錯誤通知的管理
- HTTP1.0新增 24個錯誤狀態(tài)響應(yīng)碼,
如409(conflict)表示請求的資源與當(dāng)前狀態(tài)發(fā)生沖突,410(Gone)表示服務(wù)器上的某個資源被永久性刪除
- HTTP1.0新增 24個錯誤狀態(tài)響應(yīng)碼,
- Host頭處理
- HTTP1.0中認(rèn)為每臺服務(wù)器都綁定一個唯一的IP地址,因此請求消息中URL不會傳遞主機名(hostname),隨著虛擬主機技術(shù)的發(fā)展,一臺物理服務(wù)器上可以存在多個虛擬主機,并且共享一個IP地址。
- HTTP1.1請求消息和響應(yīng)消息都支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)
- 長連接
- HTTP1.1支持長連接(PersistentConnection)和請求的流水線處理(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應(yīng),減少了簡歷和關(guān)閉連接的消耗和耗時。在HTTP1.1中默認(rèn)開啟Connection:keep-alive
HTTPS與HTTP的區(qū)別
- HTTPS協(xié)議需要到CA申請證書,一般免費證書少,需要繳費
- HTTP協(xié)議運行在TCP之上,所有傳輸?shù)膬?nèi)容都是明文的,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,所有傳輸?shù)膬?nèi)容都是經(jīng)過加密的
- HTTP和HTTPS使用完全不同的連接方式,用的端口也不一樣(80->443)
- HTTPS可以有效的防止運營商劫持
SPDY:HTTP1.x的優(yōu)化
- 多路復(fù)用:SPDY采用多路復(fù)用,解決了HTTP高延遲的問題
- 請求優(yōu)先級:多個請求同時發(fā)送時,可優(yōu)先發(fā)送高優(yōu)先級的請求
- header壓縮
- 基于HTTPS的加密協(xié)議傳輸,大大提高了傳輸數(shù)據(jù)的可靠性
- 服務(wù)端推送
SPDY: HTTP->SPDY->SSL->TCP
HTTP2.0和SPDY的區(qū)別
- HTTP2.0支持明文HTTP傳輸,而SPDY強制使用HTTPS
- HTTP2.0消息頭的壓縮算法采用HPACK,而SPDY采用DEFLATE
HTTP2.0與HTTP1.x相比的新特性
- 新的二進(jìn)制格式(Binary Format)
HTTP1.0 解析是基于文本的,HTTP2.0解析采用二進(jìn)制格式 - 多路復(fù)用
每一個request 都支持連接共享機制,一個request對應(yīng)一個id,這樣一個連接上可以有多個request。每個request可以隨機混雜在一起,接收方可以根據(jù)id將request歸屬帶不同的服務(wù)端請求中- HTTP1.x一次請求建立一個連接,用完關(guān)閉;每一個請求建立一個連接
- HTTP1.1 Pipelining 采用串行排隊處理請求,一旦前面有請求超時,后面的都會被阻塞
- HTTP2.0 多個請求可同時在一個連接上并行執(zhí)行,某個請求被阻塞不會影響其它連接
- header壓縮
HTTP2.0維護(hù)一個字典,差量更新HTTP頭部,大大降低因頭部傳輸產(chǎn)生的流量 - 服務(wù)端推送
服務(wù)端推送可以將客戶端需要的資源伴隨index.html一起發(fā)送到客戶端,省去客戶端重復(fù)請求的步驟。因為沒有發(fā)起請求,建立連接等操作,所以靜態(tài)資源通過服務(wù)端推送可以極大提高速度