首頁 - 關于我們 - 新聞活動 - 一篇文章(zhāng)帶你熟悉 TCP/IP 協議(yì)

一篇文章(zhāng)帶你熟悉 TCP/IP 協議(yì)

2020-8-28新聞

image.png

一、 計算(suàn)機網絡體系結構分(fēn)層

image.png

image.png

不難看出,TCP/IP 與 OSI 在分(fēn)層模塊上稍有區(qū)别。OSI 參考模型注重“通(tōng)信協議(yì)必要的(de)功能是什(shén)麽”,而 TCP/IP 則更強調“在計算(suàn)機上實現協議(yì)應該開發哪種程序”。


二、 TCP/IP 基礎

1. TCP/IP 的(de)具體含義

從字面意義上講,有人(rén)可(kě)能會認爲 TCP/IP 是指 TCP 和(hé) IP 兩種協議(yì)。實際生活當中有時(shí)也(yě)确實就是指這(zhè)兩種協議(yì)。然而在很多(duō)情況下(xià),它隻是利用(yòng) IP 進行通(tōng)信時(shí)所必須用(yòng)到的(de)協議(yì)群的(de)統稱。具體來(lái)說,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都屬于 TCP/IP 協議(yì)。他(tā)們與 TCP 或 IP 的(de)關系緊密,是互聯網必不可(kě)少的(de)組成部分(fēn)。TCP/IP 一詞泛指這(zhè)些協議(yì),因此,有時(shí)也(yě)稱 TCP/IP 爲網際協議(yì)群。
互聯網進行通(tōng)信時(shí),需要相應的(de)網絡協議(yì),TCP/IP 原本就是爲使用(yòng)互聯網而開發制定的(de)協議(yì)族。因此,互聯網的(de)協議(yì)就是 TCP/IP,TCP/IP 就是互聯網的(de)協議(yì)。

image.png

2. 數據包

包、幀、數據包、段、消息
以上五個(gè)術語都用(yòng)來(lái)表述數據的(de)單位,大(dà)緻區(qū)分(fēn)如下(xià):

  • 包可(kě)以說是全能性術語;

  • 幀用(yòng)于表示數據鏈路層中包的(de)單位;

  • 數據包是 IP 和(hé) UDP 等網絡層以上的(de)分(fēn)層中包的(de)單位;

  • 段則表示 TCP 數據流中的(de)信息;

  • 消息是指應用(yòng)協議(yì)中數據的(de)單位。

每個(gè)分(fēn)層中,都會對(duì)所發送的(de)數據附加一個(gè)首部,在這(zhè)個(gè)首部中包含了(le)該層必要的(de)信息,如發送的(de)目标地址以及協議(yì)相關信息。通(tōng)常,爲協議(yì)提供的(de)信息爲包首部,所要發送的(de)内容爲數據。在下(xià)一層的(de)角度看,從上一層收到的(de)包全部都被認爲是本層的(de)數據。


image.png

網絡中傳輸的(de)數據包由兩部分(fēn)組成:一部分(fēn)是協議(yì)所要用(yòng)到的(de)首部,另一部分(fēn)是上一層傳過來(lái)的(de)數據。首部的(de)結構由協議(yì)的(de)具體規範詳細定義。在數據包的(de)首部,明(míng)确标明(míng)了(le)協議(yì)應該如何讀取數據。反過來(lái)說,看到首部,也(yě)就能夠了(le)解該協議(yì)必要的(de)信息以及所要處理(lǐ)的(de)數據。包首部就像協議(yì)的(de)臉。

3. 數據處理(lǐ)流程

下(xià)圖以用(yòng)戶 a 向用(yòng)戶 b 發送郵件爲例子:

image.png

  • ① 應用(yòng)程序處理(lǐ)
    首先應用(yòng)程序會進行編碼處理(lǐ),這(zhè)些編碼相當于 OSI 的(de)表示層功能;
    編碼轉化(huà)後,郵件不一定馬上被發送出去,這(zhè)種何時(shí)建立通(tōng)信連接何時(shí)發送數據的(de)管理(lǐ)功能,相當于 OSI 的(de)會話(huà)層功能。

  • ② TCP 模塊的(de)處理(lǐ)
    TCP 根據應用(yòng)的(de)指示,負責建立連接、發送數據以及斷開連接。TCP 提供将應用(yòng)層發來(lái)的(de)數據順利發送至對(duì)端的(de)可(kě)靠傳輸。爲了(le)實現這(zhè)一功能,需要在應用(yòng)層數據的(de)前端附加一個(gè) TCP 首部。

  • ③ IP 模塊的(de)處理(lǐ)
    IP 将 TCP 傳過來(lái)的(de) TCP 首部和(hé) TCP 數據合起來(lái)當做(zuò)自己的(de)數據,并在 TCP 首部的(de)前端加上自己的(de) IP 首部。IP 包生成後,參考路由控制表決定接受此 IP 包的(de)路由或主機。

  • ④ 網絡接口(以太網驅動)的(de)處理(lǐ)
    從 IP 傳過來(lái)的(de) IP 包對(duì)于以太網來(lái)說就是數據。給這(zhè)些數據附加上以太網首部并進行發送處理(lǐ),生成的(de)以太網數據包将通(tōng)過物(wù)理(lǐ)層傳輸給接收端。

  • ⑤ 網絡接口(以太網驅動)的(de)處理(lǐ)
    主機收到以太網包後,首先從以太網包首部找到 MAC 地址判斷是否爲發送給自己的(de)包,若不是則丢棄數據。
    如果是發送給自己的(de)包,則從以太網包首部中的(de)類型确定數據類型,再傳給相應的(de)模塊,如 IP、ARP 等。這(zhè)裏的(de)例子則是 IP 。

  • ⑥ IP 模塊的(de)處理(lǐ)
    IP 模塊接收到 數據後也(yě)做(zuò)類似的(de)處理(lǐ)。從包首部中判斷此 IP 地址是否與自己的(de) IP 地址匹配,如果匹配則根據首部的(de)協議(yì)類型将數據發送給對(duì)應的(de)模塊,如 TCP、UDP。這(zhè)裏的(de)例子則是 TCP。
    另外嗎,對(duì)于有路由器的(de)情況,接收端地址往往不是自己的(de)地址,此時(shí),需要借助路由控制表,在調查應該送往的(de)主機或路由器之後再進行轉發數據。

  • ⑦ TCP 模塊的(de)處理(lǐ)
    在 TCP 模塊中,首先會計算(suàn)一下(xià)校驗和(hé),判斷數據是否被破壞。然後檢查是否在按照(zhào)序号接收數據。最後檢查端口号,确定具體的(de)應用(yòng)程序。數據被完整地接收以後,會傳給由端口号識别的(de)應用(yòng)程序。

  • ⑧ 應用(yòng)程序的(de)處理(lǐ)
    接收端應用(yòng)程序會直接接收發送端發送的(de)數據。通(tōng)過解析數據,展示相應的(de)内容。

三、傳輸層中的(de) TCP 和(hé) UDP

TCP/IP 中有兩個(gè)具有代表性的(de)傳輸層協議(yì),分(fēn)别是 TCP 和(hé) UDP。

  • TCP 是面向連接的(de)、可(kě)靠的(de)流協議(yì)。流就是指不間斷的(de)數據結構,當應用(yòng)程序采用(yòng) TCP 發送消息時(shí),雖然可(kě)以保證發送的(de)順序,但還(hái)是猶如沒有任何間隔的(de)數據流發送給接收端。TCP 爲提供可(kě)靠性傳輸,實行“順序控制”或“重發控制”機制。此外還(hái)具備“流控制(流量控制)”、“擁塞控制”、提高(gāo)網絡利用(yòng)率等衆多(duō)功能。

  • UDP 是不具有可(kě)靠性的(de)數據報協議(yì)。細微的(de)處理(lǐ)它會交給上層的(de)應用(yòng)去完成。在 UDP 的(de)情況下(xià),雖然可(kě)以确保發送消息的(de)大(dà)小,卻不能保證消息一定會到達。因此,應用(yòng)有時(shí)會根據自己的(de)需要進行重發處理(lǐ)。

  • TCP 和(hé) UDP 的(de)優缺點無法簡單地、絕對(duì)地去做(zuò)比較:TCP 用(yòng)于在傳輸層有必要實現可(kě)靠傳輸的(de)情況;而在一方面,UDP 主要用(yòng)于那些對(duì)高(gāo)速傳輸和(hé)實時(shí)性有較高(gāo)要求的(de)通(tōng)信或廣播通(tōng)信。TCP 和(hé) UDP 應該根據應用(yòng)的(de)目的(de)按需使用(yòng)。

1. 端口号

數據鏈路和(hé) IP 中的(de)地址,分(fēn)别指的(de)是 MAC 地址和(hé) IP 地址。前者用(yòng)來(lái)識别同一鏈路中不同的(de)計算(suàn)機,後者用(yòng)來(lái)識别 TCP/IP  網絡中互連的(de)主機和(hé)路由器。在傳輸層也(yě)有這(zhè)種類似于地址的(de)概念,那就是端口号。端口号用(yòng)來(lái)識别同一台計算(suàn)機中進行通(tōng)信的(de)不同應用(yòng)程序。因此,它也(yě)被稱爲程序地址。

1.1 根據端口号識别應用(yòng)

一台計算(suàn)機上同時(shí)可(kě)以運行多(duō)個(gè)程序。傳輸層協議(yì)正是利用(yòng)這(zhè)些端口号識别本機中正在進行通(tōng)信的(de)應用(yòng)程序,并準确地将數據傳輸。

image.png

1.2 通(tōng)過 IP 地址、端口号、協議(yì)号進行通(tōng)信識别
  • 僅憑目标端口号識别某一個(gè)通(tōng)信是遠(yuǎn)遠(yuǎn)不夠的(de)。

image.png

image.png

  • ① 和(hé)② 的(de)通(tōng)信是在兩台計算(suàn)機上進行的(de)。它們的(de)目标端口号相同,都是80。這(zhè)裏可(kě)以根據源端口号加以區(qū)分(fēn)。

  • ③ 和(hé) ① 的(de)目标端口号和(hé)源端口号完全相同,但它們各自的(de)源 IP 地址不同。

  • 此外,當 IP 地址和(hé)端口号全都一樣時(shí),我們還(hái)可(kě)以通(tōng)過協議(yì)号來(lái)區(qū)分(fēn)(TCP 和(hé) UDP)。

1.3 端口号的(de)确定
  • 标準既定的(de)端口号:這(zhè)種方法也(yě)叫靜态方法。它是指每個(gè)應用(yòng)程序都有其指定的(de)端口号。但并不是說可(kě)以随意使用(yòng)任何一個(gè)端口号。例如 HTTP、FTP、TELNET 等廣爲使用(yòng)的(de)應用(yòng)協議(yì)中所使用(yòng)的(de)端口号就是固定的(de)。這(zhè)些端口号被稱爲知名端口号,分(fēn)布在 0~1023 之間;除知名端口号之外,還(hái)有一些端口号被正式注冊,它們分(fēn)布在 1024~49151 之間,不過這(zhè)些端口号可(kě)用(yòng)于任何通(tōng)信用(yòng)途。

  • 時(shí)序分(fēn)配法:服務器有必要确定監聽(tīng)端口号,但是接受服務的(de)客戶端沒必要确定端口号。在這(zhè)種方法下(xià),客戶端應用(yòng)程序完全可(kě)以不用(yòng)自己設置端口号,而全權交給操作系統進行分(fēn)配。動态分(fēn)配的(de)端口号範圍在 49152~65535 之間。

1.4 端口号與協議(yì)
  • 端口号由其使用(yòng)的(de)傳輸層協議(yì)決定。因此,不同的(de)傳輸層協議(yì)可(kě)以使用(yòng)相同的(de)端口号。

  • 此外,那些知名端口号與傳輸層協議(yì)并無關系。隻要端口一緻都将分(fēn)配同一種應用(yòng)程序進行處理(lǐ)。

2. UDP

  • UDP 不提供複雜(zá)的(de)控制機制,利用(yòng) IP 提供面向無連接的(de)通(tōng)信服務。

  • 并且它是将應用(yòng)程序發來(lái)的(de)數據在收到的(de)那一刻,立即按照(zhào)原樣發送到網絡上的(de)一種機制。即使是出現網絡擁堵的(de)情況,UDP 也(yě)無法進行流量控制等避免網絡擁塞行爲。

  • 此外,傳輸途中出現丢包,UDP 也(yě)不負責重發。

  • 甚至當包的(de)到達順序出現亂序時(shí)也(yě)沒有糾正的(de)功能。

  • 如果需要以上的(de)細節控制,不得(de)不交由采用(yòng) UDP 的(de)應用(yòng)程序去處理(lǐ)。

  • UDP 常用(yòng)于一下(xià)幾個(gè)方面:1.包總量較少的(de)通(tōng)信(DNS、SNMP等);2.視頻(pín)、音(yīn)頻(pín)等多(duō)媒體通(tōng)信(即時(shí)通(tōng)信);3.限定于 LAN 等特定網絡中的(de)應用(yòng)通(tōng)信;4.廣播通(tōng)信(廣播、多(duō)播)。

3. TCP

  • TCP 與 UDP 的(de)區(qū)别相當大(dà)。它充分(fēn)地實現了(le)數據傳輸時(shí)各種控制功能,可(kě)以進行丢包時(shí)的(de)重發控制,還(hái)可(kě)以對(duì)次序亂掉的(de)分(fēn)包進行順序控制。而這(zhè)些在 UDP 中都沒有。

  • 此外,TCP 作爲一種面向有連接的(de)協議(yì),隻有在确認通(tōng)信對(duì)端存在時(shí)才會發送數據,從而可(kě)以控制通(tōng)信流量的(de)浪費。

  • 根據 TCP 的(de)這(zhè)些機制,在 IP 這(zhè)種無連接的(de)網絡上也(yě)能夠實現高(gāo)可(kě)靠性的(de)通(tōng)信( 主要通(tōng)過檢驗和(hé)、序列号、确認應答(dá)、重發控制、連接管理(lǐ)以及窗(chuāng)口控制等機制實現)。

3.1 三次握手(重點)
  • TCP 提供面向有連接的(de)通(tōng)信傳輸。面向有連接是指在數據通(tōng)信開始之前先做(zuò)好兩端之間的(de)準備工作。

  • 所謂三次握手是指建立一個(gè) TCP 連接時(shí)需要客戶端和(hé)服務器端總共發送三個(gè)包以确認連接的(de)建立。在socket編程中,這(zhè)一過程由客戶端執行connect來(lái)觸發。

下(xià)面來(lái)看看三次握手的(de)流程圖:

image.png

  • 第一次握手:客戶端将标志位SYN置爲1,随機産生一個(gè)值seq=J,并将該數據包發送給服務器端,客戶端進入SYN_SENT狀态,等待服務器端确認。

  • 第二次握手:服務器端收到數據包後由标志位SYN=1知道客戶端請求建立連接,服務器端将标志位SYN和(hé)ACK都置爲1,ack=J+1,随機産生一個(gè)值seq=K,并将該數據包發送給客戶端以确認連接請求,服務器端進入SYN_RCVD狀态。

  • 第三次握手:客戶端收到确認後,檢查ack是否爲J+1,ACK是否爲1,如果正确則将标志位ACK置爲1,ack=K+1,并将該數據包發送給服務器端,服務器端檢查ack是否爲K+1,ACK是否爲1,如果正确則連接建立成功,客戶端和(hé)服務器端進入ESTABLISHED狀态,完成三次握手,随後客戶端與服務器端之間可(kě)以開始傳輸數據了(le)。

3.2 四次揮手(重點)
  • 四次揮手即終止TCP連接,就是指斷開一個(gè)TCP連接時(shí),需要客戶端和(hé)服務端總共發送4個(gè)包以确認連接的(de)斷開。在socket編程中,這(zhè)一過程由客戶端或服務端任一方執行close來(lái)觸發。

  • 由于TCP連接是全雙工的(de),因此,每個(gè)方向都必須要單獨進行關閉,這(zhè)一原則是當一方完成數據發送任務後,發送一個(gè)FIN來(lái)終止這(zhè)一方向的(de)連接,收到一個(gè)FIN隻是意味著(zhe)這(zhè)一方向上沒有數據流動了(le),即不會再收到數據了(le),但是在這(zhè)個(gè)TCP連接上仍然能夠發送數據,直到這(zhè)一方向也(yě)發送了(le)FIN。首先進行關閉的(de)一方将執行主動關閉,而另一方則執行被動關閉。

下(xià)面來(lái)看看四次揮手的(de)流程圖:

image.png

  • 中斷連接端可(kě)以是客戶端,也(yě)可(kě)以是服務器端。

  • 第一次揮手:客戶端發送一個(gè)FIN=M,用(yòng)來(lái)關閉客戶端到服務器端的(de)數據傳送,客戶端進入FIN_WAIT_1狀态。意思是說"我客戶端沒有數據要發給你了(le)",但是如果你服務器端還(hái)有數據沒有發送完成,則不必急著(zhe)關閉連接,可(kě)以繼續發送數據。

  • 第二次揮手:服務器端收到FIN後,先發送ack=M+1,告訴客戶端,你的(de)請求我收到了(le),但是我還(hái)沒準備好,請繼續你等我的(de)消息。這(zhè)個(gè)時(shí)候客戶端就進入FIN_WAIT_2 狀态,繼續等待服務器端的(de)FIN報文。

  • 第三次揮手:當服務器端确定數據已發送完成,則向客戶端發送FIN=N報文,告訴客戶端,好了(le),我這(zhè)邊數據發完了(le),準備好關閉連接了(le)。服務器端進入LAST_ACK狀态。

  • 第四次揮手:客戶端收到FIN=N報文後,就知道可(kě)以關閉連接了(le),但是他(tā)還(hái)是不相信網絡,怕服務器端不知道要關閉,所以發送ack=N+1後進入TIME_WAIT狀态,如果Server端沒有收到ACK則可(kě)以重傳。服務器端收到ACK後,就知道可(kě)以斷開連接了(le)。客戶端等待了(le)2MSL後依然沒有收到回複,則證明(míng)服務器端已正常關閉,那好,我客戶端也(yě)可(kě)以關閉連接了(le)。最終完成了(le)四次握手。

上面是一方主動關閉,另一方被動關閉的(de)情況,實際中還(hái)會出現同時(shí)發起主動關閉的(de)情況,
具體流程如下(xià)圖:

image.png

3.3 通(tōng)過序列号與确認應答(dá)提高(gāo)可(kě)靠性
  • 在 TCP 中,當發送端的(de)數據到達接收主機時(shí),接收端主機會返回一個(gè)已收到消息的(de)通(tōng)知。這(zhè)個(gè)消息叫做(zuò)确認應答(dá)(ACK)。當發送端将數據發出之後會等待對(duì)端的(de)确認應答(dá)。如果有确認應答(dá),說明(míng)數據已經成功到達對(duì)端。反之,則數據丢失的(de)可(kě)能性很大(dà)

  • 在一定時(shí)間内沒有等待到确認應答(dá),發送端就可(kě)以認爲數據已經丢失,并進行重發。由此,即使産生了(le)丢包,仍然能夠保證數據能夠到達對(duì)端,實現可(kě)靠傳輸。

  • 未收到确認應答(dá)并不意味著(zhe)數據一定丢失。也(yě)有可(kě)能是數據對(duì)方已經收到,隻是返回的(de)确認應答(dá)在途中丢失。這(zhè)種情況也(yě)會導緻發送端誤以爲數據沒有到達目的(de)地而重發數據。

  • 此外,也(yě)有可(kě)能因爲一些其他(tā)原因導緻确認應答(dá)延遲到達,在源主機重發數據以後才到達的(de)情況也(yě)屢見不鮮。此時(shí),源主機隻要按照(zhào)機制重發數據即可(kě)。

  • 對(duì)于目标主機來(lái)說,反複收到相同的(de)數據是不可(kě)取的(de)。爲了(le)對(duì)上層應用(yòng)提供可(kě)靠的(de)傳輸,目标主機必須放棄重複的(de)數據包。爲此我們引入了(le)序列号。

  • 序列号是按照(zhào)順序給發送數據的(de)每一個(gè)字節(8位字節)都标上号碼的(de)編号。接收端查詢接收數據 TCP 首部中的(de)序列号和(hé)數據的(de)長(cháng)度,将自己下(xià)一步應該接收的(de)序列号作爲确認應答(dá)返送回去。通(tōng)過序列号和(hé)确認應答(dá)号,TCP 能夠識别是否已經接收數據,又能夠判斷是否需要接收,從而實現可(kě)靠傳輸。


image.png

3.4 重發超時(shí)的(de)确定
  • 重發超時(shí)是指在重發數據之前,等待确認應答(dá)到來(lái)的(de)那個(gè)特定時(shí)間間隔。如果超過這(zhè)個(gè)時(shí)間仍未收到确認應答(dá),發送端将進行數據重發。最理(lǐ)想的(de)是,找到一個(gè)最小時(shí)間,它能保證“确認應答(dá)一定能在這(zhè)個(gè)時(shí)間内返回”。

  • TCP 要求不論處在何種網絡環境下(xià)都要提供高(gāo)性能通(tōng)信,并且無論網絡擁堵情況發生何種變化(huà),都必須保持這(zhè)一特性。爲此,它在每次發包時(shí)都會計算(suàn)往返時(shí)間及其偏差。将這(zhè)個(gè)往返時(shí)間和(hé)偏差時(shí)間相加,重發超時(shí)的(de)時(shí)間就是比這(zhè)個(gè)總和(hé)要稍大(dà)一點的(de)值。

  • 在 BSD 的(de) Unix 以及 Windows 系統中,超時(shí)都以0.5秒爲單位進行控制,因此重發超時(shí)都是0.5秒的(de)整數倍。不過,最初其重發超時(shí)的(de)默認值一般設置爲6秒左右。

  • 數據被重發之後若還(hái)是收不到确認應答(dá),則進行再次發送。此時(shí),等待确認應答(dá)的(de)時(shí)間将會以2倍、4倍的(de)指數函數延長(cháng)。

  • 此外,數據也(yě)不會被無限、反複地重發。達到一定重發次數之後,如果仍沒有任何确認應答(dá)返回,就會判斷爲網絡或對(duì)端主機發生了(le)異常,強制關閉連接。并且通(tōng)知應用(yòng)通(tōng)信異常強行終止。

3.5 以段爲單位發送數據
  • 在建立 TCP 連接的(de)同時(shí),也(yě)可(kě)以确定發送數據包的(de)單位,我們也(yě)可(kě)以稱其爲“最大(dà)消息長(cháng)度”(MSS)。最理(lǐ)想的(de)情況是,最大(dà)消息長(cháng)度正好是 IP 中不會被分(fēn)片處理(lǐ)的(de)最大(dà)數據長(cháng)度。

  • TCP 在傳送大(dà)量數據時(shí),是以 MSS 的(de)大(dà)小将數據進行分(fēn)割發送。進行重發時(shí)也(yě)是以 MSS  爲單位。

  • MSS 在三次握手的(de)時(shí)候,在兩端主機之間被計算(suàn)得(de)出。兩端的(de)主機在發出建立連接的(de)請求時(shí),會在 TCP 首部中寫入 MSS  選項,告訴對(duì)方自己的(de)接口能夠适應的(de) MSS 的(de)大(dà)小。然後會在兩者之間選擇一個(gè)較小的(de)值投入使用(yòng)。

3.6 利用(yòng)窗(chuāng)口控制提高(gāo)速度
  • TCP 以1個(gè)段爲單位,每發送一個(gè)段進行一次确認應答(dá)的(de)處理(lǐ)。這(zhè)樣的(de)傳輸方式有一個(gè)缺點,就是包的(de)往返時(shí)間越長(cháng)通(tōng)信性能就越低。

  • 爲解決這(zhè)個(gè)問題,TCP 引入了(le)窗(chuāng)口這(zhè)個(gè)概念。确認應答(dá)不再是以每個(gè)分(fēn)段,而是以更大(dà)的(de)單位進行确認,轉發時(shí)間将會被大(dà)幅地縮短。也(yě)就是說,發送端主機,在發送了(le)一個(gè)段以後不必要一直等待确認應答(dá),而是繼續發送。如下(xià)圖所示:

image.png

  • 窗(chuāng)口大(dà)小就是指無需等待确認應答(dá)而可(kě)以繼續發送數據的(de)最大(dà)值。上圖中窗(chuāng)口大(dà)小爲4個(gè)段。這(zhè)個(gè)機制實現了(le)使用(yòng)大(dà)量的(de)緩沖區(qū),通(tōng)過對(duì)多(duō)個(gè)段同時(shí)進行确認應答(dá)的(de)功能。

3.7 滑動窗(chuāng)口控制

image.png

  • 上圖中的(de)窗(chuāng)口内的(de)數據即便沒有收到确認應答(dá)也(yě)可(kě)以被發送出去。不過,在整個(gè)窗(chuāng)口的(de)确認應答(dá)沒有到達之前,如果其中部分(fēn)數據出現丢包,那麽發送端仍然要負責重傳。爲此,發送端主機需要設置緩存保留這(zhè)些待被重傳的(de)數據,直到收到他(tā)們的(de)确認應答(dá)。

  • 在滑動窗(chuāng)口以外的(de)部分(fēn)包括未發送的(de)數據以及已經确認對(duì)端已收到的(de)數據。當數據發出後若如期收到确認應答(dá)就可(kě)以不用(yòng)再進行重發,此時(shí)數據就可(kě)以從緩存區(qū)清除。

  • 收到确認應答(dá)的(de)情況下(xià),将窗(chuāng)口滑動到确認應答(dá)中的(de)序列号的(de)位置。這(zhè)樣可(kě)以順序地将多(duō)個(gè)段同時(shí)發送提高(gāo)通(tōng)信性能。這(zhè)種機制也(yě)别稱爲滑動窗(chuāng)口控制。

3.8 窗(chuāng)口控制中的(de)重發控制

在使用(yòng)窗(chuāng)口控制中, 出現丢包一般分(fēn)爲兩種情況:

  • ① 确認應答(dá)未能返回的(de)情況。在這(zhè)種情況下(xià),數據已經到達對(duì)端,是不需要再進行重發的(de),如下(xià)圖:

image.png

② 某個(gè)報文段丢失的(de)情況。接收主機如果收到一個(gè)自己應該接收的(de)序列号以外的(de)數據時(shí),會針對(duì)當前爲止收到數據返回确認應答(dá)。如下(xià)圖所示,當某一報文段丢失後,發送端會一直收到序号爲1001的(de)确認應答(dá),因此,在窗(chuāng)口比較大(dà),又出現報文段丢失的(de)情況下(xià),同一個(gè)序列号的(de)确認應答(dá)将會被重複不斷地返回。而發送端主機如果連續3次收到同一個(gè)确認應答(dá),就會将其對(duì)應的(de)數據進行重發。這(zhè)種機制比之前提到的(de)超時(shí)管理(lǐ)更加高(gāo)效,因此也(yě)被稱爲高(gāo)速重發控制。

image.png

四、網絡層中的(de) IP 協議(yì)

  • IP(IPv4、IPv6)相當于 OSI 參考模型中的(de)第3層——網絡層。網絡層的(de)主要作用(yòng)是“實現終端節點之間的(de)通(tōng)信”。這(zhè)種終端節點之間的(de)通(tōng)信也(yě)叫“點對(duì)點通(tōng)信”。

  • 網絡的(de)下(xià)一層——數據鏈路層的(de)主要作用(yòng)是在互連同一種數據鏈路的(de)節點之間進行包傳遞。而一旦跨越多(duō)種數據鏈路,就需要借助網絡層。網絡層可(kě)以跨越不同的(de)數據鏈路,即使是在不同的(de)數據鏈路上也(yě)能實現兩端節點之間的(de)數據包傳輸。

  • IP 大(dà)緻分(fēn)爲三大(dà)作用(yòng)模塊,它們是 IP 尋址、路由(最終節點爲止的(de)轉發)以及 IP 分(fēn)包與組包。

1. IP 地址

1.1 IP 地址概述
  • 在計算(suàn)機通(tōng)信中,爲了(le)識别通(tōng)信對(duì)端,必須要有一個(gè)類似于地址的(de)識别碼進行标識。在數據鏈路中的(de) MAC 地址正是用(yòng)來(lái)标識同一個(gè)鏈路中不同計算(suàn)機的(de)一種識别碼。

  • 作爲網絡層的(de) IP ,也(yě)有這(zhè)種地址信息,一般叫做(zuò) IP 地址。IP 地址用(yòng)于在“連接到網絡中的(de)所有主機中識别出進行通(tōng)信的(de)目标地址”。因此,在 TCP/IP 通(tōng)信中所有主機或路由器必須設定自己的(de) IP 地址。

  • 不論一台主機與哪種數據鏈路連接,其 IP 地址的(de)形式都保持不變。

  • IP 地址(IPv4 地址)由32位正整數來(lái)表示。IP 地址在計算(suàn)機内部以二進制方式被處理(lǐ)。然而,由于我們并不習(xí)慣于采用(yòng)二進制方式,我們将32位的(de) IP 地址以每8位爲一組,分(fēn)成4組,每組以 “.” 隔開,再将每組數轉換成十進制數。如下(xià):

28282828
10101100000101000000000100000001(2進制)
10101100.00010100.00000001.00000001(2進制)
172.20.1.1(10進制)
1.2 IP 地址由網絡和(hé)主機兩部分(fēn)标識組成
  • 如下(xià)圖,網絡标識在數據鏈路的(de)每個(gè)段配置不同的(de)值。網絡标識必須保證相互連接的(de)每個(gè)段的(de)地址不相重複。而相同段内相連的(de)主機必須有相同的(de)網絡地址。IP 地址的(de)“主機标識”則不允許在同一個(gè)網段内重複出現。由此,可(kě)以通(tōng)過設置網絡地址和(hé)主機地址,在相互連接的(de)整個(gè)網絡中保證每台主機的(de) IP 地址都不會相互重疊。即 IP 地址具有了(le)唯一性。

image.png

  • 如下(xià)圖,IP 包被轉發到途中某個(gè)路由器時(shí),正是利用(yòng)目标 IP 地址的(de)網絡标識進行路由。因爲即使不看主機标識,隻要一見到網絡标識就能判斷出是否爲該網段内的(de)主機。

image.png

1.3 IP 地址的(de)分(fēn)類
  • IP 地址分(fēn)爲四個(gè)級别,分(fēn)别爲A類、B類、C類、D類。它根據 IP 地址中從第 1 位到第 4 位的(de)比特列對(duì)其網絡标識和(hé)主機标識進行區(qū)分(fēn)。

  • A 類 IP 地址是首位以 “0” 開頭的(de)地址。從第 1 位到第 8 位是它的(de)網絡标識。用(yòng)十進制表示的(de)話(huà),0.0.0.0~127.0.0.0 是 A 類的(de)網絡地址。A 類地址的(de)後 24 位相當于主機标識。因此,一個(gè)網段内可(kě)容納的(de)主機地址上限爲16,777,214個(gè)。

  • B 類 IP 地址是前兩位 “10” 的(de)地址。從第 1 位到第 16 位是它的(de)網絡标識。用(yòng)十進制表示的(de)話(huà),128.0.0.0~191.255.0.0 是 B 類的(de)網絡地址。B 類地址的(de)後 16 位相當于主機标識。因此,一個(gè)網段内可(kě)容納的(de)主機地址上限爲65,534個(gè)。

  • C 類 IP 地址是前三位爲 “110” 的(de)地址。從第 1 位到第 24 位是它的(de)網絡标識。用(yòng)十進制表示的(de)話(huà),192.0.0.0~223.255.255.0 是 C 類的(de)網絡地址。C 類地址的(de)後 8 位相當于主機标識。因此,一個(gè)網段内可(kě)容納的(de)主機地址上限爲254個(gè)。

  • D 類 IP 地址是前四位爲 “1110” 的(de)地址。從第 1 位到第 32 位是它的(de)網絡标識。用(yòng)十進制表示的(de)話(huà),224.0.0.0~239.255.255.255 是 D 類的(de)網絡地址。D 類地址沒有主機标識,常用(yòng)于多(duō)播。

  • 在分(fēn)配 IP 地址時(shí)關于主機标識有一點需要注意。即要用(yòng)比特位表示主機地址時(shí),不可(kě)以全部爲 0 或全部爲 1。因爲全部爲 0 隻有在表示對(duì)應的(de)網絡地址或 IP 地址不可(kě)以獲知的(de)情況下(xià)才使用(yòng)。而全部爲 1 的(de)主機通(tōng)常作爲廣播地址。因此,在分(fēn)配過程中,應該去掉這(zhè)兩種情況。這(zhè)也(yě)是爲什(shén)麽 C 類地址每個(gè)網段最多(duō)隻能有 254( 28 - 2 = 254)個(gè)主機地址的(de)原因。

1.4 廣播地址
  • 廣播地址用(yòng)于在同一個(gè)鏈路中相互連接的(de)主機之間發送數據包。将 IP 地址中的(de)主機地址部分(fēn)全部設置爲 1,就成了(le)廣播地址。

  • 廣播分(fēn)爲本地廣播和(hé)直接廣播兩種。在本網絡内的(de)廣播叫做(zuò)本地廣播;在不同網絡之間的(de)廣播叫做(zuò)直接廣播。

1.5 IP 多(duō)播
  • 多(duō)播用(yòng)于将包發送給特定組内的(de)所有主機。由于其直接使用(yòng) IP 地址,因此也(yě)不存在可(kě)靠傳輸。

  • 相比于廣播,多(duō)播既可(kě)以穿透路由器,又可(kě)以實現隻給那些必要的(de)組發送數據包。請看下(xià)圖:

image.png

image.png

  • 多(duō)播使用(yòng) D 類地址。因此,如果從首位開始到第 4 位是 “1110”,就可(kě)以認爲是多(duō)播地址。而剩下(xià)的(de) 28 位可(kě)以成爲多(duō)播的(de)組編号。

  • 此外, 對(duì)于多(duō)播,所有的(de)主機(路由器以外的(de)主機和(hé)終端主機)必須屬于 224.0.0.1 的(de)組,所有的(de)路由器必須屬于 224.0.0.2 的(de)組。

1.6 子網掩碼
  • 現在一個(gè) IP 地址的(de)網絡标識和(hé)主機标識已不再受限于該地址的(de)類别,而是由一個(gè)叫做(zuò)“子網掩碼”的(de)識别碼通(tōng)過子網網絡地址細分(fēn)出比 A 類、B 類、C 類更小粒度的(de)網絡。這(zhè)種方式實際上就是将原來(lái) A 類、B 類、C 類等分(fēn)類中的(de)主機地址部分(fēn)用(yòng)作子網地址,可(kě)以将原網絡分(fēn)爲多(duō)個(gè)物(wù)理(lǐ)網絡的(de)一種機制。

  • 子網掩碼用(yòng)二進制方式表示的(de)話(huà),也(yě)是一個(gè) 32 位的(de)數字。它對(duì)應 IP 地址網絡标識部分(fēn)的(de)位全部爲 “1”,對(duì)應 IP 地址主機标識的(de)部分(fēn)則全部爲 “0”。由此,一個(gè) IP 地址可(kě)以不再受限于自己的(de)類别,而是可(kě)以用(yòng)這(zhè)樣的(de)子網掩碼自由地定位自己的(de)網絡标識長(cháng)度。當然,子網掩碼必須是 IP 地址的(de)首位開始連續的(de) “1”。

  • 對(duì)于子網掩碼,目前有兩種表示方式。第一種是,将 IP 地址與子網掩碼的(de)地址分(fēn)别用(yòng)兩行來(lái)表示。以 172.20.100.52 的(de)前 26 位是網絡地址的(de)情況爲例,如下(xià):

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
  • 第二種表示方式是,在每個(gè) IP 地址後面追加網絡地址的(de)位數用(yòng) “/ ” 隔開,如下(xià):

IP 地址172.20.100.52/ 26
網絡地址172.20.100.0/ 26
廣播地址172.20.100.63/ 26
  • 另外,在第二種方式下(xià)記述網絡地址時(shí)可(kě)以省略後面的(de) “0” 。例如:172.20.0.0/26 跟 172.20/26 其實是一個(gè)意思。

2. 路由

  • 發送數據包時(shí)所使用(yòng)的(de)地址是網絡層的(de)地址,即 IP 地址。然而僅僅有 IP 地址還(hái)不足以實現将數據包發送到對(duì)端目标地址,在數據發送過程中還(hái)需要類似于“指明(míng)路由器或主機”的(de)信息,以便真正發往目标地址。保存這(zhè)種信息的(de)就是路由控制表。

  • 該路由控制表的(de)形成方式有兩種:一種是管理(lǐ)員(yuán)手動設置,另一種是路由器與其他(tā)路由器相互交換信息時(shí)自動刷新。前者也(yě)叫做(zuò)靜态路由控制,而後者叫做(zuò)動态路由控制。

  • IP 協議(yì)始終認爲路由表是正确的(de)。然後,IP 本身并沒有定義制作路由控制表的(de)協議(yì)。即 IP 沒有制作路由控制表的(de)機制。該表示由一個(gè)叫做(zuò)“路由協議(yì)”的(de)協議(yì)制作而成。

2.1 IP 地址與路由控制
  • IP 地址的(de)網絡地址部分(fēn)用(yòng)于進行路由控制。

  • 路由控制表中記錄著(zhe)網絡地址與下(xià)一步應該發送至路由器的(de)地址。

  • 在發送 IP 包時(shí),首先要确定 IP 包首部中的(de)目标地址,再從路由控制表中找到與該地址具有相同網絡地址的(de)記錄,根據該記錄将 IP 包轉發給相應的(de)下(xià)一個(gè)路由器。如果路由控制表中存在多(duō)條相同網絡地址的(de)記錄,就選擇一個(gè)最爲吻合的(de)網絡地址。

image.png

3. IP 分(fēn)包與組包

  • 每種數據鏈路的(de)最大(dà)傳輸單元(MTU)都不盡相同,因爲每個(gè)不同類型的(de)數據鏈路的(de)使用(yòng)目的(de)不同。使用(yòng)目的(de)不同,可(kě)承載的(de) MTU 也(yě)就不同。

  • 任何一台主機都有必要對(duì) IP 分(fēn)片進行相應的(de)處理(lǐ)。分(fēn)片往往在網絡上遇到比較大(dà)的(de)報文無法一下(xià)子發送出去時(shí)才會進行處理(lǐ)。

  • 經過分(fēn)片之後的(de) IP 數據報在被重組的(de)時(shí)候,隻能由目标主機進行。路由器雖然做(zuò)分(fēn)片但不會進行重組。

3.1 路徑 MTU 發現
  • 分(fēn)片機制也(yě)有它的(de)不足。如路由器的(de)處理(lǐ)負荷加重之類。因此,隻要允許,是不希望由路由器進行 IP 數據包的(de)分(fēn)片處理(lǐ)的(de)。

  • 爲了(le)應對(duì)分(fēn)片機制的(de)不足,“路徑 MTU 發現” 技術應運而生。路徑 MTU 指的(de)是,從發送端主機到接收端主機之間不需要分(fēn)片是最大(dà) MTU 的(de)大(dà)小。即路徑中存在的(de)所有數據鏈路中最小的(de) MTU 。

  • 進行路徑 MTU 發現,就可(kě)以避免在中途的(de)路由器上進行分(fēn)片處理(lǐ),也(yě)可(kě)以在 TCP 中發送更大(dà)的(de)包。

4. IPv6

  • IPv6(IP version 6)是爲了(le)根本解決 IPv4 地址耗盡的(de)問題而被标準化(huà)的(de)網際協議(yì)。IPv4 的(de)地址長(cháng)度爲 4 個(gè) 8 位字節,即 32 比特。而 IPv6 的(de)地址長(cháng)度則是原來(lái)的(de) 4 倍,即 128 比特,一般寫成 8 個(gè) 16 位字節。

4.1 IPv6 的(de)特點
  • IP 得(de)知的(de)擴大(dà)與路由控制表的(de)聚合。

  • 性能提升。包首部長(cháng)度采用(yòng)固定的(de)值(40字節),不再采用(yòng)首部檢驗碼。簡化(huà)首部結構,減輕路由器負擔。路由器不再做(zuò)分(fēn)片處理(lǐ)。

  • 支持即插即用(yòng)功能。即使沒有DHCP服務器也(yě)可(kě)以實現自動分(fēn)配 IP 地址。

  • 采用(yòng)認證與加密功能。應對(duì)僞造 IP 地址的(de)網絡安全功能以及防止線路竊聽(tīng)的(de)功能。

  • 多(duō)播、Mobile IP 成爲擴展功能。

4.2 IPv6 中 IP 地址的(de)标記方法
  • 一般人(rén)們将 128 比特 IP 地址以每 16 比特爲一組,每組用(yòng)冒号(“:”)隔開進行标記。

  • 而且如果出現連續的(de) 0 時(shí)還(hái)可(kě)以将這(zhè)些 0 省略,并用(yòng)兩個(gè)冒号(“::”)隔開。但是,一個(gè) IP 地址中隻允許出現一次兩個(gè)連續的(de)冒号。

4.3 IPv6 地址的(de)結構
  • IPv6 類似 IPv4,也(yě)是通(tōng)過 IP 地址的(de)前幾位标識 IP 地址的(de)種類。

  • 在互聯網通(tōng)信中,使用(yòng)一種全局的(de)單播地址。它是互聯網中唯一的(de)一個(gè)地址,不需要正式分(fēn)配 IP 地址。

未定義0000 ... 0000(128比特)::/ 128
環回地址0000 ... 0001(128比特)::1 / 128
唯一本地地址1111 110FC00:/ 7
鏈路本地單播地址1111 1110 10FE80::/ 10
多(duō)播地址1111 1111FF00::/ 8
全局單播地址(其他(tā))
4.4 全局單播地址
  • 全局單播地址是指世界上唯一的(de)一個(gè)地址。它是互聯網通(tōng)信以及各個(gè)域内部通(tōng)信中最爲常用(yòng)的(de)一個(gè) IPv6 地址。

  • 格式如下(xià)圖所示,現在 IPv6 的(de)網絡中所使用(yòng)的(de)格式爲,n = 48,m = 16 以及 128 - n - m = 64。即前 64 比特爲網絡标識,後 64 比特爲主機标識。

image.png

4.5 鏈路本地單播地址
  • 鏈路本地單播地址是指在同一個(gè)數據鏈路内唯一的(de)地址。它用(yòng)于不經過路由器,在同一個(gè)鏈路中的(de)通(tōng)信。通(tōng)常接口 ID 保存 64 比特版的(de) MAC 地址。

image.png

4.6 唯一本地地址

唯一本地地址是不進行互聯網通(tōng)信時(shí)所用(yòng)的(de)地址。

唯一本地地址雖然不會與互聯網連接,但是也(yě)會盡可(kě)能地随機生成一個(gè)唯一的(de)全局 ID。

L 通(tōng)常被置爲 1

全局 ID 的(de)值随機決定

子網 ID 是指該域子網地址

接口 ID 即爲接口的(de) ID


image.png

4.7 IPv6 分(fēn)段處理(lǐ)
  • IPv6 的(de)分(fēn)片處理(lǐ)隻在作爲起點的(de)發送端主機上進行,路由器不參與分(fēn)片。

  • IPv6 中最小 MTU 爲 1280 字節,因此,在嵌入式系統中對(duì)于那些有一定系統資源限制的(de)設備來(lái)說,不需要進行“路徑 MTU 發現”,而是在發送 IP 包時(shí)直接以 1280 字節爲單位分(fēn)片送出。

4.8 IP 首部(暫略)

5. IP 協議(yì)相關技術

  • IP 旨在讓最終目标主機收到數據包,但是在這(zhè)一過程中僅僅有 IP 是無法實現通(tōng)信的(de)。必須還(hái)有能夠解析主機名稱和(hé) MAC 地址的(de)功能,以及數據包在發送過程中異常情況處理(lǐ)的(de)功能。

5.1 DNS
  • 我們平常在訪問某個(gè)網站時(shí)不适用(yòng) IP 地址,而是用(yòng)一串由羅馬字和(hé)點号組成的(de)字符串。而一般用(yòng)戶在使用(yòng) TCP/IP 進行通(tōng)信時(shí)也(yě)不使用(yòng) IP 地址。能夠這(zhè)樣做(zuò)是因爲有了(le) DNS (Domain Name System)功能的(de)支持。DNS 可(kě)以将那串字符串自動轉換爲具體的(de) IP 地址。

  • 這(zhè)種 DNS 不僅适用(yòng)于 IPv4,還(hái)适用(yòng)于 IPv6。

5.2 ARP
  • 隻要确定了(le) IP 地址,就可(kě)以向這(zhè)個(gè)目标地址發送 IP 數據報。然而,在底層數據鏈路層,進行實際通(tōng)信時(shí)卻有必要了(le)解每個(gè) IP 地址所對(duì)應的(de) MAC 地址。

  • ARP 是一種解決地址問題的(de)協議(yì)。以目标 IP 地址爲線索,用(yòng)來(lái)定位下(xià)一個(gè)應該接收數據分(fēn)包的(de)網絡設備對(duì)應的(de) MAC 地址。不過 ARP 隻适用(yòng)于 IPv4,不能用(yòng)于 IPv6。IPv6 中可(kě)以用(yòng) ICMPv6 替代 ARP 發送鄰居探索消息。

  • RARP 是将 ARP 反過來(lái),從 MAC 地址定位 IP 地址的(de)一種協議(yì)。

5.3 ICMP
  • ICMP 的(de)主要功能包括,确認 IP 包是否成功送達目标地址,通(tōng)知在發送過程當中 IP 包被廢棄的(de)具體原因,改善網絡設置等。

  • IPv4 中 ICMP 僅作爲一個(gè)輔助作用(yòng)支持 IPv4。也(yě)就是說,在 IPv4 時(shí)期,即使沒有 ICMP,仍然可(kě)以實現 IP 通(tōng)信。然而,在 IPv6 中,ICMP 的(de)作用(yòng)被擴大(dà),如果沒有 ICMPv6,IPv6 就無法進行正常通(tōng)信。

5.4 DHCP
  • 如果逐一爲每一台主機設置 IP 地址會是非常繁瑣的(de)事情。特别是在移動使用(yòng)筆記本電腦(nǎo)、隻能終端以及平闆電腦(nǎo)等設備時(shí),每移動到一個(gè)新的(de)地方,都要重新設置 IP 地址。

  • 于是,爲了(le)實現自動設置 IP 地址、統一管理(lǐ) IP 地址分(fēn)配,就産生了(le) DHCP(Dynamic Host Configuration Protocol)協議(yì)。有了(le) DHCP,計算(suàn)機隻要連接到網絡,就可(kě)以進行 TCP/IP 通(tōng)信。也(yě)就是說,DHCP 讓即插即用(yòng)變得(de)可(kě)能。

  • DHCP 不僅在 IPv4 中,在 IPv6 中也(yě)可(kě)以使用(yòng)。

5.5 NAT
  • NAT(Network Address Translator)是用(yòng)于在本地網絡中使用(yòng)私有地址,在連接互聯網時(shí)轉而使用(yòng)全局 IP 地址的(de)技術。

  • 除轉換 IP 地址外,還(hái)出現了(le)可(kě)以轉換 TCP、UDP 端口号的(de) NAPT(Network Address Ports Translator)技術,由此可(kě)以實現用(yòng)一個(gè)全局 IP 地址與多(duō)個(gè)主機的(de)通(tōng)信。

  • NAT(NAPT)實際上是爲正在面臨地址枯竭的(de) IPv4 而開發的(de)技術。不過,在 IPv6 中爲了(le)提高(gāo)網絡安全也(yě)在使用(yòng) NAT,在 IPv4 和(hé) IPv6 之間的(de)相互通(tōng)信當中常常使用(yòng) NAT-PT。

5.6 IP 隧道

image.png

  • 如上圖的(de)網絡環境中,網絡 A 與網絡 B 之間無法直接進行通(tōng)信,爲了(le)讓它們之間正常通(tōng)信,這(zhè)時(shí)必須得(de)采用(yòng) IP 隧道的(de)功能。

  • IP 隧道可(kě)以将那些從網絡 A 發過來(lái)的(de) IPv6 的(de)包統合爲一個(gè)數據,再爲之追加一個(gè) IPv4 的(de)首部以後轉發給網絡 C。

  • 一般情況下(xià),緊接著(zhe) IP 首部的(de)是 TCP 或 UDP 的(de)首部。然而,現在的(de)應用(yòng)當中“ IP 首部的(de)後面還(hái)是 IP 首部”或者“ IP 首部的(de)後面是 IPv6 的(de)首部”等情況與日俱增。這(zhè)種在網絡層的(de)首部後面追加網絡層首部的(de)通(tōng)信方法就叫做(zuò)“ IP 隧道”。