Network 之五 TCP/IP 协议族、工作流程、常用协议格式
??最近工作需要搞網(wǎng)絡(luò)相關(guān)的內(nèi)容,由于之前對(duì)網(wǎng)絡(luò)了解比較少,因此開(kāi)始重點(diǎn)學(xué)習(xí)一下網(wǎng)絡(luò)相關(guān)的各種知識(shí)。博文中的有些內(nèi)容來(lái)自于在學(xué)習(xí)過(guò)程中對(duì)于一些互聯(lián)網(wǎng)上我認(rèn)為的重點(diǎn)知識(shí)的記錄,如果侵權(quán)請(qǐng)聯(lián)系刪除!
??在之前的博文 Network 之一 國(guó)際標(biāo)準(zhǔn)組織介紹、互聯(lián)網(wǎng)/因特網(wǎng)、以太網(wǎng)概念區(qū)分、協(xié)議標(biāo)準(zhǔn) 中,曾經(jīng)學(xué)習(xí)了互聯(lián)通信的參考模型:OSI 參考模型和 TCP/IP 參考模型,以及相關(guān)的標(biāo)準(zhǔn)。但是受制于篇幅,沒(méi)有詳細(xì)介紹各種規(guī)約的細(xì)節(jié),這篇博文就重點(diǎn)學(xué)習(xí)協(xié)議的細(xì)節(jié)。
協(xié)議戰(zhàn)爭(zhēng)
??在 20 世紀(jì) 70 年代到 90 年代之間,計(jì)算機(jī)科學(xué)領(lǐng)域發(fā)生了一場(chǎng)名為 “協(xié)議戰(zhàn)爭(zhēng)”(Protocol Wars) 的長(zhǎng)期爭(zhēng)論。當(dāng)時(shí),工程師、組織和國(guó)家在哪種通信協(xié)議能產(chǎn)生最好、最強(qiáng)大的計(jì)算機(jī)網(wǎng)絡(luò)的問(wèn)題上出現(xiàn)了兩極分化。這場(chǎng)辯論在 80 年代末和 90 年代初的 Internet - OSI 標(biāo)準(zhǔn)之戰(zhàn)中達(dá)到了頂峰,最終在 90 年代中期由 Internet 獲勝。
Internet 標(biāo)準(zhǔn)最終形成了互聯(lián)網(wǎng)協(xié)議套件,由于互聯(lián)網(wǎng)協(xié)議套件是從 TCP/IP 協(xié)議一步步發(fā)展來(lái)的,因此也被稱為 TCP/IP 協(xié)議族。
??在互聯(lián)網(wǎng)發(fā)展的這個(gè)階段中,最先出現(xiàn)的是一些專有網(wǎng)絡(luò)標(biāo)準(zhǔn)及協(xié)議。例如,最早的高級(jí)研究計(jì)劃局網(wǎng)絡(luò)(ARPANET) 中的 Network Control Program (NCP) ,歐洲郵政、電報(bào)和電話服務(wù)(PTT)于 1976 年開(kāi)發(fā)了 X.25 標(biāo)準(zhǔn)。OSI 在 20 世紀(jì) 80 年代后期開(kāi)發(fā)了其網(wǎng)絡(luò)標(biāo)準(zhǔn),完整的互聯(lián)網(wǎng)協(xié)議套件在1989 年開(kāi)發(fā)完成。
??隨著完整的互聯(lián)網(wǎng)協(xié)議套件的開(kāi)發(fā),以及與電信和計(jì)算機(jī)行業(yè)的合作,將 TCP/IP 軟件整合到各種操作系統(tǒng)中,為廣泛采用 TCP/IP 作為綜合協(xié)議套件奠定了基礎(chǔ)。雖然 OSI 在 20 世紀(jì) 80 年代后期開(kāi)發(fā)了其網(wǎng)絡(luò)標(biāo)準(zhǔn),但 TCP/IP 在眾多供應(yīng)商網(wǎng)絡(luò)上被廣泛應(yīng)用,并最終稱為了互聯(lián)網(wǎng)的核心組件。很多協(xié)議基本都直接消失或者間接投靠了 TCP/IP 協(xié)議。
TCP/IP 協(xié)議族
??TCP/IP 協(xié)議族,也稱為互聯(lián)網(wǎng)協(xié)議套件(Internet Protocol Suite,IPS)是一組實(shí)現(xiàn)支持因特網(wǎng)和大多數(shù)商業(yè)網(wǎng)絡(luò)運(yùn)行的協(xié)議棧的網(wǎng)絡(luò)傳輸協(xié)議。這個(gè)名稱來(lái)源于其中兩個(gè)最重要的協(xié)議:傳輸控制協(xié)議(TCP)和因特網(wǎng)協(xié)議(IP),它們也是最先定義的兩個(gè)協(xié)議。
??由于在網(wǎng)絡(luò)通訊協(xié)議普遍采用分層的結(jié)構(gòu),當(dāng)多個(gè)層次的協(xié)議共同工作時(shí),類似計(jì)算機(jī)科學(xué)中的堆棧,因此又稱為 TCP/IP 協(xié)議棧(TCP/IP Protocol Stack),也被簡(jiǎn)稱為 TCP/IP 協(xié)議。
??目前,TCP/IP 協(xié)議族的相關(guān)標(biāo)準(zhǔn)由 IEFT 負(fù)責(zé)指定,所有這些協(xié)議都在相應(yīng)的 RFC 文檔中討論及標(biāo)準(zhǔn)化。其中有個(gè)問(wèn)題我們需要知道,TCP/IP 協(xié)議棧的眾多協(xié)議并沒(méi)有嚴(yán)格的按照分層的理念來(lái)進(jìn)行設(shè)計(jì),它更多的是處于實(shí)用的目的。盡管在很多文獻(xiàn)中將 TCP/IP 協(xié)議棧中的各種協(xié)議劃分到各層,但沒(méi)有對(duì)應(yīng)的標(biāo)準(zhǔn)來(lái)說(shuō)明這一點(diǎn),IEFT 也不負(fù)責(zé)處理分層的相關(guān)標(biāo)準(zhǔn)。
TCP/IP 數(shù)據(jù)流
??在 TCP/IP 協(xié)議工作流程中(TCP/IP 數(shù)據(jù)流過(guò)程),應(yīng)用層數(shù)據(jù)通過(guò)協(xié)議棧發(fā)送到網(wǎng)絡(luò)上時(shí),每一層協(xié)議都會(huì)添加一個(gè)自己的頭部,這個(gè)過(guò)程稱為封裝(Encapsulation)。
??數(shù)據(jù)封裝成幀后發(fā)到傳輸介質(zhì)上,到達(dá)目的主機(jī)后每層協(xié)議再剝掉相應(yīng)的首部,最后將應(yīng)用層數(shù)據(jù)交給應(yīng)用程序處理。上圖僅僅是兩臺(tái)計(jì)算機(jī)在同一網(wǎng)段的簡(jiǎn)單情況,如果兩臺(tái)計(jì)算機(jī)在不同網(wǎng)段,則還需要經(jīng)過(guò)一個(gè)或多個(gè)路由器(也可能是廣域網(wǎng)節(jié)點(diǎn)交換機(jī))。
??每個(gè)協(xié)議層都有自己的名稱來(lái)標(biāo)識(shí)數(shù)據(jù)單元。TCP 將數(shù)據(jù)單元稱為段(Segment),UDP 將數(shù)據(jù)單元稱為數(shù)據(jù)報(bào),IP 將數(shù)據(jù)單元稱為數(shù)據(jù)包(Packet),數(shù)據(jù)鏈路層和物理層或網(wǎng)絡(luò)接口層將其稱為幀(Frame)。
以太網(wǎng)幀
??以太網(wǎng)(Ethernet)是一種計(jì)算機(jī)局域網(wǎng)技術(shù)。IEEE 制定的 IEEE 802.3 標(biāo)準(zhǔn)定義了以太網(wǎng)的技術(shù)標(biāo)準(zhǔn),它規(guī)定了包括物理層的連線、電子信號(hào)和介質(zhì)訪問(wèn)控制的內(nèi)容。以太網(wǎng)是目前應(yīng)用最普遍的局域網(wǎng)技術(shù),取代了其他局域網(wǎng)標(biāo)準(zhǔn)如令牌環(huán)、FDDI 和 ARCNET。各種以太網(wǎng)類型參見(jiàn)博文 Network 之三 Ethernet(以太網(wǎng))物理介質(zhì)(10Base、100Base-T、100Base-TX等)介紹。
??IEEE 802 的相關(guān)標(biāo)準(zhǔn)主要規(guī)定了以太網(wǎng)數(shù)據(jù)鏈路層和物理層,且將數(shù)據(jù)鏈路層又分為了介質(zhì)訪問(wèn)控制 (MAC) 層 和邏輯鏈路控制 (LLC) 層 這兩層。其中,前者負(fù)責(zé)控制網(wǎng)絡(luò)中的設(shè)備如何獲得對(duì)介質(zhì)的訪問(wèn)權(quán)限和傳輸數(shù)據(jù)的權(quán)限,后者負(fù)責(zé)識(shí)別和封裝網(wǎng)絡(luò)層協(xié)議,并控制錯(cuò)誤檢查和幀同步。
??以太網(wǎng)的雛型是施樂(lè)以太網(wǎng)(Xerox Ethernet),在 1982 年,Xerox 與 DEC 及 Intel 組成 DIX 聯(lián)盟,并共同發(fā)表了 Ethernet Version 2(EV2)的規(guī)格,并將它投入商場(chǎng)市場(chǎng),且被普遍使用。后來(lái),DIX 將其遞交到了 IEEE 802 工作組,1983 IEEE 802 工作組發(fā)布 IEEE 802.3 以太網(wǎng)標(biāo)準(zhǔn),開(kāi)始負(fù)責(zé)制定后續(xù)以太網(wǎng)標(biāo)準(zhǔn)。
??以太網(wǎng)幀有多種類型,Ethernet Version 2 和 IEEE 802.3 是目前最常見(jiàn)的以太網(wǎng)幀(Ethernet II 格式相對(duì)使用廣泛),其他如子網(wǎng)接入?yún)f(xié)議(SNAP)幀、Novell raw 802.3 幀等我們基本接觸不到。Ethernet Version 2(EV2)幀格式與 IEEE 802.3 幀格式有些不一樣,但是,一般認(rèn)為他們是兼容的,并且可以同時(shí)出現(xiàn)在以太網(wǎng)鏈路上。
Ethernet Version 2
??1982 年,DIX 聯(lián)盟發(fā)表了 Ethernet Version 2(EV2)。以太幀起始部分由前同步碼和幀開(kāi)始定界符組成,后面緊跟著一個(gè)以太網(wǎng)報(bào)頭,以 MAC 地址說(shuō)明目的地址和源地址。以太幀的中部是該幀負(fù)載的包含其他協(xié)議報(bào)頭的數(shù)據(jù)包。以太幀由一個(gè) 32 位冗余校驗(yàn)碼結(jié)尾,用于檢驗(yàn)數(shù)據(jù)傳輸是否出現(xiàn)損壞。
- 前導(dǎo)碼:同于幀同步
- 目的 MAC:指定要將數(shù)據(jù)幀發(fā)送到哪個(gè)適配器,標(biāo)識(shí)幀的接收者
- 源 MAC:消息源自哪個(gè)適配器,標(biāo)識(shí)幀的發(fā)送者
- 類型:用于標(biāo)識(shí)數(shù)據(jù)字段種包含的高層協(xié)議。由 IEEE 注冊(cè)機(jī)構(gòu)分配,下圖是一些常見(jiàn)協(xié)議分配情況
- 數(shù)據(jù):網(wǎng)絡(luò)層數(shù)據(jù)。如果不足 46 字節(jié)時(shí),會(huì)填充到最小長(zhǎng)度。最大值也叫最大傳輸單元(MTU)。
- FCS:循環(huán)冗余校驗(yàn)碼。
??Ethernet Version 2 幀格式是目前使用最多的以太網(wǎng)幀,以太網(wǎng)幀的整體大小必須在 64~1518 字節(jié)之間(不包含前導(dǎo)碼)。有些系統(tǒng)支持更大的幀,最大可以支持 9000 字節(jié)。
IEEE 802.3 幀
??IEEE 802.3 幀是在 Ethernet Version 2 幀基礎(chǔ)上制定出來(lái)的。在 IEEE 802.3 初期,IEEE 802.3 幀與 Ethernet Version 2 幀并不相同, IEEE 802.3 對(duì)其進(jìn)行了擴(kuò)展。然而隨著 Ethernet Version 2 的流行,后續(xù)的 IEEE 802.3 標(biāo)準(zhǔn)也在不斷改變,下面是最新的 IEEE 802.3-2018 標(biāo)準(zhǔn)中給出的幀格式:
- 前導(dǎo)碼: IEEE 802.3 對(duì)原來(lái) Ethernet Version 2 幀的前導(dǎo)碼進(jìn)行了擴(kuò)展
- 前同步碼:7 字節(jié)固定數(shù)字 0xAA
- 幀界定符:1 字節(jié)固定數(shù)字 0xAB
- 目的 MAC:指定要將數(shù)據(jù)幀發(fā)送到哪個(gè)適配器,標(biāo)識(shí)幀的接收者
- 源 MAC:消息源自哪個(gè)適配器,標(biāo)識(shí)幀的發(fā)送者
- 長(zhǎng)度/類型:IEEE 802 規(guī)定所有以太網(wǎng)類型的值都要大于十六進(jìn)制 0x05DC,由于以太網(wǎng)中的最大幀大小為 1518 字節(jié),因此以太網(wǎng)類型和長(zhǎng)度之間沒(méi)有重疊的意義。如果源地址后面的字段大于 0x05DC,則該幀為 Ethernet Version 2,否則為 IEEE 802.3。這里的類型就是 Ethernet Version 2 中的類型,由 IEEE 注冊(cè)機(jī)構(gòu)分配。
- 數(shù)據(jù):上層協(xié)議數(shù)據(jù)或者填充到最小 46 字節(jié)
- FCS:循環(huán)冗余校驗(yàn)碼
IEEE 802.3 規(guī)定發(fā)送幀的時(shí)候,每個(gè)字節(jié)的低位在前高位在后
??從上面的幀格式可以看出,最新的 IEEE 802.3 幀與 Ethernet Version 2 基本是一致的。但是早期的 IEEE 802.3 幀格式分為 IEEE 802.3/802.2 LLC 和 IEEE 802.3/802.2 SNAP 這兩種,但實(shí)際并沒(méi)有流行開(kāi)來(lái)。大部分 TCP/IP 協(xié)議棧也沒(méi)有實(shí)現(xiàn) IEEE 802.2 所定義的 LLC 層,而且部分標(biāo)準(zhǔn)已經(jīng)不再維護(hù)及更新了(IEEE 相應(yīng)的工作組已經(jīng)解散)。
IEEE 802.3/802.2 LLC
??這是 IEEE 802.3 發(fā)布初期定義的 802.3 以太幀,它由 Ethernet V2 發(fā)展而來(lái)。它將 Ethernet V2 幀頭的協(xié)議類型字段替換為幀長(zhǎng)度字段(取值為 0x0000 ~ 0x05DC),并加入 802.2 LLC 頭用以標(biāo)志上層協(xié)議。
- DSAP Destination Service Access Point,目標(biāo)服務(wù)接入點(diǎn)
- SSAP Source Service Access Point 來(lái)源服務(wù)接入點(diǎn)
- Control 控制字段,8 或16bits。為了便于區(qū)分,有三種 LLC PDU 控制字段,分別叫做 U,I,S 幀。
- U(Unnumbered)幀,8 位的控制字段,特別用于無(wú)連接的應(yīng)用
- I(Information)幀,16 位的控制和幀編號(hào)字段,用于面向連接的應(yīng)用
- S(Supervisory)幀,16 位的控制字段,用于在 LLC 層中進(jìn)行管理監(jiān)督。
在這三種格式中,只有 U 幀在廣泛使用。用第一個(gè)字節(jié)的最后兩位來(lái)區(qū)分這三種 PDU 幀格式。
IEEE 802.3/802.2 SNAP
這是 IEEE 為保證在 802.2 LLC 上支持更多的上層協(xié)議同時(shí)更好的支持 IP 協(xié)議而發(fā)布的標(biāo)準(zhǔn)。
Novell raw 802.3
??這是 1983 年 Novell 發(fā)布其劃時(shí)代的 Netware/86 網(wǎng)絡(luò)套件時(shí)采用的私有以太網(wǎng)幀格式,該格式以當(dāng)時(shí)尚未正式發(fā)布的802.3標(biāo)準(zhǔn)為基礎(chǔ);但是當(dāng)兩年以后 IEEE 正式發(fā)布 802.3 標(biāo)準(zhǔn)時(shí),IEEE 在 802.3 幀頭中又加入了 802.2 LLC(Logical Link Control)頭,這使得Novell 的 RAW 802.3 格式跟正式的 IEEE 802.3 標(biāo)準(zhǔn)互不兼容。
IP
??網(wǎng)際協(xié)議(Internet Protocol,IP),又稱互聯(lián)網(wǎng)協(xié)議,是用于分組交換數(shù)據(jù)網(wǎng)絡(luò)的協(xié)議。IP 是 TCP/IP 協(xié)議族中網(wǎng)絡(luò)層的最主要協(xié)議之一,任務(wù)是根據(jù)源主機(jī)和目的主機(jī)的地址來(lái)傳送數(shù)據(jù)。
??IP 是一種無(wú)連接協(xié)議,它以盡力而為的交付模式運(yùn)行,因?yàn)樗槐WC交付,也不保證正確的順序或避免重復(fù)交付。這些方面(包括數(shù)據(jù)完整性)由上層傳輸協(xié)議(如傳輸控制協(xié)議 (TCP))解決。
??IP 的第一個(gè)主要版本是互聯(lián)網(wǎng)協(xié)議版本 4(IPv4),它的繼任者是互聯(lián)網(wǎng)協(xié)議版本 6(IPv6)。IPv4 使用地址解析協(xié)議(ARP)將 IP 地址解析成相應(yīng)的數(shù)據(jù)鏈路地址(MAC 地址),而 IPv6 則采用鄰居發(fā)現(xiàn)協(xié)議(NDP)。目前仍然是廣泛使用的是 IPv4。
-
版本: 標(biāo)識(shí)正在使用的 IP 版本。當(dāng)前版本為 4,此版本稱為 IPv4。
-
頭長(zhǎng)度(IHL): Internet Header Length (IHL)指示 IP 頭的長(zhǎng)度,單位是 4 字節(jié)。這個(gè)字段的最小值是 5,最大十進(jìn)制值是 15。
-
服務(wù)類型/DS Field: 在 RFC 791 中被定義為服務(wù)類型,實(shí)際上并未使用。1998 年被 IETF 在 RFC 2474 中重定義為 Differentiated Services Field(DS Field)。
- IP 優(yōu)先級(jí):用于標(biāo)識(shí)數(shù)據(jù)包在網(wǎng)絡(luò)中收到的服務(wù)級(jí)別。
- DSCP: 差分服務(wù)代碼點(diǎn) (Differentiated Services Code Point,DSCP)用于標(biāo)識(shí)數(shù)據(jù)包在網(wǎng)絡(luò)中接收的服務(wù)級(jí)別。
- ECN:顯式擁塞通知(Explicit Congestion Notification,ECN)在 RFC 3168 中定義,允許在不丟棄報(bào)文的同時(shí)通知對(duì)方網(wǎng)絡(luò)擁塞的發(fā)生。
ECN 是一種可選的功能,僅當(dāng)兩端都支持并希望使用,且底層網(wǎng)絡(luò)支持時(shí)才被使用。
-
總長(zhǎng)度: IP 頭+ 數(shù)據(jù)的長(zhǎng)度。因此該字段的最小值是 20(20 字節(jié)頭 + 0 字節(jié)數(shù)據(jù)),最大為 65535 字節(jié)。
-
標(biāo)識(shí)符: 用來(lái)唯一地標(biāo)識(shí)一個(gè)報(bào)文的分片。因?yàn)榉制灰欢ò葱虻竭_(dá),所以在重組時(shí)需要知道分片所屬的報(bào)文。
-
標(biāo)志: 用于控制和識(shí)別分片。下面是它們可能的配置
- Bit 0: 保留的,必須設(shè)置為零
- Bit 1: 禁止分片(Don’t Fragment,DF),當(dāng) DF = 0 時(shí)才允許分片
- Bit 2: 更多分片(More Fragment,MF),MF = 1 代表后面還有分片,MF = 0 代表已經(jīng)是最后一個(gè)分片。
-
片段偏移量: 指明了每個(gè)分片相對(duì)于原始報(bào)文開(kāi)頭的偏移量,以 8 字節(jié)作單位。
-
生存時(shí)間(TTL): 避免報(bào)文在互聯(lián)網(wǎng)中永遠(yuǎn)存在。以秒為單位,小于一秒的時(shí)間均向上取整到一秒。實(shí)際使用中,TTL 最初設(shè)置為一個(gè)數(shù)字,并由通過(guò)的每個(gè)路由器遞減,當(dāng) TTL 達(dá)到 0 時(shí),數(shù)據(jù)包將被丟棄。
-
協(xié)議: 在分層協(xié)議模型中,用于指示該報(bào)文的數(shù)據(jù)區(qū)使用的協(xié)議。IANA 維護(hù)著一份協(xié)議列表(最初由 RFC 790 定義),詳細(xì)參見(jiàn) IP協(xié)議號(hào)列表
-
頭校驗(yàn)和: 只對(duì)首部查錯(cuò),不包括數(shù)據(jù)部分。具體方法參見(jiàn) RFC 1071。在計(jì)算時(shí),先將校驗(yàn)和字段置為 0,計(jì)算之后填實(shí)際值,下面是 Wireshark 的一個(gè)示例:
??TCP 報(bào)文中經(jīng)常出現(xiàn)校驗(yàn)和錯(cuò)誤(其他報(bào)文貌似好一些),關(guān)于為何 Wireshark 抓取的 TCP 報(bào)文為何出現(xiàn)大量校驗(yàn)和錯(cuò)誤,參見(jiàn) Wireshark 官網(wǎng)解釋。 -
源 IP 地址: IPv4 地址,指出報(bào)文的發(fā)送端。
-
目標(biāo) IP 地址: IPv4 地址,指出報(bào)文的接收端。
-
選項(xiàng)和填充: 以 4 字節(jié)為單位,從1 到 40個(gè)字節(jié)不等,一般不用。如果選項(xiàng)值不是 4 的倍數(shù),則填充 0 以確保 4 字節(jié)對(duì)齊。如果 IHL 大于 5,那么選項(xiàng)字段必然存在并必須被考慮。
-
數(shù)據(jù): 數(shù)據(jù)字段不是首部的一部分,因此并不被包含在首部檢驗(yàn)和中。數(shù)據(jù)的格式在協(xié)議首部字段中被指明,并可以是任意的傳輸層協(xié)議
TCP/UDP
??TCP 和 UDP 是 TCP/IP 協(xié)議中最具有代表性的傳輸層協(xié)議。其中,TCP 協(xié)議全稱是傳輸控制協(xié)議(Transmission Control Protocol)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由 IETF 的 RFC 793 定義;UDP 協(xié)議全稱是用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol)是一種無(wú)連接的協(xié)議,由 IETF 的 RFC 768 定義。下面是兩個(gè)的簡(jiǎn)單對(duì)比:
| 服務(wù)類型 | TCP 是一種面向連接的協(xié)議。連接定向是指通信設(shè)備在傳輸數(shù)據(jù)之前要建立連接,在傳輸數(shù)據(jù)之后要關(guān)閉連接。 | UDP 是面向數(shù)據(jù)報(bào)的協(xié)議。它沒(méi)有打開(kāi)連接、維護(hù)連接和終止連接的開(kāi)銷。UDP 對(duì)于廣播和組播類型的網(wǎng)絡(luò)傳輸十分有效。 |
| 可靠性 | 可靠的,因?yàn)?TCP 保證將數(shù)據(jù)的傳輸?shù)侥繕?biāo)路由器。 | 不可靠,因?yàn)?UDP 無(wú)法保證將數(shù)據(jù)傳送到目的地。 |
| 錯(cuò)誤檢查機(jī)制 | 提供了廣泛的錯(cuò)誤檢查機(jī)制。因?yàn)樗峁┝肆骺刂坪蛿?shù)據(jù)確認(rèn)。 | UDP 只有使用校驗(yàn)和的基本錯(cuò)誤檢查機(jī)制。 |
| 確認(rèn) | 有確認(rèn) | 無(wú)確認(rèn) |
| 時(shí)序 | 數(shù)據(jù)的排序是 TCP 的一個(gè)特性。數(shù)據(jù)包按順序到達(dá)接收器。 | 在 UDP 中沒(méi)有數(shù)據(jù)排序。如果需要順序,則必須由應(yīng)用層管理。 |
| 速度 | 比 UDP 慢 | 比 TCP 更快、更簡(jiǎn)單、更高效 |
| 重發(fā) | 可以重傳丟失的數(shù)據(jù)包 | 不能重發(fā) |
| 報(bào)頭長(zhǎng)度 | 20 - 60 字節(jié)的可變長(zhǎng)度頭 | 8 字節(jié)的固定長(zhǎng)度頭 |
| 量級(jí) | 重量級(jí) | 輕量級(jí) |
| 握手技術(shù) | 使用 SYN、ACK、SYN-ACK 等握手方式 | 沒(méi)有握手 |
| 廣播 | 不支持 | 支持 |
| 協(xié)議 | 用于 HTTP、HTTPs、FTP、SMTP 和 Telnet | 用于 DNS、DHCP、TFTP、SNMP、RIP、VoIP等協(xié)議 |
| 流類型 | 字節(jié)流 | 消息流 |
| 開(kāi)銷 | 低但高于 UDP | 非常低 |
TCP
-
源端口號(hào): 標(biāo)識(shí)發(fā)送端口
-
目的端口號(hào): 標(biāo)識(shí)接收端口
-
序列號(hào): 主要有兩個(gè)作用
- 如果 SYN 位被置 1,則此為最初的序列號(hào)。實(shí)際的第一個(gè)數(shù)據(jù)字節(jié)的序列號(hào)和相應(yīng)的 ACK 中確認(rèn)的序列號(hào)是這個(gè)序列號(hào)加上 1。
- 如果 SYN 位被清 0,那么這是當(dāng)前會(huì)話的這個(gè)段的第一個(gè)數(shù)據(jù)字節(jié)的累積序列號(hào)。
-
確認(rèn)號(hào): 如果設(shè)置了 ACK 標(biāo)志,那么該字段的值就是 ACK 發(fā)送方期望的下一個(gè)序列號(hào)。
-
數(shù)據(jù)偏移: 以 4 字節(jié)為單位計(jì)算出的數(shù)據(jù)段開(kāi)始地址的偏移量。TCP 頭的最小大小為 20 個(gè)字節(jié),最大大小為 60 個(gè)字節(jié),因此該值最小值為 5,最大值為 15。當(dāng)該值大于 5 時(shí),就需要在 選項(xiàng) 字段中添加內(nèi)容。
-
保留: 留將來(lái)使用,必須置 0
-
標(biāo)志符:
- NS: 顯式擁塞通知(Explicit Congestion Notification,ECN)是對(duì) TCP 的擴(kuò)展,定義于 RFC 3540(2003)。ECN 允許擁塞控制的端對(duì)端通知而避免丟包。ECN 為一項(xiàng)可選功能,如果底層網(wǎng)絡(luò)設(shè)施支持,則可能被啟用 ECN 的兩個(gè)端點(diǎn)使用。
- CWR: Congestion Window Reduced,定義于 RFC 3168(2001)。
- ECE: ECN-Echo 有兩種意思,取決于 SYN 標(biāo)志的值,定義于 RFC 3168(2001)。
- URG: 為 1 表示高優(yōu)先級(jí)數(shù)據(jù)包,緊急指針字段有效。
- ACK: 為 1 表示確認(rèn)號(hào)字段有效
- PSH: 為 1 表示是帶有 PUSH 標(biāo)志的數(shù)據(jù),指示接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層而不用等待緩沖區(qū)裝滿。
- RST: 為 1 表示出現(xiàn)嚴(yán)重差錯(cuò)。可能需要重新創(chuàng)建 TCP 連接。還可以用于拒絕非法的報(bào)文段和拒絕連接請(qǐng)求。
- SYN: 為 1 表示這是連接請(qǐng)求或是連接接受請(qǐng)求,用于創(chuàng)建連接和使順序號(hào)同步
- FIN: 為 1 表示發(fā)送方?jīng)]有數(shù)據(jù)要傳輸了,要求釋放連接。
-
窗口大小: 接收窗口的大小,它指定了這個(gè)段的發(fā)送者目前愿意接收的窗口大小單位(默認(rèn)是以字節(jié)為單位)的數(shù)量。
-
校驗(yàn)和: TCP 頭 + 數(shù)據(jù) + IP 偽報(bào)頭計(jì)算的校驗(yàn)和。IP 偽報(bào)頭由源 IP 地址、目的 IP 地址、TCP 協(xié)議的協(xié)議號(hào)組成。完整的計(jì)算內(nèi)容如下所示:
IP 偽報(bào)頭僅用于計(jì)算校驗(yàn)和,不傳輸。偽頭中的 TCP 長(zhǎng)度(字節(jié)為單位)不含偽頭本身。 下面在來(lái)看個(gè)實(shí)例:
關(guān)于為何 Wireshark 抓取的 TCP 報(bào)文為何出現(xiàn)大量校驗(yàn)和錯(cuò)誤,參見(jiàn) Wireshark 官網(wǎng)解釋。 -
緊急指針: 如果設(shè)置了 URG 標(biāo)志,那么該字段是表示最后一個(gè)緊急數(shù)據(jù)字節(jié)的序號(hào)的偏移量,否則,該字段固定為 0。
-
選項(xiàng): 以 4 字節(jié)為單位,最多 40 個(gè)字節(jié)。該字段的長(zhǎng)度和數(shù)據(jù)偏移字段的值相關(guān)。該部分又由三個(gè)字段組成:
- Option-Kind: 固定占 1 字節(jié),表示選項(xiàng)的類型,該字段是必須的。根據(jù) Option-Kind 值,后面兩個(gè)字段內(nèi)容可變。Option-Kind 的分配由 IANA 維護(hù)。
- Option-Length: 如果存在該字段,則固定占 1 字節(jié),表示該選項(xiàng)的總長(zhǎng)度(Option-Kind + Option-Length + Option-Data)。
- Option-Data: 包含與該選項(xiàng)相關(guān)的數(shù)據(jù)(如果有數(shù)據(jù)的話),長(zhǎng)度根據(jù) Option-Kind 不同而變化。
注意,這里其實(shí)是個(gè)列表,可以包含上面多個(gè) Option-Kind + Option-Length + Option-Data 的組合。 如下圖是 Wireshark 抓取一個(gè)報(bào)文示例:
- Option-Kind: 固定占 1 字節(jié),表示選項(xiàng)的類型,該字段是必須的。根據(jù) Option-Kind 值,后面兩個(gè)字段內(nèi)容可變。Option-Kind 的分配由 IANA 維護(hù)。
-
填充: 如果 TCP 頭長(zhǎng)度不是 32 對(duì)齊的,則需要在頭尾部用 0 進(jìn)行填充。
UDP
- 源端口號(hào): 標(biāo)識(shí)發(fā)送者使用的端口號(hào),如果(IPv4 和 IPv6 中)不使用,則應(yīng)為零。
- 目標(biāo)端口號(hào): 標(biāo)識(shí)接收者使用的端口號(hào),并且是必需的。
- 報(bào)文長(zhǎng)度: 指定 UDP 標(biāo)頭和 UDP 數(shù)據(jù)的長(zhǎng)度(以字節(jié)為單位)。最小長(zhǎng)度為 8 個(gè)字節(jié),即頭的長(zhǎng)度。字段大小將 UDP 數(shù)據(jù)報(bào)的理論限制設(shè)置為 65535 字節(jié)(8 字節(jié)標(biāo)頭 + 65527 字節(jié)數(shù)據(jù))。但是,底層 IPv4 協(xié)議對(duì)數(shù)據(jù)長(zhǎng)度的實(shí)際限制為 65507 字節(jié)(65535 字節(jié) ? 8 字節(jié) UDP 標(biāo)頭 ? 20 字節(jié) IP 標(biāo)頭)。
- 校驗(yàn)和: 這里的校驗(yàn)和是 UDP 頭 + 數(shù)據(jù) + IP 偽報(bào)頭 計(jì)算的校驗(yàn)和。該字段在 IPv4 中是可選的,在 IPv6 中是必需的。如果未使用,該字段將全為零。用于計(jì)算校驗(yàn)和的方法在 RFC 768 中定義,而 RFC 1071 給出了一個(gè)更高效的計(jì)算方法。要計(jì)算的整個(gè)內(nèi)容如下圖所示:
IP 偽報(bào)頭僅用于計(jì)算校驗(yàn)和,不傳輸。偽頭中的 UDP 長(zhǎng)度(字節(jié)為單位)不含偽頭本身。 下面在看個(gè)示例:
ARP
??地址解析協(xié)議 (ARP) 用于發(fā)現(xiàn)與給定的互聯(lián)網(wǎng)層地址(通常是 IPv4 地址)關(guān)聯(lián)的鏈路層地址(如 MAC 地址)。于 1982 年由 RFC 826 定義。IPv4 使用地址解析協(xié)議(ARP)將 IP 地址解析成相應(yīng)的數(shù)據(jù)鏈路地址(MAC 地址),而 IPv6 則采用鄰居發(fā)現(xiàn)協(xié)議(NDP)。
- 協(xié)議地址: 就是 IP 地址。
- 目標(biāo)硬件地址:在不知道目標(biāo)硬件地址時(shí),通常這里全部填寫 00,Ethernet II 幀中 MAC 為全 FF。
??在每臺(tái)安裝有 TCP/IP 協(xié)議的電腦或路由器里都有一個(gè) ARP 緩存表,表里的 IP 地址與 MAC 地址是一對(duì)應(yīng)的。當(dāng)首次不知道目標(biāo)硬件地址時(shí),就需要發(fā)送 ARP 廣播(Ethernet II 幀中 MAC 為全 FF),所有設(shè)備都會(huì)收到有 ARP 廣播,但是只有符合條件(協(xié)議地址一致的)的設(shè)備就會(huì)進(jìn)行應(yīng)答:
??地址解析協(xié)議是一種請(qǐng)求-響應(yīng)協(xié)議。ARP 請(qǐng)求是廣播的,ARP 回復(fù)是單播,且它在單個(gè)網(wǎng)絡(luò)的邊界內(nèi)進(jìn)行通信,從不跨互聯(lián)節(jié)點(diǎn)進(jìn)行路由。下面是 Wireshark 抓取的 ARP 請(qǐng)求-響應(yīng)幀:
ICMP
??互聯(lián)網(wǎng)控制消息協(xié)議(Internet Control Message Protocol,ICMP)是互聯(lián)網(wǎng)協(xié)議族的核心協(xié)議之一。它用于網(wǎng)際協(xié)議(IP)中發(fā)送控制消息,提供可能發(fā)生在通信環(huán)境中的各種問(wèn)題反饋。IPv4 中的 ICMP被稱作 ICMPv4(RFC 792),IPv6 中的 ICMP 則被稱作 ICMPv6(RFC 4443)。
- 類型和代碼: 類型標(biāo)識(shí)生成的錯(cuò)誤報(bào)文,代碼進(jìn)一步劃分 ICMP 的類型,用來(lái)查找產(chǎn)生錯(cuò)誤的原因。類型及代碼的定義見(jiàn)下表(部分):
- 校驗(yàn)和: 用于進(jìn)行錯(cuò)誤檢查,該校驗(yàn)和是從 ICMP 頭和以該字段替換為 0 的數(shù)據(jù)計(jì)算得出的。
- 剩余部分: 以 4 字節(jié)為單位,理論值是 0 ~ 65507(IP 長(zhǎng)度限制),但實(shí)際內(nèi)容根據(jù) ICMP 類型和代碼而有所不同。
??ICMP 主要被用于網(wǎng)絡(luò)設(shè)備之間(如兩臺(tái)路由器)進(jìn)行消息傳遞,除了 traceroute 和 ping(其實(shí)就是 traceroute 的簡(jiǎn)化版)之外,計(jì)算機(jī)用戶一般不會(huì)直接使用到該協(xié)議。
??在互聯(lián)網(wǎng)層上運(yùn)行的 IP 協(xié)議是一種無(wú)連接協(xié)議。 因此,如果 IP 數(shù)據(jù)包傳輸失敗,則無(wú)法檢測(cè)到失敗,ICMP 就負(fù)責(zé)跟蹤 IP。ICMP 通常被認(rèn)為是 IP 的一部分(分擔(dān)了 IP 糾錯(cuò)功能),雖然與其他上層協(xié)議一樣,ICMP 消息也包含在標(biāo)準(zhǔn) IP 數(shù)據(jù)包中,但 ICMP 消息通常作為特殊情況進(jìn)行處理。
Ping
??Ping 命令通過(guò)指定目標(biāo) IP 地址發(fā)送 Ping 請(qǐng)求,如果可以到達(dá)該目標(biāo),則向源返回 Ping 響應(yīng)。它是 ICMP 的一個(gè)典型應(yīng)用,使用就是 ICMP 的 Echo Request (Type 8) 和 Echo Reply (Type 0)。
??其中數(shù)據(jù)可以填充任意內(nèi)容,一般都是 4 的整數(shù)倍。且 Reply 的內(nèi)容與 Request 是一樣的。下面是 Windows 的 Ping 和 Ubuntu 的 Ping 對(duì)比情況:
參考
總結(jié)
以上是生活随笔為你收集整理的Network 之五 TCP/IP 协议族、工作流程、常用协议格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Network 之四 常用 Linux
- 下一篇: 博图注册表删除方法_技成周报40期 |