12.08 IP 協議,明明白白

一圖看完本文

一、 計算機網絡體系結構分層

計算機網絡體系結構分層

計算機網絡體系結構分層

不難看出,TCP/IP 與 OSI 在分層模塊上稍有區別。OSI 參考模型注重“通信協議必要的功能是什麼”,而 TCP/IP 則更強調“在計算機上實現協議應該開發哪種程序”。

二、 TCP/IP 基礎

1. TCP/IP 的具體含義

從字面意義上講,有人可能會認為 TCP/IP 是指 TCP 和 IP 兩種協議。實際生活當中有時也確實就是指這兩種協議。然而在很多情況下,它只是利用 IP 進行通信時所必須用到的協議群的統稱。具體來說,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都屬於 TCP/IP 協議。他們與 TCP 或 IP 的關係緊密,是互聯網必不可少的組成部分。TCP/IP 一詞泛指這些協議,因此,有時也稱 TCP/IP 為網際協議群。

互聯網進行通信時,需要相應的網絡協議,TCP/IP 原本就是為使用互聯網而開發制定的協議族。因此,互聯網的協議就是 TCP/IP,TCP/IP 就是互聯網的協議。

網際協議群

2. 數據包

包、幀、數據包、段、消息

以上五個術語都用來表述數據的單位,大致區分如下:

包可以說是全能性術語;幀用於表示數據鏈路層中包的單位;數據包是 IP 和 UDP 等網絡層以上的分層中包的單位;段則表示 TCP 數據流中的信息;消息是指應用協議中數據的單位。

每個分層中,都會對所發送的數據附加一個首部,在這個首部中包含了該層必要的信息,如發送的目標地址以及協議相關信息。通常,為協議提供的信息為包首部,所要發送的內容為數據。在下一層的角度看,從上一層收到的包全部都被認為是本層的數據。

數據包首部

網絡中傳輸的數據包由兩部分組成:一部分是協議所要用到的首部,另一部分是上一層傳過來的數據。首部的結構由協議的具體規範詳細定義。在數據包的首部,明確標明瞭協議應該如何讀取數據。反過來說,看到首部,也就能夠了解該協議必要的信息以及所要處理的數據。

包首部就像協議的臉。

3. 數據處理流程

下圖以用戶 a 向用戶 b 發送郵件為例子:

數據處理流程

① 應用程序處理首先應用程序會進行編碼處理,這些編碼相當於 OSI 的表示層功能;編碼轉化後,郵件不一定馬上被髮送出去,這種何時建立通信連接何時發送數據的管理功能,相當於 OSI 的會話層功能。② TCP 模塊的處理TCP 根據應用的指示,負責建立連接、發送數據以及斷開連接。TCP 提供將應用層發來的數據順利發送至對端的可靠傳輸。為了實現這一功能,需要在應用層數據的前端附加一個 TCP 首部。③ IP 模塊的處理IP 將 TCP 傳過來的 TCP 首部和 TCP 數據合起來當做自己的數據,並在 TCP 首部的前端加上自己的 IP 首部。IP 包生成後,參考路由控制表決定接受此 IP 包的路由或主機。④ 網絡接口(以太網驅動)的處理從 IP 傳過來的 IP 包對於以太網來說就是數據。給這些數據附加上以太網首部並進行發送處理,生成的以太網數據包將通過物理層傳輸給接收端。⑤ 網絡接口(以太網驅動)的處理主機收到以太網包後,首先從以太網包首部找到 MAC 地址判斷是否為發送給自己的包,若不是則丟棄數據。如果是發送給自己的包,則從以太網包首部中的類型確定數據類型,再傳給相應的模塊,如 IP、ARP 等。這裡的例子則是 IP 。⑥ IP 模塊的處理IP 模塊接收到 數據後也做類似的處理。從包首部中判斷此 IP 地址是否與自己的 IP 地址匹配,如果匹配則根據首部的協議類型將數據發送給對應的模塊,如 TCP、UDP。這裡的例子則是 TCP。另外嗎,對於有路由器的情況,接收端地址往往不是自己的地址,此時,需要藉助路由控制表,在調查應該送往的主機或路由器之後再進行轉發數據。⑦ TCP 模塊的處理在 TCP 模塊中,首先會計算一下校驗和,判斷數據是否被破壞。然後檢查是否在按照序號接收數據。最後檢查端口號,確定具體的應用程序。數據被完整地接收以後,會傳給由端口號識別的應用程序。⑧ 應用程序的處理接收端應用程序會直接接收發送端發送的數據。通過解析數據,展示相應的內容。

三、傳輸層中的 TCP 和 UDP

TCP/IP 中有兩個具有代表性的傳輸層協議,分別是 TCP 和 UDP。

TCP 是面向連接的、可靠的流協議。流就是指不間斷的數據結構,當應用程序採用 TCP 發送消息時,雖然可以保證發送的順序,但還是猶如沒有任何間隔的數據流發送給接收端。TCP 為提供可靠性傳輸,實行“順序控制”或“重發控制”機制。此外還具備“流控制(流量控制)”、“擁塞控制”、提高網絡利用率等眾多功能。UDP 是不具有可靠性的數據報協議。細微的處理它會交給上層的應用去完成。在 UDP 的情況下,雖然可以確保發送消息的大小,卻不能保證消息一定會到達。因此,應用有時會根據自己的需要進行重發處理。TCP 和 UDP 的優缺點無法簡單地、絕對地去做比較:TCP 用於在傳輸層有必要實現可靠傳輸的情況;而在一方面,UDP 主要用於那些對高速傳輸和實時性有較高要求的通信或廣播通信。TCP 和 UDP 應該根據應用的目的按需使用。

1. 端口號

數據鏈路和 IP 中的地址,分別指的是 MAC 地址和 IP 地址。前者用來識別同一鏈路中不同的計算機,後者用來識別 TCP/IP 網絡中互連的主機和路由器。在傳輸層也有這種類似於地址的概念,那就是端口號。端口號用來識別同一臺計算機中進行通信的不同應用程序。因此,它也被稱為程序地址。

1.1 根據端口號識別應用

一臺計算機上同時可以運行多個程序。傳輸層協議正是利用這些端口號識別本機中正在進行通信的應用程序,並準確地將數據傳輸。

通過端口號識別應用

1.2 通過 IP 地址、端口號、協議號進行通信識別

僅憑目標端口號識別某一個通信是遠遠不夠的。

通過端口號、IP地址、協議號進行通信識別

① 和② 的通信是在兩臺計算機上進行的。它們的目標端口號相同,都是80。這裡可以根據源端口號加以區分。③ 和 ① 的目標端口號和源端口號完全相同,但它們各自的源 IP 地址不同。此外,當 IP 地址和端口號全都一樣時,我們還可以通過協議號來區分(TCP 和 UDP)。

1.3 端口號的確定

標準既定的端口號:這種方法也叫靜態方法。它是指每個應用程序都有其指定的端口號。但並不是說可以隨意使用任何一個端口號。例如 HTTP、FTP、TELNET 等廣為使用的應用協議中所使用的端口號就是固定的。這些端口號被稱為知名端口號,分佈在 0~1023 之間;除知名端口號之外,還有一些端口號被正式註冊,它們分佈在 1024~49151 之間,不過這些端口號可用於任何通信用途。時序分配法:服務器有必要確定監聽端口號,但是接受服務的客戶端沒必要確定端口號。在這種方法下,客戶端應用程序完全可以不用自己設置端口號,而全權交給操作系統進行分配。動態分配的端口號範圍在 49152~65535 之間。

1.4 端口號與協議

端口號由其使用的傳輸層協議決定。因此,不同的傳輸層協議可以使用相同的端口號。此外,那些知名端口號與傳輸層協議並無關係。只要端口一致都將分配同一種應用程序進行處理。

2. UDP

UDP 不提供複雜的控制機制,利用 IP 提供面向無連接的通信服務。並且它是將應用程序發來的數據在收到的那一刻,立即按照原樣發送到網絡上的一種機制。即使是出現網絡擁堵的情況,UDP 也無法進行流量控制等避免網絡擁塞行為。此外,傳輸途中出現丟包,UDP 也不負責重發。甚至當包的到達順序出現亂序時也沒有糾正的功能。如果需要以上的細節控制,不得不交由採用 UDP 的應用程序去處理。UDP 常用於一下幾個方面:1.包總量較少的通信(DNS、SNMP等);2.視頻、音頻等多媒體通信(即時通信);3.限定於 LAN 等特定網絡中的應用通信;4.廣播通信(廣播、多播)。

3. TCP

TCP 與 UDP 的區別相當大。它充分地實現了數據傳輸時各種控制功能,可以進行丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。而這些在 UDP 中都沒有。此外,TCP 作為一種面向有連接的協議,只有在確認通信對端存在時才會發送數據,從而可以控制通信流量的浪費。根據 TCP 的這些機制,在 IP 這種無連接的網絡上也能夠實現高可靠性的通信( 主要通過檢驗和、序列號、確認應答、重發控制、連接管理以及窗口控制等機制實現)。

3.1 三次握手(重點)

TCP 提供面向有連接的通信傳輸。面向有連接是指在數據通信開始之前先做好兩端之間的準備工作。所謂三次握手是指建立一個 TCP 連接時需要客戶端和服務器端總共發送三個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發。

下面來看看三次握手的流程圖:

三次握手

第一次握手:客戶端將標誌位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給服務器端,客戶端進入SYN_SENT狀態,等待服務器端確認。第二次握手:服務器端收到數據包後由標誌位SYN=1知道客戶端請求建立連接,服務器端將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給客戶端以確認連接請求,服務器端進入SYN_RCVD狀態。第三次握手:客戶端收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該數據包發送給服務器端,服務器端檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,客戶端和服務器端進入ESTABLISHED狀態,完成三次握手,隨後客戶端與服務器端之間可以開始傳輸數據了。

3.2 四次揮手(重點)

四次揮手即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發。由於TCP連接是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉。

下面來看看四次揮手的流程圖:

四次揮手

中斷連接端可以是客戶端,也可以是服務器端。第一次揮手:客戶端發送一個FIN=M,用來關閉客戶端到服務器端的數據傳送,客戶端進入FIN_WAIT_1狀態。意思是說"我客戶端沒有數據要發給你了",但是如果你服務器端還有數據沒有發送完成,則不必急著關閉連接,可以繼續發送數據。第二次揮手:服務器端收到FIN後,先發送ack=M+1,告訴客戶端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息。這個時候客戶端就進入FIN_WAIT_2 狀態,繼續等待服務器端的FIN報文。第三次揮手:當服務器端確定數據已發送完成,則向客戶端發送FIN=N報文,告訴客戶端,好了,我這邊數據發完了,準備好關閉連接了。服務器端進入LAST_ACK狀態。第四次揮手:客戶端收到FIN=N報文後,就知道可以關閉連接了,但是他還是不相信網絡,怕服務器端不知道要關閉,所以發送ack=N+1後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。服務器端收到ACK後,就知道可以斷開連接了。客戶端等待了2MSL後依然沒有收到回覆,則證明服務器端已正常關閉,那好,我客戶端也可以關閉連接了。最終完成了四次握手。

上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,

具體流程如下圖:

同時揮手

3.3 通過序列號與確認應答提高可靠性

在 TCP 中,當發送端的數據到達接收主機時,接收端主機會返回一個已收到消息的通知。這個消息叫做確認應答(ACK)。當發送端將數據發出之後會等待對端的確認應答。如果有確認應答,說明數據已經成功到達對端。反之,則數據丟失的可能性很大。在一定時間內沒有等待到確認應答,發送端就可以認為數據已經丟失,並進行重發。由此,即使產生了丟包,仍然能夠保證數據能夠到達對端,實現可靠傳輸。未收到確認應答並不意味著數據一定丟失。也有可能是數據對方已經收到,只是返回的確認應答在途中丟失。這種情況也會導致發送端誤以為數據沒有到達目的地而重發數據。此外,也有可能因為一些其他原因導致確認應答延遲到達,在源主機重發數據以後才到達的情況也屢見不鮮。此時,源主機只要按照機制重發數據即可。對於目標主機來說,反覆收到相同的數據是不可取的。為了對上層應用提供可靠的傳輸,目標主機必須放棄重複的數據包。為此我們引入了序列號。
序列號是按照順序給發送數據的每一個字節(8位字節)都標上號碼的編號。接收端查詢接收數據 TCP 首部中的序列號和數據的長度,將自己下一步應該接收的序列號作為確認應答返送回去。通過序列號和確認應答號,TCP 能夠識別是否已經接收數據,又能夠判斷是否需要接收,從而實現可靠傳輸。

序列號和確認應答

3.4 重發超時的確定

重發超時是指在重發數據之前,等待確認應答到來的那個特定時間間隔。如果超過這個時間仍未收到確認應答,發送端將進行數據重發。最理想的是,找到一個最小時間,它能保證“確認應答一定能在這個時間內返回”。TCP 要求不論處在何種網絡環境下都要提供高性能通信,並且無論網絡擁堵情況發生何種變化,都必須保持這一特性。為此,它在每次發包時都會計算往返時間及其偏差。將這個往返時間和偏差時間相加,重發超時的時間就是比這個總和要稍大一點的值。在 BSD 的 Unix 以及 Windows 系統中,超時都以0.5秒為單位進行控制,因此重發超時都是0.5秒的整數倍。不過,最初其重發超時的默認值一般設置為6秒左右。數據被重發之後若還是收不到確認應答,則進行再次發送。此時,等待確認應答的時間將會以2倍、4倍的指數函數延長。此外,
數據也不會被無限、反覆地重發。達到一定重發次數之後,如果仍沒有任何確認應答返回,就會判斷為網絡或對端主機發生了異常,強制關閉連接。並且通知應用通信異常強行終止。

3.5 以段為單位發送數據

在建立 TCP 連接的同時,也可以確定發送數據包的單位,我們也可以稱其為“最大消息長度”(MSS)。最理想的情況是,最大消息長度正好是 IP 中不會被分片處理的最大數據長度。TCP 在傳送大量數據時,是以 MSS 的大小將數據進行分割發送。進行重發時也是以 MSS 為單位。MSS 在三次握手的時候,在兩端主機之間被計算得出。兩端的主機在發出建立連接的請求時,會在 TCP 首部中寫入 MSS 選項,告訴對方自己的接口能夠適應的 MSS 的大小。然後會在兩者之間選擇一個較小的值投入使用。

3.6 利用窗口控制提高速度

TCP 以1個段為單位,每發送一個段進行一次確認應答的處理。這樣的傳輸方式有一個缺點,就是包的往返時間越長通信性能就越低。為解決這個問題,TCP 引入了窗口這個概念。確認應答不再是以每個分段,而是以更大的單位進行確認,轉發時間將會被大幅地縮短。也就是說,發送端主機,在發送了一個段以後不必要一直等待確認應答,而是繼續發送。如下圖所示:


窗口控制窗口大小就是指無需等待確認應答而可以繼續發送數據的最大值。上圖中窗口大小為4個段。這個機制實現了使用大量的緩衝區,通過對多個段同時進行確認應答的功能。

3.7 滑動窗口控制

滑動窗口

上圖中的窗口內的數據即便沒有收到確認應答也可以被髮送出去。不過,在整個窗口的確認應答沒有到達之前,如果其中部分數據出現丟包,那麼發送端仍然要負責重傳。為此,發送端主機需要設置緩存保留這些待被重傳的數據,直到收到他們的確認應答。在滑動窗口以外的部分包括未發送的數據以及已經確認對端已收到的數據。當數據發出後若如期收到確認應答就可以不用再進行重發,此時數據就可以從緩存區清除。收到確認應答的情況下,將窗口滑動到確認應答中的序列號的位置。這樣可以順序地將多個段同時發送提高通信性能。這種機制也別稱為滑動窗口控制。

3.8 窗口控制中的重發控制

在使用窗口控制中, 出現丟包一般分為兩種情況:

① 確認應答未能返回的情況。在這種情況下,數據已經到達對端,是不需要再進行重發的,如下圖:

部分確認應答丟失

② 某個報文段丟失的情況。接收主機如果收到一個自己應該接收的序列號以外的數據時,會針對當前為止收到數據返回確認應答。如下圖所示,當某一報文段丟失後,發送端會一直收到序號為1001的確認應答,因此,在窗口比較大,又出現報文段丟失的情況下,同一個序列號的確認應答將會被重複不斷地返回。而發送端主機如果連續3次收到同一個確認應答,就會將其對應的數據進行重發。這種機制比之前提到的超時管理更加高效,因此也被稱為高速重發控制。

高速重發控制

四、網絡層中的 IP 協議

IP(IPv4、IPv6)相當於 OSI 參考模型中的第3層——網絡層。網絡層的主要作用是“實現終端節點之間的通信”。這種終端節點之間的通信也叫“點對點通信”。網絡的下一層——數據鏈路層的主要作用是在互連同一種數據鏈路的節點之間進行包傳遞。而一旦跨越多種數據鏈路,就需要藉助網絡層。網絡層可以跨越不同的數據鏈路,即使是在不同的數據鏈路上也能實現兩端節點之間的數據包傳輸。
IP 大致分為三大作用模塊,它們是 IP 尋址、路由(最終節點為止的轉發)以及 IP 分包與組包。

1. IP 地址

1.1 IP 地址概述

在計算機通信中,為了識別通信對端,必須要有一個類似於地址的識別碼進行標識。在數據鏈路中的 MAC 地址正是用來標識同一個鏈路中不同計算機的一種識別碼。作為網絡層的 IP ,也有這種地址信息,一般叫做 IP 地址。IP 地址用於在“連接到網絡中的所有主機中識別出進行通信的目標地址”。因此,在 TCP/IP 通信中所有主機或路由器必須設定自己的 IP 地址。不論一臺主機與哪種數據鏈路連接,其 IP 地址的形式都保持不變。IP 地址(IPv4 地址)由32位正整數來表示。IP 地址在計算機內部以二進制方式被處理。然而,由於我們並不習慣於採用二進制方式,我們將32位的 IP 地址以每8位為一組,分成4組,每組以 “.” 隔開,再將每組數轉換成十進制數。如下:

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

如下圖,網絡標識在數據鏈路的每個段配置不同的值。網絡標識必須保證相互連接的每個段的地址不相重複。而相同段內相連的主機必須有相同的網絡地址。IP 地址的“主機標識”則不允許在同一個網段內重複出現。由此,可以通過設置網絡地址和主機地址,在相互連接的整個網絡中保證每臺主機的 IP 地址都不會相互重疊。即 IP 地址具有了唯一性。

IP地址的主機標識

如下圖,IP 包被轉發到途中某個路由器時,正是利用目標 IP 地址的網絡標識進行路由。因為即使不看主機標識,只要一見到網絡標識就能判斷出是否為該網段內的主機。

IP地址的網絡標識

1.3 IP 地址的分類

IP 地址分為四個級別,分別為A類、B類、C類、D類。它根據 IP 地址中從第 1 位到第 4 位的比特列對其網絡標識和主機標識進行區分。A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網絡標識。用十進制表示的話,0.0.0.0~127.0.0.0 是 A 類的網絡地址。A 類地址的後 24 位相當於主機標識。因此,一個網段內可容納的主機地址上限為16,777,214個。B 類 IP 地址是前兩位 “10” 的地址。從第 1 位到第 16 位是它的網絡標識。用十進制表示的話,128.0.0.0~191.255.0.0 是 B 類的網絡地址。B 類地址的後 16 位相當於主機標識。因此,一個網段內可容納的主機地址上限為65,534個。C 類 IP 地址是前三位為 “110” 的地址。
從第 1 位到第 24 位是它的網絡標識。用十進制表示的話,192.0.0.0~223.255.255.0 是 C 類的網絡地址。C 類地址的後 8 位相當於主機標識。因此,一個網段內可容納的主機地址上限為254個。D 類 IP 地址是前四位為 “1110” 的地址。從第 1 位到第 32 位是它的網絡標識。用十進制表示的話,224.0.0.0~239.255.255.255 是 D 類的網絡地址。D 類地址沒有主機標識,常用於多播。在分配 IP 地址時關於主機標識有一點需要注意。即要用比特位表示主機地址時,不可以全部為 0 或全部為 1。因為全部為 0 只有在表示對應的網絡地址或 IP 地址不可以獲知的情況下才使用。而全部為 1 的主機通常作為廣播地址。因此,在分配過程中,應該去掉這兩種情況。這也是為什麼 C 類地址每個網段最多隻能有 254( 28 - 2 = 254)個主機地址的原因。

1.4 廣播地址

廣播地址用於在同一個鏈路中相互連接的主機之間發送數據包。將 IP 地址中的主機地址部分全部設置為 1,就成了廣播地址。廣播分為本地廣播和直接廣播兩種。在本網絡內的廣播叫做本地廣播;在不同網絡之間的廣播叫做直接廣播。

1.5 IP 多播

多播用於將包發送給特定組內的所有主機。由於其直接使用 IP 地址,因此也不存在可靠傳輸。相比於廣播,多播既可以穿透路由器,又可以實現只給那些必要的組發送數據包。請看下圖:


IP 多播多播使用 D 類地址。因此,如果從首位開始到第 4 位是 “1110”,就可以認為是多播地址。而剩下的 28 位可以成為多播的組編號。此外, 對於多播,所有的主機(路由器以外的主機和終端主機)必須屬於 224.0.0.1 的組,所有的路由器必須屬於 224.0.0.2 的組。

1.6 子網掩碼

現在一個 IP 地址的網絡標識和主機標識已不再受限於該地址的類別,而是由一個叫做“子網掩碼”的識別碼通過子網網絡地址細分出比 A 類、B 類、C 類更小粒度的網絡。這種方式實際上就是將原來 A 類、B 類、C 類等分類中的主機地址部分用作子網地址,可以將原網絡分為多個物理網絡的一種機制。子網掩碼用二進制方式表示的話,也是一個 32 位的數字。它對應 IP 地址網絡標識部分的位全部為 “1”,對應 IP 地址主機標識的部分則全部為 “0”。由此,一個 IP 地址可以不再受限於自己的類別,而是可以用這樣的子網掩碼自由地定位自己的網絡標識長度。當然,子網掩碼必須是 IP 地址的首位開始連續的 “1”。對於子網掩碼,目前有兩種表示方式。第一種是,將 IP 地址與子網掩碼的地址分別用兩行來表示。以 172.20.100.52 的前 26 位是網絡地址的情況為例,如下:

第二種表示方式是,在每個 IP 地址後面追加網絡地址的位數用 “/ ” 隔開,如下:

2. 路由

發送數據包時所使用的地址是網絡層的地址,即 IP 地址。然而僅僅有 IP 地址還不足以實現將數據包發送到對端目標地址,在數據發送過程中還需要類似於“指明路由器或主機”的信息,以便真正發往目標地址。保存這種信息的就是路由控制表。該路由控制表的形成方式有兩種:一種是管理員手動設置,另一種是路由器與其他路由器相互交換信息時自動刷新。前者也叫做靜態路由控制,而後者叫做動態路由控制。IP 協議始終認為路由表是正確的。然後,IP 本身並沒有定義製作路由控制表的協議。即 IP 沒有製作路由控制表的機制。該表示由一個叫做“路由協議”的協議製作而成。

2.1 IP 地址與路由控制

IP 地址的網絡地址部分用於進行路由控制。路由控制表中記錄著網絡地址與下一步應該發送至路由器的地址。在發送 IP 包時,首先要確定 IP 包首部中的目標地址,再從路由控制表中找到與該地址具有相同網絡地址的記錄,根據該記錄將 IP 包轉發給相應的下一個路由器。如果路由控制表中存在多條相同網絡地址的記錄,就選擇一個最為吻合的網絡地址。

路由控制表與 IP 包發送

3. IP 分包與組包

每種數據鏈路的最大傳輸單元(MTU)都不盡相同,因為每個不同類型的數據鏈路的使用目的不同。使用目的不同,可承載的 MTU 也就不同。任何一臺主機都有必要對 IP 分片進行相應的處理。分片往往在網絡上遇到比較大的報文無法一下子發送出去時才會進行處理。經過分片之後的 IP 數據報在被重組的時候,只能由目標主機進行。路由器雖然做分片但不會進行重組。

3.1 路徑 MTU 發現

分片機制也有它的不足。如路由器的處理負荷加重之類。因此,只要允許,是不希望由路由器進行 IP 數據包的分片處理的。為了應對分片機制的不足,“路徑 MTU 發現” 技術應運而生。路徑 MTU 指的是,從發送端主機到接收端主機之間不需要分片是最大 MTU 的大小。即路徑中存在的所有數據鏈路中最小的 MTU 。進行路徑 MTU 發現,就可以避免在中途的路由器上進行分片處理,也可以在 TCP 中發送更大的包。

4. IPv6

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

4.1 IPv6 的特點

IP 得知的擴大與路由控制表的聚合。性能提升。包首部長度採用固定的值(40字節),不再採用首部檢驗碼。簡化首部結構,減輕路由器負擔。路由器不再做分片處理。支持即插即用功能。即使沒有DHCP服務器也可以實現自動分配 IP 地址。採用認證與加密功能。應對偽造 IP 地址的網絡安全功能以及防止線路竊聽的功能。多播、Mobile IP 成為擴展功能。

4.2 IPv6 中 IP 地址的標記方法

一般人們將 128 比特 IP 地址以每 16 比特為一組,每組用冒號(“:”)隔開進行標記。而且如果出現連續的 0 時還可以將這些 0 省略,並用兩個冒號(“::”)隔開。但是,一個 IP 地址中只允許出現一次兩個連續的冒號。

4.3 IPv6 地址的結構

IPv6 類似 IPv4,也是通過 IP 地址的前幾位標識 IP 地址的種類。在互聯網通信中,使用一種全局的單播地址。它是互聯網中唯一的一個地址,不需要正式分配 IP 地址。

4.4 全局單播地址

全局單播地址是指世界上唯一的一個地址。它是互聯網通信以及各個域內部通信中最為常用的一個 IPv6 地址。格式如下圖所示,現在 IPv6 的網絡中所使用的格式為,n = 48,m = 16 以及 128 - n - m = 64。即前 64 比特為網絡標識,後 64 比特為主機標識。

全局單播地址

4.5 鏈路本地單播地址

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

鏈路本地單播地址

4.6 唯一本地地址

唯一本地地址是不進行互聯網通信時所用的地址。唯一本地地址雖然不會與互聯網連接,但是也會盡可能地隨機生成一個唯一的全局 ID。L 通常被置為 1全局 ID 的值隨機決定子網 ID 是指該域子網地址接口 ID 即為接口的 ID

唯一本地地址

4.7 IPv6 分段處理

IPv6 的分片處理只在作為起點的發送端主機上進行,路由器不參與分片。IPv6 中最小 MTU 為 1280 字節,因此,在嵌入式系統中對於那些有一定系統資源限制的設備來說,不需要進行“路徑 MTU 發現”,而是在發送 IP 包時直接以 1280 字節為單位分片送出。

4.8 IP 首部(暫略)

5. IP 協議相關技術

IP 旨在讓最終目標主機收到數據包,但是在這一過程中僅僅有 IP 是無法實現通信的。必須還有能夠解析主機名稱和 MAC 地址的功能,以及數據包在發送過程中異常情況處理的功能。

5.1 DNS

我們平常在訪問某個網站時不適用 IP 地址,而是用一串由羅馬字和點號組成的字符串。而一般用戶在使用 TCP/IP 進行通信時也不使用 IP 地址。能夠這樣做是因為有了 DNS (Domain Name System)功能的支持。DNS 可以將那串字符串自動轉換為具體的 IP 地址。這種 DNS 不僅適用於 IPv4,還適用於 IPv6。

5.2 ARP

只要確定了 IP 地址,就可以向這個目標地址發送 IP 數據報。然而,在底層數據鏈路層,進行實際通信時卻有必要了解每個 IP 地址所對應的 MAC 地址。ARP 是一種解決地址問題的協議。以目標 IP 地址為線索,用來定位下一個應該接收數據分包的網絡設備對應的 MAC 地址。不過 ARP 只適用於 IPv4,不能用於 IPv6。IPv6 中可以用 ICMPv6 替代 ARP 發送鄰居探索消息。RARP 是將 ARP 反過來,從 MAC 地址定位 IP 地址的一種協議。

5.3 ICMP

ICMP 的主要功能包括,確認 IP 包是否成功送達目標地址,通知在發送過程當中 IP 包被廢棄的具體原因,改善網絡設置等。IPv4 中 ICMP 僅作為一個輔助作用支持 IPv4。也就是說,在 IPv4 時期,即使沒有 ICMP,仍然可以實現 IP 通信。然而,在 IPv6 中,ICMP 的作用被擴大,如果沒有 ICMPv6,IPv6 就無法進行正常通信。

5.4 DHCP

如果逐一為每一臺主機設置 IP 地址會是非常繁瑣的事情。特別是在移動使用筆記本電腦、只能終端以及平板電腦等設備時,每移動到一個新的地方,都要重新設置 IP 地址。於是,為了實現自動設置 IP 地址、統一管理 IP 地址分配,就產生了 DHCP(Dynamic Host Configuration Protocol)協議。有了 DHCP,計算機只要連接到網絡,就可以進行 TCP/IP 通信。也就是說,DHCP 讓即插即用變得可能。DHCP 不僅在 IPv4 中,在 IPv6 中也可以使用。

5.5 NAT

NAT(Network Address Translator)是用於在本地網絡中使用私有地址,在連接互聯網時轉而使用全局 IP 地址的技術。除轉換 IP 地址外,還出現了可以轉換 TCP、UDP 端口號的 NAPT(Network Address Ports Translator)技術,由此可以實現用一個全局 IP 地址與多個主機的通信。NAT(NAPT)實際上是為正在面臨地址枯竭的 IPv4 而開發的技術。不過,在 IPv6 中為了提高網絡安全也在使用 NAT,在 IPv4 和 IPv6 之間的相互通信當中常常使用 NAT-PT。

5.6 IP 隧道

夾著 IPv4 網絡的兩個 IPv6 網絡

如上圖的網絡環境中,網絡 A 與網絡 B 之間無法直接進行通信,為了讓它們之間正常通信,這時必須得采用 IP 隧道的功能。IP 隧道可以將那些從網絡 A 發過來的 IPv6 的包統合為一個數據,再為之追加一個 IPv4 的首部以後轉發給網絡 C。一般情況下,緊接著 IP 首部的是 TCP 或 UDP 的首部。然而,現在的應用當中“ IP 首部的後面還是 IP 首部”或者“ IP 首部的後面是 IPv6 的首部”等情況與日俱增。這種在網絡層的首部後面追加網絡層首部的通信方法就叫做“ IP 隧道”。

鏈接:https://www.jianshu.com/p/9f3e879a4c9c