TCP/IP(二):IP協議

IP協議處于OSI參考模型的第三層——網絡層,網絡層的主要作用是實現終端節點間的通信。IP協議是網絡層的一個重要協議,網絡層中還有ARP(獲取MAC地址)和ICMP協議(數據發送異常通知)

數據鏈路層的作用在于實現同一種數據鏈路下的包傳遞,而網絡層則可以實現跨越不同數據鏈路的包傳遞。比如主機A通過Wi-Fi連接到路由器B,路由器B通過以太網連接到路由器C,而路由器C又通過Wi-Fi與主機D保持連接。這時主機A向D發送的數據包就依賴于網絡層進行傳輸。

這篇文章主要介紹IP協議的基本知識和IP首部,IP協議可以分為三大作用模塊:IP尋址、路由和IP分包。

IP地址

IP地址是一種在網絡層用于識別通信對端信息的地址。它有別于數據鏈路層中的MAC地址,后者用于標識同一鏈路下不同的計算機。

舉一個形象的例子,我要從鎮江的家里去沈陽的東北大學,通信兩端的地址分別是家和學校,他們相當于IP地址。然而沒有交通工具可以讓我從家直接去學校,所以我先要打車去火車站,然后坐高鐵到沈陽站,再轉公交去學校。這三次中轉分別屬于三種交通方式(數據鏈路),每一次中轉都有起點和終點,他們就相當于MAC地址。每次中轉可以稱為一跳(Hop)

IP地址由32位正整數表示,為了直觀的表示,我們把它分成4個部分,每個部分由8位整數組成,對應十進制的范圍就是0-255。

比如172.20.1.1可以表示為:10101100 00010100 00000001 00000001。轉換規則很簡單,就是分別把四個部分的十進制(0-255)與8位二進制數字進行轉換。

從功能上看,IP地址由兩部分組成:網絡標識和主機標識。

網絡標識用于區分不同的網段,相同段內的主機必須擁有相同的網絡表示,不同段內的主機不能擁有相同的網絡標識。

主機標識用于區分同一網段下不同的主機,它不能在同一網段內重復出現。

32位IP地址被分為兩部分,到底前多少位是網絡標識呢?一般有兩種方法表示:IP地址分類、子網掩碼。

IP分類

IP地址分為四個級別,分別為A類、B類、C類和D類。分類的依據是IP地址的前四位:

A類IP地址是第一位為“0”的地址。A類IP地址的前8位是網絡標識,用十進制標識的話0.0.0.0-127.0.0.0是A類IP地址的理論范圍。另外我們還可以得知,A類IP地址最多只有128個(實際上是126個,下文不贅述),每個網段內主機上限為2的24次方,也就是16,777,214個。

B類IP地址是前兩位為“10“的地址。B類IP地址的前16位是網絡標識,用十進制標識的話128.0.0.0-191.255.0.0是B類IP地址的范圍。B類IP地址的主機標記長度為16位,因此一個網段內可容納主機地址上限為65534個。

C類IP地址是前三位為“110”的地址。C類IP地址的前24位是網絡標識,用十進制標識的話192.0.0.0-223.255.255.0是C類IP地址的范圍。C類地址的后8位是主機標識,共容納254個主機地址。

D類IP地址是前四位為“1110”的地址。D類IP地址的網絡標識長32位,沒有主機標識,因此常用于多播。

子網掩碼

IP地址總長度32位,它能表示的主機數量有限,大約在43億左右。而IP地址分類更是造成了極大的浪費,A、B類地址一共也就一萬多個,而世界上包含主機數量超過254的網段顯然不止這么點。

我們知道IP地址分類的本質是區分網絡標識和主機標識,另一種更加靈活、細粒度的區分方法是使用子網掩碼。

子網掩碼長度也是32位,由一段連續的1和一段連續的0組成。1的長度就表示網絡標識的長度。以IP地址172.20.100.52為例,它本來是一個B類IP地址(前16位是網絡標識),但通過子網掩碼,它可以是前26為為網絡標識的IP地址:


子網掩碼

路由控制

路由控制(Routing)是指將分組數據發送到目標地址的功能,這個功能一般由路由器完成。(不要與家里用的小型無線路由器混為一談)

路由器中保存著路由控制表,它在路由控制表中查找目標IP地址對應的下一個路由器地址。下圖描述了這一過程:


路由控制

主機A的地址是10.1.1.30,要把數據發往地址為10.1.2.10的主機。在主機A的路由表中,保存了兩個字段,由于目標地址10.1.2.1010.1.1.0/24段不匹配,所以它被發往默認路由10.1.1.1也就是圖中路由器1的左側網卡的IP地址。

路由器1繼續在它自己的路由控制表中查找目標地址10.1.2.10,它發現目標地址屬于10.1.2.0/24這一段,因此將數據轉發至下一個路由器10.1.0.2,也就是路由器2的左側網卡的地址。

路由器2在自己的路由控制表中查找目標地址10.1.2.10,根據表中記錄將數據發往10.1.2.1接口,也就是自己的右側網卡的IP地址。主機B檢查目標IP地址和自己相同,于是接收數據。

路由控制表

路由控制的關鍵在于路由控制表,路由控制表可以由管理員手動設置,稱為靜態路由控制,但是估計大部分人沒這么干過。這是因為路由器可以喝其他路由器互換信息比即使自動刷新路由表,這個信息交換的協議并沒有在IP協議中定義,而是由一個叫做“路由協議”的協議管理。

環路

上圖中,假設主機A向一個不存在的IP地址發送數據,并且路由器1、2、3設置的默認路由形成了一個循環,那么數據將在網絡中不斷轉發最終導致網絡擁堵。這個問題將在下文分析IP首部時得到解決。

IP報文分割重組

在數據鏈路層中,我們已經提到過不同的數據鏈路有不同的最大傳輸單元(MTU)。因此IP協議的一個任務是對數據進行分片和重組。分片由發送端主機和路由器負責,重組由接收端主機負責。

路徑MTU發現

分片會加重路由器的負擔,因此只要條件允許,我們都不希望路由器對IP數據包進行分片處理。另外,如果一個分片丟失,整個IP數據報都會作廢。

解決以上問題的技術是“路徑MTU發現”。主機會首先獲取整個路徑中所有數據鏈路的最小MTU,并按照整個大小將數據分片。因此傳輸過程中的任何一個路由器都不用進行分片工作。

為了找到路徑MTU,主機首先發送整個數據包,并將IP首部的禁止分片標志設為1.這樣路由器在遇到需要分片才能處理的包時不會分片,而是直接丟棄數據并通過ICMP協議將整個不可達的消息發回給主機。

主機將ICMP通知中的MTU設置為當前MTU,根據整個MTU對數據進行分片處理。如此反復下去,直到不再收到ICMP通知,此時的MTU就是路徑MTU。

以UDP協議發送數據為例:


路徑MTU發現

重組

接收端根據IP首部中的標志(Flag)和片偏移(Fragment Offset)進行數據重組。具體內容將在分析IP首部時詳細解釋。

IP首部(IPv4)

IP首部是一個有些復雜的結構,我們不用記憶它的結構,只需了解每個部分的作用即可,這樣可以加深對IP協議的理解。


IP首部

其中幾個重要的部分介紹如下:

  • 總長度(Total Length):表示IP首部與數據部分總的字節數,該段長16比特,所以IP包的最大長度為65535字節(2^16)。雖然不同數據鏈路的MTU不同,但是IP協議屏蔽了這些區別,通過自己實現的數據分片功能,從上層的角度來看,IP協議總是能夠以65535為最大包長進行傳輸。

  • 標識(ID:Identification):用于分片重組。屬于同一個分片的幀的ID相同。但即使ID相同,如果目標地址、源地址、上層協議中有任何一個不同,都被認為不屬于同一個分片。

  • 標志(Flags):由于分片重組,由三個比特構成。

    第一個比特未使用,目前必須是0。

    第二個比特表示是否進行分片,0表示可以分片,1表示不能分片。在路徑MTU發現技術中就用到了這個位。

    第三個比特表示在分片時,是否表示最后一個包。1表示不是最后一個包,0表示分配中最后一個包。

  • 片偏移(FO: Fragment Offset):由13比特組成,表示被分片的段相對于原始數據的位置。它可以表示8192(2^13)個位置,單位為8字節,所以最大可以表示8 x 8192 = 65536字節的偏移量。

  • 生存時間(TTL: Time To Live):表示包可以經過多少個路由器的中轉。每經過一個路由器,TTL減1。這樣可以避免前文提到的無限傳遞包的問題。

  • 協議: 表示IP首部的下一個首部屬于哪個協議。比如TCP協議的編號為6,UDP編號為17.
  • 首部校驗和:用于檢查IP首部是否損壞
  • 可選項:僅在試驗或診斷時用,可以沒有。如果有,需要配合填充(Padding)占滿32比特。


文/bestswifter(簡書作者)
原文鏈接:http://www.jianshu.com/p/9cb5cf1864da
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248013.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ajax — 大事件項目(第四天)

分類管理 添加分類 初步使用彈出層 給 “添加分類” 綁定一個單擊事件單擊事件中,使用 layer.open() 實現一個彈出層 type: 1, 彈層的類型是頁面層title, “添加文字分類”content: ‘字符串,DOM’,area: [‘500px’, ‘250px’] // ---------------…

redis學習(四)

一、Redis 鍵(key) 1、Redis 鍵命令用于管理 redis 的鍵。 2、Redis 鍵命令的基本語法如下:redis 127.0.0.1:6379> COMMAND KEY_NAME 3、常用key命令 keys * 獲取所有的keyselect 0 選擇第一個庫move myString 1 將當前的數據庫key移動到某個…

TCP/IP(三):IP協議相關技術

在前兩篇文章中,我分別介紹了數據鏈路層和網絡層的IP協議。雖然這個系列教程的重點是搞定 TCP/IP,不過不用著急,本文簡要介紹完與 IP 協議相關的技術,下一篇文章就會正式、詳細的介紹 傳輸層與 TCP 協議。這篇文章會介紹 DNS、ARP…

Node — 第一天

Node-01 會 JavaScript,就能學會 Node.js!!! **Node.js 的官網地址: ** Node.js 的學習路徑: JavaScript 基礎語法 Node.js 內置 API 模塊(fs、path、http等) 第三方 API 模塊&…

TCP/IP(四):TCP 與 UDP 協議簡介

從本章開始,我們開始介紹最重要的傳輸層。傳輸層位于 OSI 七層模型的第四層(由下往上)。顧名思義,傳輸層的主要作用是實現應用程序之間的通信。網絡層主要是保證不同數據鏈路下數據的可達性,至于如何傳輸數據則是由傳輸…

Node — 第二天

http模塊 搭建服務器的步驟 ① 導入 http 模塊 ② 創建 web 服務器實例 ③ 為服務器實例綁定 request 事件,監聽客戶端的請求 ④ 啟動服務器 // ① 導入 http 模塊 const http require(http);// ② 創建 web 服務器實例 const server http.createServer();/…

《學習之道》第九章不要突擊工作

靈感從天而降的時刻確實是存在的。 這樣少見的創造性突破,通常是在經歷了一番神經緊張的準備、竭盡全力的努力,甚至包括熬夜工作后才姍姍來遲。這與 數學 和 科學標準的一天學習 是大不相同的。 它更像體育運動:每隔一陣子會有一天的比賽&…

TCP/IP(五):TCP 協議詳解

上一節 中講過,TCP 協議是面向有連接的協議,它具有丟包重發和流量控制的功能,這是它區別于 UDP 協議最大的特點。本文就主要討論這兩個功能。 數據包重發 數據發送 丟包重發的前提是發送方能夠知道接收方是否成功的接收了消息。所以&#…

nodeJS — 學習的筆記

Node介紹 為什么要學習Node.js 企業需求 具有服務端開發經驗更改front-endback-end全棧開發工程師基本的網站開發能力 服務端前端運維部署 多人社區 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MVqHkEIo-1588084625862)(C:\Users\A\AppData\R…

TCP/IP(六):HTTP 與 HTTPS 簡介

本文是準備面試過程中網絡部分總結整理的最后一篇文章,主要介紹以下知識: HTTP 協議概述POST 請求和 GET 請求Cookie 和 Session數據傳輸時的加密HTTPS 簡介 HTTP 協議 在 OSI 七層模型中,HTTP 協議位于最頂層的應用層中。通過瀏覽器訪問網…

Node — 第三天

模塊化 什么是模塊化 模塊化是指解決一個復雜問題時,自頂向下逐層把系統劃分成若干模塊的過程。 對于整個系統來說,模塊是可組合、分解和更換的單元。 生活中的模塊化 編程中的模塊化 編程領域中的模塊化,就是遵守固定的規則,…

FireDAC 中文字段過濾問題

當使用 FireDAC Filter 過濾數據的時候,通常這樣寫: FDMemTable.Filtered : False; FDMemTable1.Filter : 姓名 string(edtFilter.Text).QuotedString; FDMemTable.Filtered : True; 將會報錯:[FireDAC][Stan][Eval]-107. Invalid characte…

UIScrollViewDelegate-代理API詳解

在iOS編程中,經常用到UIScrollView控件。自然也會用到UIScrollViewDelegate協議。 今天就抽空,研究了一下UIScrollViewDelegate中所有的委托方法。 僅做Mark!如有,錯誤之處,歡迎留言指正,交流!貼…

License for package Android SDK Build-Tools 28.0.2 not accepted.(MAC)

https://blog.csdn.net/user11223344abc/article/details/83997907轉載于:https://www.cnblogs.com/dtdxrk/p/10812469.html

Express — 使用步驟

Express Express 介紹安裝搭建服務器的步驟express提供的新方法GET接口 獲取GET中的請求參數 POST接口 獲取POST請求提交的數據 中間件原理中間件語法中間件初體驗(設置響應頭)中間件開放靜態資源中間件接收POST請求體中間件返回404頁面 express 介紹 E…

大模型工具_Langchain-Chatchat

https://github.com/chatchat-space/Langchain-Chatchat 原Langchain-ChatGLM 1 功能 整體功能,想解決什么問題 基于 Langchain 與 ChatGLM 等LLM模型,搭建一套針對中文場景與開源模型,界面友好、可離線運行的知識庫問答解決方案。 當前解決…

iOS 鍵盤風格詳解UIKeyboardType

一、鍵盤風格 UIKit框架支持8種風格鍵盤。 [java] view plaincopy print?typedef enum { UIKeyboardTypeDefault, // 默認鍵盤:支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默認鍵盤 UIKeyboardTypeNu…

MySQL Hardware--FIO壓測

FIO參數 filename/export/1.txt 支持文件系統或者裸設備,-filename/dev/sda2或-filename/dev/sdb direct1 測試過程繞過機器自帶的buffer,使測試結果更真實 rwrandwread 測試隨機讀的I/O rwrandwrite 測試隨機…

Node — 第四天(Promise與路由)

Promise - ES6新對象 Promise能夠處理異步程序。 回調地獄 JS中或node中,都大量的使用了回調函數進行異步操作,而異步操作什么時候返回結果是不可控的,如果我們希望幾個異步請求按照順序來執行,那么就需要將這些異步操作嵌套起來…

xcode8 升級后注釋快捷鍵不能使用的解決方法

一種說法: 這個是因為蘋果解決xcode ghost。把插件屏蔽了。解決方法 命令運行: sudo /usr/libexec/xpccachectl 然后必須重啟電腦后生效 還有一種說法:不用指令直接重啟就可以了。