IP協議


IP協議

4.1 IP即網際協議

TCP/IP的心臟是互聯網層。 這一層主要由IP(Internet Protocol) 和ICMP(Internet Control Message Protocol) 兩個協議組成。

4.1.1 IP相當於OSI參考模型的第3層

IP(IPv4、 IPv6) 相當於OSI參考模型中的第3層——網絡層。

網絡層的主要作用是“實現終端節點之間的通信”。 這種終端節點之間的通信也叫“點對點(end-to-end) 通信”。

從前面的章節可知, 網絡層的下一層——數據鏈路層的主要作用是在互連同一種數據鏈路的節點之間進行包傳遞。 而一旦跨越多種數據鏈路, 就需要借助網絡層。 網絡層可以跨越不同的數據鏈路, 即使是在不同的數據鏈路上也能實現兩端節點之間的數據包傳輸

4.1.2 網絡層與數據鏈路層的關系

數據鏈路層提供直連兩個設備之間的通信功能。 與之相比, 作為網絡層的IP則負責在沒有直連的兩個網絡之間進行通信傳輸。 那么為什么一定需要這樣的兩個層次呢? 它們之間的區別又是什么呢?

仔細分析一下機票和火車票, 不難發現, 每張票只能夠在某一限定區間內移動。 此處的“區間內”就如同通信網絡上的數據鏈路。 而這個區間內的出發地點和目的地點就如同某一個數據鏈路的源地址和目標地址等首部信息(出發地點好比源MAC地址, 目標地點好比目的MAC地址。 )。 整個全程的行程表的作用就相當於網絡層。

4.2 IP基礎知識

IP大致分為三大作用模塊, 它們是IP尋址、 路由(最終節點為止的轉發) 以及IP分包與組包。

4.2.1 IP地址屬於網絡層地址

在計算機通信中, 為了識別通信對端, 必須要有一個類似於地址的識別碼進行標識。我們介紹過數據鏈路的MAC地址。 MAC地址正是用來標識同一個鏈路中不同計算機的一種識別碼。

作為網絡層的IP, 也有這種地址信息。 一般叫做IP地址。 IP地址用於在“連接到網絡中的所有主機中識別出進行通信的目標地址”。 因此,在TCP/IP通信中所有主機或路由器必須設定自己的IP地址(嚴格來說,要針對每塊網卡至少配置一個或一個以上的IP地址。) 。

不論一台主機與哪種數據鏈路連接, 其IP地址的形式都保持不變。以太網、 無線局域網、 PPP等, 都不會改變IP地址的形式。網絡層對數據鏈路層的某些特性進行了抽象。 數據鏈路的類型對IP地址形式透明, 這本身就是其中抽象化中的一點。

另外, 在網橋或交換集線器等物理層或數據鏈路層數據包轉發設備中, 不需要設置IP地址(在用SNMP進行網路管理時有必要設置IP地址。不指定IP則無法利用IP進行網路管理。 ) 。 因為這些設備只負責將IP包轉化為0、 1比特流轉發或對數據鏈路幀的數據部分進行轉發, 而不需要應對IP協議

4.2.2 路由控制

路由控制(Routing) 是指將分組數據發送到最終目標地址的功能。

■ 發送數據至最終目標地址

Hop譯為中文叫“跳”。 它是指網絡中的一個區間。 IP包正是在網絡中一個個跳間被轉發。 因此IP路由也叫做多跳路由。 在每一個區間內決定着包在下一跳被轉發的路徑。

■ 路由控制表

為了將數據包發給目標主機, 所有主機都維護着一張路由控制表(Routing Table) 。 該表記錄IP數據在下一步應該發給哪個路由器。 IP包將根據這個路由表在各個數據鏈路上傳輸。

4.2.3 數據鏈路的抽象化

IP是實現多個數據鏈路之間通信的協議。數據鏈路根據種類的不同各有特點。 數據鏈路的地址可以被抽象化為IP地址。因此, 對IP的上一層來說, 不論底層數據鏈路使用以太網還是無線LAN亦或是PPP, 都將被一視同仁。

不同數據鏈路有個最大的區別, 就是它們各自的最大傳輸單位(MTU: Maximum Transmission Unit) 不同。 MTU的值在以太網中是1500字節, 在FDDI中是4352字節, 而ATM則為9180字節 。 IP的上一層可能會要求傳送比這些MTU更多字節的數據, 因此必須在線路上傳送比包長還要小的MTU。

為了解決這個問題, IP進行分片處理(IP Fragmentation) :將較大的IP包分成多個較小的IP包 。分片的包到了對端目標地址以后會再被組合起來傳給上一層。 即從IP的上次層看, 它完全可以忽略數據包在途中的各個數據鏈路上的MTU, 而只需要按照源地址發送的長度接收數據包。 IP就是以這種方式抽象化了數據鏈路層, 使得從上層更不容易看到底層網絡構造的細節。

4.2.4 IP屬於面向無連接型

為什么IP要采用面向無連接呢?

主要有兩點原因: 一是為了簡化, 二是為了提速。 面向連接比起面向無連接處理相對復雜。 甚至管理每個連接本身就是一個相當繁瑣的事情。 此外, 每次通信之前都要事先建立連接, 又會降低處理速度。 需要有連接時, 可以委托上一層提供此項服務。 因此, IP為了實現簡單化與高速化采用面向無連接的方式。

4.3 IP地址的基礎知識

4.3.1 IP地址的定義

IP地址(IPv4地址) 由32位正整數來表示。 TCP/IP通信要求將這樣的IP地址分配給每一個參與通信的主機。 IP地址在計算機內部以二進制(二進制是指用0、 1表示數字的方法。 ) 方式被處理。 然而, 由於人類社會並不習慣於采用二進制方式, 需要采用一種特殊的標記方式。 那就是將32位的IP地址以每8位為一組, 分成4組, 每組以“.”隔開, 再將每組數轉換為十進制數。

4.3.2 IP地址由網絡和主機兩部分標識組成

IP地址由“網絡標識(網絡地址) ”和“主機標識(主機地址) ”兩部分組成(192.168.128.10/24中的“/24” 表示從第1位開始到多少位屬於網絡標識。 在這個例子中, 192.168.128之前的都是該IP的網絡地址。)

網絡標識在數據鏈路的每個段配置不同的值。 網絡標識必須保證相互連接的每個段的地址不相重復。 而相同段內相連的主機必須有相同的網絡地址。 IP地址的“主機標識”則不允許在同一個網段內重復出現。

由此, 可以通過設置網絡地址和主機地址, 在相互連接的整個網絡中保證每台主機的IP地址都不會相互重疊。 即IP地址具有了唯一性。

那么, 究竟從第幾位開始到第幾位算是網絡標識, 又從第幾位開始到第幾位算是主機標識呢? 關於這點, 有約定俗成的兩種類型。 最初二者以分類進行區別。 而現在基本以子網掩碼(網絡前綴) 區分。

4.3.3 IP地址的分類

IP地址分為四個級別, 分別為A類、 B類、 C類、 D類(還有一個一直未使用的E類。 ) 。 它根據IP地址中從第1位到第4位的比特列對其網絡標識和主機標識進行區分。

■ A類地址

A類IP地址是首位以“0”開頭的地址。 從第1位到第8位(去掉分類位剩下7位。 ) 是它的網絡標識。 用十進制表示的話, 0.0.0.0~127.0.0.0是A類的網絡地址。 A類地址的后24位相當於主機標識。 因此, 一個網段內可容納的主機地址上限為16, 777,214個。

■ B類地址

B類IP地址是前兩位為“10”的地址。 從第1位到第16位(去掉分類位剩下14位。 ) 是它的網絡標識。 用十進制表示的話, 128.0.0.1~191.255.0.0是B類的網絡地址。 B類地址的后16位相當於主機標識。 因此, 一個網段內可容納的主機地址上限為65, 534個。

■ C類地址

C類IP地址是前三位為“110”的地址。 從第1位到第24位(去掉分類位剩下21位。 ) 是它的網絡標識。 用十進制表示的話, 192.168.0.0~239.255.255.0是C類的網絡地址。 C類地址的后8位相當於主機標識。 因此, 一個網段內可容納的主機地址上限為254個 。

■ D類地址

D類IP地址是前四位為“1110”的地址。 從第1位到第32位(去掉分類位剩下28位。 ) 是它的網絡標識。 用十進制表示的話, 224.0.0.0~239.255.255.255是D類的網絡地址。 D類地址沒有主機標識, 常被用於多播。

■ 關於分配IP主機地址的注意事項

在分配IP地址時關於主機標識有一點需要注意。 即要用比特位表示主機地址時, 不可以全部為0或全部為1。 因為全部為只有0在表示對應的網絡地址或IP地址不可獲知的情況下才使用。 而全部為1的主機地址通常作為廣播地址。

因此, 在分配過程中, 應該去掉這兩種情況。 這也是為什么C類地址每個網段最多只能有254(28 -2=254) 個主機地址的原因。

4.3.4 廣播地址

廣播地址用於在同一個鏈路中相互連接的主機之間發送數據包。 將IP地址中的主機地址部分全部設置為1, 就成為了廣播地址。

■ 本地廣播

在本網絡內的廣播叫做本地廣播。 例如網絡地址為192.168.0.0/24的情況下, 廣播地址是192.168.0.255。 因為這個廣播地址的IP包會被路由器屏蔽, 所以不會到達192.168.0.0/24以外的其他鏈路上。

■ 直接廣播

在不同網絡之間的廣播叫做直接廣播。 例如網絡地址為192.168.0.0/24的主機向192.168.1.255/24的目標地址發送IP包。 收到這個包的路由器, 將數據轉發給192.168.1.0/24, 從而使得所有192.168.1.1~192.168.1.254的主機都能收到這個包

4.3.5 IP多播

■ 同時發送提高效率

多播用於將包發送給特定組內的所有主機。 由於其直接使用IP協議, 因此也不存在可靠傳輸。

而隨着多媒體應用的發展, 對於向多台主機同時發送數據包, 在效率上的要求也日益提高。 在電視會議系統中對於1對N、 N對N通信的需求明顯上升。 而具體實現上往往采用復制1對1通信的數據, 將其同時發送給多個主機的方式。

在人們使用多播功能之前, 一直采用廣播的方式。 那時廣播將數據發給所有終端主機, 再由這些主機IP之上的一層去判斷是否有必要接收數據。 是則接收, 否則丟棄。

然而這種方式會給那些毫無關系的網絡或主機帶來影響, 造成網絡上很多不必要的流量。 況且由於廣播無法穿透路由, 若想給其他網段發送同樣的包, 就不得不采取另一種機制。 因此, 多播這種既可以穿透路由器, 又可以實現只給那些必要的組發送數據包的技術就成為必選之路了。

■ IP多播與地址

多播使用D類地址。 因此, 如果從首位開始到第4位是“1110”, 就可以認為是多播地址。 而剩下的28位可以成為多播的組編號。

從224.0.0.0到239.255.255.255都是多播地址的可用范圍。 其中從224.0.0.0到224.0.0.255的范圍不需要路由控制, 在同一個鏈路內也能實現多播。 而在這個范圍之外設置多播地址會給全網所有組內成員發送多播的包(可以利用生存時間(TTL, Time To Live) 限制包的到達范圍。 ) 。

此外, 對於多播, 所有的主機(路由器以外的主機和終端主機) 必須屬於224.0.0.1的組, 所有的路由器必須屬於224.0.0.2的組。 類似地,多播地址中有眾多已知的地址, 它們中具有代表性的部分已在表4.1中列出。

利用IP多播實現通信, 除了地址外還需要IGMP(Internet GroupManagement Protocol) 等協議的支持。

4.3.6 子網掩碼

■ 分類造成浪費?

一個IP地址只要確定了其分類, 也就確定了它的網絡標識和主機標識。其中“1”的部分是網絡地址部分, “0”的部分是主機地址部分。 將它們以十進制表示,C類為255.255.255.0

網絡標識相同的計算機必須同屬於同一個鏈路。 因此, 直接使用A類或B類地址, 確實有些浪費。 隨着互聯網的覆蓋范圍逐漸增大, 網絡地址會越來越不足以應對需求, 直接使用A類、B類、 C類地址就更加顯得浪費資源。 為此, 人們已經開始一種新的組合方式以減少這種浪費。

■ 子網與子網掩碼

現在, 一個IP地址的網絡標識和主機標識已不再受限於該地址的類別, 而是由一個叫做“子網掩碼”的識別碼通過子網網絡地址細分出比A類、 B類、 C類更小粒度的網絡。 這種方式實際上就是將原來A類、 B類C類等分類中的主機地址部分用作子網地址, 可以將原網絡分為多個物理網絡的一種機制。

自從引入了子網以后, 一個IP地址就有了兩種識別碼。 一是IP地址本身, 另一個是表示網絡部的子網掩碼。 子網掩碼用二進制方式表示的話, 也是一個32位的數字。 它對應IP地址網絡標識部分的位全部為“1”, 對應IP地址主機標識的部分則全部為“0”。 由此, 一個IP地址可以不再受限於自己的類別, 而是可以用這樣的子網掩碼自由地定位自己的網絡標識長度。 當然, 子網掩碼必須是IP地址的首位開始連續的“1”(最初提出子網掩碼時曾允許出現不連續的子網掩碼, 但現在基本不允許出現這種情況。 ) 。

另一種表示方式:它在每個IP地址后面追加網絡地址的位數(這種方式也叫“后綴” 表示法。 ) 用“/”隔開。

4.3.7 CIDR與VLSM

於是, 人們開始放棄IP地址的分類,采用任意長度分割IP地址的網絡標識和主機標識。 這種方式叫做CIDR(Classless InterDomain Routing)。由於BGP(Border Gateway Protocol, 邊界網關協議) 對應了CIDR, 所以不受IP地址分類的限制自由分配

根據CIDR, 連續多個C類地址就可以划分到一個較大的網絡內。 CIDR更有效地利用了當前IPv4地址, 同時通過路由集中降低了路由器的負擔。

在CIDR被應用到互聯網的初期, 網絡內部采用固定長度的子網掩碼機制。 也就是說, 當子網掩碼的長度被設置為/25以后, 域內所有的子網掩碼都得使用同樣的長度。 然而, 有些部門可能有500台主機, 另一些部門可能只有50台主機。 如果全部采用統一標准, 就難以架構一個高效的網絡結構。 為此人們提出組織內要使用可變長度的、 高效的IP地址分配方式。

於是產生了一種可以隨機修改組織內各個部門的子網掩碼長度的機制——VLSM(可變長子網掩碼) (Variable Length Subnet Mask)。 它可以通過域間路由協議轉換為RIP2以及OSPF實現。 根據VLSM可以將網絡地址划分為主機數為500個時子網掩碼長度為/23, 主機數為50個時子網掩碼長度為/26。 從而在理論上可以將IP地址的利用率提高至50%。

有了CIDR和VLSM技術, 確實相對緩解了全局IP地址不夠用的問題。 但是IP地址的絕對數本身有限的事實無法改變。 因此才會出現IPv6等IPv4以外的方法。

4.3.8 全局地址與私有地址

起初, 互聯網中的任何一台主機或路由器必須配有一個唯一的IP地址。 一旦出現IP地址沖突, 就會使發送端無法判斷究竟應該發給哪個地址。 而接收端收到數據包以后發送回執時, 由於地址重復, 發送端也無從得知究竟是哪個主機返回的信息, 影響通信的正常進行。然而, 隨着互聯網的迅速普及, IP地址不足的問題日趨顯著。 如果一直按照現行的方法采用唯一地址的話, 會有IP地址耗盡的危險。

於是就出現了一種新技術。 它不要求為每一台主機或路由器分配一個固定的IP地址, 而是在必要的時候只為相應數量的設備分配唯一的IP地址。尤其對於那些沒有連接互聯網的獨立網絡中的主機, 只要保證在這個網絡內地址唯一, 可以不用考慮互聯網即可配置相應的IP地址。 不過, 即使讓每個獨立的網絡各自隨意地設置IP地址, 也可能會有問題。於是又出現了私有網絡的IP地址。

包含在這個范圍內的IP地址都屬於私有IP, 而在此之外(A類~C類范圍中除去0/8、 127/8。 ) 的IP地址稱為全局IP(也叫公網IP。 ) 。

私有IP最早沒有計划連接互聯網, 而只用於互聯網之外的獨立網絡。 然而, 當一種能夠互換私有IP與全局IP的NAT技術誕生以后, 配有私有地址的主機與配有全局地址的互聯網主機實現了通信。

現在有很多學校、 家庭、 公司內部正采用在每個終端設置私有IP,而在路由器(寬帶路由器) 或在必要的服務器上設置全局IP地址的方法。 而如果配有私有IP的地址主機連網時, 則通過NAT進行通信。

全局IP地址基本上要在整個互聯網范圍內保持唯一(在使用任播的情況下, 多台主機或路由器可以配置同一個IP。 ) , 但私有地址不需要。 只要在同一個域里保證唯一即可。 在不同的域里出現相同的私有IP不會影響使用。

由此, 私有IP地址結合NAT技術已成為現在解決IP地址分配問題的主流方案。 它與使用全局IP地址相比有各種限制(例如在應用的首部或數據部分傳遞IP地址和端口號的應用程序來說, 直接使用私有地址會導致無法通信。 ) 。

4.3.9 全局地址由誰決定

在世界范圍內, 全局IP由ICANN(Internet Corporation for Assigned Names and Numbers, 中文叫“互聯網名稱與數字地址分配機構” , 負責管理全世界的IP地址和域名。 ) 進行管理。 在日本則由一個叫做JPNIC(Japan Network Information Center, 負責日本國內IP地址與AS編號的管理。 ) 的機構進行管理, 它是日本國內唯一指定的全局IP地址管理的組織。

在互聯網被廣泛商用之前, 用戶只有直接向JPNIC申請全局IP地址才能接入互聯網。 然而, 隨着ISP的出現, 人們在向ISP申請接入互聯網的同時往往還會申請全局IP地址。 在這種情況下, 實際上是ISP代替用戶向JPNIC申請了一個全局IP地址。 而連接某個區域網絡時, 一般不需要聯系提供商, 只要聯系該區域網絡的運營商即可。

對於FTTH和ADSL的服務, 網絡提供商直接給用戶分配全局IP地址, 並且用戶每次重連該IP地址都可能會發生變化。 這時的IP地址由提供商維護, 不需要用戶親自申請全局IP地址。

一般只有在需要固定IP的情況下才會申請全局IP地址。 例如, 如果要讓多台主機接入互聯網, 就需要為每一台主機申請一個IP地址。

不過現在, 普遍采用的一種方式是, 在LAN中設置私有地址, 通過少數設置全局IP地址的代理服務器結合NAT的設置進行互聯網通信。 這時IP地址個數就不限於
LAN中主機個數而是由代理服務器和NAT的個數決定。

如果完全使用公司內網, 今后不會接入互聯網, 只要使用私有地址即可。

4.4 路由控制

發送數據包時所使用的地址是網絡層的地址, 即IP地址。 然而僅僅有IP地址還不足以實現將數據包發送到對端目標地址, 在數據發送過程中還需要類似於“指明路由器或主機”的信息, 以便真正發往目標地址。保存這種信息的就是路由控制表(Routing Table) 。 實現IP通信的主機和路由器都必須持有一張這樣的表。 它們也正是在這個表格的基礎上才得以進行數據包發送的。

該路由控制表的形成方式有兩種: 一種是管理員手動設置, 另一種是路由器與其他路由器相互交換信息時自動刷新。 前者也叫靜態路由控制, 而后者叫做動態路由控制。 為了讓動態路由及時刷新路由表, 在網絡上互連的路由器之間必須設置好路由協議, 保證正常讀取路由控制信息。

IP協議始終認為路由表是正確的。 然而, IP本身並沒有定義制作路由控制表的協議。 即IP沒有制作路由控制表的機制。 該表是由一個叫做“路由協議”(這個協議有別於IP) 的協議制作而成。

4.4.1 IP地址與路由控制

IP地址的網絡地址部分用於進行路由控制。

路由控制表中記錄着網絡地址與下一步應該發送至路由器的地址。在發送IP包時, 首先要確定IP包首部中的目標地址, 再從路由控制表中找到與該地址具有相同網絡地址的記錄, 根據該記錄將IP包轉發給相應的下一個路由器。 如果路由控制表中存在多條相同網絡地址的記錄, 就選擇一個最為吻合的網絡地址。 所謂最為吻合是指相同位數最多的意思(也叫最長匹配。 ) 。 此外, 如果路由表中下一個路由器的位置記錄着某個主機或路由器網卡的IP地址, 那就意味着“發送的目標地址屬於同一個鏈路” 。

■ 默認路由

如果一張路由表中包含所有的網絡及其子網的信息, 將會造成無端的浪費。 這時, 默認路由(Default Route) 是不錯的選擇。 默認路由是指路由表中任何一個地址都能與之匹配的記錄。默認路由一般標記為0.0.0.0/0或default 。

■ 主機路由

“IP地址/32”也被稱為主機路由(Host Route) 。 它的意思是整個IP地址的所有位都將參與路由。 進行主機路由, 意味着要基於主機上網卡上配置的IP地址本身, 而不是基於該地址的網絡地址部分進行路由。

主機路由多被用於不希望通過網絡地址路由的情況(不過, 使用主機路由會導致路由表膨大, 路由負荷增加, 進而造成網絡性能下降。) 。

■ 環回地址

環回地址是在同一台計算機上的程序之間進行網絡通信時所使用的一個默認地址。 計算機使用一個特殊的IP地址127.0.0.1作為環回地址。與該地址具有相同意義的是一個叫做localhost的主機名。 使用這個IP或主機名時, 數據包不會流向網絡。

4.4.2 路由控制表的聚合

利用網絡地址的比特分布可以有效地進行分層配置。 對內即使有多個子網掩碼, 對外呈現出的也是同一個網絡地址。 這樣可以更好地構建網絡, 通過路由信息的聚合可以有效地減少路由表的條目(路由表的聚合也叫路由匯總(Aggregation) 。 ) 。

能夠縮小路由表的大小是它最大的優勢。 路由表越大, 管理它所需要的內存和CPU也就越多。 並且查找路由表的時間也會越長, 導致轉發IP數據包的性能下降。 如果想要構建大規模、 高性能網絡, 則需要盡可能削減路由表的大小。

而且路由聚合可以將已知的路由信息傳送給周圍其他的路由器, 以達到控制路由信息的目的。

4.5 IP分割處理與再構成處理

4.5.1 數據鏈路不同, MTU則相異

每種數據鏈路的MTU之所以不同, 是因為每個不同類型的數據鏈路的使用目的不同。使用目的不同, 可承載的MTU也就不同。 鑒於IP屬於數據鏈路上一層,它必須不受限於不同數據鏈路的MTU大小。

4.5.2 IP報文的分片與重組

任何一台主機都有必要對IP分片(IP Fragmentation) 進行相應的處理。 分片往往在網絡上遇到比較大的報文無法一下子發送出去時才會進行處理。

經過分片之后的IP數據報在被重組的時候, 只能由目標主機進行。路由器雖然做分片但不會進行重組。

這樣的處理是由諸多方面的因素造成的。 例如, 現實當中無法保證IP數據報是否經由同一個路徑傳送。 因此, 途中即使等待片刻, 數據包也有可能無法到達目的地。 此外, 拆分之后的每個分片也有可能會在途中丟失(在目標主機上進行分片的重組時, 可能有一部分包會延遲到達。 因此, 一般會從第一個數據報的分片到達的那一刻起等待約30秒再進行處理。 ) 。 即使在途中某一處被重新組裝, 但如果下一站再經過其他路由時還會面臨被分片的可能。 這會給路由器帶來多余的負擔, 也會降低網絡傳送效率。 出於這些原因, 在終結點(目標主機) 端重組分片了的IP數據報成為現行的規范。

4.5.3 路徑MTU發現

分片機制也有它的不足。 首先, 路由器的處理負荷加重。 隨着時代的變遷, 計算機網絡的物理傳輸速度不斷上升。 這些高速的鏈路, 對路由器和計算機網絡提出了更高的要求。 另一方面, 隨着人們對網絡安全的要求提高, 路由器需要做的其他處理也越來越多, 如網絡過濾(過濾是指只有帶有一定特殊參數的IP數據報才能通過路由器。 這里的參數可以是發送端主機、 接收端主機、 TCP或UDP端口號或者TCP的SYN標志或ACK標志等。 ) 等。 因此, 只要允許, 是不希望由路由器進行IP數據包的分片處理的。

其次, 在分片處理中, 一旦某個分片丟失, 則會造成整個IP數據報作廢。 為了避免此類問題, TCP的初期設計還曾使用過更小(包含TCP的數據限制在536字節或512字節。 ) 的分片進行傳輸。 其結果是網路的利用率明顯下降。

為了應對以上問題, 產生了一種新的技術“路徑MTU發現”(Path MTU Discovery(也可以縮寫為PMTUD。 ) ) 。 所謂路徑MTU(Path MTU) 是指從發送端主機到接收端主機之間不需要分片時最大MTU的大小。 即路徑中存在的所有數據鏈路中最小的MTU。 而路徑MTU發現從發送主機按照路徑MTU的大小將數據報分片后進行發送。 進行路徑MTU發現, 就可以避免在中途的路由器上進行分片處理, 也可以在TCP中發送更大的包。 現在, 很多操作系統都已經實現了路徑MTU發現的功能。

路徑MTU發現的工作原理如下:

首先在發送端主機發送IP數據報時將其首部的分片禁止標志位設置為1。 根據這個標志位, 途中的路由器即使遇到需要分片才能處理的大包, 也不會去分片, 而是將包丟棄。 隨后, 通過一個ICMP的不可達消息將數據鏈路上MTU的值給發送主機(具體來說, 以ICMP不可達消息中的分片需求(代碼4) 進行通知。 然而, 在有些老式的路由器中,ICMP可能不包含下一個MTU值。 這時, 發送主機端必須不斷增減包的大小, 以此來定位一個合適的MTU值。 ) 。

下一次, 從發送給同一個目標主機的IP數據報獲得ICMP所通知的MTU值以后, 將它設置為當前MTU。 發送主機根據這個MTU對數據報進行分片處理。 如此反復, 直到數據報被發送到目標主機為止沒有再收到任何ICMP, 就認為最后一次ICMP所通知的MTU即是一個合適的MTU值。 那么, 當MTU的值比較多時, 最少可以緩存(緩存是指將反復使用的信息暫時保存到一個可以即刻獲取的位置。 ) 約10分鍾。 在這10分鍾內使用剛剛求得的MTU, 但過了這10分鍾以后則重新根據鏈路上的MTU做一次路徑MTU發現。

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

4.6 IPv6

4.6.1 IPv6的必要性

IPv6(IP version 6) 是為了根本解決IPv4地址耗盡的問題而被標准化的網際協議。 IPv4的地址長度為4個8位字節, 即32比特。 而IPv6的地址長度則是原來的4倍, 即128比特(因此IPv6的地址空間是IPv4的296=7.923×1028 倍。 ) , 一般寫成8個16位字節。

從IPv4切換到IPv6極其耗時, 需要將網絡中所有主機和路由器的IP地址進行重新設置。 當互聯網廣泛普及后, 替換所有IP地址會是更為艱巨的任務。

也是出於上述原因, IPv6不僅僅能解決IPv4地址耗盡的問題, 它甚至試圖彌補IPv4中的絕大多數缺陷。 目前, 人們正着力於進行IPv4與
IPv6之間的相互通信與兼容性方面的測試(即IP隧道和協議轉換 等) 。

4.6.2 IPv6的特點

  • IP地址的擴大與路由控制表的聚合

    IP地址依然適應互聯網分層構造。 分配與其地址結構相適應的IP地址, 盡可能避免路由表膨大。

  • 性能提升

    包首部長度采用固定的值(40字節) , 不再采用首部檢驗碼。 簡化首部結構, 減輕路由器負荷。 路由器不再做分片處理(通過路徑MTU發現只由發送端主機進行分片處理) 。

  • 支持即插即用功能

    即使沒有DHCP服務器也可以實現自動分配IP地址。

  • 采用認證與加密功能

    應對偽造IP地址的網絡安全功能以及防止線路竊聽的功能(IPsec) 。

  • 多播、 Mobile IP成為擴展功能

    多播和Mobile IP被定義為IPv6的擴展功能。 由此可以預期, 曾在IPv4中難於應用的這兩個功能在IPv6中能夠順利使用。

4.6.3 IPv6中IP地址的標記方法

如果將IPv6的地址像IPv4的地址一樣用十進制數據表示的話, 是16個數字的序列(IPv4是4個數字的序列) 。 由於用16個數字序列表示顯得有些麻煩, 因此, 將IPv6和IPv4在標記方法上進行區分。 一般人們將128比特IP地址以每16比特為一組, 每組用冒號(“: ”) 隔開進行標記。 而且如果出現連續的0時還可以將這些0省略, 並用兩個冒號(“: : ”) 隔開。 但是, 一個IP地址中只允許出現一次兩個連續的冒號。

4.6.4 IPv6地址的結構

Pv6類似IPv4, 也是通過IP地址的前幾位標識IP地址的種類。

在互聯網通信中, 使用一種全局的單播地址。 它是互聯網中唯一的一個地址, 不需要正式分配IP地址。

限制型網絡, 即那些不與互聯網直接接入的私有網絡, 可以使用唯一本地地址。 該地址根據一定的算法生成隨機數並融合到地址當中,可以像IPv4的私有地址一樣自由使用。

在不使用路由器或者在同一個以太網網段內進行通信時, 可以使用鏈路本地單播地址。

而在構建允許多種類型IP地址的網絡時, 在同一個鏈路上也可以使用全局單播地址以及唯一本地地址進行通信。

在IPv6的環境下, 可以同時將這些IP地址全都配置在同1個NIC上,按需靈活使用。

4.6.5 全局單播地址

全局單播地址是指世界上唯一的一個地址。 它是互聯網通信以及各個域內部通信中最為常用的一個IPv6地址。

全局單播地址的格式如圖4.28所示。 現在IPv6的網絡中所使用的格式為, n=48, m=16以及128-n-m=64。 即前64比特為網絡標識, 后64比特為主機標識。

通常, 接口ID中保存64比特版的MAC地址的值。 不過由於MAC地址(稱為IEEE EUI-64識別碼。 ) 屬於設備固有的信息, 有時不希望讓對端知道。 這時的接口ID可設置為一個與MAC地址沒有關系的“臨時地址”。 這種臨時地址通常隨機產生, 並會定期更新。 因此, 從IPv6地址中查看定位設備變得沒那么簡單。 究竟會是哪種信息, 全由操作系統的具體裝置決定(常被用作客戶端的個人電腦中分配這種臨時地址的情況多一些。 ) 。

4.6.6 鏈路本地單播地址

鏈路本地單播地址是指在同一個數據鏈路內唯一的地址。 它用於不經過路由器, 在同一個鏈路中的通信。 通常接口ID保存64比特版的MAC地址。

4.6.7 唯一本地地址

唯一本地地址是不進行互聯網通信時所使用的地址。

設備控制的限制型網絡以及金融機關的核心網等會與互聯網隔離。為了提高安全性, 企業內部的網絡與互聯網通信時通常會通過NAT或網關(代理) 進行。 而唯一本地地址正是在這種不聯網或通過NAT以及代理聯網的環境下使用的。

唯一本地地址雖然不會與互聯網連接, 但是也會盡可能地隨機生成一個唯一的全局ID。 由於企業兼並、 業務統一、 效率提高等原因, 很有可能會需要用到唯一本地地址進行網絡之間的連接。 在這種情況下, 人們希望可以在不改動IP地址的情況下即可實現網絡的統一(全局ID不一定必須是全世界唯一的, 但是完全一致的可能性也不高。 ) 。

4.6.8 IPv6分段處理

IPv6的分片處理只在作為起點的發送端主機上進行, 路由器不參與分片。 這也是為了減少路由器的負荷, 提高網速。 因此, IPv6中的“路徑MTU發現”功能必不可少。 不過IPv6中最小MTU為1280字節。 因此,在嵌入式系統中對於那些有一定系統資源限制(CPU處理能力或內存限制等。 ) 的設備來說, 不需要進行“路徑MTU發現”, 而是在發送IP包時直接以1280字節為單位分片送出。

4.7 IPv4首部

■ 版本(Version)

由4比特構成, 表示標識IP首部的版本號。 IPv4的版本號即為4, 因此在這個字段上的值也是“4”。 關於IP版本的最新情況, 可以在以下網址發布的信息中查看:http://www.iana.org/assignments/version-numbers

■ 首部長度(IHL: Internet Header Length)

由4比特構成, 表明IP首部的大小, 單位為4字節(32比特) 。 對於沒有可選項的IP包, 首部長度則設置為“5”。 也就是說, 當沒有可選項時, IP首部的長度為20字節(4×5=20)

■ 區分服務(TOS: Type Of Service)

由8比特構成, 用來表明服務質量。

這個值通常由應用指定。 而且現在也鼓勵這種結合應用的特性設定TOS的方法。 然而在目前, 幾乎所有的網絡都無視這些字段。 這不僅僅是因為在符合質量要求的情況下按其要求發送本身的功能實現起來十分困難, 還因為若不符合質量要求就可能會產生不公平的現象。因此, 實現TOS控制變得極其復雜。 這也導致TOS整個互聯網幾乎就沒有被投入使用。 不過已有人提出將TOS字段本身再划分為DSCP和ECN兩個字段的建議。

■ DSCP段與ECN段

DSCP(Differential Services Codepoint, 差分服務代碼點) 是TOS(Type Of Service) 的一部分。 現在統稱為DiffServ,用來進行質量控制。 如果3~5位的值為0, 0~2位則被稱作類別選擇代碼點。 這樣就可以像TOS的優先度那樣提供8種類型的質量控級別。 對於每一種級別所采取的措施則由提供DiffServ的運營管理者制定。 為了與TOS保持一致, 值越大優先度也越高。 如果第5位為1, 表示實驗或本地使用的意思

ECN(Explicit Congestion Notification, 顯式擁塞通告) 用來報告網絡擁堵情況, 由兩個比特構成。 第6位的ECT(ECN-Capable Transport)用以通告上層TCP層協議是否處理ECN。 當路由器在轉發ECN為1的包的過程中, 如果出現網絡擁堵的情況, 就將CE位(Congenstion Experienced)設置為1。

■ 總長度(Total Length)

表示IP首部與數據部分合起來的總字節數。 該字段長16比特。 因此IP包的最大長度為65535(=216 ) 字節。 目前還不存在能夠傳輸最大長度為65535字節的IP包的數據鏈路。 不過, 由於有IP分片處理, 從IP的上一層的角度看, 不論底層采用何種數據鏈路, 都可以認為能夠以IP的最大包長傳輸數據。

■ 標識(ID: Identification)

由16比特構成, 用於分片重組。 同一個分片的標識值相同, 不同分片的標識值不同。 通常, 每發送一個IP包, 它的值也逐漸遞增。 此外,即使ID相同, 如果目標地址、 源地址或協議不同的話, 也會被認為是不同的分片。

■ 標志(Flags)

由3比特構成, 表示包被分片的相關信息。

比特 含義
0 未使用。 現在必須是0。
1 指示是否進行分片(don't fragment) 0- 可以分片 1- 不能分片
2 包被分片的情況下, 表示是否為最后一個包(more fragment) 。 0- 最后一個分片的包 1- 分片中段的包

■ 片偏移(FO: Fragment Offset)

由13比特構成, 用來標識被分片的每一個分段相對於原始數據的位置。第一個分片對應的值為0。單位為8字節 。

■ 生存時間(TTL: Time To Live)

由8比特構成, 它最初的意思是以秒為單位記錄當前包在網絡上應該生存的期限。 然而, 在實際中它是指可以中轉多少個路由器的意思。每經過一個路由器, TTL會減少1, 直到變成0則丟棄該包(TTL占8位,因此可以表示0~255的數字。 因此一個包的中轉路由的次數不會超過28=256個。 由此可以避免IP包在網絡內無限傳遞的問題。 ) 。

■ 協議(Protocol)

由8比特構成, 表示IP首部的下一個首部隸屬於哪個協議。關於協議編號一覽表的更新情況可以從以下網站獲取:http://www.iana.org/assignments/protocol-numbers

■ 首部校驗和(Header Checksum)

由16比特(2個字節) 構成, 也叫IP首部校驗和。 該字段只校驗數據報的首部, 不校驗數據部分。 它主要用來確保IP數據報不被破壞。校驗和的計算過程, 首先要將該校驗和的所有位置設置為0, 然后以16比特為單位划分IP首部, 並用1補數(1補數 通常計算機中對整數運算采用2補數的方式。 但在校驗和的計算中采用1補數運算方法。 這樣做的優點在於即使產生進位也可以回到第1位, 可以防止信息缺失並且可以用2個0區分使用。 ) 計算所有16位字的和。 最后將所得到這個和的1補數賦給首部校驗和字段。

■ 源地址(Source Address)

由32比特(4個字節) 構成, 表示發送端IP地址。

■ 目標地址(Destination Address)

由32比特(4個字節) 構成, 表示接收端IP地址。

■ 可選項(Options)

長度可變, 通常只在進行實驗或診斷時使用。 該字段包含如下幾點信息:

  • 安全級別
  • 源路徑
  • 路徑記錄
  • 時間戳

■ 填充(Padding)

也稱作填補物。 在有可選項的情況下, 首部長度可能不是32比特的整數倍。 為此, 通過向字段填充0, 調整為32比特的整數倍。

■ 數據(Data)

存入數據。 將IP上層協議的首部也作為數據進行處理。

4.8 IPv6首部格式

IPv6中為了減輕路由器的負擔, 省略了首部校驗和字段。因此路由器不再需要計算校驗和, 從而也提高了包的轉發效率。

此外, 分片處理所用的識別碼成為可選項。 為了讓64位CPU的計算機處理起來更方便, IPv6的首部及可選項都由8字節構成。

■ 版本(Version)

與IPv4一樣, 由4比特構成。 IPv6其版本號為6, 因此在這個字段上的值為“6”。

■ 通信量類(Traffic Class)

相當於IPv4的TOS(Type Of Service) 字段, 也由8比特構成。 由於TOS在IPv4中幾乎沒有什么建樹, 未能成為卓有成效的技術, 本來計划在IPv6中刪掉這個字段。 不過, 出於今后研究的考慮還是保留了該字段。

■ 流標號(Flow Label)

由20比特構成, 准備用於服務質量(QoS: Quality Of Service) 控制。 使用這個字段提供怎樣的服務已經成為未來研究的課題。 不使用QoS時每一位可以全部設置為0。

在進行服務質量控制時, 將流標號設置為一個隨機數, 然后利用一種可以設置流的協議RSVP(Resource Reservation Protocol) 在路由器上進行QoS設置。 當某個包在發送途中需要QoS時, 需要附上RSVP預想的流標號。路由器接收到這樣的IP包后先將流標號作為查找關鍵字, 迅速從服務質量控制信息中查找並做相應處理(采用QoS的路由器必須盡早轉發所接受的包。 但是由於以何種質量發送包才合適還需要檢索相應的質量控制信息, 因此有時可能會反而影響發送質量。 而流標號正是為“高速檢索” 而是用的一種索引(Index) 。 它的值本身沒有什么具體含義。 )。

此外, 只有流標號、 源地址以及目標地址三項完全一致時, 才被認為是一個流。

■ 有效載荷長度(Payload Length)

有效載荷是指包的數據部分。 IPv4的TL(Total Length) 是指包括首部在內的所有長度。 然而IPv6中的這個Playload Length不包括首部,只表示數據部分的長度。 由於IPv6的可選項是指連接IPv6首部的數據,因此當有可選項時, 此處包含可選項數據的所有長度就是Playload Length(該字段長度為16比特, 因此數據最大長度可達65535字節。 不過, 為了讓更大的數據也能通過一個IP包發送出去, 便增加了大型有效載荷選項(Jumbo Payload Option) 。 該選項長度為32比特。 有了它IPv6一次可以發送最大4G字節的包。 ) 。

■ 下一個首部(Next Header)

相當於IPv4中的協議字段。 由8比特構成。 通常表示IP的上一層協議是TCP或UDP。 不過在有IPv6擴展首部的情況下, 該字段表示后面第一個擴展首部的協議類型。

■ 跳數限制(Hop Limit)

由8比特構成。 與IPv4中的TTL意思相同。 為了強調“可通過路由器個數”這個概念, 才將名字改成了“Hop Limit”。 數據每經過一次路由器
就減1, 減到0則丟棄數據。

■ 源地址(Source Address)

由128比特(8個16位字節) 構成。 表示發送端IP地址。

■ 目標地址(Destination Address)

由128比特(8個16位字節) 構成。 表示接收端IP地址

■ IPv6擴展首部

擴展首部通常介於IPv6首部與TCP/UDP首部中間。 在IPv4中可選項長度固定為40字節, 但是在IPv6中沒有這樣的限制。 也就是說, IPv6的擴展首部可以是任意長度。 擴展首部當中還可以包含擴展首部協議以及下一個擴展首部字段。

IPv6首部中沒有標識以及標志字段, 在需要對IP數據報進行分片時, 可以使用擴展首部。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM