本文內(nèi)容為《圖解TCP/IP》一書學(xué)習(xí)筆記。本文主要概述四到五章內(nèi)容。
第四章 IP即網(wǎng)絡(luò)協(xié)議
4.1 IP相當(dāng)于OSI參考模型中的第3層
IP相當(dāng)于OSI參考模型中的第3層——網(wǎng)絡(luò)層。網(wǎng)絡(luò)層主要實現(xiàn)“點對點”(end-to-end)通信。數(shù)據(jù)鏈路層的作用是在互連同一種數(shù)據(jù)鏈路之間的節(jié)點進行包傳遞。而一旦跨越多種數(shù)據(jù)鏈路,就需要借助網(wǎng)絡(luò)層。

IP的主要作用就是在復(fù)雜的網(wǎng)絡(luò)環(huán)境中將數(shù)據(jù)包發(fā)送給最終地址。
主機:配置有IP地址,但不進行路由控制的設(shè)備。
路由器:既配有IP地址又具有路由控制能力的設(shè)備。
網(wǎng)絡(luò)層與數(shù)據(jù)鏈路層的關(guān)系如下圖:

類比現(xiàn)實生活中的旅行,到達目的地可能需要先后乘坐飛機、火車、公交車。
4.2 IP基礎(chǔ)知識
IP三大作用模塊:IP尋址、路由(最終節(jié)點為止的轉(zhuǎn)發(fā))以及IP分包與組包。以下對這三點逐一介紹。
4.2.1 IP尋址
在計算機通信中,為了識別通信段,必須要有一個類似于地址的識別碼進行標(biāo)識。而在數(shù)據(jù)鏈路層,使用MAC地址來標(biāo)識同一個鏈路中不同計算機的一種識別碼。在網(wǎng)絡(luò)層,則叫做IP地址。
在網(wǎng)橋或交換集線器等物理層或數(shù)據(jù)鏈路層數(shù)據(jù)包轉(zhuǎn)發(fā)設(shè)備中,不需要設(shè)置IP地址。因為這些設(shè)備只負責(zé)將IP轉(zhuǎn)化為0、1比特流轉(zhuǎn)發(fā)或?qū)?shù)據(jù)鏈路幀的數(shù)據(jù)部分進行轉(zhuǎn)發(fā),不需要應(yīng)對IP協(xié)議。
4.2.2 路由控制
路由控制(Routing)是指將分組數(shù)據(jù)發(fā)送到最終目標(biāo)地址的功能。即使網(wǎng)絡(luò)非常復(fù)雜,也可以通過路由控制確定到達目標(biāo)地址的通路。因此,一個數(shù)據(jù)包之所以能夠成功地到達最終的目標(biāo)地址,全靠路由控制。
Hop中文叫“跳”,它是指網(wǎng)絡(luò)中的一個區(qū)間,IP包正是在網(wǎng)絡(luò)中一個跳間被轉(zhuǎn)發(fā)。

數(shù)據(jù)鏈路實現(xiàn)某一個區(qū)間(一跳)內(nèi)的通信,而IP實現(xiàn)直至最終目標(biāo)地址的通信(點對點)。
一跳的范圍:利用數(shù)據(jù)鏈路層以下分層的功能傳輸數(shù)據(jù)幀的一個區(qū)間;即從源MAC地址到目標(biāo)MAC地址之間傳輸幀的區(qū)間;也即主機或路由器網(wǎng)卡不經(jīng)其他路由器而能直接到達的相鄰主機或路由器網(wǎng)卡之間的一個區(qū)間。
多跳路由:路由器或主機在轉(zhuǎn)發(fā)IP數(shù)據(jù)包時只指定下一個路由器或主機,而不是將到最終目標(biāo)為止的所有通路指定出來。每個區(qū)間(跳)在轉(zhuǎn)發(fā)IP數(shù)據(jù)包時會分別指定下一跳的操作,直至包到達目標(biāo)地址。

為了將數(shù)據(jù)包發(fā)送給目標(biāo)主機,所有主機都維護者一張路由控制表(Routing Table),該表記錄IP數(shù)據(jù)在下一步應(yīng)該發(fā)給哪一個路由器。IP包將根據(jù)這個路由表在各個數(shù)據(jù)鏈路上傳輸。
IP面向無連接,即在發(fā)包之前,不需要建立與對端目標(biāo)地址之間的連接。上層如果遇到需要發(fā)送給IP的數(shù)據(jù),該數(shù)據(jù)會被立即壓縮成IP包發(fā)送出去。
4.2.3 IP分包與組包
IP是實現(xiàn)多個數(shù)據(jù)鏈路之間通信的協(xié)議。不同的數(shù)據(jù)鏈路各自的最大傳輸單位(MTU:Maximum Transmission Unit)不同。為了解決這個問題,IP進行分片處理(IP Fragmentation),即將較大的IP包分成多個較小的IP包。分片的包到了對端目標(biāo)地址以后再被組合起來傳給上一層。有關(guān)分片處理詳見4.5
4.2.4 IP為什么面向無連接
兩個原因:
- 簡化:面向連接比起面向無連接處理相對復(fù)雜
- 提速:每次通信之前都需要建立連接,會降低處理速度
需要有連接時,可以委托上一層(傳輸層)提供此項服務(wù),因此,IP為了實現(xiàn)簡單化與高速化采用面向無連接方式。(補充:面向無連接的情況下,一臺主機對于自己會何時從哪里收到數(shù)據(jù)也是不得而知的,通常會網(wǎng)絡(luò)監(jiān)控,讓主機只接收發(fā)給自己的數(shù)據(jù)包;若沒有做好準(zhǔn)備很有可能錯過一些包,因此無連接的方式下可能會有很多冗余的通信)
IP與TCP關(guān)系:
IP提供盡力服務(wù),即“為了把數(shù)據(jù)包發(fā)送到目標(biāo)地址,盡最大努力”,然而并不做最終收到與否的驗證。上一層的TCP就用來提高通信的可靠性。IP負責(zé)將數(shù)據(jù)發(fā)給目標(biāo)主機,TCP則負責(zé)保證對端主機確實接收到數(shù)據(jù)。
為什么不讓IP具有可靠傳輸?shù)墓δ?,合并這兩種協(xié)議?
- 如果讓一種協(xié)議規(guī)定所有的功能和作用,那么該協(xié)議的具體實施和編程會變得非常復(fù)雜
- 反之,如果能進行有效分層,可以明確TCP與IP各自協(xié)議的最終目的,也有利于后續(xù)對這些協(xié)議進行擴展和性能上的優(yōu)化。
4.3 IP地址
略
4.4 路由控制
路由控制表用于在數(shù)據(jù)發(fā)送過程中指明路由器或主機,在實現(xiàn)IP通信的主機和路由器中都有,路由控制表中記錄著網(wǎng)絡(luò)地址與下一步應(yīng)該發(fā)送至路由器的地址。
IP協(xié)議認為路由表是正確的,但IP本身沒有定義制作路由控制表的協(xié)議。該表是由路由協(xié)議制作而成的,見第七章。
4.4.1 IP地址與路由控制
下圖是發(fā)送IP包的實例:

如果路由控制表中存在多條相同網(wǎng)絡(luò)地址的記錄,就選擇相同位數(shù)最多的網(wǎng)絡(luò)地址。例如172.20.100.52與172.20.16和172.20.100/24都匹配,應(yīng)選擇匹配度最長的172.20.100/24
- 默認路由:路由表中任何一個地址都能與之匹配的記錄。(如果一張路由表中包含所有的網(wǎng)絡(luò)及其子網(wǎng)的信息,會造成無端浪費)默認路由一般標(biāo)記為0.0.0.0/0或default。0.0.0.0/0后面是/0,所以并沒有標(biāo)識IP地址,而是為了避免人們誤以為0.0.0.0是IP地址。
- 主機路由:“IP地址/32”也被稱為主機路由(Host Route)。例如192.168.153.15/32。意味著要基于主機上網(wǎng)卡上配置的IP地址本身,而不是基于該地址的網(wǎng)絡(luò)地址部分進行路由。
主機路由多被用于不希望通過網(wǎng)絡(luò)地址路由的情況。 - 環(huán)回地址:環(huán)回地址是同一臺計算機上的程序之間進行網(wǎng)絡(luò)通信所使用的一個默認地址。一般使用IP地址127.0.0.1或者主機名localhost。
4.4.2 路由控制的聚合
利用網(wǎng)絡(luò)地址的比特分布可以有效的進行分層配置。對內(nèi)即使有多個子網(wǎng)掩碼,對外呈現(xiàn)出的也是同一個網(wǎng)絡(luò)地址。
路由聚合一能夠縮小路由表的大小,二能將已知的路由信息傳送給周圍的其他路由器,以達到控制路由信息的目的。

4.5 IP分割處理與再構(gòu)成處理
4.5.1 數(shù)據(jù)鏈路不同,MTU則相異
每種數(shù)據(jù)鏈路的最大傳輸單元(MTU)都不盡相同。
4.5.2 IP報文的分片與重組
分片處理只要認為路由器有必要,會周而復(fù)始地進行。

經(jīng)過分片之后的IP數(shù)據(jù)報在被重組的時候,只能由目標(biāo)主機進行,路由器雖然做分片但不會進行重組。
4.5.3 路徑MTU發(fā)現(xiàn)
路徑路徑MTU發(fā)現(xiàn)技術(shù)出現(xiàn)原因:
- 路由器要做的其他處理越來越多,例如網(wǎng)絡(luò)過濾。所以允許的話,不希望由路由器進行IP數(shù)據(jù)包的分片處理。
- 分片處理中,一旦某個分片丟失,會造成整個IP數(shù)據(jù)報作廢。TCP設(shè)計初期曾使用過更小的分片進行傳輸,結(jié)果網(wǎng)路的利用率明顯下降。
路徑路徑MTU發(fā)現(xiàn)技術(shù)是什么:
路徑MTU(Path MTU)是指從發(fā)送端主機到接收端主機之間不需要分片時最大MTU的大小,即路徑中存在的所有數(shù)據(jù)鏈路中最小的MTU。這樣可以避免在中途的路由器上進行分片處理,也可以在TCP中發(fā)送更大的包。
路徑路徑MTU實現(xiàn)原理:
- 發(fā)送端發(fā)送IP數(shù)據(jù)報時將其首部的分片禁止標(biāo)志位設(shè)置為1,這樣途中的路由器會直接丟棄需要分片處理的大包,隨后通過一個ICMP的不可達信息將數(shù)據(jù)鏈路上的MTU值給發(fā)送主機。
- 將上一步ICMP通知的MTU值設(shè)置為當(dāng)前MTU,發(fā)送主機根據(jù)這個MTU對數(shù)據(jù)報進行分片處理。
- 如此反復(fù)直到數(shù)據(jù)報被發(fā)送到目標(biāo)主機為止沒再收到任何ICMP,認為最后一次ICMP通知的MTU是一個合適的MTU值。

前面是UDP的例子。TCP情況下,根據(jù)路徑MTU的大小計算出最大段長度 (MSS),然后根據(jù)這些信息進行數(shù)據(jù)報的發(fā)送。因此如果在TCP中采用MTU路徑發(fā)現(xiàn),IP層不會再進行分片處理。

4.6 IPV6
略
4.7 IPV4首部
略
4.8 IPV6首部格式
略
第五章 IP協(xié)議相關(guān)技術(shù)
5.1 僅憑IP無法完成通信
- 人們上往時往往直接輸入Web網(wǎng)站的地址或電子郵件地址等應(yīng)用層地址,而不是使用IP地址,所以需要實現(xiàn)將應(yīng)用中使用的地址映射為IP地址。
- 數(shù)據(jù)鏈路層也不使用IP地址,在以太網(wǎng)的情況下只使用MAC地址傳輸數(shù)據(jù)包。
5.2 DNS
DNS產(chǎn)生原因:通信直接使用IP地址不方便,IP地址不好記 -> 使用主機識別碼來唯一標(biāo)識計算機,這樣通信時可以使用主機名稱而無需輸入IP地址 -> 系統(tǒng)需要實現(xiàn)將主機名轉(zhuǎn)換為具體的IP地址,即使用hosts數(shù)據(jù)庫文件 -> 最初是由互聯(lián)網(wǎng)信息中心整體管理一份hosts文件,這樣每次新加入機器時信息中心的hosts文件就需要變更,其他計算機需要定期下載最新的hosts文件;這種集中管理的方式可行性很低 -> DNS產(chǎn)生
DNS是什么:一種有效管理主機名和IP地址之間的對應(yīng)關(guān)系的系統(tǒng),即DNS系統(tǒng)。在應(yīng)用中,用戶輸入主機名(域名)時,DNS會自動檢索那個注冊了主機名和IP地址的數(shù)據(jù)庫,并迅速定位對應(yīng)的IP地址。
域名是什么:識別主機名稱和組織機構(gòu)名稱的一種具有分層的名稱。例如倉敷藝術(shù)科學(xué)大學(xué)的域名:kusa.ac.jp 。kuaa表示倉敷藝術(shù)科學(xué)大學(xué),ac表示大學(xué),jp代表日本。
使用域名時可以在主機名后追加上組織機構(gòu)的域名。例如主機pepper可以表示為pepper.kusa.ac.jp。
域名服務(wù)器:管理域名的主機和對應(yīng)的軟件,用于管理所在分層的域的相關(guān)信息。

解析器:進行DNS查詢的主機和軟件,例如用戶的PC。一個解析器至少包括組織內(nèi)部的域名服務(wù)器的IP地址。
DNS查詢:

解析器和域名服務(wù)器會將最新了解到的信息暫時保存在緩存里,這樣可以減少每次查詢時的性能消耗。
5.3 ARP
ARP是什么:一種解決地址問題的協(xié)議。以目標(biāo)IP地址為線索,定位下一個應(yīng)該接收數(shù)據(jù)分包的網(wǎng)絡(luò)設(shè)備對應(yīng)的MAC地址。ARP只適用于IPv4,IPv6中使用ICMPv6替代ARP。
ARP工作機制:借助ARP請求與ARP響應(yīng)兩種類型的包確定MAC地址。

總之,從一個IP地址發(fā)送ARP請求包以了解這個IP地址的MAC地址,目標(biāo)地址將自己的MAC地址填入其中的ARP響應(yīng)包返回給發(fā)出請求的IP地址。由此通過ARP從IP地址獲得MAC地址,實現(xiàn)鏈路內(nèi)的IP通信。
如果每發(fā)送一次IP數(shù)據(jù)報就進行一次ARP請求來確定MAC地址,會造成不必要的網(wǎng)絡(luò)流量。通常的做法是將獲取到的IP對MAC的映射關(guān)系緩存到發(fā)送端ARP緩存表中。接收主機端同樣可以緩存MAC地址,以提高效率。
為什么IP地址和MAC地址缺一不可?
疑問1:數(shù)據(jù)鏈路上知道接收端主機B的MAC地址就行了,為什么需要知道主機B的IP?
-
解答1:如下圖所示, 主機A給主機B發(fā)送數(shù)據(jù)報必須經(jīng)過路由器C。即使知道了主機B的MAC地址,由于路由器會隔斷兩個網(wǎng)絡(luò),還是無法實現(xiàn)直接從主機A發(fā)送數(shù)據(jù)報給主機B。主機A必須先將數(shù)據(jù)報發(fā)送給路由器C的MAC地址C1。
疑問2:只要知道了主機B的IP地址,不做ARP,在數(shù)據(jù)鏈路上廣播,不也可以發(fā)給主機B?
解答2:還是看上圖,假定MAC地址就用廣播地址,那么路由器D也將會收到該廣播消息。于是路由器D又將該消息轉(zhuǎn)發(fā)給l路由器C,導(dǎo)致數(shù)據(jù)包被重復(fù)發(fā)送兩次。
5.3.4 RARP
RARP(Reverse Address Resolution Protocol) 則是將ARP反過來,從MAC地址定位IP地址的一種協(xié)議。
5.4 ICMP
ICMP(Internet Control Message Protocol)主要功能包括:確認IP包是否成功送達目標(biāo)地址,通知在發(fā)送過程中IP包被廢棄的具體原因,改善網(wǎng)絡(luò)設(shè)置等等。綜合來講,即驗證網(wǎng)絡(luò)的設(shè)置是否正確,網(wǎng)絡(luò)出現(xiàn)問題時能立刻制止問題的蔓延。ping命令就是ICMP的具體應(yīng)用之一。
ICMP的通知信息會使用IP進行發(fā)送。
ICMP的消息大致分為兩類,一類是通知出錯原因的錯誤信息;另一類是用于診斷的查詢信息。
5.4.2 主要的ICMP消息
- ICMP目標(biāo)不可達信息:IP路由器無法將IP數(shù)據(jù)包發(fā)送給目標(biāo)地址時,會給發(fā)送端主機返回一個目標(biāo)不可達(Destination Unreachable Message)的ICMP信息。
- ICMP重定向消息:如果路由器發(fā)現(xiàn)發(fā)送端主機使用了次優(yōu)的路徑發(fā)送數(shù)據(jù),它會返回一個ICMP重定向(ICMP Redirect Message)的消息給這個主機。這個消息中包含了最合適的路由信息和源數(shù)據(jù)。不過多種情況下這種重定向信息成為引發(fā)問題的原因,所以往往不進行設(shè)置。
- ICMP超時信息:IP包中有一個字段叫做TTL(Time To Live,生存周期),它的值每經(jīng)過一次路由器會減1,減到0時該IP包會被丟棄。此時IP路由器會發(fā)送一個ICMP超時的信息(ICMP Time Exceeded Message)給發(fā)送端主機,并通知該包已被丟棄。設(shè)置TTL的目的是為了在路由控制遇到問題發(fā)生循環(huán)狀況時,避免IP包無休止的在網(wǎng)絡(luò)上被轉(zhuǎn)發(fā)。
- ICMP回送消息:在進行通信的主機或路由器之間,判斷所發(fā)生的數(shù)據(jù)包是否已經(jīng)到達對端的一種消息。可以向?qū)Χ酥鳈C發(fā)送回送請求的消息(ICMP Echo Request Message),也可以接收對端主機發(fā)回來的回送應(yīng)答消息(ICMP Echo Reply Message)。常用的ping命令就是利用這個消息實現(xiàn)的。
5.5 DHCP
如果逐一地為每一臺主機設(shè)置IP地址會非常繁瑣,于是為了實現(xiàn)自動設(shè)置IP地址、統(tǒng)一管理IP地址分配,就產(chǎn)生了DHCP(Dynamic Host Configuration Protocol)協(xié)議。有了DHCP,計算機只要連接到網(wǎng)絡(luò),就可以進行TCP/IP通信。


5.5.2 DHCP的工作機制
使用DHCP之前,要先架設(shè)一臺DHCP服務(wù)器。然后將DHCP所要分配的IP地址設(shè)置到服務(wù)器上。此外,還需要相應(yīng)的子網(wǎng)掩碼、路由控制信息以及DNS服務(wù)器的地址等設(shè)置到服務(wù)器上。

5.6 NAT
NAT(Network Address Translator)用于在本地網(wǎng)絡(luò)中使用私有地址,在連接互聯(lián)網(wǎng)時轉(zhuǎn)而使用全局IP地址的技術(shù)。NAT實際上是為正在面臨地址枯竭的IPv4而開發(fā)的技術(shù)。
5.6.2 NAT的工作機制

當(dāng)私有網(wǎng)絡(luò)內(nèi)的多臺機器同時都要與外部通信時,僅僅轉(zhuǎn)換IP地址,可能會出現(xiàn)全局IP地址不夠用。可以采用下圖所示的包含端口號一起轉(zhuǎn)換的方式(NAPT)來解決這個問題。

現(xiàn)在很多互聯(lián)網(wǎng)服務(wù)都基于IPv4,為了保證這些服務(wù)也能在IPv6中正常使用,產(chǎn)生了NAT-PT規(guī)范,NAT-PT將IPv6首部轉(zhuǎn)換為IPv4首部,從而保證只有IPv6地址的主機也能夠與IPv4地址的其他主機通信。

5.7 IP隧道
IP隧道產(chǎn)生原因:在一個如下圖所示的網(wǎng)絡(luò)環(huán)境中,假如網(wǎng)絡(luò)A、B使用IPv6,中間位置的網(wǎng)絡(luò)C支持使用IPv4的話,網(wǎng)絡(luò)A與網(wǎng)絡(luò)B之間無法直接進行通信。為了讓他們之間正常通信,這時需要采用IP隧道的功能。

IP隧道中可以將那些從網(wǎng)絡(luò)A發(fā)過來的IPv6的包統(tǒng)和為一個數(shù)據(jù),再為之追加一個IPv4的首部以后轉(zhuǎn)發(fā)給網(wǎng)絡(luò)C。
一般情況下,緊接著IP首部的是TCP首部或者UDP的首部,現(xiàn)在“IP首部后面還是IP首部”或“IP首部的后面是IPv6的首部”等情況越來越多。這種在網(wǎng)絡(luò)層的首部后面繼續(xù)追加網(wǎng)絡(luò)層首部的通信方法就叫做“IP隧道”。

