最近準備看《GO web編程》,想把所思所想寫出來,以供參閱。javascript
關於HTTP的講解太多,我只說些本身的理解。
HTTP是一個請求、響應協議。客戶端發起一個請求,服務端響應一個請求。
在HTTP中,老是客戶端創建一個鏈接,發起一個請求。服務端不能主動去與客戶端聯繫,也不能給客戶端發送一個回調鏈接。css
Request請求包分爲3部分。Request line(請求行)、Request header(請求頭)、body(主體)。header和body之間有個空行。html
GET /domains/example/ HTTP/1.1 //請求行: 請求方法 請求URI HTTP協議/協議版本 Host:www.iana.org //服務端的主機名 User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 //瀏覽器信息 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //客戶端能接收的mine Accept-Encoding:gzip,deflate,sdch //是否支持流壓縮 Accept-Charset:UTF-8,*;q=0.5 //客戶端字符編碼集 //空行,用於分割請求頭和消息體 //消息體,請求資源參數,例如POST傳遞的參數
請求行包括概況信息:請求的方式(GET、POST...),請求URL(/domains/example/),請求協議(HTTP、HTTPS、FTP)等
請求頭包括body的內容描述、請求用戶信息等(通常每一條header都表明了一條描述請求內容的信息):java
Content-Type: charset=utf-8 請求內容字符集採用utf-8 Content-Type: text/css 請求內容是css Content-Type: image/jpeg 請求內容是.jpeg的圖片 HTTP/1.1 200 OK 通常在服務端返回的header裏,表明請求成功 ...
主體就是本次請求的內容。nginx
HTTP response包結構以下web
HTTP/1.1 200 OK //狀態行 Server: nginx/1.0.8 //服務器使用的WEB軟件名及版本 Date:Date: Tue, 30 Oct 2012 04:14:25 GMT //發送時間 Content-Type: text/html //服務器發送信息的類型 Transfer-Encoding: chunked //表示發送HTTP包是分段發的 Connection: keep-alive //保持鏈接狀態 Content-Length: 90 //主體內容長度 //空行 用來分割消息頭和主體 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... //消息體
Response包中第一行叫作狀態行,由HTTP協議版本號、狀態碼、狀態消息三部分組成
狀態碼用於告訴客戶端本次HTTP請求是否正確響應。編程
1XX 提示信息 - 表示請求已被成功接收,繼續處理 2XX 成功 - 表示請求已被成功接收,理解,接受 3XX 重定向 - 要完成請求必須進行更進一步的處理 4XX 客戶端錯誤 - 請求有語法錯誤或請求沒法實現 5XX 服務器端錯誤 - 服務器未能實現合法的請求
通常見的比較多的狀態碼:403(禁止訪問,多是身份權限問題)、404(訪問文件未找到),這並非服務端的錯誤,而是請求有問題,因此在4XX裏面。500(服務端錯誤)。瀏覽器
無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。從另外一方面講,打開一個服務器上的網頁和你以前打開這個服務器上的網頁之間沒有任何聯繫。
HTTP是一個無狀態協議,但不表明HTTP不能保持TCP鏈接。
HTTP默認開啓了Keep-Alive保持鏈接特性。當打開一個網頁以後,客戶端與服務端的TCP鏈接不會馬上關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的TCP鏈接。
Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣服務器上設置這個時間。
這是一個頗有用的特性。通常打開一個網頁以後不會馬上關閉,會不斷地點擊頁面上的按鈕,這個時候若是每一次交互都須要創建一次TCP鏈接,會影響瀏覽速度的同時加劇服務器負擔。同時還有一個更加合適的場合應用這一特性,就是在編輯文本的同時自動保存。這中間會有不少次向服務端的請求,須要在一條TCP鏈接上完成。服務器
打開百度的時候會發現有不少請求,但只有第一個請求是我主動發起的。以後的請求我並不知道。
這是由於,在首次打開網頁的時候,我發起了一個請求,服務端響應了我這個請求而且將html頁面返回給瀏覽器,瀏覽器在渲染html頁面的時候裏面的css、javascript、img等靜態資源,瀏覽器會自動向服務器請求。因此會有不少請求。不過這些請求都是在同一條TCP鏈接上的。app