一篇文章帶你熟悉 TCP/IP 協議(網路協議篇二)

滌生_Woo發表於2017-11-11

同樣的,本文篇幅也比較長,先來一張思維導圖,帶大家過一遍。

一圖看完本文
一圖看完本文

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

計算機網路體系結構分層
計算機網路體系結構分層

計算機網路體系結構分層
計算機網路體系結構分層

不難看出,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地址、協議號進行通訊識別
通過埠號、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組,每組以 “.” 隔開,再將每組數轉換成十進位制數。如下:
28 28 28 28
10101100 00010100 00000001 00000001 (2進位制)
10101100. 00010100. 00000001. 00000001 (2進位制)
172. 20. 1. 1 (10進位制)
1.2 IP 地址由網路和主機兩部分標識組成
  • 如下圖,網路標識在資料鏈路的每個段配置不同的值。網路標識必須保證相互連線的每個段的地址不相重複。而相同段內相連的主機必須有相同的網路地址。IP 地址的“主機標識”則不允許在同一個網段內重複出現。由此,可以通過設定網路地址和主機地址,在相互連線的整個網路中保證每臺主機的 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 多播
    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 地址 172. 20. 100. 52
子網掩碼 255. 255. 255. 192
網路地址 172. 20. 100. 0
子網掩碼 255. 255. 255. 192
廣播地址 172. 20. 100. 63
子網掩碼 255. 255. 255. 192
  • 第二種表示方式是,在每個 IP 地址後面追加網路地址的位數用 “/ ” 隔開,如下:
IP 地址 172. 20. 100. 52 / 26
網路地址 172. 20. 100. 0 / 26
廣播地址 172. 20. 100. 63 / 26
  • 另外,在第二種方式下記述網路地址時可以省略後面的 “0” 。例如:172.20.0.0/26 跟 172.20/26 其實是一個意思。

2. 路由

  • 傳送資料包時所使用的地址是網路層的地址,即 IP 地址。然而僅僅有 IP 地址還不足以實現將資料包傳送到對端目標地址,在資料傳送過程中還需要類似於“指明路由器或主機”的資訊,以便真正發往目標地址。儲存這種資訊的就是路由控制表。
  • 該路由控制表的形成方式有兩種:一種是管理員手動設定,另一種是路由器與其他路由器相互交換資訊時自動重新整理。前者也叫做靜態路由控制,而後者叫做動態路由控制。
  • IP 協議始終認為路由表是正確的。然後,IP 本身並沒有定義製作路由控制表的協議。即 IP 沒有製作路由控制表的機制。該表示由一個叫做“路由協議”的協議製作而成。
2.1 IP 地址與路由控制
  • 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 地址。
未定義 0000 ... 0000(128位元) ::/ 128
環回地址 0000 ... 0001(128位元) ::1 / 128
唯一本地地址 1111 110 FC00:/ 7
鏈路本地單播地址 1111 1110 10 FE80::/ 10
多播地址 1111 1111 FF00::/ 8
全域性單播地址 (其他)
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 網路
夾著 IPv4 網路的兩個 IPv6 網路

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

後續

系列文章

上一篇文章: 一篇文章帶你詳解 HTTP 協議(網路協議篇一)

學習資料
  • 《TCP/IP 詳解》
  • 《圖解 TCP/IP》

相關文章