http 響應常見狀態碼
100-199 : 表示成功接收請求, 要求客戶端繼續提交下一次請求才能完成整個處理過程
200-299: 表示成果接收請求並已完成整個處理過程. 常用 200
300-399: 為完成請求, 客戶需進一步細化需求: 例如: 請求的資源已經移動一個新地址, 常用 302(重定向), 307 和 304(拿緩存)
400-499: 客戶端的請求有錯誤, 包含語法錯誤或者不能正確執行. 常用 404(請求的資源在 web 服務器中沒有) 403(服務器拒絕訪問, 權限不夠)
500-599: 服務器端出現錯誤
常用:
200 正常,表示一切正常, 返回的是正常請求結果
302/307 臨時重定向,指出請求的文檔已被臨時移動到別處, 此文檔的新的 url 在 location 響應頭中給出
304 未修改,表示客戶機緩存的版本是最新的, 客戶機應該繼續使用它
403 禁止,服務器理解客戶端請求, 但拒絕處理它, 通常用於服務器上文件或目錄的權限設置所致
404 找不到,服務器上不存在客戶機所請求的資源
500 服務器內部錯誤,服務器端的 cgi, asp, jsp 等程序發生錯誤
簡述 http 1.1 與 http 1.0 的區別
http 1.0 對於每個連接都得建立一次連接, 一次只能傳送一個請求和響應, 請求就會關閉, http1.0 沒有 Host 字段
而 http1.1 在同一個連接中可以傳送多個請求和響應, 多個請求可以重疊和同時進行, http1.1 必須有 host 字段
http1.1 中引入了 ETag 頭, 它的值 entity tag 可以用來唯一的描述一個資源. 請求消息中可以使用 If-None-Match 頭域來匹配資源的 entitytag 是否有變化
http1.1 新增了 Cache-Control 頭域(消息請求和響應請求都可以使用), 它支持一個可擴展的指令子集
http1.0 中只定義了 16 個狀態響應碼, 對錯誤或警告的提示不夠具體. http1.1 引入了一個 Warning 頭域, 增加對錯誤或警告信息的描述. 且新增了 24 個狀態響應碼
說一下 TCP 三次握手和四次揮手
建立 TCP 連接需要三次握手:三次握手: 首先 Client 端發送連接請求報文,Server 段接受連接後回覆 ACK 報文,併為這次連接分配資源。Client 端接收到 ACK 報文後也向 Server 段發生 ACK 報文,並分配資源,這樣 TCP 連接就建立了。
第一步: 客戶機的 TCP 先向服務器的 TCP 發送一個連接請求報文. 這個特殊的報文中不含應用層數據, 其首部中的 SYN 標誌位被置 1. 另外, 客戶機會隨機選擇一個起始序號 seq=x(連接請求報文不攜帶數據,但要消耗掉一個序號)
第二步: 服務器端的 TCP 收到連接請求報文後, 若同意建立連接, 就向客戶機發送請求, 併為該 TCP 連接分配 TCP 緩存和變量. 在確認報文中,SYN 和 ACK 位都被置為 1, 確認號字段的值為 x+1, 並且服務器隨機產生起始序號 seq=y(確認報文不攜帶數據, 但也要消耗掉一個序號). 確認報文同樣不包含應用層數據.
第三步: 當客戶機收到確認報文後, 還要向服務器給出確認, 並且也要給該連接分配緩存和變量. 這個報文的 ACK 標誌位被置為 1, 序號字段為 x+1, 確認號字段為 y+1
四次揮手
第一步: 客戶機打算關閉連接,就向其 TCP 發送一個連接釋放報文,並停止再發送數據,主動關閉 TCP 連接, 該報文的 FIN 標誌位被置 1, seq=u, 它等於前面已經傳送過的數據的最後一個字節的序號加 1(FIN 報文即使不攜帶數據,也要消耗掉一個序號)
第二步: 服務器接收連接釋放報文後即發出確認, 確認號是 ack=u+1, 這個報文自己的序號是 v, 等於它前面已傳送過的數據的最後一個自己的序號加 1. 此時, 從客戶機到服務器這個方向的連接就釋放了, TCP 連接處於半關閉狀態. 但服務器若發送數據, 客戶機仍要接收, 即從服務器到客戶機的連接仍未關閉.
第三步: 若服務器已經沒有了要向客戶機發送的數據, 就通知 TCP 釋放連接, 此時其發出 FIN=1 的連接釋放報文
第四步: 客戶機收到連接釋放報文後, 必須發出確認. 在確認報文中, ACK 字段被置為 1, 確認號 ack=w+1, 序號 seq=u+1. 此時, TCP 連接還沒有釋放掉, 必須經過等待計時器設置的時間 2MSL 後, A 才進入到連接關閉狀態.
計算機網絡體系結構有哪些
學習計算機網絡時我們一般採用折中的辦法,也就是中和 OSI 和 TCP/IP 的優點,採用一種只有五層協議的體系結構,這樣既簡潔又能將概念闡述清楚。
應用層
應用層(application-layer)的任務是通過應用進程間的交互來完成特定網絡應用。應用層協議定義的是應用進程(進程:主機中正在運行的程序)間的通信和交互的規則。對於不同的網絡應用需要不同的應用層協議。在互聯網中應用層協議很多,如域名系統 DNS,支持萬維網應用的 HTTP 協議,支持電子郵件的 SMTP 協議等等。我們把應用層交互的數據單元稱為報文。
域名系統
域名系統(Domain Name System 縮寫 DNS,Domain Name 被譯為域名)是因特網的一項核心服務,它作為可以將域名和 IP 地址相互映射的一個分佈式數據庫,能夠使人更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的 IP 數串。(百度百科)例如:一個公司的 Web 網站可看作是它在網上的門戶,而域名就相當於其門牌地址,通常域名都使用該公司的名稱或簡稱。例如上面提到的微軟公司的域名,類似的還有:IBM 公司的域名是www.ibm.com、Oracle公司的域名是www.oracle.com、Cisco公司的域名是www.cisco.com等。
http 協議
超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。所有的 WWW(萬維網) 文件都必須遵守這個標準。設計 HTTP 最初的目的是為了提供一種發佈和接收 HTML 頁面的方法。(百度百科)
運輸層
運輸層(transport layer)的主要任務就是負責向兩臺主機進程之間的通信提供通用的數據傳輸服務。應用進程利用該服務傳送應用層報文。“通用的”是指並不針對某一個特定的網絡應用,而是多種應用可以使用同一個運輸層服務。由於一臺主機可同時運行多個線程,因此運輸層有複用和分用的功能。所謂複用就是指多個應用層進程可同時使用下面運輸層的服務,分用和複用相反,是運輸層把收到的信息分別交付上面應用層中的相應進程。
運輸層常用的兩種協議TCP UDP
傳輸控制協議 TCP(Transmisson Control Protocol)--提供面向連接的,可靠的數據傳輸服務。
用戶數據協議 UDP(User Datagram Protocol)--提供無連接的,盡最大努力的數據傳輸服務(不保證數據傳輸的可靠性)。
UDP的主要特點
UDP 是無連接的;
UDP 使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的鏈接狀態(這裡面有許多參數);
UDP 是面向報文的;
UDP 沒有擁塞控制,因此網絡出現擁塞不會使源主機的發送速率降低(對實時應用很有用,如 直播,實時視頻會議等);
UDP 支持一對一、一對多、多對一和多對多的交互通信;
UDP 的首部開銷小,只有 8 個字節,比 TCP 的 20 個字節的首部要短。
TCP的主要特點
TCP 是面向連接的。(就好像打電話一樣,通話前需要先撥號建立連接,通話結束後要掛機釋放連接);
每一條 TCP 連接只能有兩個端點,每一條 TCP 連接只能是點對點的(一對一);
TCP 提供可靠交付的服務。通過 TCP 連接傳送的數據,無差錯、不丟失、不重複、並且按序到達;
TCP 提供全雙工通信。TCP 允許通信雙方的應用進程在任何時候都能發送數據。TCP 連接的兩端都設有發送緩存和接收緩存,用來臨時存放雙方通信的數據;
面向字節流。TCP 中的“流”(Stream)指的是流入進程或從進程流出的字節序列。“面向字節流”的含義是:雖然應用程序和 TCP 的交互是一次一個數據塊(大小不等),但 TCP 把應用程序交下來的數據僅僅看成是一連串的無結構的字節流。
網絡層
在 計算機網絡中進行通信的兩個計算機之間可能會經過很多個數據鏈路,也可能還要經過很多通信子網。網絡層的任務就是選擇合適的網間路由和交換結點, 確保數據及時傳送。 在發送數據時,網絡層把運輸層產生的報文段或用戶數據報封裝成分組和包進行傳送。在 TCP/IP 體系結構中,由於網絡層使用 IP 協議,因此分組也叫 IP 數據報 ,簡稱 數據報。
這裡要注意:不要把運輸層的“用戶數據報 UDP ”和網絡層的“ IP 數據報”弄混。另外,無論是哪一層的數據單元,都可籠統地用“分組”來表示。
這裡強調指出,網絡層中的“網絡”二字已經不是我們通常談到的具體網絡,而是指計算機網絡體系結構模型中第三層的名稱.
互聯網是由大量的異構(heterogeneous)網絡通過路由器(router)相互連接起來的。互聯網使用的網絡層協議是無連接的網際協議(Intert Prococol)和許多路由選擇協議,因此互聯網的網絡層也叫做網際層或 IP 層。
數據鏈路層
數據鏈路層(data link layer)通常簡稱為鏈路層。兩臺主機之間的數據傳輸,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協議。 在兩個相鄰節點之間傳送數據時,數據鏈路層將網絡層交下來的 IP 數據報組裝程幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括數據和必要的控制信息(如同步信息,地址信息,差錯控制等)。
在接收數據時,控制信息使接收端能夠知道一個幀從哪個比特開始和到哪個比特結束。這樣,數據鏈路層在收到一個幀後,就可從中提出數據部分,上交給網絡層。 控制信息還使接收端能夠檢測到所收到的幀中有誤差錯。如果發現差錯,數據鏈路層就簡單地丟棄這個出了差錯的幀,以避免繼續在網絡中傳送下去白白浪費網絡資源。如果需要改正數據在鏈路層傳輸時出現差錯(這就是說,數據鏈路層不僅要檢錯,而且還要糾錯),那麼就要採用可靠性傳輸協議來糾正出現的差錯。這種方法會使鏈路層的協議複雜些。
物理層
在物理層上所傳送的數據單位是比特。 物理層(physical layer)的作用是實現相鄰計算機節點之間比特流的透明傳送,儘可能屏蔽掉具體傳輸介質和物理設備的差異。 使其上面的數據鏈路層不必考慮網絡的具體傳輸介質是什麼。“透明傳送比特流”表示經實際電路傳送後的比特流沒有發生變化,對傳送的比特流來說,這個電路好像是看不見的。
在互聯網使用的各種協中最重要和最著名的就是 TCP/IP 兩個協議。現在人們經常提到的 TCP/IP 並不一定單指 TCP 和 IP 這兩個具體的協議,而往往表示互聯網所使用的整個 TCP/IP 協議族。
上面我們對計算機網絡的五層體系結構有了初步的瞭解,下面附送一張七層體系結構圖總結一下。圖片來源:https://blog.csdn.net/yaopeng_2005/article/details/7064869
HTTP與HTTPS的區別(常考)
Http 協議運行在 TCP 之上,明文傳輸,客戶端與服務器端都無法驗證對方的身份;Https 是身披 SSL(Secure Socket Layer)外殼的 Http,運行於 SSL 上,SSL 運行於 TCP 之上,是添加了加密和認證機制的 HTTP。二者之間存在如下不同:
端口不同:Http 與 Http 使用不同的連接方式,用的端口也不一樣,前者是 80,後者是 443;
資源消耗:和 HTTP 通信相比,Https 通信會由於加減密處理消耗更多的 CPU 和內存資源;
開銷:Https 通信需要證書,而證書一般需要向認證機構購買;
Https 的加密機制是一種共享密鑰加密和公開密鑰加密並用的混合加密機制。
對稱加密與非對稱加密
對稱密鑰加密是指加密和解密使用同一個密鑰的方式,這種方式存在的最大問題就是密鑰發送問題,即如何安全地將密鑰發給對方;而非對稱加密是指使用一對非對稱密鑰,即公鑰和私鑰,公鑰可以隨意發佈,但私鑰只有自己知道。發送密文的一方使用對方的公鑰進行加密處理,對方接收到加密信息後,使用自己的私鑰進行解密。
由於非對稱加密的方式不需要發送用來解密的私鑰,所以可以保證安全性;但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。
TCP協議如何來保持傳輸的可靠性
TCP 提供一種面向連接的、可靠的字節流服務。其中,面向連接意味著兩個使用 TCP 的應用(通常是一個客戶和一個服務器)在彼此交換數據之前必須先建立一個 TCP 連接。在一個 TCP 連接中,僅有兩方進行彼此通信;而字節流服務意味著兩個應用程序通過 TCP 鏈接交換 8bit 字節構成的字節流,TCP 不在字節流中插入記錄標識符。
對於可靠性,TCP 通過以下方式進行保證:
數據包校驗:目的是檢測數據在傳輸過程中的任何變化,若校驗出包有錯,則丟棄報文段並且不給出響應,這時 TCP 發送數據端超時後會重發數據;
對失序數據包重排序:既然 TCP 報文段作為 IP 數據報來傳輸,而 IP 數據報的到達可能會失序,因此 TCP 報文段的到達也可能會失序。TCP 將對失序數據進行重新排序,然後才交給應用層;
丟棄重複數據:對於重複數據,能夠丟棄重複數據;
應答機制:當 TCP 收到發自 TCP 連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒;
超時重發:當 TCP 發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段;
流量控制:TCP 連接的每一方都有固定大小的緩衝空間。TCP 的接收端只允許另一端發送接收端緩衝區所能接納的數據,這可以防止較快主機致使較慢主機的緩衝區溢出,這就是流量控制。TCP 使用的流量控制協議是可變大小的滑動窗口協議。
參考鏈接計算機網絡面試問題集錦
簡述 查找域名對應的IP地址
這一步包括 DNS 具體的查找過程,包括:瀏覽器緩存->系統緩存->路由器緩存...
瀏覽器搜索自己的 DNS 緩存(維護一張域名與 IP 地址的對應表);
搜索操作系統中的 DNS 緩存(維護一張域名與 IP 地址的對應表);
搜索操作系統的 hosts 文件( Windows 環境下,維護一張域名與 IP 地址的對應表);
操作系統將域名發送至 LDNS(本地區域名服務器),LDNS 查詢 自己的 DNS 緩存(一般查找成功率在 80% 左右),查找成功則返回結果,失敗則發起一個迭代 DNS 解析請求:
LDNS 向 Root Name Server (根域名服務器,如 com、net、org 等的解析的頂級域名服務器的地址)發起請求,此處,Root Name Server 返回 com 域的頂級域名服務器的地址;
LDNS 向 com 域的頂級域名服務器發起請求,返回 baidu.com 域名服務器地址;
LDNS 向 baidu.com 域名服務器發起請求,得到www.baidu.com的 IP 地址;
LDNS 將得到的 IP 地址返回給操作系統,同時自己也將 IP 地址緩存起來;
操作系統將 IP 地址返回給瀏覽器,同時自己也將 IP 地址緩存起來;
從輸入 URL 到頁面加載發生了什麼【必考】
總體來說分為以下幾個過程:
DNS 解析
TCP 連接
發送 HTTP 請求
服務器處理請求並返回 HTTP 報文
瀏覽器解析渲染頁面
連接結束
這道題的區分度很高建議大家仔細查看下面這篇文章從輸入 URL 到頁面加載發生了什麼
HTTP的幾種請求方法的用途
GET 方法:發送一個請求來取得服務器上的某一資源
POST 方法:向 URL 指定的資源提交數據或附加新的數據
PUT 方法:跟 POST 方法很像,也是想服務器提交數據。但是,它們之間有不同。PUT 指定了資源在服務器上的位置,而 POST 沒有
HEAD 方法:只請求頁面的首部
DELETE 方法:刪除服務器上的某資源
OPTIONS 方法:它用於獲取當前 URL 所支持的方法。如果請求成功,會有一個 Allow 的頭包含類似“GET,POST”這樣的信息
TRACE 方法:TRACE 方法被用於激發一個遠程的,應用層的請求消息迴路
CONNECT 方法:把請求連接轉換到透明的 TCP/IP 通道
127.0.0.1 與 192.168.0.1 有什麼區別【可能考】
首先明確二者沒有區別!兩個 IP 地址的角度不一樣,127.0.0.1 是從 IETF(因特爾工程任務組)規定看,是保留給本機使用的 IP 地址,所有的計算機默認都是相同的。而 192.168.0.1 其實只是 IETF 在 c 類網址中,專門留出給專用網絡用的一個網段中的一個 IP 而已,該網段包含了 192.168.0.1 到 192.168.255.255 中所有的 IP 地址。
五類 ip 地址的範圍
IP 地址分為 A,B,C,D,E 五類。
網絡號:用於識別主機所在的網絡; 主機號:用於識別該網絡中的主機。
其中 A 類分配給政府機關使用,B 類地址給大中型企業使用,C 類地址給個人使用。這三種是主要的。
IP 地址分為五類,A 類保留給政府機構,B 類分配給中等規模的公司,C 類分配給任何需要的人,D 類用於組播,E 類用於實驗,各類可容納的地址數目不同。
其中 A 類、B 類、和 C 類這三類地址用於 TCP/IP 節點,其它兩類 D 類和 E 類被用於特殊用途。 A、B、C 三類 IP 地址的特徵:當將 IP 地址寫成二進制形式時,A 類地址的第一位總是 O,B 類地址的前兩位總是 10,C 類地址的前三位總是 110。
A 類地址
⑴ A 類地址第 1 字節為網絡地址,其它 3 個字節為主機地址。
⑵ A 類地址範圍:1.0.0.1—126.155.255.254
⑶ A 類地址中的私有地址和保留地址:
① 10.X.X.X 是私有地址(所謂的私有地址就是在互聯網上不使用,而被用在局域網絡中的地址)。
② 127.X.X.X 是保留地址,用做循環測試用的。
B 類地址
⑴ B 類地址第 1 字節和第 2 字節為網絡地址,其它 2 個字節為主機地址。
⑵ B 類地址範圍:128.0.0.1—191.255.255.254。
⑶ B 類地址的私有地址和保留地址
① 172.16.0.0—172.31.255.255 是私有地址
② 169.254.X.X 是保留地址。如果你的 IP 地址是自動獲取 IP 地址,而你在網絡上又沒有找到可用的 DHCP 服務器。就會得到其中一個 IP。
C 類地址
⑴ C 類地址第 1 字節、第 2 字節和第 3 個字節為網絡地址,第 4 個個字節為主機地址。另外第 1 個字節的前三位固定為 110。
⑵ C 類地址範圍:192.0.0.1—223.255.255.254。
⑶ C 類地址中的私有地址:
-
192.168.X.X 是私有地址。
D 類地址
⑴ D 類地址不分網絡地址和主機地址,它的第 1 個字節的前四位固定為 1110。
⑵ D 類地址範圍:224.0.0.1—239.255.255.254E 類地址
⑴ E 類地址也不分網絡地址和主機地址,它的第 1 個字節的前五位固定為 11110。
⑵ E 類地址範圍:240.0.0.1—255.255.255.254
HTTP 長連接、短連接
在 HTTP/1.0 中默認使用短連接。也就是說,客戶端和服務器每進行一次 HTTP 操作,就建立一次連接,任務結束就中斷連接。當客戶端瀏覽器訪問的某個 HTML 或其他類型的 Web 頁中包含有其他的 Web 資源(如 JavaScript 文件、圖像文件、CSS 文件等),每遇到這樣一個 Web 資源,瀏覽器就會重新建立一個 HTTP 會話。
而從 HTTP/1.1 起,默認使用長連接,用以保持連接特性。使用長連接的 HTTP 協議,會在響應頭加入這行代碼:
Connection:keep-alive
在使用長連接的情況下,當一個網頁打開完成後,客戶端和服務器之間用於傳輸 HTTP 數據的 TCP 連接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經建立的連接。Keep-Alive 不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如 Apache)中設定這個時間。實現長連接需要客戶端和服務端都支持長連接。
HTTP 協議的長連接和短連接,實質上是 TCP 協議的長連接和短連接。
HTTP 長連接、短連接究竟是什麼?
如何理解 HTTP 協議是無狀態的【常考】
HTTP 協議是無狀態的,指的是協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。也就是說,打開一個服務器上的網頁和上一次打開這個服務器上的網頁之間沒有任何聯繫。HTTP 是一個無狀態的面向連接的協議,無狀態不代表 HTTP 不能保持 TCP 連接,更不能代表 HTTP 使用的是 UDP 協議(無連接)。
各種協議與 HTTP 協議之間的關係
一般面試官會通過這樣的問題來考察你對計算機網絡知識體系的理解。
Socket 連接與 HTTP 連接的聯繫與區別(需瞭解)
由於通常情況下 Socket 連接就是 TCP 連接,因此 Socket 連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多箇中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網絡,該連接處於活躍狀態。
而 HTTP 連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求後,服務器端才能回覆數據。
很多情況下,需要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方建立的是 Socket 連接,服務器就可以直接將數據傳送給客戶端;若雙方建立的是 HTTP 連接,則服務器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數據,如果有就將數據傳給客戶端。
http 報文大小限制
如前所述,一個 HTTP 報文包含起始行,頭域和消息體,HTTP 協議本身並沒有對報文中任一部分的長度做限制,也就是說,理論上一個請求 URI 可以無限長,頭域可以無限多,請求體可以無限大。但在實際場景下,請求 URI 的長度會受到瀏覽器的限制,如果在瀏覽器中輸入過長的 URL,那麼瀏覽器會自動進行截斷。而服務器出於安全性和效率的考慮,也會對頭域和消息體的大小作出一定的限制。
http(tcp) 報文結構(必考)
例如一個 100kb 的 HTML 文檔需要傳送到另外一臺計算機,並不會整個文檔直接傳送過去,可能會切割成幾個部分,比如四個分別為 25kb 的數據段。而每個數據段再加上一個 TCP 首部,就組成了 TCP 報文。 TCP 報文 (Segment),包括首部和數據部分。
首部:
源端口 source port
目的端口 destination port
序號 sequence number
確認號 acknowledgment number
數據偏移 offset
保留 reserved
標誌位 tcp flags
窗口大小 window size
檢驗和 checksum
緊急指針 urgent pointer
選項 tcp options
HTTP 的緩存機制(常考)
Http 的緩存主要利用 header 裡的兩個字段來控制:
Cache-control主要包含以及幾個字段:
private:則只有客戶端可以緩存
public:客戶端和代理服務器都可以緩存
max-age:緩存的過期時間
no-cache:需要使用對比緩存來驗證緩存數據
no-store:所有內存都不會進行緩存
ETag:即用來進行對比緩存,Etag 是服務端資源的一個標識碼
當客戶端發送第一次請求時服務端會下發當前請求資源的標識碼 Etag,下次再請求時,客戶端則會通過 header 裡的 If-None-Match 將這個標識碼 Etag 帶上,服務端將客戶端傳來的 Etag 與最新的資源 Etag 做對比,如果一樣,則表示資源沒有更新,返回 304。
通過 Cache-control 和 Etag 的配合來實現 Http 的緩存機制。
Cookie
Cookie 就是用來在本地緩存記住一些狀態的,一個 Cookie 一般都包含 domin(所屬域)、path、Expires(過期時間)等幾個屬性。服務端可以通過在響應頭裡的 set-cookies 來將狀態寫入客戶端的 Cookie 裡。下次客戶端發起請求時可以將 Co
Http 2.0 與 http1.x 相比有什麼優點(常考)
二進制格式:http1.x 是文本協議,而 http2.0 是二進制以幀為基本單位,是一個二進制協議,一幀中除了包含數據外同時還包含該幀的標識:Stream Identifier,即標識了該幀屬於哪個 request,使得網絡傳輸變得十分靈活。
多路複用: 一個很大的改進,原先 http1.x 一個連接一個請求的情況有比較大的侷限性,也引發了很多問題,如建立多個連接的消耗以及效率問題。
http1.x 為了解決效率問題,可能會盡量多的發起併發的請求去加載資源,然而瀏覽器對於同一域名下的併發請求有限制,而優化的手段一般是將請求的資源放到不同的域名下來突破這種限制。
而 http2.0 支持的多路複用可以很好的解決這個問題,多個請求共用一個 TCP 連接,多個請求可以同時在這個 TCP 連接上併發,一個是解決了建立多個 TCP 連接的消耗問題,一個也解決了效率的問題。那麼是什麼原理支撐多個請求可以在一個 TCP 連接上併發呢?基本原理就是上面的二進制分幀,因為每一幀都有一個身份標識,所以多個請求的不同幀可以併發的無序發送出去,在服務端會根據每一幀的身份標識,將其整理到對應的 request 中。
header 頭部壓縮:主要是通過壓縮 header 來減少請求的大小,減少流量消耗,提高效率。因為之前存在一個問題是,每次請求都要帶上 header,而這個 header 中的數據通常是一層不變的。
支持服務端推送
流量控制
流量控制是對一條通信路徑上的流量進行控制,就是發送方通過獲取接收方的回饋來動態調整發送的速率,來達到控制流量的效果,其目的是保證發送者的發送速度不超過接收者的接收速度。
擁塞控制
擁塞控制是對整個通信子網的流量進行控制,屬於全局控制。
慢開始+擁塞避免 先來看一張經典的圖:
一開始使用慢啟動,即擁塞窗口設為 1,然後擁塞窗口指數增長到慢開始的門限值(ssthresh=16),則切換為擁塞避免,即加法增長,這樣增長到一定程度,導致網絡擁塞,則此時會把擁塞窗口重新降為 1,即重新慢開始,同時調整新的慢開始門限值為 12,之後以此類推。
快重傳+快恢復
快重傳:上面我們說的重傳機制都是等到超時還未收到接收方的回覆,才開始進行重傳。而快重傳的設計思路是:如果發送方收到 3 個重複的接收方的 ACK,就可以判斷有報文段丟失,此時就可以立即重傳丟失的報文段,而不用等到設置的超時時間到了才開始重傳,提高了重傳的效率。
快恢復:上面的擁塞控制會在網絡擁塞時將擁塞窗口降為 1,重新慢開始,這樣存在的一個問題就是網絡無法很快恢復到正常狀態。快恢復就是來優化這個問題的,使用快恢復,則出現擁塞時,擁塞窗口只會降低到新的慢開始門閥值(即 12),而不會降為 1,然後直接開始進入擁塞避免加法增長,如下圖所示:
感謝:Android 網絡系列(一):關於計算機網絡的一些基礎 - 舒大飛
mp.weixin.qq.com/s/hOKfbgd-nRn2lboXMCiY8w
閱讀更多 千鋒Html5學習課堂 的文章