徹底搞懂計(jì)算機(jī)網(wǎng)絡(luò)通信設(shè)備與協(xié)議
原創(chuàng)【51CTO.com原創(chuàng)稿件】目錄
一、前言
二、設(shè)備
2.1 調(diào)制解調(diào)器
2.2 中繼器
2.3 網(wǎng)卡
2.4 交換機(jī)
2.4.1 交換機(jī)的工作原理
2.5 路由器
2.5.1 路由控制表
三、協(xié)議
3.1 DNS
3.1.1 DNS查詢過程
3.1.2 查看修改DNS
3.2 ARP
3.2.1 ARP工作原理
3.2.2 查看本機(jī)ARP
3.3 DHCP
3.3.1 DHCP 的工作機(jī)制
3.4 NAT
3.4.1 NAT的工作機(jī)制
3.5 ICMP
3.5.1 ping
四、尾聲
一、前言
面試時(shí)回答計(jì)算機(jī)網(wǎng)絡(luò)這塊的問題,很對(duì)應(yīng)試者回答的內(nèi)容多為講解計(jì)算機(jī)網(wǎng)絡(luò)的 TCP 三次握手、四次揮手,或者是 OSI 七層模型的細(xì)節(jié)闡釋。
當(dāng)被問到數(shù)據(jù)包如何在網(wǎng)絡(luò)上進(jìn)行傳輸?shù)?,比?IP 路由、ARP 尋址、交換機(jī)與路由器的區(qū)別、私有 IP 與全局 IP 的轉(zhuǎn)換等細(xì)節(jié),只能沉默以對(duì)。
本文將會(huì)梳理清楚數(shù)據(jù)包在網(wǎng)絡(luò)中由一臺(tái)主機(jī)發(fā)往另一臺(tái)主機(jī)的詳細(xì)過程,內(nèi)容包括調(diào)制解調(diào)器、中繼器、網(wǎng)卡、交換機(jī)、路由器等網(wǎng)絡(luò)設(shè)備,以及 IP 協(xié)議相關(guān)技術(shù) DNS、ARP、DHCP、NAT、ICMP等。
二、設(shè)備
搭建一套網(wǎng)絡(luò)環(huán)境要涉及各種各樣的電纜和網(wǎng)絡(luò)設(shè)備,既然要搞清楚數(shù)據(jù)的傳輸,那就先搞清楚數(shù)據(jù)傳輸?shù)拿浇椤?/p>
如圖所示,主機(jī)A向主機(jī)B發(fā)送數(shù)據(jù)包,需要經(jīng)過交換機(jī)、路由器等設(shè)備。但在物理層(OSI 模型的第 1 層),還需要調(diào)制解調(diào)器和中繼器。
2.1 調(diào)制解調(diào)器
現(xiàn)代家庭網(wǎng)絡(luò)搭建寬帶時(shí),可以看到路由器后接的調(diào)制解調(diào)器(英語:Modem),我們一般親切稱之為“貓”。
調(diào)制解調(diào)器是將計(jì)算機(jī)產(chǎn)生的數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)進(jìn)行傳輸,并解調(diào)收到的模擬信號(hào)以得到數(shù)字信號(hào)的電子設(shè)備。
以前用電話線上網(wǎng)用的是電話調(diào)制解調(diào)器,現(xiàn)在都是光纖上網(wǎng),用的是光纖調(diào)制解調(diào)器,即用于數(shù)字信號(hào)與光纖信號(hào)的轉(zhuǎn)換。
2.2 中繼器
同調(diào)制解調(diào)器一樣工作在物理層的還有中繼器,它的作用是將電纜傳過來的電信號(hào)或光信號(hào)經(jīng)由中繼器的波形調(diào)整和放大再傳給另一個(gè)電纜,簡而言之,中繼器是對(duì)減弱的信號(hào)進(jìn)行放大和發(fā)送的設(shè)備。
2.3 網(wǎng)卡
一臺(tái)計(jì)算機(jī)要想上網(wǎng)必備的就是網(wǎng)卡,而現(xiàn)在大多數(shù)計(jì)算機(jī)也早已內(nèi)置了網(wǎng)卡。
網(wǎng)卡,又稱為網(wǎng)絡(luò)適配器、LAN 卡,是一塊被設(shè)計(jì)用來允許計(jì)算機(jī)在計(jì)算機(jī)網(wǎng)絡(luò)上進(jìn)行通訊的計(jì)算機(jī)硬件。由于其擁有 MAC 地址,因此屬于 OSI 模型的第 2 層(數(shù)據(jù)鏈路層)。
我們所講的計(jì)算機(jī)的 MAC 地址或主機(jī)的 MAC 地址,實(shí)際上是網(wǎng)卡的 MAC 地址。
如下圖所示,Mac 電腦可以在「系統(tǒng)偏好設(shè)置 - 網(wǎng)絡(luò) - Wi-Fi - 高級(jí) - 硬件」查看當(dāng)前計(jì)算機(jī)的 MAC 地址。
2.4 交換機(jī)
換機(jī)是一種網(wǎng)絡(luò)設(shè)備,通過報(bào)文交換方式接收和轉(zhuǎn)發(fā)數(shù)據(jù)到目標(biāo)設(shè)備。
簡而言之,交換機(jī)就是接收數(shù)據(jù)包、查看數(shù)據(jù)包的目的地址以選擇路由、將數(shù)據(jù)包轉(zhuǎn)發(fā)給下一跳路由。
需要明確,交換機(jī)不修改數(shù)據(jù)包,只負(fù)責(zé)轉(zhuǎn)發(fā)數(shù)據(jù)包。
交換機(jī)又被稱為網(wǎng)橋或者 2 層交換機(jī),所謂 2 層,就是工作于數(shù)據(jù)鏈路層。這代表著,交換機(jī)在轉(zhuǎn)發(fā)數(shù)據(jù)包時(shí),不知道也無需要知道來源主機(jī)和目的主機(jī)的 IP 地址,只需知其 MAC 地址。
2.4.1 交換機(jī)的工作原理
交換機(jī)內(nèi)部的 CPU 會(huì)在每個(gè)端口成功連接時(shí),通過將 MAC 地址和端口對(duì)應(yīng),形成一張 MAC 表。
當(dāng)一臺(tái)交換機(jī)安裝配置好之后,其工作過程如下:
- 交換機(jī)端口 1 收到 MAC 地址為 X 的計(jì)算機(jī)發(fā)給 MAC 地址為 Y 的計(jì)算機(jī)的數(shù)據(jù)包,交換機(jī)從而記下了 MAC 地址 X 在端口 1 。(學(xué)習(xí))
- 如果目的地 MAC 地址 Y 不能在 MAC 表中找到時(shí),交換機(jī)會(huì)把數(shù)據(jù)包轉(zhuǎn)發(fā)給除端口 1 外的所有數(shù)據(jù)包。(洪泛)
- MAC 地址 Y 的計(jì)算機(jī)收到該數(shù)據(jù)包,向 MAC 地址 X 發(fā)出確認(rèn)包。交換機(jī)收到該包后,從而記錄下 MAC 地址 Y 所在的網(wǎng)段。
- 交換機(jī)向 MAC 地址 X 轉(zhuǎn)發(fā)確認(rèn)包。(轉(zhuǎn)發(fā))
- 交換機(jī)收到一個(gè)數(shù)據(jù)包,查表后發(fā)現(xiàn)該數(shù)據(jù)包的來源地址與目的地址屬于同一個(gè)端口,交換機(jī)將不處理該數(shù)據(jù)包。(過濾)
- 交換機(jī)內(nèi)部的 MAC 地址-端口 查詢表的每條記錄采用時(shí)間戳記錄最后一次訪問的時(shí)間。早于某個(gè)閾值(用戶可配置)的記錄被清除。(老化)
5. 路由器
路由器可以連接不同的數(shù)據(jù)鏈路。例如連接兩個(gè)以太網(wǎng)?,F(xiàn)在,人們?cè)诩一蜣k公室里連接互聯(lián)網(wǎng)時(shí)所使用的寬帶路由器也是路由器的一種。
路由器是在 OSI 模型的第 3 層即網(wǎng)絡(luò)層面上連接兩個(gè)網(wǎng)絡(luò)、并對(duì)分組報(bào)文進(jìn)行轉(zhuǎn)發(fā)的設(shè)備。
交換機(jī)是根據(jù)物理地址(MAC地址)進(jìn)行處理,參考的是 MAC 表,而路由器則是根據(jù) IP 地址進(jìn)行處理,所參考的表叫做路由控制表。
2.5.1 路由控制表
發(fā)送數(shù)據(jù)包時(shí)所使用的地址是網(wǎng)絡(luò)層的 IP 地址。然而僅僅有 IP 地址還不足以實(shí)現(xiàn)將數(shù)據(jù)包發(fā)送到對(duì)端目標(biāo)地址,在數(shù)據(jù)發(fā)送過程中還需要類似“指明下一個(gè)路由器或主機(jī)”的這方面信息,以便真正發(fā)往目標(biāo)地址。保存這種信息的就是路由控制表。
實(shí)現(xiàn) IP 通信的主機(jī)和路由器都必須持有一張這樣的表。它們也正是在這個(gè)表格的基礎(chǔ)上才得以進(jìn)行數(shù)據(jù)包發(fā)送的。
該路由控制表的形成方式有兩種:一種是管理員手動(dòng)設(shè)置,另一種是路由器與其它路由器相互交換信息時(shí)自動(dòng)刷新。前者也叫靜態(tài)路由控制,而后者叫做動(dòng)態(tài)路由控制。
為了讓動(dòng)態(tài)路由及時(shí)刷新路由表,在網(wǎng)絡(luò)上互連的路由器之間必須設(shè)置好路由協(xié)議,保證正常讀取路由控制信息。
路由控制表中記錄著網(wǎng)絡(luò)地址與下一步應(yīng)該發(fā)送至路由器的地址。在發(fā)送 IP 包時(shí),首先要確定 IP 包首部中的目標(biāo)地址,再從路由控制表中找到該地址具有相同網(wǎng)絡(luò)地址的記錄,根據(jù)該記錄將 IP 包轉(zhuǎn)發(fā)給相應(yīng)的下一個(gè)路由器。
如果路由控制表中存在多條相同網(wǎng)絡(luò)地址的記錄,就選擇一個(gè)最為吻合的網(wǎng)絡(luò)地址。所謂最為吻合是指相同位數(shù)最多的意思。
例如 172.20.100.52 的網(wǎng)絡(luò)地址與 172.20/16 和 172.20.100/24 兩項(xiàng)都匹配。此時(shí),應(yīng)該選擇匹配度最長的 172.20.100/24 。
默認(rèn)路由是指路由表中任何一個(gè)地址都能與之匹配的記錄。默認(rèn)路由一般標(biāo)記為 0.0.0.0/0 或 default。這里的 0.0.0.0/0 并不是指 IP 地址是 0.0.0.0,為了避免人們誤以為 0.0.0.0 是IP地址,故后綴是 /0 。
三、協(xié)議
在訪問 Web 站點(diǎn)和發(fā)送、接收電子郵件時(shí),我們通常會(huì)直接輸入 Web 網(wǎng)站的地址或電子郵件地址等那些由應(yīng)用層提供的地址,而不會(huì)使用由十進(jìn)制數(shù)字組成的某個(gè) IP 地址。
但是網(wǎng)絡(luò)層需要的是 IP 地址,這就需要一種功能--將應(yīng)用中使用的地址映射為 IP 地址。
此外,在數(shù)據(jù)鏈路層也不需要 IP 地址,需要的是 MAC 地址傳輸數(shù)據(jù)包。由此可知,在實(shí)際通信中,還需要眾多支持 IP 的相關(guān)技術(shù)才能夠?qū)崿F(xiàn)通信。
IP 的輔助技術(shù)包括 DNS、ARP、ICMP、ICMPv6、DHCP、NAT等。還包括如 IP 隧道、 IP多播、IP任播、質(zhì)量控制以及網(wǎng)絡(luò)擁塞的顯式通知和 Mobile IP 技術(shù)。
3.1 DNS
域名系統(tǒng)(英語:Domain Name System,縮寫:DNS)是互聯(lián)網(wǎng)的一項(xiàng)服務(wù)。它作為將域名和 IP 地址相互映射的一個(gè)分布式數(shù)據(jù)庫,能夠使人更方便地訪問互聯(lián)網(wǎng)。DNS 使用 TCP 和 UDP 端口 53 。當(dāng)前,對(duì)于每一級(jí)域名長度的限制是 63 個(gè)字符,域名總長度則不能超過 253 個(gè)字符。
3.1.1 DNS查詢過程
以查詢 zh.wikipedia.org 為例: 客戶端發(fā)送查詢報(bào)文 "query zh.wikipedia.org" 至DNS服務(wù)器,DNS服務(wù)器首先檢查自身緩存,如果存在記錄則直接返回結(jié)果。 如果記錄老化或不存在,則:
- DNS服務(wù)器向根域名服務(wù)器發(fā)送查詢報(bào)文"query zh.wikipedia.org",根域名服務(wù)器返回頂級(jí)域 .org 的權(quán)威域名服務(wù)器地址。
- DNS服務(wù)器向 .org 域的權(quán)威域名服務(wù)器發(fā)送查詢報(bào)文"query zh.wikipedia.org",得到二級(jí)域 .wikipedia.org 的權(quán)威域名服務(wù)器地址。
- DNS服務(wù)器向 .wikipedia.org 域的權(quán)威域名服務(wù)器發(fā)送查詢報(bào)文"query zh.wikipedia.org",得到主機(jī) zh 的A記錄,存入自身緩存并返回給客戶端。
3.1.2 查看修改DNS
如下圖所示,Mac 電腦可以在「系統(tǒng)偏好設(shè)置 - 網(wǎng)絡(luò) - Wi-Fi - 高級(jí) - DNS」查看當(dāng)前網(wǎng)絡(luò)所使用的 DNS。
為什么我們從來不需要設(shè)置 DNS 服務(wù)器呢?這是因?yàn)楝F(xiàn)代路由器大多具備 DHCP 服務(wù)器的功能,DHCP 服務(wù)器自動(dòng)為我們提供默認(rèn)的 DNS 服務(wù)器地址。
路由器會(huì)將連接到自身所有設(shè)備的 DNS 服務(wù)器地址設(shè)置為自己的 IP 地址。連接該路由器的手機(jī)、電腦等網(wǎng)絡(luò)設(shè)備的 DNS 請(qǐng)求,統(tǒng)一發(fā)送至路由器 IP 地址,此時(shí)路由器扮演各設(shè)備的 DNS 服務(wù)器。然后,路由器轉(zhuǎn)發(fā) DNS 請(qǐng)求,到實(shí)際的 DNS 服務(wù)器。實(shí)際的 DNS 服務(wù)器解析域名 IP,返回給路由器。最后,路由器再把 IP 返回給終端設(shè)備。
發(fā)送 DNS 請(qǐng)求到 DNS 服務(wù)器獲取網(wǎng)站真實(shí)的 IP 地址,這個(gè)過程需要一定的時(shí)間,影響這個(gè)時(shí)間的因素之一就是 DNS 服務(wù)器的地理位置。DNS 服務(wù)器離你越近,傳輸數(shù)據(jù)自然更快。因此默認(rèn)情況下,路由器將從網(wǎng)絡(luò)提供商提供獲取最近的 DNS 服務(wù)器地址,實(shí)現(xiàn)最快的網(wǎng)絡(luò)響應(yīng)。
3.2 ARP
只要確定了 IP 地址,就可以向這個(gè)目標(biāo)地址發(fā)送 IP 數(shù)據(jù)報(bào)。然而,在底層數(shù)據(jù)鏈路層,進(jìn)行實(shí)際通信卻有必要了解每個(gè) IP 地址所對(duì)應(yīng)的 MAC 地址。
于是需要一種方法,根據(jù)目的主機(jī)的 IP 地址,獲得其 MAC 地址。這就是 ARP 協(xié)議要做的事情。所謂地址解析(address resolution)就是主機(jī)在發(fā)送幀前將目標(biāo) IP 地址轉(zhuǎn)換成目標(biāo) MAC 地址的過程。
另外,當(dāng)發(fā)送主機(jī)和目的主機(jī)不在同一個(gè)局域網(wǎng)中時(shí),即便知道對(duì)方的 MAC 地址,兩者也不能直接通信,必須經(jīng)過路由轉(zhuǎn)發(fā)才可以。所以此時(shí),發(fā)送主機(jī)通過 ARP 協(xié)議獲得的將不是目的主機(jī)的真實(shí) MAC 地址,而是一臺(tái)可以通往局域網(wǎng)外的路由器的 MAC 地址。于是此后發(fā)送主機(jī)發(fā)往目的主機(jī)的所有幀,都將發(fā)往該路由器,通過它向外發(fā)送。這種情況稱為委托 ARP 或 ARP代理(ARP Proxy)。
3.2.1 ARP工作原理
ARP 是如何知道 MAC 地址的呢?簡單來說,ARP 是借助 ARP 請(qǐng)求與 ARP 響應(yīng)兩種類型的包確定 MAC 地址的。
在每臺(tái)安裝有 TCP/IP 協(xié)議的電腦或路由器里都有一個(gè) ARP 緩存表,表里的 IP 地址與 MAC 地址是一對(duì)應(yīng)的,如下表所示。
以主機(jī)A(192.168.38.10)向主機(jī)B(192.168.38.11)發(fā)送數(shù)據(jù)為例。
- 當(dāng)發(fā)送數(shù)據(jù)時(shí),主機(jī)A會(huì)在自己的 ARP 緩存表中尋找是否有目標(biāo) IP 地址。如果找到就知道目標(biāo) MAC 地址為(00-BB-00-62-C2-02),直接把目標(biāo) MAC 地址寫入幀里面發(fā)送就可。
- 如果在 ARP 緩存表中沒有找到相對(duì)應(yīng)的 IP 地址,主機(jī)A就會(huì)在網(wǎng)絡(luò)上發(fā)送一個(gè)廣播(ARP request),目標(biāo) MAC 地址是“FF.FF.FF.FF.FF.FF”,這表示向同一網(wǎng)段內(nèi)的所有主機(jī)發(fā)出這樣的詢問:“192.168.38.11的 MAC 地址是什么?”
- 網(wǎng)絡(luò)上其他主機(jī)并不響應(yīng) ARP 詢問,只有主機(jī)B接收到這個(gè)幀時(shí),才向主機(jī)A做出這樣的回應(yīng)(ARP response):“192.168.38.11的 MAC 地址是00-BB-00-62-C2-02”,此回應(yīng)以單播方式。這樣,主機(jī)A就知道主機(jī)B的 MAC 地址,它就可以向主機(jī)B發(fā)送信息。同時(shí)它還更新自己的 ARP 高速緩存(ARP cache),下次再向主機(jī)B發(fā)送信息時(shí),直接從 ARP 緩存表里查找就可。
需要注意,示例的主機(jī) A 和主機(jī) B 屬于同一網(wǎng)段。如果主機(jī) A 和主機(jī) B 不屬于同一網(wǎng)段,那么主機(jī) A 發(fā)送的廣播(ARP request)主機(jī) B 就不可能收到。
所以,在發(fā)送廣播(ARP request)前,主機(jī) A 會(huì)判斷主機(jī) B 是否屬于同一網(wǎng)段,如果不屬于,就會(huì)在自己的 ARP 緩存表中尋找網(wǎng)關(guān)(也就是路由器)的 MAC 地址。如果沒有找到,主機(jī) A 就會(huì)在網(wǎng)絡(luò)上發(fā)送一個(gè)廣播(ARP request)詢問網(wǎng)關(guān)(路由器)的 MAC 地址。
ARP 緩存表采用老化機(jī)制,在一段時(shí)間內(nèi)如果表中的某一行沒有使用,就會(huì)被刪除,這樣可減少緩存表的長度,加快查詢速度。
3.2.2 查看本機(jī)ARP
如何查看本機(jī) ARP 緩存表呢?
- Windows:開始 → 運(yùn)行 → cmd → arp -a(參數(shù)a表示顯示所有內(nèi)容)
- Linux:終端 → arp -nv
- MacOS:終端 → arp -nla
3.3 DHCP
如果逐一為每一臺(tái)主機(jī)設(shè)置 IP 地址會(huì)是非常繁瑣的事情。于是,為了實(shí)現(xiàn)自動(dòng)設(shè)置 IP 地址、統(tǒng)一管理 IP 地址分配,就產(chǎn)生了 DHCP 協(xié)議。
如下圖所示,Mac 電腦可以在「系統(tǒng)偏好設(shè)置 - 網(wǎng)絡(luò) - Wi-Fi - 高級(jí) - TCP/IP」查看當(dāng)前本地 IP 配置。
DHCP 服務(wù)器會(huì)統(tǒng)一管理每個(gè)子網(wǎng)的 IP 地址分配范圍、子網(wǎng)掩碼、默認(rèn)路由以及 DNS 服務(wù)器。
有了 DHCP ,計(jì)算機(jī)只要連接到網(wǎng)絡(luò),就可以進(jìn)行 TCP/IP 通信。也就是說,DHCP 讓即插即用變得可能。而 DHCP 不僅在 IPv4 中,在 IPv6 中也可以使用。
3.3.1 DHCP 的工作機(jī)制
在使用 DHCP 之前,首先要架設(shè)一臺(tái) DHCP 服務(wù)器(很多時(shí)候用該網(wǎng)段的路由器充當(dāng) DHCP 服務(wù)器。)。然后將 DHCP 所要分配的 IP 地址設(shè)置到服務(wù)器上。此外,還需要將相應(yīng)的子網(wǎng)掩碼、路由控制信息以及 DNS 服務(wù)器的地址等設(shè)置到服務(wù)器上。
DHCP 服務(wù)器搭建好之后,DHCP 的運(yùn)行分為四個(gè)基本過程,分別為請(qǐng)求 IP 租約、提供 IP 租約、選擇 IP 租約和確認(rèn) IP 租約。所謂租約,也就是計(jì)算機(jī) IP 地址的有效期。
由此,DHCP 的網(wǎng)絡(luò)設(shè)置結(jié)束,可以進(jìn)行 TCP/IP 通信。不需要 IP 地址時(shí),可以發(fā)送 DHCP 解除包。
另外,DHCP客戶端在 IP 租約到期前可以發(fā)送 DHCP 請(qǐng)求包通知想要延長這個(gè)時(shí)限。
3.4 NAT
告訴大家一個(gè)有趣的實(shí)驗(yàn),拿起你的手機(jī)和電腦,連接同一 Wi-Fi ,然后訪問百度,輸入“IP”,你會(huì)驚奇的看到手機(jī)和電腦顯示的 IP 地址是相同的,而且并非是本機(jī) IP 地址。
那么問題來了,在數(shù)據(jù)包的發(fā)送過程中,是根據(jù)網(wǎng)絡(luò)層的來源 IP 地址和目的 IP 地址進(jìn)行定位。同一局域網(wǎng)的來源 IP 地址根據(jù)上面實(shí)驗(yàn)的結(jié)果顯然都是相同的公網(wǎng) IP ,那么百度響應(yīng)過來的數(shù)據(jù)包是如何精確發(fā)送到我們的本地計(jì)算機(jī)呢?答案是使用 NAT 技術(shù)。
NAT(Network Address Translator)是用于在本地網(wǎng)絡(luò)中使用私有地址,在連接互聯(lián)網(wǎng)時(shí)轉(zhuǎn)而使用全局 IP 地址。除轉(zhuǎn)換 IP 地址外,還出現(xiàn)了可以轉(zhuǎn)換 TCP、UDP 端口號(hào)的 NART(Network Address Ports Translator)技術(shù),由此可以實(shí)現(xiàn)用一個(gè) IP 地址與多個(gè)主機(jī)的通信?,F(xiàn)在我們所說的 NAT 多半都是 NAPT,或者稱之為 IP 偽裝。
NAT(NAPT)實(shí)際上是為了正在面臨地址枯竭的 IPv4 而開發(fā)的技術(shù),不過,IPv6 為了提高網(wǎng)絡(luò)安全也正在使用 NAT,在 IPv4 和 IPv6 之間的相互通信當(dāng)中常常使用 NAT-PT。
3.4.1 NAT的工作機(jī)制
如下圖所示,以 10.0.0.10 的主機(jī)與 163.221.120.9 的主機(jī)進(jìn)行通信為例。利用 NAT ,途中的 NAT 路由器將發(fā)送源地址從 10.0.0.10 轉(zhuǎn)換為全局的 IP 地址(202.244.174.37)再發(fā)送數(shù)據(jù)。反之,當(dāng)包從地址163.221.120.9 發(fā)過來時(shí),目標(biāo)地址(202.244.174.37)先被轉(zhuǎn)換成私有 IP 地址 10.0.0.10 以后再被轉(zhuǎn)發(fā)。
NAT 對(duì)數(shù)據(jù)包的 IP 首部進(jìn)行改動(dòng),由于在 TCP 或 UDP 中,IP 地址還用于校驗(yàn)和的計(jì)算,因此 IP 發(fā)生變化時(shí),也需要相應(yīng)地將 TCP、UDP 的首部進(jìn)行轉(zhuǎn)換。
在 NAT(NAPT)路由器的內(nèi)部,有一張自動(dòng)生成的用來轉(zhuǎn)換地址的表。當(dāng) 10.0.0.10 向 163.221.120.9 發(fā)送第一個(gè)包時(shí)生成這張表,并按照表中的映射關(guān)系進(jìn)行處理。
當(dāng)私有網(wǎng)絡(luò)內(nèi)的多臺(tái)機(jī)器同時(shí)都要與外部進(jìn)行通信時(shí),僅僅轉(zhuǎn)換 IP 地址,人們不免擔(dān)心全局 IP 地址是否不夠用。這時(shí)采用如下圖所示的包含端口號(hào)一起轉(zhuǎn)換的方式(NAPT)可以解決這個(gè)問題。
如圖所示,主機(jī) 163.221.120.9 的端口號(hào)是 80,局域網(wǎng)有兩個(gè)客戶端 10.0.0.10 和 10.0.0.11 同時(shí)進(jìn)行通信,并且這兩個(gè)客戶端的本地端口都是 1025。此時(shí),僅僅轉(zhuǎn)換 IP 地址為某個(gè)全局地址 202.244.174.37,會(huì)令轉(zhuǎn)換后的所有數(shù)字完全一致。為此,只要將 10.0.0.11 的端口號(hào)轉(zhuǎn)換為 1026 就可以解決問題。
將上圖橢圓形內(nèi)容進(jìn)行合并,生成一個(gè) NAPT 路由器的轉(zhuǎn)換表,就可以正確地轉(zhuǎn)換地址跟端口的組合,令客戶端 A、B 能同時(shí)與服務(wù)器之間進(jìn)行通信。
這種轉(zhuǎn)換表在 NAT 路由器上自動(dòng)生成。例如,在 TCP 的情況下,建立 TCP 連接首次握手時(shí)的 SYN 包一經(jīng)發(fā)出,就會(huì)生成這個(gè)表。而后又隨著收到關(guān)閉連接時(shí)發(fā)出 FIN 包的確認(rèn)應(yīng)答從表中被刪除。
在使用 TCP 或 UDP 的通信當(dāng)中,只有目標(biāo)地址、源地址、目標(biāo)端口、源端口以及協(xié)議類型(TCP 還是 UDP)五項(xiàng)內(nèi)容都一致時(shí)才被認(rèn)為是同一個(gè)通信連接。也就是復(fù)用轉(zhuǎn)換表的同一行記錄。
3.5 ICMP
架構(gòu) IP 網(wǎng)絡(luò)時(shí)需要特別注意兩點(diǎn):確認(rèn)網(wǎng)絡(luò)是否正常工作,以及遇到異常時(shí)進(jìn)行問題診斷。
例如,一個(gè)剛剛搭建好的網(wǎng)絡(luò),需要驗(yàn)證該網(wǎng)絡(luò)的設(shè)置是否正確。ICMP 正是提供這類功能的一種協(xié)議。
ICMP 的主要功能包括,確認(rèn) IP 包是否成功送達(dá)目標(biāo)地址,通知在發(fā)送過程當(dāng)中 IP 包被廢棄的具體原因,改善網(wǎng)絡(luò)設(shè)置等。有了這些功能以后,就可以獲得網(wǎng)絡(luò)是否正常、設(shè)置是否有誤以及設(shè)備有何異常等信息,從而便于進(jìn)行網(wǎng)絡(luò)上的問題診斷。
在 IP 通信中如果某個(gè) IP 包因?yàn)槟撤N原因未能達(dá)到目標(biāo)地址,那么這個(gè)具體的原因?qū)⒂?ICMP 負(fù)責(zé)通知。例如,主機(jī) A 向主機(jī) B 發(fā)送了數(shù)據(jù)包,由于某種原因,途中的路由器未能發(fā)現(xiàn)主機(jī) B 的存在,這時(shí),路由器就會(huì)向主機(jī) A 發(fā)送一個(gè) ICMP 包,說明發(fā)往主機(jī) B 的包未能成功。
ICMP 的消息大致可以分為兩類:一類是通知出錯(cuò)原因的錯(cuò)誤消息,另一類是用于診斷的查詢消息。
3.5.1 ping
ping(呯)是使用 ICMP 協(xié)議的一種計(jì)算機(jī)網(wǎng)絡(luò)工具,用來測試數(shù)據(jù)包能否透過 IP 協(xié)議到達(dá)特定主機(jī)。
ping 的運(yùn)作原理是向目標(biāo)主機(jī)傳出一個(gè) ICMP 的請(qǐng)求回顯數(shù)據(jù)包,并等待接收回顯回應(yīng)數(shù)據(jù)包。程序會(huì)按時(shí)間和成功響應(yīng)的次數(shù)估算丟失數(shù)據(jù)包率(丟包率)和數(shù)據(jù)包往返時(shí)間(網(wǎng)絡(luò)時(shí)延,Round-trip delay time)。
ping 有時(shí)候也被我們說成了動(dòng)詞,如 “ping一下計(jì)算機(jī)XXX,看它是否開著。”
下面以 ping 百度的網(wǎng)址作為示例:
可以看到,百度的 IP 地址是 61.135.169.125,以 64 bytes 測試,反應(yīng)時(shí)間 5.589 毫秒,TTL(Time To Live)值為 56。
這里不得不解釋 TTL 是什么?
IP 包中有一個(gè)字段叫做 TTL (Time To Live,生存周期),它的值隨著沒經(jīng)過一次路由器就會(huì)減 1,直到減到 0 時(shí)該 IP 包會(huì)被丟棄。此時(shí),IP 路由器將會(huì)發(fā)送一個(gè) ICMP 超時(shí)的消息給發(fā)送端主機(jī),并通知該包已被丟棄。
示例中 TTL 的值為 56 ,假設(shè)發(fā)送端設(shè)置的 TTL 為 64,那么中間經(jīng)歷的路由數(shù)為 64 - 56 = 8。
四、尾聲
根據(jù) OSI 七層模型,HTTP 數(shù)據(jù)報(bào)為應(yīng)用層,在傳輸層附加 TCP 首部,指明源端口號(hào)和目標(biāo)端口號(hào),在網(wǎng)絡(luò)層附加 IP 首部,指明發(fā)送端和接收端的 IP 地址,指明上層協(xié)議號(hào)(TCP/UDP),在數(shù)據(jù)鏈路層附加以太網(wǎng)首部,指明接收端 MAC 地址和發(fā)送端 MAC 地址。
這是你以往的認(rèn)知,通過本文的學(xué)習(xí),相信你可以對(duì) 本機(jī) IP 地址、子網(wǎng)掩碼的配置,本機(jī) MAC 地址,目的機(jī)器 IP 地址,其它機(jī)器 MAC 地址的獲取等做到知其然又知其所以然。
作者介紹
薛勤,公眾號(hào)“代碼藝術(shù)”的作者,就職于阿里巴巴,熱衷于探索計(jì)算機(jī)世界的底層原理,個(gè)人在 Github@Ystcode 上擁有多個(gè)開源項(xiàng)目。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】