HTTP是超文本傳輸協議,其定義了客戶端與服務器端之間文本傳輸的規范。HTTP默認使用80端口,這個端口指的是服務端的端口,而客戶端使用的端口是動態分配的。當我們沒有指定端口訪問時,瀏覽器會默認幫我們添加80端口。我們也可以自己指定訪問端口如:http://www.ip138.com:80。 需要注意的是,現在大多數訪問都使用了HTTPS協議,而HTTPS的默認端口為443,如果使用80端口訪問HTTPS協議的服務器可能會被拒絕。
HTTP協議定義Web客戶端如何從Web服務器請求Web頁面,以及服務器如何把Web頁面傳送給客戶端。HTTP協議采用了請求/響應模型。客戶端向服務器發送一個請求報文,請求報文包含請求的方法、URL、協議版本、請求頭部和請求數據。服務器以一個狀態行作為響應,響應的內容包括協議的版本、成功或者錯誤代碼、服務器信息、響應頭部和響應數據。
客戶端連接到Web服務器->發送Http請求->服務器接受請求并返回HTTP響應->釋放連接TCP連接->客戶端瀏覽器解析HTML內容
一個HTTP客戶端,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接。例如,http://www.baidu.com
通過TCP套接字,客戶端向Web服務器發送一個文本的請求報文,一個請求報文由請求行、請求頭部、空行和請求數據4部分組成。
若connection 模式為close,則服務器主動關閉TCP連接,客戶端被動關閉連接,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
客戶端瀏覽器首先解析狀態行,查看表明請求是否成功的狀態代碼。然后解析每一個響應頭,響應頭告知以下為若干字節的HTML文檔和文檔的字符集。客戶端瀏覽器讀取響應數據HTML,根據HTML的語法對其進行格式化,并在瀏覽器窗口中顯示。
GET /562f25980001b1b106000338.jpg HTTP/1.1Host img.mukewang.comUser-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36Accept image/webp,image/*,*/*;q=0.8Referer http://www.imooc.com/Accept-Encoding gzip, deflate, sdchAccept-Language zh-CN,zh;q=0.8
GET說明請求類型為GET,[/562f25980001b1b106000338.jpg]為要訪問的資源,該行的最后一部分說明使用的是HTTP1.1版本。
從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎.該信息由你的瀏覽器來定義,并且在每個請求中自動發送等等
即使第四部分的請求數據為空,也必須有空行。
這個例子的請求數據為空。
POST / HTTP1.1Host:www.wrox.comUser-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)Content-Type:application/x-www-form-urlencodedContent-Length:40Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley
第一部分:請求行,第一行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求數據,第八行。
一般情況下,服務器接收并處理客戶端發過來的請求后會返回一個HTTP的響應消息。
例子
HTTP/1.1 200 OKDate: Fri, 22 May 2009 06:07:21 GMTContent-Type: text/html; charset=UTF-8<html> <head></head> <body> <!--body goes here--> </body></html>
第一行為狀態行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態消息為(ok)
第二行和第三行為消息報頭,
Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
空行后面的html部分為響應正文。
200 OK 當您的操作將在響應正文中返回數據時,出現此結果。
204 No Content 當您的操作成功,但不在響應正文中返回數據時,出現此結果。
304 Not Modified(重定向) 當測試實體自上次檢索以來是否被修改時,出現此結果。
403 Forbidden 客戶端錯誤
401 Unauthorized 客戶端錯誤
413 Payload Too Large(客戶端錯誤) 當請求長度過長時,出現此結果。
400 BadRequest(客戶端錯誤) 當參數無效時,出現此結果。
404 Not Found(客戶端錯誤) 當資源不存在時,出現此結果。
405 Method Not Allowed(客戶端錯誤)由于方法和資源組合不正確而出現此錯誤。 例如,您不能對一個實體集合使用 DELETE 或 PATCH。
412 Precondition Failed 客戶端錯誤
501 Not Implemented(服務器錯誤) 當未實施某個請求的操作時,出現此結果。
503 Service Unavailable(服務器錯誤) 當 Web API 服務不可用時,出現此結果。
“get”方法提交的數據會直接填充在請求報文的URL上,如“ https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1 ” “?”問號劃分域名和get提交的參數,A=B中的A是參數名,B是參數值,多個參數之間用&進行分割,如果參數值是中文,則會轉換成諸如%ab%12加密16進制碼。一般來說,瀏覽器處理的URL最大限度長度為1024B(不同瀏覽器不一樣),所以GET方法提交參數長度有限制。
“post”方法提交的數據會附在正文上,一般請求正文的長度是沒有限制的,但表單中所能處理的長度一般為100k(不同協議不同瀏覽器不一樣),而且需要考慮下層報文的傳輸效率,不推薦過長。
所以GET方法可以用來傳輸一些可以公開的參數信息,解析也比較方便,如百度的搜索的關鍵詞,而POST方法可以用來提交一個用戶的敏感信息(如果不使用HTTPS加密,報文正文仍舊是明文,容易被人截獲讀取)
無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
http是超文本傳輸協議,默認端口號為80,客戶端是動態的,瀏覽器會自動默認為80
https默認端口號為443
請求方法8種
get、post、put、delete、options、trace、connect、head
請求流程2種分為request和response,但是他們的流程都是相同的,一個請求一個接收
流程為:狀態行、消息報頭、空行和響應正文
請求響應步驟:
客戶端連接到Web服務器->發送Http請求->服務器接受請求并返回HTTP響應->釋放連接TCP連接->客戶端瀏覽器解析HTML內容