面試 -- 網路 TCP/IP

yck發表於2017-01-04

現在面試門檻越來越高,很多開發者對於網路知識這塊瞭解的不是很多,遇到這些面試題會手足無措。本篇文章知識主要集中在 TCP/IP 這塊,也會對物理層和資料鏈路層有簡單的介紹。文中知識來自 《圖解 TCP/IP》與維基百科,若有錯誤請大家指出。文章會持續更新。

面試 -- 網路 HTTP

TCP/IP 基礎知識

分組技術

  • 可以讓多個使用者共享一條線路

tcp/ip 代表什麼

  • 利用 IP 進行通訊時所必須用到的協議群的統稱
    • RFC 協議的說明,STD 管理 RFC

網際網路結構

  • 網際網路由很多較小範圍的網路組成,每個小網由骨幹網和末端網組成

TCP/IP 協議分層模型

  • 物理層將二進位制的0和1和電壓高低,光的閃滅和電波的強弱訊號進行轉換
  • 鏈路層代表驅動
  • 網路層
    • 使用 IP 協議,IP 協議基於 IP 轉發分包資料
    • IP 協議是個不可靠協議,不會重發
    • IP 協議傳送失敗會使用ICMP 協議通知失敗
    • ARP 解析 IP 中的 MAC 地址,MAC 地址由網路卡出廠提供
    • IP 還隱含鏈路層的功能,不管雙方底層的鏈路層是啥,都能通訊
  • 傳輸層

    • 通用的 TCP 和 UDP 協議
      • TCP 協議面向有連線,能正確處理丟包,傳輸順序錯亂的問題,但是為了建立與斷開連線,需要至少7次的發包收包,資源浪費
      • UDP 面向無連線,不管對方有沒有收到,如果要得到通知,需要通過應用層
  • 會話層以上分層

    • TCP/IP 分層中,會話層,表示層,應用層集中在一起
    • 網路管理通過 SNMP 協議

TCP/IP 分層模型與通訊示例

  • 發包過程
    • 表示層轉碼,會話層決定何時建立連線,傳輸層負責建立連線,斷開連線和傳送資料,保證資料能順利傳送至對端。TCP 協議(傳輸層)在資料前附加一個首部,這個首部除了包含傳送端和接收端地址以外,還包含序號,檢驗和(判斷資料是否被破壞)。IP (網路層)模組將 TCP 傳來的首部和資料當資料。加首部,這個首部中包含地址和上一層的協議。鏈路層除了新增首部,還會新增 FCS 到包尾
  • 收包過程
    • 鏈路層判斷 MAC 地址,判斷IP 協議。網路層做的事情差不多,在這裡,對於有路由器的情況下,藉助路由控制表,在找到應該送達的主句或路由器以後再轉發資料。傳輸層檢驗資料是否被損壞,檢驗資料是否按照順序傳送,然後再做相同的事情

資料鏈路層

資料鏈路的作用

  • 鏈路層將資料集合為一個幀的塊,然後進行傳輸
  • 只提供導線一端到另一端的傳輸

MAC 地址

  • Mac 地址長48位元,被燒入到網路卡 ROM 中,不會重複

交換機

  • 交換機自學然後生成一張 Mac 表,具體原理為
    • 交換機4個埠連線著終端,A 終端與埠1連線,傳送 frame 後交換機得知埠1和 A 終端的關係,然後轉發到其他三端,轉發完成後得知埠2與主機 B 想對應,記錄到表中。以後主機 A 與主機 B 的通訊就通過埠1和埠2進行

幀 frame

  • 幀是“一個資料鏈路層的傳輸單元,由一個資料鏈路層首部和其攜帶的分組所組成”。譬如說乙太網幀,PPP 幀

乙太網幀結構

面試 -- 網路 TCP/IP
乙太網幀結構

  • 一個幀以7個位元組的前導碼和1個位元組的幀開始符作為幀的開始
  • 抱頭包含源和目標的 Mac 地址和表明上一層網路協議的型別
  • 接下來是資料
  • 後面是幀驗證序列,以驗證幀是否損壞
  • 最後有一個幀間距,兩個幀傳送間要再傳送至少12位元組的空閒線路狀態碼

IP 協議

網路層作用

  • 跨越多種資料鏈路傳輸資料包
  • 提供路由和定址功能

IP 地址

  • 每塊網路卡需配置至少一個 IP 地址
  • IP 地址由32位正整陣列成,為二進位制,但是為了人類更好的閱讀,將他每8位分為一組,共4組
  • IP 地址由網路和主機兩標識組成
    • 網路標識在資料鏈路的每個段配置不同的值,必須保證相互連線的端的地址不重複
    • 主機標識不允許在同一網段內重複
  • IP 地址分為四個級別,分別為 A, B, C, D
    • A類地址是首位為 0 開頭,前八位是網路標識, 0.0.0.0 ~ 127.0.0.0屬於 A 類
    • B 類地址是前兩位由 10 組成,前16位是網路標識,128.0.0.0 ~ 191.255.0.0 屬於 B 類
    • C 類地址前三位是 110, 前24位是網路標識,192.0.0.0 ~ 239.255.255.0 屬於 B 類
    • D 類前四位是 1110,32位全是網路標識,224.0.0.0 ~ 239.255.255.255屬於 D 類
  • 但是以上的分類已經不用,改為使用子網掩碼定位網路標識長度。
    • 子網標識同一個閘道器,255.255.255.0和255.255.255.1是同一個子網
    • 子網掩碼也是32位組成
    • 掩碼中有幾個1就程式碼幾位網路標識,其他為主機標識
    • 假如掩碼前24位為1,就代表前24位都為網路標識,用 IP 地址標識就是255.255.255.0,後面的0代表主機標識,理論上有256臺主機可連線

路由控制

  • 僅有 IP 地址還不足以將資料包傳送到對端,還需指明路由器或主機。儲存這種資訊的就是路由控制表。
  • 路由控制表中記錄著地址與下一步要傳送至路由器的地址。在傳送 IP 包時,先確定 IP 包首部目標地址,然後在表中找到與該地址具有相同網路地址的記錄,根據記錄將 IP 包轉發給相應的下一個路由器。

IPv6

  • 地址長度為128位
  • 解決了很多 IPv4的問題
    • IP 地址擴大(目前 IPv4地址不足的問題由 NAT解決,NAT 是一種在 IP 資料包通過路由器或防火牆時重寫源 IP 地址或目標地址的技術。這種技術被用於多臺主機使用單個公有 IP 訪問網際網路的私有網路中。)
    • 包首部長度固定40位元組,路由器不在做分片操作,直接在傳送端主機分片
    • 不需 DHCP 伺服器也能自動分配 IP地址
    • 使用認證和加密功能

IP協議相關技術

DNS

  • IP 地址不容易記憶,然後出現了域名。DNS 是將域名和 IP 地址相互對映的一個分散式資料庫。
  • DNS 解析
    • 查詢 www.baidu.com ,DNS 伺服器會先檢查自身快取,有記錄則返回結果
    • 記錄不存在,DNS 伺服器向根域名伺服器查詢,然後會返回.com 域的權威域名伺服器地址
    • DNS 向 .com 伺服器查詢,得到 .baidu.com 地址
    • DNS 向 .baidu.com 伺服器查詢,得到最終地址,存入快取並返回結果

ARP

  • 乙太網協議規定兩臺主機相互通訊必須知道目標主機 MAC 地址
  • 資料鏈路層會將上一層 IP 協議發來的 IP 地址轉為 MAC 地址
  • 如果兩臺主機不在同一個區域網內,必須通過路由轉發才能通訊。此時,傳送端通過 ARP 獲得的 MAC 地址是一臺可以通向區域網外的路由器的 MAC 地址
  • IPv6解析 MAC 地址通過 NDP

NAT

  • 用於在本地網路中使用私有地址,連線網際網路時轉為全域性 IP 地址的技術
    • 本地地址10.0.0.10要向163.221.120.9通訊
    • NAT 路由器會將傳送源地址從10.0.0.10轉為全域性 IP 地址202.244.174.37再通訊
  • 當一個公有 IP 下有多臺主機需要對外通訊時,如果多臺主機都使用相同的埠號會導致轉為全域性 IP 時數字一致,所有通過 NAPT 技術可以給轉換埠號
    • NAT 路由器會自動生成 NAPT 的轉換表,這個轉換表可以正確轉換地址和埠的組合
    • 在 TCP 中,簡歷 TCP 連線首次握手時的 SYN 包發出後就會生成表。在收到關閉連線時發出的 FIN 包時刪除

TCP 與 UDP

傳輸層協議

TCP 和 UDP 是傳輸層的兩個具有代表意義的協議.

TCP 是面向有連結的,可靠的協議,TCP 建立連線需要三次握手,斷開連線需要四次握手.因為效率比不上 UDP 協議.但是 TCP 協議具有重發包,順序控制等的機制。

UDP 是面向無連線的協議,不提供複雜的控制機制。做的最重要的事情就是分辨應用層協議。多用於視訊音訊通訊。

傳輸層的作用是指出具體該把資料包發給哪個應用,通過埠來分辨應用。

埠號

同一個埠不會同時出現,傳輸層通過辨認埠號來確認應用。但是隻靠埠號識別通訊是不夠的。需要採取五個資訊來識別一個通訊,分別是源 IP 地址,目標 IP 地址,協議號,源埠號,目標埠號。兩個包中只要任何一個資訊不同就不是同一個通訊。

TCP

三次握手建立連線

主機 A 相與主機 B 建立連線,主機 A 會首先傳送一個 SYN 包給主機 B。主機 B 會返回 確認應答 ACK 或者否定應答 NACK。如果這時主機 A 長時間沒有收到主機 B 的應答,主機 A 會重發 SYN 包給主機 B,實現了重發資料包的功能。當主機 B 傳送 ACK 給主機 A 後,主機 A 也會傳送一個 ACK 包給主機 B,這時建立連線。

TCP有順序控制的功能,通過一個序列號來確認傳送的資料。在傳送 SYN 包前,假設主機 A 的初始序列號為1000,以該序號依次往下進行資料編號,然後告訴主機 B 初始序列,同時主機 B 會對 A 的序列號進行確認,假如主機 B 返回一個2000的序列號,則代表位元組編號為1000 — 1999,表明主機 B 收到1000位元組。

為什麼不是兩次握手

兩次握手就建立連線,假如主機 A 傳送的 SYN 因網路問題遲遲沒有到達主機 B,這時候會重發另一個 SYN 包給 B,當 A 接受到 B 的 ACK 包時建立連線。這時如果第一個 SYN 到達 B 時,主機 B 會認為主機 A 希望再次建立連線,會返回一個 ACK 包給 A。當 A 收到 ACK 時會拋棄掉這個包,因為 A 並不想建立連線,這時主機 B 認為連線已經建立,會一直等待主機 A 傳送資料,這樣會導致主機 B 的效能損耗。

四次握手斷開連線

主機 A 傳送 FIN(請求切斷連線),主機 B 收到後回覆 ACK 和 FIN 包,主機 A 收到主機 B 的 FIN 和 ACK 後傳送 ACK 包

TCP首部

面試 -- 網路 TCP/IP
TCP首部

序列號碼

  • 如果含有 SYN,則此為最初序列號
  • 如果沒有 SYN,則此為第一個資料位元組的序列號

確認號碼,期望收到的資料的開始序列號。

檢驗和,對整個 TCP 報文段,包括頭部和資料以16位字進行計算所得,這時一個強制性欄位

UDP頭部

面試 -- 網路 TCP/IP
UDP頭部

報文長度,指定 UDP 報頭和資料總共佔用的長度。

檢驗和,用於發現頭部資訊和資料中的傳輸錯誤,該欄位在 IPv4中可選, IPv6中強制。

相關文章