1. 程式人生 > >前端必知網路知識大全

前端必知網路知識大全

綜述:感覺這篇文章寫的非常好,分享下,面試前利器

1 .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 等程式發生錯誤

2.簡述 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 個狀態響應碼

3.說一下 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 才進入到連線關閉狀態.

4.計算機網路體系結構有哪些

學習計算機網路時我們一般採用折中的辦法,也就是中和 OSI 和 TCP/IP 的優點,採用一種只有五層協議的體系結構,這樣既簡潔又能將概念闡述清楚。

5.應用層

應用層(application-layer)的任務是通過應用程序間的互動來完成特定網路應用。應用層協議定義的是應用程序(程序:主機中正在執行的程式)間的通訊和互動的規則。對於不同的網路應用需要不同的應用層協議。在網際網路中應用層協議很多,如域名系統 DNS,支援全球資訊網應用的 HTTP 協議,支援電子郵件的 SMTP 協議等等。我們把應用層互動的資料單元稱為報文。

6.域名系統

  • 域名系統(Domain Name System 縮寫 DNS,Domain Name 被譯為域名)是因特網的一項核心服務,它作為可以將域名和 IP 地址相互對映的一個分散式資料庫,能夠使人更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的 IP 數串。(百度百科)例如:一個公司的 Web 網站可看作是它在網上的門戶,而域名就相當於其門牌地址,通常域名都使用該公司的名稱或簡稱。例如上面提到的微軟公司的域名,類似的還有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com、Cisco 公司的域名是 www.cisco.com 等。

7.http 協議

  • 超文字傳輸協議(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一種網路協議。所有的 WWW(全球資訊網) 檔案都必須遵守這個標準。設計 HTTP 最初的目的是為了提供一種釋出和接收 HTML 頁面的方法。(百度百科)

運輸層

運輸層(transport layer)的主要任務就是負責向兩臺主機程序之間的通訊提供通用的資料傳輸服務。應用程序利用該服務傳送應用層報文。“通用的”是指並不針對某一個特定的網路應用,而是多種應用可以使用同一個運輸層服務。由於一臺主機可同時執行多個執行緒,因此運輸層有複用和分用的功能。所謂複用就是指多個應用層程序可同時使用下面運輸層的服務,分用和複用相反,是運輸層把收到的資訊分別交付上面應用層中的相應程序。

8 .運輸層常用的兩種協議TCP UDP

  • 傳輸控制協議 TCP(Transmisson Control Protocol)--提供面向連線的,可靠的資料傳輸服務。

  • 使用者資料協議 UDP(User Datagram Protocol)--提供無連線的,盡最大努力的資料傳輸服務(不保證資料傳輸的可靠性)。

9.UDP的主要特點

  • UDP 是無連線的;

  • UDP 使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連結狀態(這裡面有許多引數);

  • UDP 是面向報文的;

  • UDP 沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如 直播,實時視訊會議等);

  • UDP 支援一對一、一對多、多對一和多對多的互動通訊;

  • UDP 的首部開銷小,只有 8 個位元組,比 TCP 的 20 個位元組的首部要短。

10.TCP的主要特點

  • TCP 是面向連線的。(就好像打電話一樣,通話前需要先撥號建立連線,通話結束後要掛機釋放連線);

  • 每一條 TCP 連線只能有兩個端點,每一條 TCP 連線只能是點對點的(一對一);

  • TCP 提供可靠交付的服務。通過 TCP 連線傳送的資料,無差錯、不丟失、不重複、並且按序到達;

  • TCP 提供全雙工通訊。TCP 允許通訊雙方的應用程序在任何時候都能傳送資料。TCP 連線的兩端都設有傳送快取和接收快取,用來臨時存放雙方通訊的資料;

  • 面向位元組流。TCP 中的“流”(Stream)指的是流入程序或從程序流出的位元組序列。“面向位元組流”的含義是:雖然應用程式和 TCP 的互動是一次一個資料塊(大小不等),但 TCP 把應用程式交下來的資料僅僅看成是一連串的無結構的位元組流。

11.網路層

在 計算機網路中進行通訊的兩個計算機之間可能會經過很多個數據鏈路,也可能還要經過很多通訊子網。網路層的任務就是選擇合適的網間路由和交換結點, 確保資料及時傳送。 在傳送資料時,網路層把運輸層產生的報文段或使用者資料報封裝成分組和包進行傳送。在 TCP/IP 體系結構中,由於網路層使用 IP 協議,因此分組也叫 IP 資料報 ,簡稱 資料報。

這裡要注意:不要把運輸層的“使用者資料報 UDP ”和網路層的“ IP 資料報”弄混。另外,無論是哪一層的資料單元,都可籠統地用“分組”來表示。

這裡強調指出,網路層中的“網路”二字已經不是我們通常談到的具體網路,而是指計算機網路體系結構模型中第三層的名稱.

網際網路是由大量的異構(heterogeneous)網路通過路由器(router)相互連線起來的。網際網路使用的網路層協議是無連線的網際協議(Intert Prococol)和許多路由選擇協議,因此網際網路的網路層也叫做網際層或 IP 層。

12.資料鏈路層

資料鏈路層(data link layer)通常簡稱為鏈路層。兩臺主機之間的資料傳輸,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協議。 在兩個相鄰節點之間傳送資料時,資料鏈路層將網路層交下來的 IP 資料報組裝程幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括資料和必要的控制資訊(如同步資訊,地址資訊,差錯控制等)。

在接收資料時,控制資訊使接收端能夠知道一個幀從哪個位元開始和到哪個位元結束。這樣,資料鏈路層在收到一個幀後,就可從中提出資料部分,上交給網路層。 控制資訊還使接收端能夠檢測到所收到的幀中有誤差錯。如果發現差錯,資料鏈路層就簡單地丟棄這個出了差錯的幀,以避免繼續在網路中傳送下去白白浪費網路資源。如果需要改正資料在鏈路層傳輸時出現差錯(這就是說,資料鏈路層不僅要檢錯,而且還要糾錯),那麼就要採用可靠性傳輸協議來糾正出現的差錯。這種方法會使鏈路層的協議複雜些。

13.物理層

在物理層上所傳送的資料單位是位元。 物理層(physical layer)的作用是實現相鄰計算機節點之間位元流的透明傳送,儘可能遮蔽掉具體傳輸介質和物理裝置的差異。 使其上面的資料鏈路層不必考慮網路的具體傳輸介質是什麼。“透明傳送位元流”表示經實際電路傳送後的位元流沒有發生變化,對傳送的位元流來說,這個電路好像是看不見的。

在網際網路使用的各種協中最重要和最著名的就是 TCP/IP 兩個協議。現在人們經常提到的 TCP/IP 並不一定單指 TCP 和 IP 這兩個具體的協議,而往往表示網際網路所使用的整個 TCP/IP 協議族。

上面我們對計算機網路的五層體系結構有了初步的瞭解,下面附送一張七層體系結構圖總結一下。圖片來源:https://blog.csdn.net/yaopeng_2005/article/details/7064869

14.HTTP與HTTPS的區別(常考)

  • Http 協議執行在 TCP 之上,明文傳輸,客戶端與伺服器端都無法驗證對方的身份;Https 是身披 SSL(Secure Socket Layer)外殼的 Http,運行於 SSL 上,SSL 運行於 TCP 之上,是添加了加密和認證機制的 HTTP。二者之間存在如下不同:

  • 埠不同:Http 與 Https使用不同的連線方式,用的埠也不一樣,前者是 80,後者是 443;

  • 資源消耗:和 HTTP 通訊相比,Https 通訊會由於加減密處理消耗更多的 CPU 和記憶體資源;

  • 開銷:Https 通訊需要證書,而證書一般需要向認證機構購買;

  • Https 的加密機制是一種共享金鑰加密和公開金鑰加密並用的混合加密機制。

15.對稱加密與非對稱加密

  • 對稱金鑰加密是指加密和解密使用同一個金鑰的方式,這種方式存在的最大問題就是金鑰傳送問題,即如何安全地將金鑰發給對方;而非對稱加密是指使用一對非對稱金鑰,即公鑰和私鑰,公鑰可以隨意釋出,但私鑰只有自己知道。傳送密文的一方使用對方的公鑰進行加密處理,對方接收到加密資訊後,使用自己的私鑰進行解密。

  • 由於非對稱加密的方式不需要傳送用來解密的私鑰,所以可以保證安全性;但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送訊息,但對稱加密所使用的金鑰我們可以通過非對稱加密的方式傳送出去。

16.TCP協議如何來保持傳輸的可靠性

TCP 提供一種面向連線的、可靠的位元組流服務。其中,面向連線意味著兩個使用 TCP 的應用(通常是一個客戶和一個伺服器)在彼此交換資料之前必須先建立一個 TCP 連線。在一個 TCP 連線中,僅有兩方進行彼此通訊;而位元組流服務意味著兩個應用程式通過 TCP 連結交換 8bit 位元組構成的位元組流,TCP 不在位元組流中插入記錄識別符號。

對於可靠性,TCP 通過以下方式進行保證:

  • 資料包校驗:目的是檢測資料在傳輸過程中的任何變化,若校驗出包有錯,則丟棄報文段並且不給出響應,這時 TCP 傳送資料端超時後會重發資料;

  • 對失序資料包重排序:既然 TCP 報文段作為 IP 資料報來傳輸,而 IP 資料報的到達可能會失序,因此 TCP 報文段的到達也可能會失序。TCP 將對失序資料進行重新排序,然後才交給應用層;

  • 丟棄重複資料:對於重複資料,能夠丟棄重複資料;

  • 應答機制:當 TCP 收到發自 TCP 連線另一端的資料,它將傳送一個確認。這個確認不是立即傳送,通常將推遲幾分之一秒;

  • 超時重發:當 TCP 發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段;

  • 流量控制:TCP 連線的每一方都有固定大小的緩衝空間。TCP 的接收端只允許另一端傳送接收端緩衝區所能接納的資料,這可以防止較快主機致使較慢主機的緩衝區溢位,這就是流量控制。TCP 使用的流量控制協議是可變大小的滑動視窗協議。

17.簡述 查詢域名對應的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 地址快取起來;

18.從輸入 URL 到頁面載入發生了什麼【必考】

總體來說分為以下幾個過程:

  • DNS 解析

  • TCP 連線

  • 傳送 HTTP 請求

  • 伺服器處理請求並返回 HTTP 報文

  • 瀏覽器解析渲染頁面

  • 連線結束

這道題的區分度很高建議大家仔細檢視下面這篇文章從輸入 URL 到頁面載入發生了什麼

19.HTTP的幾種請求方法的用途

  • GET 方法:傳送一個請求來取得伺服器上的某一資源

  • POST 方法:向 URL 指定的資源提交資料或附加新的資料

  • PUT 方法:跟 POST 方法很像,也是想伺服器提交資料。但是,它們之間有不同。PUT 指定了資源在伺服器上的位置,而 POST 沒有

  • HEAD 方法:只請求頁面的首部

  • DELETE 方法:刪除伺服器上的某資源

  • OPTIONS 方法:它用於獲取當前 URL 所支援的方法。如果請求成功,會有一個 Allow 的頭包含類似“GET,POST”這樣的資訊

  • TRACE 方法:TRACE 方法被用於激發一個遠端的,應用層的請求訊息迴路

  • CONNECT 方法:把請求連線轉換到透明的 TCP/IP 通道

20.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 地址。

21.五類 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.254

E 類地址

  • ⑴ E 類地址也不分網路地址和主機地址,它的第 1 個位元組的前五位固定為 11110。

  • ⑵ E 類地址範圍:240.0.0.1—255.255.255.254

22.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 長連線、短連線究竟是什麼?

23.如何理解 HTTP 協議是無狀態的【常考】

HTTP 協議是無狀態的,指的是協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。也就是說,開啟一個伺服器上的網頁和上一次開啟這個伺服器上的網頁之間沒有任何聯絡。HTTP 是一個無狀態的面向連線的協議,無狀態不代表 HTTP 不能保持 TCP 連線,更不能代表 HTTP 使用的是 UDP 協議(無連線)。

24.各種協議與 HTTP 協議之間的關係

一般面試官會通過這樣的問題來考察你對計算機網路知識體系的理解。

25.Socket 連線與 HTTP 連線的聯絡與區別(需瞭解)

由於通常情況下 Socket 連線就是 TCP 連線,因此 Socket 連線一旦建立,通訊雙方即可開始相互發送資料內容,直到雙方連線斷開。但在實際網路應用中,客戶端到伺服器之間的通訊往往需要穿越多箇中間節點,例如路由器、閘道器、防火牆等,大部分防火牆預設會關閉長時間處於非活躍狀態的連線而導致 Socket 連線斷連,因此需要通過輪詢告訴網路,該連線處於活躍狀態。

而 HTTP 連線使用的是“請求—響應”的方式,不僅在請求時需要先建立連線,而且需要客戶端向伺服器發出請求後,伺服器端才能回覆資料。

很多情況下,需要伺服器端主動向客戶端推送資料,保持客戶端與伺服器資料的實時與同步。此時若雙方建立的是 Socket 連線,伺服器就可以直接將資料傳送給客戶端;若雙方建立的是 HTTP 連線,則伺服器需要等到客戶端傳送一次請求後才能將資料傳回給客戶端,因此,客戶端定時向伺服器端傳送連線請求,不僅可以保持線上,同時也是在“詢問”伺服器是否有新的資料,如果有就將資料傳給客戶端。

26.http 報文大小限制

如前所述,一個 HTTP 報文包含起始行,頭域和訊息體,HTTP 協議本身並沒有對報文中任一部分的長度做限制,也就是說,理論上一個請求 URI 可以無限長,頭域可以無限多,請求體可以無限大。但在實際場景下,請求 URI 的長度會受到瀏覽器的限制,如果在瀏覽器中輸入過長的 URL,那麼瀏覽器會自動進行截斷。而伺服器出於安全性和效率的考慮,也會對頭域和訊息體的大小作出一定的限制。

27.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

28.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 的快取機制。

29.Cookie

Cookie 就是用來在本地快取記住一些狀態的,一個 Cookie 一般都包含 domin(所屬域)、path、Expires(過期時間)等幾個屬性。服務端可以通過在響應頭裡的 set-cookies 來將狀態寫入客戶端的 Cookie 裡。下次客戶端發起請求時可以將 Co

30.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 中的資料通常是一層不變的。

  • 支援服務端推送

31.流量控制

流量控制是對一條通訊路徑上的流量進行控制,就是傳送方通過獲取接收方的回饋來動態調整發送的速率,來達到控制流量的效果,其目的是保證傳送者的傳送速度不超過接收者的接收速度。

32.擁塞控制

擁塞控制是對整個通訊子網的流量進行控制,屬於全域性控制。

  1. 慢開始+擁塞避免 先來看一張經典的圖: 

    一開始使用慢啟動,即擁塞視窗設為 1,然後擁塞視窗指數增長到慢開始的門限值(ssthresh=16),則切換為擁塞避免,即加法增長,這樣增長到一定程度,導致網路擁塞,則此時會把擁塞視窗重新降為 1,即重新慢開始,同時調整新的慢開始門限值為 12,之後以此類推。

  2. 快重傳+快恢復

  • 快重傳:上面我們說的重傳機制都是等到超時還未收到接收方的回覆,才開始進行重傳。而快重傳的設計思路是:如果傳送方收到 3 個重複的接收方的 ACK,就可以判斷有報文段丟失,此時就可以立即重傳丟失的報文段,而不用等到設定的超時時間到了才開始重傳,提高了重傳的效率。

  • 快恢復:上面的擁塞控制會在網路擁塞時將擁塞視窗降為 1,重新慢開始,這樣存在的一個問題就是網路無法很快恢復到正常狀態。快恢復就是來優化這個問題的,使用快恢復,則出現擁塞時,擁塞視窗只會降低到新的慢開始門閥值(即 12),而不會降為 1,然後直接開始進入擁塞避免加法增長,如下圖所示:

感謝:Android 網路系列(一):關於計算機網路的一些基礎 - 舒大飛

推薦閱讀

(點選標題可跳轉閱讀)

WEB即時通訊最佳實踐

前端通訊進階

WebSocket 通訊過程與實現