前言
IP相當于OSI參考模型的第3層--網絡層:主要作用是"實現終端節點之間的通信"又稱"點對點通信"。
IP作為整個TCP/IP中至關重要的協議,主要負責將數據包發送給最終的目標計算機。因此,IP能夠讓世界上任何兩臺計算機之間進行通信。
數據鏈路層的作用在于實現同一種數據鏈路下的包傳遞,而網絡層則可以實現跨越不同數據鏈路的包傳遞。
主機:配置有IP地址,但是不進行路由控制的設備。
既配有IP地址又有路由控制能力的設備叫做"路由器"。
節點:主機和路由器的統稱。
網絡層和數據鏈路層的關系
- 數據鏈路層提供兩個直連設備之間的通信功能。
- 網絡層負責沒有直連的兩個網絡之間進行通信傳輸。
舉個旅行的例子:
如果要去一個地方,計劃先飛機后火車再公交到達目的地。我們買好票,又制定一個行程表,幾點幾分去哪里坐車都一目了然。
機票和火車票只在特定區間有效,當你換乘不同公司的飛機或不同區間的火車時,還要重新購票。
每張票,只能在特定的區間內移動,就如同通信網絡上的數據鏈路。
而這個區間內的出發地點和目的地點就圖同一個數據鏈路的原地址和目標地址等首部信息。
整個過程的行程表的作用就相當于網絡層。
如果只有行程表,沒有車票,就無法達成交通工具到達目的地。反之,如果只有車票,而不知道坐什么車,在哪換乘,恐怕也很難到達目的地。
與之類似,計算機網絡中也需要數據鏈路層和網絡層才能實現向最終目標地址的通信。
IP基礎知識
IP大致分為三大作用模塊,它們是IP尋址、路由(最終節點為止的轉發)以及IP分包與組包。
IP屬于面向無連接
- 為了簡化
- 為了提速
IP地址
為了識別通信終端,數據鏈路有MAC地址,網絡層有IP地址。
IP地址用于在"連接到網絡中的所有主機中識別出進行通信的目標地址"。
IP地址(IPv4地址)由32位正整數來表示。
IP地址有"網絡標識(網絡地址)"和"主機標識(主機地址)"兩部分組成。
相互連接的不同段,以不同的網絡標識來區別,在同一個段內,以不同的主機地址來區別。
由此,可以保證相互連接的整個網絡中的每臺主機的IP地址都不會重疊。
IP地址分類
IP地址分為四個級別,分別為A類、B類、C類和D類。分類的依據是IP地址的前四位:
A類IP地址是第一位為“0”的地址。A類IP地址的前8位是網絡標識,用十進制標識的話0.0.0.0-127.0.0.0是A類IP地址的理論范圍。另外我們還可以得知,A類IP地址最多只有128個(實際上是126個,下文不贅述),每個網段內主機上限為2的24次方,也就是16,777,214個。
B類IP地址是前兩位為“10“的地址。B類IP地址的前16位是網絡標識,用十進制標識的話128.0.0.0-191.255.0.0是B類IP地址的范圍。B類IP地址的主機標記長度為16位,因此一個網段內可容納主機地址上限為65534個。
C類IP地址是前三位為“110”的地址。C類IP地址的前24位是網絡標識,用十進制標識的話192.0.0.0-223.255.255.0是C類IP地址的范圍。C類地址的后8位是主機標識,共容納254個主機地址。
D類IP地址是前四位為“1110”的地址。D類IP地址的網絡標識長32位,沒有主機標識,因此常用于多播。
子網掩碼
IP地址總長度32位,它能表示的主機數量有限,大約在43億左右。而IP地址分類更是造成了極大的浪費,A、B類地址一共也就一萬多個,而世界上包含主機數量超過254的網段顯然不止這么點。
我們知道IP地址分類的本質是區分網絡標識和主機標識,另一種更加靈活、細粒度的區分方法是使用子網掩碼。使用原A,B,C,D類等分類中的主機地址部分用作子網地址,可以將原網絡分為多個物理網絡的一種機制。
子網是指一個ip地址上生成的邏輯網絡,它可以讓一個網絡地址跨越多個物理網絡,即一個網絡地址代表多個網絡(很明顯這樣做可以節省ip地址)。呵呵,聽起來是不是很蹊蹺?一個網絡就這樣被莫名其妙的劃分成了許多子網?那么這樣做有什么用呢?
我舉個例子來跟你說吧:比如你是某個學校的網管,你的學校有四個處于不同物理位置的網絡教室,每個網絡教室25臺機器,你的任務是給這些機器配置ip地址和子網掩碼。你可能會覺得這再簡單不過了,申請4個C類地址,每個教室一個,然后在一一配置不就搞定了。嗯,這樣做理論上沒錯,但你有沒有想到這樣做很浪費,你一共浪費了(254-25)*4=916個ip地址,如果所有的網管都像你這樣做,那么internet上的ip地址將會在極短的時間內枯竭,顯然,你是不能這樣做,你應該做子網劃分。
子網劃分說白了是這樣一個事情:因為在劃分了子網后,ip地址的網絡號是不變的,因此在局域網外部看來,這里仍然只存在一個網絡,即網絡號所代表的那個網絡;但在網絡內部卻是另外一個景象,因為我們每個子網的子網號是不同的,當用化分子網后的ip地址與子網掩碼(注意,這里指的子網掩碼已經不是缺省子網掩碼了,而是自定義子網掩碼,是管理員在經過計算后得出的)做'與'運算時,每個子網將得到不同的子網地址,從而實現了對網絡的劃分(得到了不同的地址,當然就能區別出各個子網了,有趣吧)。
子網編址技術,即子網劃分將會有助于以下問題的解決:
1)巨大的網絡地址管理耗費:如果你是一個A類網絡的管理員,你一定會為管理數量龐大的主機而頭痛的;
2)路由器中的選路表的急劇膨脹:當路由器與其他路由器交換選路表時,互聯網的負載是很高的,所需的計算量也很高;
3)IP地址空間有限并終將枯竭:這是一個至關重要的問題,高速發展的internet,使原來的編址方法不能適應,而一些ip地址卻不能被充分的利用,造成了浪費。
因此,在配置局域網或其他網絡時,根據需要劃分子網是很重要的,有時也是必要的。現在,子網編址技術已經被絕大多數局域網所使用。
子網掩碼長度也是32位,由一段連續的1和一段連續的0組成。1的長度就表示網絡標識的長度。以IP地址172.20.100.52為例,它本來是一個B類IP地址(前16位是網絡標識),但通過子網掩碼,它可以是前26為為網絡標識的IP地址:
路由控制
互聯網是由路由器連接的網絡組合而成的。為了能讓數據包正確的到達目標主機,路由器必須在途中進行正確的轉發。
這種"正確的方向"轉發數據所進行的處理就叫做路由控制或路由。
路由控制是指將分組數據發送到最終目標地址的功能。
"跳"指網絡的一個區間。IP包正是在網絡中一個跳間被轉發。因此IP路由也叫做多跳路由。在每一個區間內決定著包在下一條被轉發的路徑。
路由器是根據由控制表轉發數據包。它根據所收到的數據包中目標主機的IP地址與路由控制表的比較得出下一個應該接收的路由器。
為了將數據包發給目標主機,所有主機都維護者一張路由控制表。 該表記錄IP數據在下一步應該發給哪個路由器。IP包將根據這個路由表在各個數據鏈路上傳輸。
路由控制分為靜態和動態兩種類型。
靜態:通常是由使用者手工操作完成的,是指事先設置好路由器和主機中并將路由信息固定的一種方法。
動態:讓管理者設置好的路由協議在運行過程中自動的設置路由控制信息的一種方法。
IP分割處理
IP是實現多個數據鏈路之間通信的協議。
但是不同的數據鏈路,它們各自的最大傳輸單位不同。
為了解決這個問題,IP進行分片處理。將較大的IP包分成多個較小的IP包。分片的包到達了對端目標地址以后會再備注合起來傳給上一層。經過分片之后的IP數據報在被重組的時候,只能由目標主機進行。路由器雖然做分片,但不會進行重組。
路徑MTU發現
分片會加重路由器的負擔,因此只要條件允許,我們都不希望路由器對IP數據包進行分片處理。另外,如果一個分片丟失,整個IP數據報都會作廢。
解決以上問題的技術是“路徑MTU發現”。主機會首先獲取整個路徑中所有數據鏈路的最小MTU,并按照整個大小將數據分片。因此傳輸過程中的任何一個路由器都不用進行分片工作。
為了找到路徑MTU,主機首先發送整個數據包,并將IP首部的禁止分片標志設為1.這樣路由器在遇到需要分片才能處理的包時不會分片,而是直接丟棄數據并通過ICMP協議將整個不可達的消息發回給主機。
主機將ICMP通知中的MTU設置為當前MTU,根據整個MTU對數據進行分片處理。如此反復下去,直到不再收到ICMP通知,此時的MTU就是路徑MTU。
以UDP協議發送數據為例:
IPv4首部
通過IP進行通信是,需要在數據的前面加入IP首部信息。IP首部中包含著用于IP協議進行發包控制時所有的必要信息。所以,為了對IP所提供的功能有一個詳細的把握,還是有必要了解下IP首部的結構的。
其中幾個重要的部分介紹如下:
總長度(Total Length):表示IP首部與數據部分總的字節數,該段長16比特,所以IP包的最大長度為65535字節(2^16)。雖然不同數據鏈路的MTU不同,但是IP協議屏蔽了這些區別,通過自己實現的數據分片功能,從上層的角度來看,IP協議總是能夠以65535為最大包長進行傳輸。
標識(ID:Identification):用于分片重組。屬于同一個分片的幀的ID相同。但即使ID相同,如果目標地址、源地址、上層協議中有任何一個不同,都被認為不屬于同一個分片。
-
標志(Flags):由于分片重組,由三個比特構成。
第一個比特未使用,目前必須是0。
第二個比特表示是否進行分片,0表示可以分片,1表示不能分片。在路徑MTU發現技術中就用到了這個位。
第三個比特表示在分片時,是否表示最后一個包。1表示不是最后一個包,0表示分配中最后一個包。
片偏移(FO: Fragment Offset):由13比特組成,表示被分片的段相對于原始數據的位置。它可以表示8192(2^13)個位置,單位為8字節,所以最大可以表示8 x 8192 = 65536字節的偏移量。
生存時間(TTL: Time To Live):表示包可以經過多少個路由器的中轉。每經過一個路由器,TTL減1。這樣可以避免前文提到的無限傳遞包的問題。
協議: 表示IP首部的下一個首部屬于哪個協議。比如TCP協議的編號為6,UDP編號為17.
首部校驗和:用于檢查IP首部是否損壞
源地址:由32比特構成(4個字節),表示發送端IP地址。
目標地址:由32比特構成(4個字節),表示接收端IP地址。
可選項:僅在試驗或診斷時用,可以沒有。如果有,需要配合填充(Padding)占滿32比特。
IPv6
IPv6是為了根本解決IPv4地址耗盡的問題而被標準化的網際協議。IPv4地址長度32比特,而IPv6地址長度128比特,一般寫成8個16位字節。
IPv6特點
- IP地址的擴大與路由控制表的聚合
- 性能提升
- 支持即插即用功能
- 采用認證與加密功能
- 多播、Mobile IP成為拓展功能
IPv6中IP地址的標記方法
一般人們將128比特IP地址以每16比特為一組,每組用冒號(":")隔開進行標記。而且如果出現連續的0時還可以將這些0省略掉,并用冷兒冒號("::")隔開。但是一個IP地址中只允許出現一次兩個連續的冒號。
在互聯網通信中,使用一種全局的單播地址。他是互聯萬中唯一的一個地址,不需要正式分配IP地址。