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

在前兩篇文章中,我分別介紹了數據鏈路層和網絡層的IP協議。雖然這個系列教程的重點是搞定 TCP/IP,不過不用著急,本文簡要介紹完與 IP 協議相關的技術,下一篇文章就會正式、詳細的介紹 傳輸層與 TCP 協議。這篇文章會介紹 DNSARPNAT 協議,這些內容雖然與 TCP 沒有直接關聯,但理解它們的原理有助于鞏固基礎知識,更好的理解網絡的工作原理。

DNS 解析

IP地址用于識別通信雙方的地址,但它是一串長數字,不方便記憶,人們希望主機有自己自己的名字,這個名字是唯一的,而且容易記住。于是,誕生了“域名”的概念。域名是一種為了識別主機名稱和機構名的具有分層的名稱,比如在域名 neu.edu.cn中,neu是主機名,educn 是不同層次下的機構名。

域名和 IP 地址都可以唯一對應一臺主機,DNS 協議的作用就是將自身具有意義的域名轉換成不容易記住的 IP 地址。

域名是分層的,每層都有自己的 DNS 服務器用于處理 DNS 解析的請求。這樣的好處在于每層的服務器不用關注過多的信息,它只要知道自己這一層下的域名服務器信息即可。以解析域名: www.ietf.org為例:


DNS解析過程

根服務器其實并不知道 www.ietf.org 的 IP 地址,但是它知道 itef.org 域名服務器的地址,所以它把這條查詢請求轉發給 itef.org 域名服務器。DNS請求被逐層下發,直到找到對應的 IP 地址為止。

ARP 協議

ARP 協議(Address Resolution Protocol)用于通過目標 IP 地址,定位下一個接收數據包的網絡設備的 MAC 地址。如果目標主機處在同一個數據鏈路上,那么可以直接得到目標主機的 MAC 地址,否則會得到下一條路由器的 MAC 地址。

ARP 協議的工作原理可以分為兩部分:ARP 請求和 ARP 響應。 首先,源主機會通過廣播發送一個 ARP 請求包:“我要與 IP 地址為 xxx 的主機通話,誰知道它的 MAC地址?”。

數據鏈路上的所有主機都會收到這條消息并檢查自己的 IP 地址,如果與 ARP 請求包中的 IP 地址一致,主機就會發送 ARP 響應包:“我就是 IP 地址為 xxx 的主機,我的 MAC 地址是:xxxx”。

下圖表示了 ARP 協議的工作機制:


ARP機制

在實際的使用過程中,每次往目標主機發送數據都要使用 ARP 是很低效的,通常的做法是把獲取到的 MAC 地址緩存一段時間。一般來說,一旦源主機向目標地址發送一個數據包,接下來繼續發送多次的概率非常大,因此這種緩存非常容易命中。

當下一次發送 ARP 請求或超過一定時間后,緩存都會失效,這保證了即使 MAC 地址與 IP 地址的對應關系發生了變化,數據包依然能夠被正確的發往目標地址。

再次強調一下,MAC 和 IP 地址雖然看上去功能類似(都是用于唯一區分主機),但是兩者缺一不可。如果只有 IP 地址,雖然可以跳過 ARP,直接在數據鏈路上發一個廣播,但是這僅適用于通信雙方處于同一個數據鏈路下的情況。如果雙方處于不同的數據鏈路,數據報無法穿透中間的路由器。

如果全世界只用 MAC 地址,那么請參考交換機的自學過程,可以想象這個過程會帶來龐大的,不必要的流量。

正因為 MAC 和 IP 地址缺一不可,所以才產生了 ARP 這樣的協議將兩者關聯起來。

NAT 和 NAPT 技術

NAT (Network Address Translator) 是一種用于將局域網中的私有地址轉換成全局 IP 地址的技術。

在連接上無線路由器的時候,如果檢查一下設備的 IP 地址,也許你會發現是類似于 192.168.1.1 這樣的局域網 IP 地址。那不同網段中,IP 地址都是 192.168.1.1 的主機改如何通信呢?

下圖描繪了 NAT 的工作原理:

局域網中 IP 地址為 10.0.0.10 的主機向全局 IP 地址 163.221.120.9 發送數據。NAT 路由器將數據包的源地址修改成自己的全局 IP 地址:202.244.174.37。同理,接收數據時,路由器把目標地址 202.244.174.37 翻譯成內網地址:10.0.0.10


NAT工作原理

路由器只有一個對外的全局 IP 地址,如果有多個內網主機都向外部通訊怎么辦呢?這時就要使用 NAPT 技術,它和 NAT 從原理上類似,但它可以轉換 TCP 和 UDP 端口號。

使用 NAPT 技術時,不同的內網 IP 被轉換成同一個公共 IP 地址,也就是路由器對外顯示的全局 IP 地址,但是被附加不同的端口號以示區分:


NAPT工作原理

不管是 NAT 還是 NAPT,都需要路由器路由器內部維護一張自動生成的地址轉換表。以 TCP 為例,建立 TCP 連接首次握手的 SYN 包發出時會生成這個表,關閉連接時會發出 FIN 包,收到這個包的應答時轉換表被刪除。

如果暫時不了解 TCP 協議和三次握手也沒有關系,下一篇文章將會有詳細的講解。



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

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

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

相關文章

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 然后必須重啟電腦后生效 還有一種說法:不用指令直接重啟就可以了。

winform datagridview控件使用

最近做項目時&#xff0c;顯示查詢結果總需要綁定到datagridview控件上顯示&#xff0c;總結了給datagridview綁定數據的方式&#xff0c;以及導出datagridview數據到excel表格&#xff0c;如有錯誤請多指教 1.直接綁定數據源&#xff0c;可以綁定的數據格式有List<T>,Da…

Node — 第五天

1. MySQL數據庫 phpstudy 數據庫服務器及圖形化軟件 軟件鏈接 鏈接&#xff1a;https://pan.baidu.com/s/1F8wdoMstHAJkINfDKDejsw 提取碼&#xff1a;xl3k 數據庫對于我們前端同學來說&#xff0c;就是一個了解。 對于不會變化的數據&#xff08;省、市、縣&#xff09;&…

iOS10 權限訪問崩潰

手機升級了 iOS10 Beta&#xff0c;然后用正在開發的項目 裝了個ipa包&#xff0c;發現點擊有關 權限訪問 直接Crash了&#xff0c;并在控制臺輸出了一些信息&#xff1a; This app has crashed because it attempted to access privacy-sensitive data without a usage descr…