Linux 高效能伺服器程式設計-IP 協議詳解

Dragonbuf發表於2018-10-15

IP 協議詳解

  • IP 頭部資訊。IP 頭部資訊出現在每個 IP資料包中,用於指定 IP 通訊的根源 IP地址、目的端 IP 地址,指導 IP 分片和重組,以及指定部分通訊行為
  • IP 資料包的路由和轉發。 在除目標機器之外的所有主機和路由器上,決定資料包是否應該轉發和如何轉發

    2.1 IP 服務的特點

    IP 協議是 TCP/IP 協議族的動力,它為上層協議提供 無狀態、無連線、不可靠的服務。

無狀態:IP 通訊雙方不同步不同步傳輸資料的狀態資訊,因為所有 IP 資料包 傳送、傳輸、接受相互獨立。

  • 缺點: 無法處理亂序和重複的 IP資料包。

(面向連線的 TCP 協議,則能夠自己處理亂序、重複的報文段,保證遞交給上層協議的有序、正確。)

  • 優點:簡單、高效。無需為保持通訊狀態分片核心資源,無需傳遞狀態資訊。如 UDP HTTP 協議 都是無狀態協議

IP 資料包頭部提供標識欄位來唯一標識資料包,不用來指示接受順序。

無連線 :IP 通訊雙方都不長久維持對方任何資訊。

上層協議傳送資料,必須指定對方 IP 地址。 不保證 IP資料包準確到達接收端,承諾盡最大努力。
失敗:

  • 中轉路由器發現 IP 資料在網路上存活時間太長(根據 頭部 TTL 判斷),丟棄後,返回 ICMP 超時錯誤。
  • 接收端發現接受到 IP資料包不正確,丟棄後返回 ICMP IP頭部引數錯誤。
    傳送失敗後,通知上層協議失敗,不會重試,所以使用 IP 協議的上層協議(TCP 協議)需要自己實現資料確認、超時重傳。

2.2 IPV4 頭部

2.2.1 IPV4 頭部結構

file

  • 4位版本號 指定 IP 協議版本, IPV4 為 4 ,其他擴充套件協議 SIP PIP 不同版本號
  • 頭部長度: 標識該 IP 頭部有多少個 32 bit 字(4位元組) 4 位最大表示 15,則 IP 頭部最長 60 位元組
  • Type of Service, 3位優先權欄位(忽略)、4位 TOS 欄位、1位為零保留欄位。
    4 位 TOS 含義:
    最小延時
    最大吞吐量
    最高可靠性
    最小費用

    如 ssh telnet 登入程式需要最小延時服務,而 ftp 需要最大吞吐量服務。 這4個欄位,最多一個能置為1.

  • 16位總長度: 整個IP 資料包的長度,以位元組位單位,因此最長長度 2^16 -1 ,但由於 MTU 的資料包分片傳輸,所以遠遠沒有達到最大值。
  • 16位標識: 唯一的標識主機傳送的每一個資料包。初始值系統隨機生成,每次加一
  • 3位標誌: 第一位保留。第二位標識禁止分片,如果設定,則 IP 模組不對資料分片,但是如果超過 MTU限制,則 IP 模組丟棄資料,返回 ICMP 差錯。 第三位 標識更多分片,除了資料包最後一個分片,其他分片都是 1.
  • 13 位分片偏移: 分片相對原始 IP資料包開始(僅資料部分)的偏移,實際偏移值是 該值左移3位(乘8)。因此除了最後一個 IP 分片,其他部分長度必須是 8 的整數倍,以保證後面 IP 部分擁有合適的偏移值。
  • 8位生存時間:Time To Live 資料包到達目的地之前允許經過的路由器跳數,常設64,如果 TTL 減到 0,路由器丟棄資料包,傳送 ICMP 差錯報文。放置資料路由迴圈
  • 8位協議:區分上層協議 ICMP 1, TCP 6 UDP 17
  • 16 位頭部校驗和: 傳送端填充,接收端使用 CRC 演算法檢驗 IP資料包 頭部是否順壞。
  • 32 位源端 IP地址 和目的端 IP 地址,標識據報的傳送端和接收端。一般情況下 保持不變。
  • 變長可選資訊: 最多40位元組。IP頭部最長 60位元組(包括20位元組固定部分)。(很少被使用,參考 RFC1393 文件)
    可用 IP選項包括:
    記錄路由:告訴資料包途徑的所有路由器將自己 IP 地址填入 IP 頭部
    時間戳:告訴每個路由器將資料包被轉發時間(或時間與 IP地址對)填入 IP頭部
    鬆散源路由選擇: 指定一個路由器 IP地址列表,資料包傳送過程中必須經過其中路由器
    嚴格源路由選擇: 資料包只能經過被指定的路由器

2.2.2 使用 tcpdump 觀察 IPV4 頭部結構

sudo tcpdump -ntx -i lo 抓取本地迴路上資料包

2.3 IP 分片

當IP 資料包長度超過 幀的 MTU 時,將被分片傳輸。

只有在最終的目標機器上,分片被核心中的 IP 模組重新組裝。在 IP 頭部中:資料包標識、標誌、片偏移 用以給 IP的分片和重組提供足夠資訊。一個 IP 資料包的每個分片都具有自己的 IP 頭部,他們拒用相同標識值,具有不同片偏移,並且除最後一個分片外,其他分片都設定 MF 值,每個分片的 IP 頭部總張都嫁給你被設定為該分片的長度。
乙太網幀的 MTU 1500 位元組。 因此 除 IP 頭部 20位元組外,最多 1480 位元組的 IP 資料包,.

2.4 IP 路由

  IP 協議的一個核心任務是資料包的路由,即決定傳送資料包到目標機器的路徑。

2.4.1 IP 模組工作流程

file

  • 當IP 模組接受到來自資料鏈路層的 IP 資料包時, 首先 對資料包頭部做 CRC 校驗,之後分析頭部具體資訊
  • 如果該 IP 資料包頭部設定了源站選路選項,則 IP 模組呼叫資料包轉發子模組來處理該資料包
  • 如果該 IP 資料包頭部中目標 IP 是本機,則根據資料包頭部中的協議欄位來決定將它派發給哪個上層應用,如果 IP 模組發現這個資料包不是傳送給本機的,則也呼叫資料包轉發子模組來處理該資料包。
  • 資料包轉發子模組將首先檢測系統是否允許轉發,如果不允許,則將資料包丟棄。如果允許,資料包轉發子模組將對該資料包執行一些操作,然後將它交給 IP 資料包輸出子模組。
  • IP 資料包應該傳送至哪個下一跳路由,以及經過哪個網路卡來傳送就是 IP 路由過程。IP模組實現資料包路由的核心資料結果是路由表。
  • IP 輸出佇列中存放的是所有等待傳送的 IP 資料包,其中除了需要轉發的 IP 資料包外,還包括封裝了本機上層資料(ICMP 報文、TCP 報文段、UDP資料包)的 IP 資料包。

2.4.2 路由機制

可以使用 route netstat 檢視路由表

file
在路由表中,第一項地址是 default ,即預設路由項。該項包含一個 “G” ,說明路由的下一跳是閘道器,其地址為 192.168.1.1。另外一個路由項的目標地址是 192.168.1.0 它是本地區域網,該路由項閘道器地址為 * ,說明資料包不需要路由中轉,可以直接傳送到目標機器。
IP 路由機制:

  • 查詢路由表中和資料包 的目標 IP地址完全相同的主機 IP 地址,如果找到,使用該路由項,沒找到則轉2
  • 查詢路由表中和資料包的目標 IP 地址具有相同網路 ID 的網路 IP地址(如 Gateway),如果找到,使用該路由項,沒有轉 3
  • 選擇預設路由項,這通常意味著資料包的下一跳路由是閘道器。

所有傳送到 IP 地址為 192.168.1.* 的機器的 IP 資料包都可以直接傳送到目標機器(匹配路由表第二項),而所有訪問因特網的請求都將通過閘道器來轉發(匹配預設路由項)。

file

2.4.3 路由表更新

路由表必須能夠更新,以反應網路連線的變化。這樣 IP 模組才能準確、高效地轉發資料包。

2.5 IP 轉發

不是傳送給本機的 IP 資料包將由資料包轉發子模組來處理。 

路由器都能執行資料包的轉發操作,而主機一般只能傳送和接受資料包,因為主機上 /proc/sys/net/ipv4/ip_forward 核心引數預設設定 0,我麼可以修改 它來使主機的資料包轉發功能。
對於允許 IP 資料包轉發的系統 ,資料包轉發子模組將對期望轉發的資料包執行:

  • 檢測資料包頭部 TTL 值,如果為0,則丟棄該資料包
  • 檢視資料包頭部的嚴格源路由選項標誌,如果被設定。則檢測資料包的目標IP地址是否是本機的某個 IP 地址,如果不是 則傳送 ICMP 源站選路失敗報文給傳送端/
  • 如果有必要,則給源傳送一個 ICMP 重定向報文,以告訴它一個更合理的下一跳路由器。
  • 將 TTL 減 1
  • 處理 IP 頭部選項
  • 如果有必要,則執行 IP 分片操作。

2.6 重定向 (ICMP 重定向)

file
ICMP 重定向報文的型別值為5,程式碼欄位有 4 個可選值,用來區分不同的重定向型別,主機重定向為 1.

ICMP重定向報文的資料部分很明確:

  • 引起重定向的 IP資料包(即圖中 原始 IP資料包) 的源端 IP 地址。
  • 應該使用的路由器 IP 地址

接受主機根據這兩個資訊就可以斷定引起重定向的IP 資料包應該使用哪個路由器來轉發,並且更新路由表(通常更新路由表緩衝)
/proc/sys/net/ipv4/conf/all/send_redirects 核心引數指定是否允許傳送 ICMP 重定向報文
/proc/sys/net/ipv4/conf/all/accept_redirects 核心引數指定是否允許節後首 ICMP重定向報文。

一般來說, 主機只能接受 ICMP 重定向報文,而路由器只能傳送 ICMP 重定向報文。

2.6.2 主機重定向例項

2.7 IPv6 頭部結構

IPv6 解決了 IPv4 地址不夠用的問題,
增加了多播和流的功能,為網路上多媒體內容的質量提供精細的控制,
引入自動配置功能,使區域網管理更方便,
增加了專門的網路安全功能等。

2.7.1 IPv6 固定頭部結構

IPv6 頭部由 40 位元組的固定頭部和可變長的擴充套件頭部組成。

file

  • 4 位版本號 指定 IP 協議的版本,對於 IPv6 來說,值為 6
  • 8位通訊型別:執行資料流通訊型別或優先順序,和 IPv4 中的 TOS 累屎
  • 20 位流標籤:新增欄位,用於某些對連線的服務質量有特殊要求的通訊,比如音訊或者視訊等實時資料傳輸
  • 16位淨荷長度: IPv6 擴充套件頭部和應用程式資料長度之和,不包括固定頭部長度
  • 8 位下一個包頭: 指出緊跟IPv6 固定頭部後的包頭型別,如擴充套件頭或某個上協議頭(如TCP UDP ICMP ),類似於IPv4頭部中的協議欄位,且相同的取值有相同的含義。
  • 8 位跳數限制 和IPv4 中 TTL 含義相同
  • IPv6 用 128 位(16位元組)來表示 IP 地址,使 IP 地址的總量達到了 2^128 個。

2.7.2 IPv6 擴充套件頭部

可變長的擴充套件頭部,使得 IPv6 能支援更多選項,長度可以為 0 。
一個資料包可以包含多個擴充套件頭部,每個擴充套件頭部的型別由前一個頭部中的下一個報頭欄位指定。

可以使用的擴充套件頭部:
file

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章