在計算機網絡領域,網絡層應該向運輸層提供怎樣的服務(「面向鏈接」仍是「無鏈接」)曾引發了長期的爭論。算法
一種觀點認爲,應該讓計算機網絡模仿電信網絡,使用面向鏈接的通訊方式。
通訊以前先創建虛電路(Virtual Circuit),以保證雙方通訊所需的一切網絡資源。 (這裏的虛網絡表示這只是一條邏輯上的鏈接,分組都沿着這條邏輯鏈接按照存儲轉發方式傳送,而並非真正創建了一條物理鏈接;與之相對的,電路交換的電話通訊是先創建一條真正的鏈接具體可參見概述部分介紹segmentfault
另外一種觀點認爲,應該讓網絡層向上只提供簡單靈活的、無鏈接的、盡最大努力交付的數據報服務。
採用這種設計思路,則網絡的造價大大下降,運行方式靈活,可以適應多種應用。且每一個分組獨立選擇路由進行轉發。緩存
網際協議 IP 是 TCP/IP 體系中兩個最主要的協議之一。
與 IP 協議配套使用的還有三個協議:網絡
所謂虛擬互連網絡也就是邏輯互連網絡,它的意思就是互連起來的各類物理網絡的異構性原本是客觀存在的,可是咱們利用 IP 協議就可使這些性能各異的網絡從用戶看起來好像是一個統一的網絡。數據結構
若是在這種覆蓋全球的 IP 網的 上層使用 TCP 協議,那麼就是如今的 互聯網 (Internet)。
IP 地址就是給每一個鏈接在互聯網上的主機(或路由器)分配一個在全世界範圍是惟一的 32 位的標識符。less
IP 地址 ::= { <網絡號>, <主機號>}性能
通常表示IP地址採用 點分十進制記法,將每一個 八位二進制數(1 byte)轉換爲 十進制數。
其中 D類地址爲 多播地址;
E類地址保留爲從此使用。
通常不可用的特殊IP地址測試
網絡號 | 主機號 | 做爲源地址 | 做爲目的地址 | 表明含義 |
---|---|---|---|---|
0 | 0 | 能夠 | 不可 | 在本網絡上的本主機 |
0 | host-id | 能夠 | 不可 | 在本網絡上的某臺主機 host-id |
全 1 | 全 1 | 不可 | 能夠 | 只在本網絡上進行廣播(各路由器均不轉發) |
net-id | 全 1 | 不可 | 能夠 | 對 net-id 上的全部主機進行廣播 |
127 | 非全 0 或全 1 的任何數 | 能夠 | 能夠 | 用做本地軟件環回測試之用 |
一、IP地址其實是標誌一個主機(或路由器)和一條鏈路的接口。ui
二、用轉發器或網橋鏈接起來的若干個局域網仍爲一個網絡,所以這些局域網都具備一樣的網絡號。spa
三、全部分配到網絡號的網絡,不管是範圍很小的局域網,仍是可能覆蓋很大地理範圍的廣域網,都是平等的。
路由轉發過程當中,路由器僅根據目的站的IP地址進行路由選擇,IP數據報首部的內容不變;
而MAC幀每通過一個路由,都將首部的目的地址和源地址更新爲下一個路由(主機)硬件地址和這個路由(主機)硬件地址。
IP層屏蔽了傳輸中的細節。
每個主機都設有一個 ARP 高速緩存 (ARP cache),裏面有所在的局域網上的各主機和路由器的 IP 地址到硬件地址的映射表。
< IP address;MAC address;TTL >
(TTL:地址映射有效時間)
當主機 A 欲向本局域網上的某個主機 B 發送 IP 數據報時,就先在其 ARP 高速緩存中查看有無主機 B 的 IP 地址。
ARP 是解決 同一個局域網上的主機或路由器的 IP 地址和硬件地址的映射問題。
若是所要找的主機和源主機不在同一個局域網上,那麼就要 經過 ARP 找到一個位於本局域網上的某個路由器的硬件地址,而後把分組發送給這個路由器,讓這個路由器把分組轉發給下一個網絡。剩下的工做就由下一個網絡來作。
首部 前部分(20字節)是固定長度,是全部IP數據報共有的;
後面是一些可選字段,其 長度可變。
在路由表中,對每一條路由,最主要的是(目的網絡地址,下一跳地址)
根據目的網絡地址就能肯定下一跳路由器,這樣作的結果是:
- IP 數據報最終必定能夠找到目的主機所在目的網絡上的路由器(可能要經過屢次的間接交付)。
- 只有到達最後一個路由器時,才試圖向目的主機進行直接交付。
雖然互聯網全部的分組轉發都是基於目的主機所在的網絡,但在大多數狀況下都容許有這樣的特例,即爲特定的目的主機指明一個路由。
路由器還可採用默認路由以減小路由表所佔用的空間和搜索路由表所用的時間。
若是一個主機鏈接在一個小網絡上,而這個網絡只用一個路由器和互聯網鏈接,那麼在這種狀況下使用默認路由是很是合適的。
「下一跳」是在下層實現的
當路由器收到待轉發的數據報,不是將下一跳路由器的 IP 地址填入 IP 數據報,而是送交下層的網絡接口軟件。
網絡接口軟件使用 ARP 負責將 下一跳路由器的 IP 地址轉換成硬件地址,並將此 硬件地址放在鏈路層的 MAC 幀的首部,而後根據這個硬件地址找到下一跳路由器。
從 1985 年起在 IP 地址中又增長了一個「子網號字段」(Subnet-ID),使兩級的 IP 地址變成爲三級的 IP 地址。
這種作法叫作劃分子網 (subnetting) 。
子網掩碼 (subnet mask)用於找出 IP 地址中的子網部分。
子網掩碼長度爲32位(IP地址的長度):
路由器在和相鄰路由器交換路由信息時,必須把本身所在網絡(或子網)的子網掩碼告訴相鄰路由器。
路由器的路由表中的每個項目,除了要給出目的網絡地址外,還必須同時給出該網絡的子網掩碼。
(目的網絡地址,子網掩碼,下一跳地址)
劃分子網狀況下的分組轉發
(1) 從收到的分組的首部提取 目的 IP 地址 D。
(2) 先用(本網絡內部) 各網絡的子網掩碼和 D 逐位相「與」,看是否和相應的網絡地址匹配。 若匹配,則將分組直接交付。不然就是間接交付,執行 (3)。
(3) 若路由表中有目的地址爲 D 的特定主機路由,則將分組傳送給指明的下一跳路由器;不然,執行 (4)。
(4) 對 路由表中的每一行,將 子網掩碼和 D 逐位相「與」。若結果與該行的目的網絡地址匹配,則將分組傳送給該行指明的下一跳路由器;不然,執行 (5)。
(5) 若路由表中有一個默認路由,則將分組傳送給路由表中所指明的默認路由器;不然,執行 (6)。
(6) 報告轉發分組出錯。
CIDR使用各類長度的「網絡前綴」(network-prefix)來代替分類地址中的網絡號和子網號。
IP 地址從三級編址(使用子網掩碼)又回到了兩級編址。
IP地址 ::= {<網絡前綴>, <主機號>}
CIDR 使用「斜線記法」(slash notation)即在 IP 地址面加上一個斜線「/」,而後寫上網絡前綴所佔的位數(這個數值對應於三級編址中子網掩碼中 1 的個數)。例如: 220.78.168.0/24。
CIDR 把網絡前綴都相同的連續的 IP 地址組成「CIDR 地址塊」。
一個 CIDR 地址塊能夠表示不少地址,這種地址的聚合常稱爲路由聚合,它使得路由表中的一個項目能夠表示不少個(例如上千個)原來傳統分類地址的路由。
能夠更加有效地分配 IPv4 的地址空間,可根據客戶的須要分配適當大小的 CIDR 地址塊。
使用 CIDR 時,路由表中的每一個項目由「網絡前綴」和「下一跳地址」組成。在查找路由表時可能會獲得不止一個匹配結果。
應當從匹配結果中選擇具備最長網絡前綴的路由:最長前綴匹配 (longest-prefix matching)。
爲了進行更加有效的查找,一般是將無分類編址的路由表存放在一種層次的數據結構中,而後自上而下地按層次進行查找。這裏最經常使用的就是二叉線索 (binary trie)。IP 地址中從左到右的比特值決定了從根結點逐層向下層延伸的路徑,而二叉線索中的各個路徑就表明路由表中存放的各個地址。