HTTP協(xié)議
超文本傳輸協(xié)議(HyperText Transfer Protocol)袖牙,縮寫HTTP雳攘。通過HTTP或者HTTPS協(xié)議請求的資源由統(tǒng)一資源標識符(Uniform Resource Identifiers赏胚,URI)來標識谜洽。由HTTP客戶端發(fā)起一個請求宵睦,創(chuàng)建一個到服務器指定端口(默認是80端口)的TCP連接交惯。HTTP服務器則在那個端口監(jiān)聽客戶端的請求肯适。一旦收到請求变秦,服務器會向客戶端返回一個狀態(tài),比如"HTTP/1.1 200 OK"框舔,以及返回的內(nèi)容蹦玫,如請求的文件、錯誤消息刘绣、或者其它信息樱溉。
URI和URL
-
URI:Uniform Resource Identifier,統(tǒng)一資源標識符
Web上可用的每種資源如HTML文檔纬凤、圖像福贞、視頻片段、程序等都是用URI來定位的停士;
URI一般由三部分組成:
- 訪問資源的命名機制
- 存放資源的主機名
- 資源自身的名稱挖帘,由路徑表示完丽,著重強調(diào)于資源
-
URL:Uniform Resource Location,統(tǒng)一資源定位符
URL是Internet上用來描述信息資源的字符串拇舀,主要用在各種WWW客戶程序和服務器程序上逻族。URL是URI的一種。
采用URL可以用一種統(tǒng)一的格式來描述各種信息資源你稚,包括文件瓷耙、服務器的地址和目錄等。
URL一般由三部組成
- 協(xié)議
- 可訪問該資源的主機IP地址(或帶有端口號)
- 主機資源的具體地址(目錄加文件名)
URL的構成:
- 協(xié)議部分:協(xié)議部分為http:
- 域名部分:域名部分例如"www.reibang.com"刁赖,當然域名也可以用IP地址搁痛,IP少一步用DNS服務器解析
- 端口部分:域名和端口之間使用":"分隔。端口不是URL必須的部分宇弛,如果端口省略鸡典,將采用默認端口號80,所以實際請求地址是http://www.reibang.com:80
4.虛擬目錄部分:從域名后的第一個“/”開始到最后一個“/”為止枪芒,是虛擬目錄部分彻况。虛擬目錄也不是一個URL必須的部分。 - 文件名部分:指在服務器中訪問的資源文件的路徑舅踪。
- 錨部分:從“#”開始到最后纽甘,都是錨部分,也不是必須的部分抽碌。做過html的都知道悍赢,用于定位到頁面的滑動位置。
- 參數(shù)部分:從“货徙?”開始到“#”為止之間的部分為參數(shù)部分左权,又稱搜索部分、查詢部分痴颊。例如?page=1赏迟。
請求的種類:
HTTP協(xié)議中共定義了八種方法或者叫“動作”來表明對Request-URI指定的資源的不同操作方式。就類似操作數(shù)據(jù)庫和文件系統(tǒng)一樣蠢棱,設計網(wǎng)絡的請求也是一樣锌杀。URL用于定位了網(wǎng)絡資源,創(chuàng)造PUT,DELETE,POST,GET來對應增泻仙,刪抛丽,改,查操作饰豺。但是我們在實際應用中常用的也就是get和post,其他請求方式也都可以通過這兩種方式間接的來實現(xiàn)允蜈。
GET
向指定資源發(fā)出“顯示“信息冤吨。使用GET方法只用于獲取數(shù)據(jù)蒿柳,而不應該改變數(shù)據(jù)本身袁波,即不對數(shù)據(jù)進行操作和提交信息昨寞。POST
向指定資源提交數(shù)據(jù)敷待,請求服務器進行處理(例如提交參數(shù)/表單氧卧,或者上傳文件)味悄≌胱耍可能會對數(shù)據(jù)進行操作和提交信心纽疟,創(chuàng)建資源盛泡。PUT
向指定資源位置上傳其最新內(nèi)容捺癞。DELETE
顧名思義夷蚊,請求服務器刪除URI所對應的資源。HEAD
與GET方法一樣髓介,都是向服務器發(fā)出指定資源的請求惕鼓。只不過服務器將不傳回資源的本文部分。它的好處在于唐础,使用這個方法可以在不必傳輸全部內(nèi)容的情況下箱歧,就可以獲取其中“關于該資源的信息”(元信息或稱元數(shù)據(jù))。TRACE
回顯服務器收到的請求一膨,主要用于測試或診斷呀邢。OPTIONS
這個方法可使服務器傳回該資源所支持的所有HTTP請求方法。用'*'來代替資源名稱豹绪,向Web服務器發(fā)送OPTIONS請求价淌,可以測試服務器功能是否正常運作。CONNECT
HTTP/1.1協(xié)議中預留給能夠?qū)⑦B接改為管道方式的代理服務器森篷。通常用于SSL加密服務器的鏈接(經(jīng)由非加密的HTTP代理服務器)输钩。
GET和POST的區(qū)別:
參數(shù)攜帶位置不同。
GET提交的數(shù)據(jù)會附加家URL之后(即把數(shù)據(jù)放在請求行中)仲智,會在地址欄中顯示买乃,接?=傳值钓辆,多個參數(shù)用&連接剪验。POST提交的數(shù)據(jù)放在HTTP包體中,地址欄不顯示前联。傳輸數(shù)據(jù)大小限制不同功戚。
不同瀏覽器對URL的長度有限制,因此對于GET提交時似嗤,傳輸數(shù)據(jù)就會受到URL長度的限制啸臀。POST由于不是通過URL傳值,理論上數(shù)據(jù)不受限。POST的安全性要比GET的安全性高乘粒。因為瀏覽器可能對請求地址做歷史記錄的存儲豌注,對于GET請求的登錄,那其他人就可以直接在URL上拿到你的賬號和密碼了灯萍,而POST拿不到參數(shù)轧铁。
HTTP請求信息:
客戶端發(fā)送一個HTTP請求到服務的請求信息包括以下格式:
請求行(request line)、請求頭(header旦棉,常用于存放token)齿风、空行和請求數(shù)據(jù)四個部分。
例如:
GET /8669504-c2641e8e6eed5904.png HTTP/1.1
Host www.reibang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/,/*;q=0.8
Referer www.reibang.com
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
name=Professional%20Ajax&publisher=lili
- 第一行請求行绑洛,用來說明請求類型救斑,要訪問的資源以及所使用的HTTP版本。
- 第二部分诊笤,大括號之間的請求頭部系谐,用于提交服務器的附加信息。
- 第三部分讨跟,空行纪他,請求頭部后面的空行是必須的。
- 第四部分晾匠,請求數(shù)據(jù)也叫主體茶袒,可以添加任意的其他數(shù)據(jù)。
HTTP響應信息:
服務器接受請求回傳響應信息也由四分部組成:
狀態(tài)行凉馆,消息報頭薪寓,空行和響應正文。
例如:
HTTP/1.1 200 OK
Date: Fri, 22 May 2017 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
</body>
</html>
- 第一行包括協(xié)議版本號澜共,返回狀態(tài)碼
- 第二行為響應日期時間
- 第三行為響應消息報頭向叉,Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
- 響應正文,服務器返回給客戶端的文本信息嗦董。
HTTP狀態(tài)碼:
狀態(tài)碼有三位數(shù)字母谎,第一數(shù)字表示當前相應的類型,各個類型有:
- 1xx消息——請求已被服務器接受京革,繼續(xù)處理
- 2xx成功——請求已成功被服務器接收(如見到就像親人的200奇唤,201)
- 3xx重定向——需要后續(xù)操作才能完成這一請求
- 4xx請求錯誤——客戶端錯誤:請求含有詞法錯誤或無法被執(zhí)行(如見到就想暴走的404 Not Found)
- 5xx服務器錯誤——服務端錯誤:服務器在處理某個正確請求時發(fā)生錯誤(如一見到就想找后臺的500)
常見的狀態(tài)碼如下:
200 OK:客戶端請求成功
400 Bad Request:客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized:請求未經(jīng)授權匹摇,這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden:服務器收到請求咬扇,但是拒絕提供服務
500 Internal Server Error:服務器發(fā)生不可預期的錯誤
503 Server Unavailable:服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
總結HTTP一次請求的完整過程:
- 客戶端與服務端建立TCP連接
- 通過TCP套接字連接廊勃,發(fā)送HTTP請求
- 服務器解析請求懈贺,定位請求資源,將查詢資源然后返回HTML文本數(shù)據(jù),由客戶端讀取隅居。
- 釋放TCP連接
5.客戶端瀏覽器解析HTML內(nèi)容
瀏覽器輸入網(wǎng)站發(fā)生的事件:
1钠至、瀏覽器向 DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;
2、解析出 IP 地址后胎源,根據(jù)該 IP 地址和默認端口 80,和服務器建立TCP連接;
3屿脐、瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應的文件)的HTTP 請求涕蚤,該請求報文作為 TCP 三次握手的第三個報文的數(shù)據(jù)發(fā)送給服務器;
4、服務器對瀏覽器請求作出響應的诵,并把對應的 html 文本發(fā)送給瀏覽器;
5万栅、釋放 TCP連接;
6、瀏覽器將該 html 文本并顯示內(nèi)容;
Http各版本特性有哪些:
HTTP 1.0
特點:
1.引入請求頭和響應頭(數(shù)據(jù)類型西疤、語言版本烦粒、編碼類型、用戶代理)代赁;
2.數(shù)據(jù)壓縮扰她;
3.引入狀態(tài)碼;
4.提供了Cache緩存機制(head里的緩存頭:If-Modified-Since芭碍、Expires)徒役。
瓶頸:
僅支持短連接,對于包含多個請求的文件窖壕,會大大增加開銷忧勿;
串行文件傳輸,一個請求沒有及時返回瞻讽,會引起隊頭阻塞鸳吸;
一個服務器僅支持一個域名;
因為在響應頭中需要指定數(shù)據(jù)大小速勇,因此無法接收動態(tài)生成的數(shù)據(jù)晌砾;
服務器只能傳遞完整的數(shù)據(jù),而不能滿足“只想要數(shù)據(jù)的一部分”這樣的需求快集,會導致帶寬浪費贡羔;
不支持斷點續(xù)傳。
每次數(shù)據(jù)傳輸个初,在TCP建立連接時乖寒,三次握手都會有1.5個RTT(round-trip time)的延遲。
HTTP 1.1
特點:
1.支持持久連接院溺,一次連接可以發(fā)送多個請求和響應(最多6個)
2.引入虛擬主機技術楣嘁,讓一個服務器可以支持多個域名;
3.引入Cookie與安全機制;
4.引入range頭域逐虚,可以只請求資源的一部分(狀態(tài)碼206)聋溜;
5.優(yōu)化緩存策略(在head中,增加Etag叭爱、If-Unmodified-Since撮躁、If-Match、If-None-Match等緩存頭)买雾;
6.增加錯誤狀態(tài)碼把曼。
HTTP 2.0
1.使用多路復用技術,一個連接可以發(fā)送多個請求漓穿;
2.可以設置請求優(yōu)先級嗤军;
3.借助專門為首部壓縮設計的HPACK 算法進行首部壓縮。
HTTP2.0多路復用有多好晃危?
HTTP 性能優(yōu)化的關鍵并不在于高帶寬叙赚,而是低延遲。TCP 連接會隨著時間進行自我「調(diào)諧」僚饭,起初會限制連接的最大速度震叮,如果數(shù)據(jù)成功傳輸,會隨著時間的推移提高傳輸?shù)乃俣壤嘶拧_@種調(diào)諧則被稱為 TCP 慢啟動冤荆。由于這種原因,讓原本就具有突發(fā)性和短時性的 HTTP 連接變的十分低效权纤。
HTTP/2 通過讓所有數(shù)據(jù)流共用同一個連接钓简,可以更有效地使用 TCP 連接,讓高帶寬也能真正的服務于 HTTP 的性能提升汹想。
HTTP 3.0
特點:
1.基于UDP
2.實現(xiàn)了多路復用外邓;
3.實現(xiàn)了流量控制、可靠傳輸古掏;
4.實現(xiàn)了快速握手损话。
瓶頸:
兼容性尚不完整;
優(yōu)化程度不高槽唾。
參考:
https://blog.csdn.net/qq_44647809/article/details/120570572
https://zhuanlan.zhihu.com/p/342311013