之前寫過一篇《通俗易懂TCP/IP(概述)》 , 廣受歡迎和好評 , 有網友催更 , 便抽空續寫IP章節 , 回應粉絲期待 。
TCP/IP網絡模型TCP/IP網絡模型分為4層 , 自下而上分布為鏈路層(又叫網絡接口層)、網絡層、傳輸層、應用層 。
文章插圖
- 鏈路層:處理數據在媒介上的表示、傳輸以及與硬件交互的細節 。
- 網絡層:IP層負責IP數據報的路由轉發 , 所有的TCP、UDP、ICMP和IGMP數據都通過IP數據報傳輸 。網絡層(IP)提供了一種盡力而為、無連接、不可靠的數據報交付服務 , IP負責將IP數據報(又叫分組)放入數據鏈路層傳輸 , 并處理分片和重組邏輯 。
- 傳輸層:為端主機上運行的應用程序提供端到端服務 , 包括TCP和UDP 。
- TCP提供了帶流量控制、擁塞控制、有序、可靠的流交付 , TCP需要處理丟包檢測重傳、重排序等IP層不處理的問題 , TCP面向連接 , 不保留消息邊界 。
- UDP提供的功能基本上沒有超越IP , 不提供速率控制和差錯控制 , 不保證可靠性 , UDP只是提供一套端口號 , 用于復用、多路分解(即把收到的數據報交給應用層對應程序處理)和校驗數據完整性(只檢錯不糾錯) , UDP面向非連接 , 保留消息邊界 。
- 應用層:負責處理特定應用的細節 , 通常應用的實現都是基于TCP/IP或者UDP/IP 。應用層與應用細節相關 , 與網絡數據傳輸無關 , 而之下的三層(鏈路層、網絡層、傳輸層)則對應用一無所知 , 但需要處理通信的細節 。
文章插圖
分層的目標是隔離 , 通過分層實現:下層對上層透明 , 而上層利用下層提供的能力 。
分層的另一個優點是協議復用 , 這種復用允許多種協議共存于同一基礎設施之中 , 復用可以發生在不同層 , 并在每層都有不同類型的標識符區分 , 用于確定信息屬于哪個協議 。
比如在鏈路層的數據幀(Frame)有一個協議標識符字段 , 用來標識鏈路層幀攜帶的協議是IP還是ARP;又比如在網絡層的IP數據報頭部有一個8位協議字段 , 標識該IP數據報來自于TCP、還是UDP、亦或是ICMP、IGMP...
封裝【通俗易懂網絡協議 pdu是什么】數據在發送端從上到下經過TCP/IP協議棧 , 遵循應用層->TCP/UDP->IP->鏈路層的順序 。
當某層的一個協議數據單元(PDU)對象轉換為由底層攜帶的數據格式表示 , 這個過程稱為在相鄰低層的封裝 , 即上層被封裝對象作為不透明數據充當底層的Payload部分 , 封裝是層層包裹的過程 。
文章插圖
每層都有自己的消息對象(PDU)的概念 。
- TCP層的PDU叫TCP段(segment)
- UDP層的PDU叫UDP數據報(Datagram)
- IP層的PDU叫IP數據報(Datagram)
- 鏈路層的PDU叫鏈路層幀(Frame)
具體到TCP傳輸數據而言 , 發送端的數據要經過三次封裝 。
- 應用層數據經過TCP層的時候 , 會增加TCP頭部 , 產生TCP Segment , TCP頭部中的端口號是該層的分解標識符 。
- TCP Segment經過IP層的時候 , 會增加IP頭部 , 產生IP Datagram , IP頭部中的協議類型字段是該層的分解標識符 。
- IP分組經過鏈路層的時候 , 會增加以太網首部和尾部 , 產生以太網Frame , 幀頭部中的以太網類型字段 , 可用于區分IPv4(0x8000)、IPv6(0x86DD)和ARP(0x0806) 。
接收端的數據還原也需要經歷三次解封 。
- 經過鏈路層會剝離以太網首尾部 , 根據以太網類型字段 , 如果是IP Datagram則交給IP模塊 。
- 經過IP層會清除IP頭部 , 根據IP頭部中的協議類型字段 , 交給TCP、UDP或者ICMP、IGMP模塊 。
- 經過TCP/UDP層去掉TCP/UDP頭部 , 根據端口號 , 最終將數據還原取出 , 并交付給應用程序 。
文章插圖
封裝發生在發送方 , 拆封(還原)發生在接收方 。
消息邊界應用層將協議攜帶的數據寫入消息 , 消息邊界是兩次寫入操作之間的位置或字節偏移量 。
保留消息邊界的協議(UDP)在接收方能獲得發送方的消息邊界 , 而不保留消息邊界的協議(TCP)在接收方將不能獲得發送方的消息邊界 。
文章插圖
比如發送端通過UDP協議先后發送2個大小分別為100、200字節的消息 , 接收端通過UDP協議接收數據 , 將分2次分別接收到100、200字節的消息 , 但不保證接收100、200消息的先后順序 。
而TCP是數據流協議 , 如果發送端通過TCP協議先后發送2個大小為100和200字節的消息 , 接收端會收到300字節數據 , 但每次接收返回的不一定是100、200字節消息 , 接收端丟失了發送端的消息邊界 。
網絡地址IP地址用于IP層 , IPv4的IP地址是32位整數 , 最多可以表示40多億個IP地址 , 按8位一字節 , 則分為4字節 , 每個字節是一個0~255的無符號整數 , 所以可以表示為“abc.def.ghi.jkl”的點分十進制格式 , 也可以表示為32位無符號整數 。
點分十進制和無符號32位無符號整數可以很容易換算 。
IPv4地址空間分成五大類 , A、B、C類用于Internet單播 , D類地址供組播使用 , E類地址保留 。
IPv4的32位又被劃分為網絡號和主機號 , 可以把網絡號想象成到小區的郵政地址 , 而主機號想象成房間號 。
文章插圖
鏈路層使用48bit的MAC地址 , ARP和RARP用于IP地址和MAC地址之間的相互換算 。
應用程序編程接口操作系統通過提供編程接口(API)來支持應用程序的網絡開發 , 目前最流行的API是套接字(Socket) , 也叫Berkeley套接字 。
Socket抽象層位于應用層跟傳輸層之間 , 提供創建、綁定、監聽、連接、發送、接收、關閉等常用方法 。
文章插圖
Internet協議IP是TCP/IP協議族中的核心協議 , 為傳輸層提供IP數據報的交付能力 , 它負責將IP數據報從網絡一端傳遞到另一端 , 實現數據轉發 。
IP的另一個作用是:在發送端 , 接收來自傳輸層的協議數據單元(PDU) , 添加IP首部封裝為IP數據報 , 交給協議族的下一層鏈路層 。
在接收端(包括中間路由器) , 接收來自鏈路層的PDU , 去掉IP首部 , 根據IP首部中的協議類型 , 將數據分發給TCP、UDP或者其他 。
IP只是完成分組交換(轉發) , 如果你希望得到可靠性保證 , IP會說:對不起 , 做不了 。
發送一個IP數據報猶如寄一個快遞 , 只需把目的地收件人寫在快遞上 , 快遞公司會路由分發 , 但中間有可能丟件 , 丟了不管 , 而且到了 , 也不會有確認 , 一切隨緣 。
基于TCP/IP協議族構建的網絡 , 可以區分為端系統(兩邊的主機)和中間系統(中間路由器) , 端主機實現網絡所有層 , 而路由器實現傳輸層之下的所有層 , IP使用逐跳協議 , IP之上的各層使用端到端協議 。
路由器路由器工作于網絡層 , 是IP層的核心設備 。
路由器有兩個或兩個以上的網絡接口 , 用于連接兩個或多個網絡 , 負責將IP數據報(分組)從一個網絡接口轉發到另一個網絡接口 。
帶有多網絡接口(網卡)的主機也能承擔轉發分組的功能 , 這種主機稱為作為路由器使用的主機 。
文章插圖
如果把一個村莊比喻成一個小的局域網 , 那路由器就相當于連接村莊的橋梁 , 路由器屬于中間系統 , 所以連接不同網絡的路由器需要實現不同的鏈路層協議 , 完成不同鏈路層的翻譯轉換功能 。
另一方面 , 路由器實現鏈路層+網絡層這2層就夠了 , 而不必實現傳輸層和應用層 , 這是由它的功能(實現分組交換)決定的 。
每個IP分組都是一個IP數據報 , 包含發送方和接收方的第三層地址(IP地址) , 即32位的IPv4或128位的IPv6 , IP數據報首部中的目的地址決定將該數據報發往何處 , 而做出決定和發送數據報到下一跳的過程叫轉發 , 轉發依賴于路由表 , 是存儲于內存中的一個數據結構 。
IP協議格式在貼出IP協議格式之前 , 我們可以設想一下 , IP協議需要包括哪些信息 , 這比直接上圖+死記硬背要好 。
根據之前封裝的描述 , 顯然 , IP數據報應該是包括IP首部+數據負載 , 而這個不透明的負載(Payload)來自于TCP、UDP或者其他 。
所以我們講IP數據報格式 , 其實就是IP首部的組成和結構 , 因為數據負載來自于上層 , 而封裝的本質要求上層的數據對下層隱藏、無須解釋 , 既然IP的Payload對于IP層透明 , 那自然沒什么可講的 。
IP首部由各種不同用途和含義的字段組成 。
因為IP分32位的IPv4和128位的IPv6 , 所以IP首部需要包括版本號字段用來區分這兩種情況 。
因為IP負責分組轉發 , 所以IP首部應該包括目的IP地址 , 用于路由轉發邏輯的處理 , 另外接收端可能需要找到該分組的來源 , 所以也應該包含來源IP地址 。
TCP、UDP、ICMP、IGMP都通過IP數據報傳輸 , 所以在IP首部 , 需要包含一個協議字段 , 用于區分該IP數據報承載的是哪種類型的協議 。
IP不糾錯 , 但是需要檢查錯誤 , 數據在傳輸過程中 , 有可能出錯 , 導致接收到的數據跟發送的不一樣 , 所以接收端需要有方法知道傳輸過程中 , 數據是否跟發送端一致 , 所以頭部校驗和字段也是必要的 。
因為IP要處理分片和重組 , 所以IP首部需要包含相關信息 , 以支持該功能 。
IP分IPv4和IPv6兩種 , 協議格式不同 , 本文講述以IPv4為主 , 先給一個IPv4的數據報圖 , 不帶選項的IP數據報頭部為20字節 。
文章插圖
版本 , IP協議的第一個字段都是版本字段 , 這也是IPv4和IPv6唯一相同的字段 , IP數據報的版本字段為4對應IPv4 , 為6對應IPv6 , 主機或者路由器可以根據版本字段 , 分別處理IPv4或IPv6(稱為雙棧) 。
IHL , Internet頭部長度 , 該字段為4位 , 表示頭部(包括選項)32位字的數量 , 也就是說 , 真正的用字節表示的頭部長度應該是IHL的值 , 再乘以4(32位=4字節) , 因為4位能表示的最大2進制為1111 , 對應十進制15 , 所以IPv4的首部最多60(15*4)字節 。
DS , 服務類型字段占6bit , 顯示控制通知(ECN)占2bit , 一共8bit , 該8bit用來替換了最初版本的服務類型(ToS)字段 , 原因是ToS其實沒怎么被用 。
總長度字段 , 是IP數據報的總長度 , 包括首部和數據 。
接下來的32位字(4字節) , 標識(16bit)+標志(3bit)+分片偏移(13bit)用于分片和重組邏輯 。
TTL , 生存期字段用于設置數據報可經過路由器數量的上限 。超此上限的IP數據報將被丟棄 。
協議字段 , 8bit , 提供多路分解功能 , 滿足IP協議可用于攜帶多種(TCP、UDP、ICMP、IGMP等)協議類型的有效載荷的要求 , TCP對應值17 , UDP對應值為6 。
頭部校驗和字段 , 僅計算IPv4頭部 , 不包括數據 , 數據(Payload)的校驗由傳輸層協議去保證 , 校驗和的含義很簡單明了 , 在發送端根據IP頭部的各位計算出一個數值 , 接收端根據接收到的IP頭部的各位重算一個數值 , 如果該值等于校驗和字段 , 那就哦了 , 否則 , 傳輸過程中出錯了 , 這個IP數據報不靠譜 , 扔了吧 。
分片和重組鏈路層對可傳輸的幀有一個最大長度的限制 , 以太網對數據幀的長度上限是1500字節 , 鏈路層可傳輸幀的長度限制叫做最大傳輸單元(MTU) 。
如果IP層有一個數據報要傳 , 且數據長度比鏈路層的MTU還大 , 那么IP層就需要對該數據報分片(fragmentation) , 把超限的數據報切分為若干片 , 使得每片都小于MTU限制 。
IP層接收到一份要發送的數據報時 , 通過選路邏輯來決定向哪個接口(網卡)發送數據 , 發送數據之前 , 需要查詢該接口獲得其MTU , 然后將數據報長度與MTU進行比較 , 如果需要 , 則進行分片 , 分片可以發生在原始發送端主機 , 也可以發生在中間路由器上 。
IP數據報分片后 , 到達目的地后才進行重新組裝 , 恢復分片前的IP數據報信息 , 重組由目的主機的IP層完成 。因此 , 分片和重組對傳輸層(TCP、UDP)透明 , IP首部中的標識、標志、分片偏移字段為分片和重組提供了足夠的信息 。
IP數據報首部中的標識(16bit)保存分片的唯一值 , 這意味著屬于同一IP數據報的多個分片擁有相同的標識值 。
標志(3bit)字段中的一位用來表示“是否有更多的片” , 除最后一片外 , 其他組成數據報的分片該位設1 , 最后一片置0表示沒有更多的片 , 也就是最后一片;片偏移字段用來標識該片在原始IP數據報中的位置 。
當IP數據報切分為多個分片(IP數據報)后 , 每個分片的總長度字段(16bit)要更改為該片的長度值 。
對鏈路層而言 , 不管是完整的IP數據報 , 還是IP數據報的一個分片 , 都以IP分組同等視之 , 分組是IP層把數據報傳遞給鏈路層的一個概念 , 既可能是一個獨立IP數據報也可能是一個IP數據報的分片 。每個分組(分片)都有自己的IP首部 , 并在選路時與其他分組(分片)獨立路由 , 所以這些分片到達目的端可能失序 , 但IP首部有足夠信息重新組裝這些片 。
任何一個分片的丟失 , 都要導致重傳整個數據報 , 這是因為重傳機制在傳輸層 , 而分片對傳輸層透明 。
文章插圖
上圖是UDP數據報在IP層的分片示例 , 可見UDP首部只存在第一個分組(分片)之中 , 這很容易理解 , 因為經傳輸層封裝后的數據報對于IP層而言是透明的 , IP不區分UDP首部和UDP數據 , 它們都是不透明的Payload 。
接收端在收到IP分片后 , 相同標識值的分片屬于同一個被切分的數據報 , 然后對分片偏移排序 , 更多片標志位為0的分組是最后一片 , 排序后的分組 , 如果分配偏移連續 , 且最后一個分組也到達 , 則表示整個數據報都到達了 , 則恢復數據報 , 否則繼續等待 。
IP轉發IP轉發的概念很簡單 , 就是路由器為IP數據報挑選一個接口發送出去 。
從發送端到目的端 , 之間經歷的所有路由器構成網絡路由的完整路徑 , 這跟從家到公司經過的所有路口構成的路徑類似 。
當網絡接口(網卡)收到數據報時 , IP模塊檢查數據報目的地址是否為自己的IP地址 , 如果是 , 數據報交付給由協議字段指定的協議模塊(TCP、UDP等) , 如果不是 , 則判斷IP層是否配置為路由器 , 如果是 , 則轉發 , 如果不是 , 丟棄 , 因為主機不轉發那些不是由它生成的數據報 。
IP層包含一些位于內存中的信息 , 稱為路由表 , 每次轉發數據報時 , 都要查詢路由表 , 執行最長前綴匹配法 , 決定挑選哪個路由表項做數據轉發 。IP轉發逐跳進行 , 每次轉發假設離目的地更近一步 , 路由器和主機不包含到目的地的完整路徑信息 。
路由表是路由條目的列表 , 每個路由條目包括以下幾項關鍵信息 。
- 目的地:一個32位字段 , 用于與掩碼操作結果相匹配 。
- 掩碼:一個32位字段 , 用于與IP數據報中的目的IP地址做按位與操作 。
- 下一跳:下一個IP實體(路由器或者主機)的32位IP地址 , 數據報將被轉發到該地址 。
- 接口:用于將數據報發送給下一跳的網絡接口(網卡) 。
- 首先取出數據報中的目的IP地址 , 然后與路由條目的掩碼字段進行按位與 , 按位與的結果如果等于路由條目的目的地 , 則該條目與目的地IP匹配 , 該條目進入候選集合 。
- 從候選集合中選擇最匹配的條目 , 即掩碼最多位為1的條目 , 取出下一跳字段作為轉發數據報的下一跳IP地址 。
- 通過最匹配條目的網絡接口 , 發送到下一跳 。
- 如果沒有匹配條目 , 則數據報無法交付 , 通過ICMP發送“主機不可達”通知發送主機 。
歡迎關注:"碼磚雜役"公眾號和頭條號 , 本號專注于科技互聯網知識傳播和分享 。
- 郵政編碼是一個國家或地區為實現郵件分揀自動化和郵政網絡數位化 河南省項城市的郵政編碼
- 在雙代號網絡計劃中,當計劃工期等于計算工期時
- 網絡安全成為國家安全重要組成部分 網絡概念股有哪些
- 網絡電視是直播嗎
- 網絡數據與大數據 什么叫網絡大數據
- 解聘勞動合同協議書 解聘勞動合同協議書企業要加什么字
- 常用的網絡硬件設備有哪些?其功能是什么 常用的網絡硬件設備有哪些
- 復印的協議可以被勞動監察認可嗎
- 解除勞務合同協議書 協議解除勞動合同有經濟補償金嗎
- 為什么登錄快手無法連接網絡
