一次完整的HTTP請求是怎樣的一個過程?
當我們在浏覽器的位址欄輸入
jianshu.com
,然後回車,這一瞬間到底發生了什麼?
- 域名解析
- 發起TCP三向交握
- 建立TCP連接配接後發起http請求(GET, POST)
- 伺服器響應http請求,浏覽器得到HTML代碼
- 浏覽器解析HTML代碼并請求html代碼中的資源(js,css,圖檔等)
- 浏覽器對頁面進行渲染展現給使用者
TCP為什麼需要三次握手?
2台計算機通信是靠協定來實作的,目前流行的是TPC/IP協定,如果兩台計算機使用的協定不一樣,那是不能進行通信的,是以這個三次握手就相當于試探一下對方是否遵循TCP/IP協定,協商完成後就可以進行通信了,這隻是簡單了解下,其實過程中要複雜些。
HTTP和HTTPS的差別:
HTTP的URL是以http開頭,而HTTPS是https開頭;
HTTP是不安全的,HTTPS是安全的(相對);
HTTP标準端口是80,HTTPS是443;
在OSI網絡模型中,HTTP工作于應用層,HTTPS的安全傳輸機制工作在傳輸層;
HTTP無法加密,HTTPS對傳輸的資料進行加密;
HTTP無需證書,而HTTPS 需要CA機構wosign的頒發的SSL證書;
什麼是Http協定無狀态協定?怎麼解決Http協定無狀态協定?
無狀态協定對于事務處理沒有記憶能力。缺少狀态意味着如果後續處理需要前面的資訊
也就是說,當用戶端一次HTTP請求完成以後,用戶端再發送一次HTTP請求,HTTP并不知道目前用戶端是一個”老使用者“。
可以使用Cookie來解決無狀态的問題,Cookie就相當于一個通行證,第一次通路的時候給用戶端發送一個Cookie,當用戶端再次來的時候,拿着Cookie(通行證),那麼伺服器就知道這個是”老使用者“。
常用的會話跟蹤技術Cookie和Session
HTTP本身是一個無狀态的連接配接協定,為了支援用戶端與伺服器之間的互動,我們就需要通過不同的技術為互動存儲狀态,而這些不同的技術就是Cookie和Session了.
- Cookie實際上是一小段的文本資訊。用戶端請求伺服器,如果伺服器需要記錄該使用者狀态,就使用response向用戶端浏覽器頒發一個Cookie。用戶端浏覽器會把Cookie儲存起來。當浏覽器再請求該網站時,浏覽器把請求的網址連同該Cookie一同送出給服務 器。伺服器檢查該Cookie,以此來辨認使用者狀态。伺服器還可以根據需要修改Cookie的内容。
檢視某個網站頒發的Cookie很簡單。在浏覽器位址欄輸入javascript:alert (document. cookie)就可以了(需要有網才能檢視)。JavaScript腳本會彈出一個對話框顯示本網站頒發的所有Cookie的内容
是以,總結一下:
Session是在服務端儲存的一個資料結構,用來跟蹤使用者的狀态,這個資料可以儲存在叢集、資料庫、檔案中;
Cookie是用戶端儲存使用者資訊的一種機制,用來記錄使用者的一些資訊,也是實作Session的一種方式。
常見的HTTP相應狀态碼
- 200:請求被正常處理
- 204:請求被受理但沒有資源可以傳回
- 206:用戶端隻是請求資源的一部分,伺服器隻對請求的部分資源執行GET方法,相應封包中通過Content-Range指定範圍的資源。
- 301:永久性重定向
- 302:臨時重定向
- 303:與302狀态碼有相似功能,隻是它希望用戶端在請求一個URI的時候,能通過GET方法重定向到另一個URI上
- 304:發送附帶條件的請求時,條件不滿足時傳回,與重定向無關
- 307:臨時重定向,與302類似,隻是強制要求使用POST方法
- 400:請求封包文法有誤,伺服器無法識别
- 401:請求需要認證
- 403:請求的對應資源禁止被通路
- 404:伺服器無法找到對應資源
- 500:伺服器内部錯誤
- 503:伺服器正忙
HTTP優化方案
我下面就簡要概括一下:
- TCP複用:TCP連接配接複用是将多個用戶端的HTTP請求複用到一個伺服器端TCP連接配接上,而HTTP複用則是一個用戶端的多個HTTP請求通過一個TCP連接配接進行處理。前者是負載均衡裝置的獨特功能;而後者是HTTP 1.1協定所支援的新功能,目前被大多數浏覽器所支援。
- 内容緩存:将經常用到的内容進行緩存起來,那麼用戶端就可以直接在記憶體中擷取相應的資料了。
- 壓縮:将文本資料進行壓縮,減少帶寬
- SSL加速(SSL Acceleration):使用SSL協定對HTTP協定進行加密,在通道内加密并加速
- TCP緩沖:通過采用TCP緩沖技術,可以提高伺服器端響應時間和處理效率,減少由于通信鍊路問題給伺服器造成的連接配接負擔。
HTTP三次握手四次揮手
三次握手與四次揮手分别對應TCP連接配接建立過程與斷開過程
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuAzMyADOmdDZ4QjNyIDM3UzN2kjM4UzM5YGO5Q2Y4UWMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
螢幕快照 2018-04-09 下午11.38.34.png
問題1: 為什麼要三次握手?
答:三次握手的目的是建立可靠的通信信道,說到通訊,簡單來說就是資料的發送與接收,而三次握手最主要的目的就是雙方确認自己與對方的發送與接收機能正常。
第一次握手:Client什麼都不能确認;Server确認了對方發送正常
第二次握手:Client确認了:自己發送、接收正常,對方發送、接收正常;Server确認了:自己接收正常,對方發送正常
第三次握手:Client确認了:自己發送、接收正常,對方發送、接收正常;Server确認了:自己發送、接收正常,對方發送接收正常
是以三次握手就能确認雙發收發功能都正常,缺一不可。
問題2:為什麼要發送特定的資料包,随便發不行嗎?
答:三次握手的另外一個目的就是确認雙方都支援TCP,告知對方用TCP傳輸。
第一次握手:Server 猜測Client可能要建立TCP請求,但不确定,因為也可能是Client亂發了一個資料包給自己
第二次握手:通過ack=J+1,Client知道Server是支援TCP的,且了解了自己要建立TCP連接配接的意圖
第三次握手:通過ack=K+1,Server知道Client是支援TCP的,且确實是要建立TCP連接配接
問題3:上圖中的SYN和ACK是什麼?
答:SYN是标志位,SYN=1表示請求連接配接;
ACK其實就是ack後面加上的那個數,真正發送的時候不單獨發ACK,隻發ack,下面四次揮手的圖同理
螢幕快照 2018-04-09 下午11.43.09.png
問題1: 為什麼要四次揮手?
答:根本原因是,一方發送FIN隻表示自己發完了所有要發的資料,但還允許對方繼續把沒發完的資料發過來。
舉個例子:A和B打電話,通話即将結束後,A說“我沒啥要說的了”,B回答“我知道了”,但是B可能還會有要說的話,A不能要求B跟着自己的節奏結束通話,于是B可能又巴拉巴拉說了一通,最後B說“我說完了”,A回答“知道了”,這樣通話才算結束。
問題2:為什麼雙方要發送這樣的資料包?
答:和握手的情況類似,隻是為了讓對方知曉自己了解了對方的意圖。