“TCP/IP協(xié)議”可謂是我們?nèi)粘9ぷ髦薪佑|到的最多的數(shù)據(jù)傳輸協(xié)議了,也是在網(wǎng)絡(luò)訪問過程中的底層協(xié)議??赡芎芏嘈』锇橐哺乙粯与m然對(duì)這個(gè)“協(xié)議”很熟悉,卻傻傻分不清楚這個(gè)東西到底是什么以及整個(gè)工作流程是怎么樣的,在拖延了也迷迷糊糊的用了無數(shù)天之后,終于下定決心好好梳理一番協(xié)議相關(guān)的知識(shí)。在拜讀了無數(shù)前輩們辛苦整理的文章和帖子之后,最終寫下本篇文章詳細(xì)的梳理一下“TCP/IP協(xié)議”到底是什么以及整個(gè)工作流程,一是加深自己的學(xué)習(xí)印象,二來作為自己學(xué)習(xí)的記錄,方便日后回顧重溫。
本篇文章僅僅針對(duì)網(wǎng)絡(luò)協(xié)議小白,很多知識(shí)都比較基礎(chǔ),可能也會(huì)有點(diǎn)啰嗦,但盡可能使用淺顯易懂的語言來描述清楚,如有不足之處歡迎指正。
首先我們要弄清楚一個(gè)定義:
我們常說的TCP/IP不是一個(gè)協(xié)議,而是一個(gè)協(xié)議模型。
TCP/IP 的定義為傳輸控制協(xié)議/網(wǎng)絡(luò)協(xié)議模型(Transmission Control Protocol/Internet Protocol)(不要被他長(zhǎng)長(zhǎng)的名字嚇到了,只是一個(gè)模型的官方名,大部分的時(shí)間我們都統(tǒng)稱為TCP/IP協(xié)議)。
這個(gè)模型描述了數(shù)據(jù)在網(wǎng)絡(luò)傳輸?shù)恼麄€(gè)流程,可以簡(jiǎn)單理解為【程序發(fā)起數(shù)據(jù)傳輸請(qǐng)求、通過端口將數(shù)據(jù)發(fā)出、通過網(wǎng)絡(luò)傳遞、接受程序收到數(shù)據(jù)】這個(gè)流程的模型。在這個(gè)模型里面用到了很多協(xié)議,但是TCP、IP協(xié)議在整個(gè)模型中占比最為重要,所以整個(gè)模型以TCP/IP來命名。
也有人把TCP/IP作為一個(gè)協(xié)議族的統(tǒng)稱,里面包括了 IP 協(xié)議、IMCP 協(xié)議、TCP 協(xié)議、以及 http、ftp、pop3 協(xié)議等,這些都是在TCP/IP協(xié)議模型里使用到的協(xié)議。
好了,進(jìn)入正題,先用一個(gè)簡(jiǎn)單的數(shù)據(jù)請(qǐng)求流程圖來了解一下TCP/IP協(xié)議模型:與之相關(guān)的還有一個(gè)協(xié)議模型我們可以簡(jiǎn)單了解下--OSI/RM:開放系統(tǒng)互連基本參考模型(Open systems Interconnection Reference Model),簡(jiǎn)稱為OSI。這個(gè)模型在1983正式成為國(guó)際標(biāo)準(zhǔn),但是在這個(gè)模型發(fā)布之前因特網(wǎng)已經(jīng)大范圍的發(fā)布了,當(dāng)時(shí)的因特網(wǎng)采用的TCP/IP協(xié)議模型,所以TCP/IP協(xié)議成為了使用范圍最廣的協(xié)議標(biāo)準(zhǔn)模型,也在1984年成為美國(guó)的計(jì)算機(jī)網(wǎng)絡(luò)標(biāo)準(zhǔn),而OSI則就不了了之了。

這個(gè)圖簡(jiǎn)單描述了一下整個(gè)TCP/IP模型的一次數(shù)據(jù)傳遞流程,可能對(duì)添加的一些請(qǐng)求頭有點(diǎn)陌生之外,對(duì)于整個(gè)業(yè)務(wù)流程我們還是可以容易的理解的,會(huì)有一些新名詞和術(shù)語,不要著急,對(duì)于每一步我們后面都會(huì)詳細(xì)的解析,先看明白這是一個(gè)常用的請(qǐng)求流程就好。

互聯(lián)網(wǎng)中信息以數(shù)據(jù)包的單位傳輸,不同的協(xié)議層對(duì)數(shù)據(jù)包有不同的稱謂,在傳輸層叫做段 (segment),在網(wǎng)絡(luò)層叫做數(shù)據(jù)報(bào) (datagram),在鏈路層叫做幀 (frame)。 還有一個(gè)圖可以對(duì)整個(gè)流程進(jìn)行比較清晰的概括:


光明正大的再拿百度大大一張圖,還是那句話,對(duì)里面的一些名字和縮寫不用在意,后面我們都會(huì)講解,其實(shí)并不復(fù)雜:

相信通過以上的幾個(gè)圖片大家對(duì)于網(wǎng)絡(luò)分層的概念和每一層進(jìn)行的操作已經(jīng)很清楚了,先簡(jiǎn)單說一下每層大概的作用吧(以接收數(shù)據(jù)的路線來看),對(duì)整體流程有個(gè)大概的認(rèn)識(shí),后面會(huì)對(duì)每一層的功能和作用以及涉及到的相關(guān)知識(shí)點(diǎn)進(jìn)行詳細(xì)的解讀:
鏈路層:
鏈路層負(fù)責(zé)將封裝完的數(shù)據(jù)幀在網(wǎng)絡(luò)中(網(wǎng)線等各種傳輸介質(zhì))進(jìn)行傳遞
網(wǎng)絡(luò)層:
網(wǎng)絡(luò)層負(fù)責(zé)接收來自鏈路層的數(shù)據(jù),然后通過IP地址和MAC地址找到目標(biāo)主機(jī),然后將數(shù)據(jù)傳遞給對(duì)應(yīng)的主機(jī)
傳輸層:
傳輸層負(fù)責(zé)接收來自網(wǎng)絡(luò)層的數(shù)據(jù),然后根據(jù)端口號(hào)將數(shù)據(jù)傳遞給目標(biāo)端口,監(jiān)聽該端口的程序即可收到該數(shù)據(jù)
應(yīng)用層:
應(yīng)用層的程序負(fù)責(zé)接收到數(shù)據(jù)后進(jìn)行解析使用
每一層還是比較容易理解的吧,接下來我們看看每一層的詳細(xì)解析,從鏈路層-網(wǎng)絡(luò)層-傳輸層-應(yīng)用層的順序講解:
(每層篇幅介紹量:鏈路層約15% 網(wǎng)絡(luò)層約40% 傳輸層約40% 應(yīng)用層約 5%,請(qǐng)合理安排耐心閱讀)
鏈路層
鏈路層的作用是接受上一層傳過來的數(shù)據(jù)包并通過網(wǎng)絡(luò)發(fā)送出去或者從網(wǎng)絡(luò)上接受物理幀,抽出IP數(shù)據(jù)包交給網(wǎng)絡(luò)層處理,網(wǎng)絡(luò)層再傳遞給傳輸層,傳輸層再傳遞給應(yīng)用層進(jìn)行數(shù)據(jù)解析處理。
鏈路層包括網(wǎng)絡(luò)使用的硬件設(shè)備比如路由,網(wǎng)卡(NIC,network interface card)及網(wǎng)線等可見部分,還包括協(xié)議這種不可見部分,使用的協(xié)議取決于使用的是哪種網(wǎng)絡(luò)。如果物理網(wǎng)絡(luò)是LAN,那么通常使用的是以太網(wǎng)協(xié)議(802.3)和他的變體,如果使用的是WAN,常用的則是點(diǎn)對(duì)點(diǎn)協(xié)議(PPP)以及幀中繼等協(xié)議。
其中最出名的是以太網(wǎng)協(xié)議,以太網(wǎng)協(xié)議通過網(wǎng)卡來進(jìn)行數(shù)據(jù)通信。每個(gè)網(wǎng)卡都有自己的獨(dú)特的一個(gè)地址,就是MAC地址。以太網(wǎng)數(shù)據(jù)以幀為單位,包括標(biāo)頭和數(shù)據(jù)部分。以太網(wǎng)在子網(wǎng)內(nèi)通過廣播的形式發(fā)送數(shù)據(jù),如果兩臺(tái)設(shè)備在同一個(gè)子網(wǎng)里的話可以正常進(jìn)行數(shù)據(jù)通信,但是如果這兩臺(tái)設(shè)備不在一個(gè)子網(wǎng)里的話就無法進(jìn)行數(shù)據(jù)傳輸了,以太網(wǎng)協(xié)議就無法進(jìn)行數(shù)據(jù)通信了。這就需要通過網(wǎng)絡(luò)層來區(qū)分每臺(tái)設(shè)備所在的網(wǎng)絡(luò)是哪個(gè)子網(wǎng),如果在同一個(gè)子網(wǎng)就通過廣播發(fā)送數(shù)據(jù),不在同一個(gè)子網(wǎng)就通過路由發(fā)送數(shù)據(jù)。這就導(dǎo)致了網(wǎng)絡(luò)層的產(chǎn)生。(每個(gè)子網(wǎng)有自己的IP地址,可以通過IP地址進(jìn)行查找和區(qū)分)
說一個(gè)子網(wǎng)在生活中的例子:
比如機(jī)場(chǎng)系統(tǒng)是將IP地址的主機(jī)編碼分出一些位來挪用為子網(wǎng)編碼。
我們可以在172.50.0.0地址中,將第3個(gè)字節(jié)挪用出來表示各個(gè)子網(wǎng),而不再分配給主機(jī)地址。這樣,我們可以用172.50.1.0表示鄭州機(jī)務(wù)段的子網(wǎng),172.50.2.0分配給濟(jì)南機(jī)務(wù)段作為該子網(wǎng)的網(wǎng)絡(luò)地址,172.50.3.0分配給長(zhǎng)沙機(jī)務(wù)段作為長(zhǎng)沙機(jī)務(wù)段子網(wǎng)的網(wǎng)絡(luò)地址。于是,172.50.0.0網(wǎng)絡(luò)中有172.50.1.0、172.50.2.0、172.50.3.0…等子網(wǎng)。
再舉一個(gè)子網(wǎng)的例子:
我們自己可以通過公司內(nèi)和自己連接在一個(gè)無線網(wǎng)下的同事查詢對(duì)比公網(wǎng)IP,會(huì)發(fā)現(xiàn)同處于一個(gè)無線網(wǎng)下的機(jī)器通過百度查詢IP地址的時(shí)候(直接在百度輸入IP搜索),查詢的結(jié)果為路由器連接的公網(wǎng)IP地址,會(huì)查詢出同樣的結(jié)果,因?yàn)槲覀兌继幱诼酚善鞯淖泳W(wǎng)之下。但是每臺(tái)機(jī)器都會(huì)有一個(gè)路由器分配的本機(jī)IP地址,用來進(jìn)行數(shù)據(jù)發(fā)送和接收,這個(gè)就是同一個(gè)子網(wǎng)下的不同機(jī)器分配了不同的子網(wǎng)Ip地址。
擴(kuò)展一點(diǎn)以太網(wǎng)幀的傳播:
交換機(jī)的工作原理:交換機(jī)從某一節(jié)點(diǎn)收到一個(gè)以太網(wǎng)幀后,便在其內(nèi)存中地址表進(jìn)行查找(MAC地址),如果有就將數(shù)據(jù)傳輸?shù)皆摰刂?,如果沒有就將該數(shù)據(jù)包廣播到所有節(jié)點(diǎn),與此匹配的MAC地址收到后就會(huì)做出應(yīng)答,最后交換機(jī)就可以將這個(gè)地址保存到MAC地址表。(基于IPv4協(xié)議,在IPv4中廣泛的使用單播、廣播、組播的方式。而在IPv6的應(yīng)用環(huán)境中,使用單播,組播、任意播的新方式,放棄廣播的使用,在IPv6的環(huán)境中不再有廣播的存在。)
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層的作用是:網(wǎng)絡(luò)層的主要作用就是確定每個(gè)數(shù)據(jù)包的發(fā)送路線,就是建立發(fā)送端主機(jī)和接收端主機(jī)之間的連接路徑以及進(jìn)行IP報(bào)傳遞(尋址、選擇數(shù)據(jù)包理由、數(shù)據(jù)發(fā)送及是否進(jìn)行切片分段發(fā)送)。兩臺(tái)主機(jī)可以在同一個(gè)網(wǎng)絡(luò)也可能在不同的外部網(wǎng)絡(luò),因此需要先區(qū)分主機(jī)是不是在同一個(gè)子網(wǎng)。兩臺(tái)主機(jī)之間的數(shù)據(jù)傳輸需要知道對(duì)方的IP地址及MAC地址才可以進(jìn)行傳輸。發(fā)送端的主機(jī)通過Ip地址找到局域網(wǎng)服務(wù)器的地方,然后通過ARP協(xié)議查詢局域網(wǎng)路由器獲取到目標(biāo)主機(jī)的MAC地址,接著進(jìn)行數(shù)據(jù)傳輸。
局域網(wǎng)路由器記錄目標(biāo)主機(jī)的IP地址的操作是發(fā)生在目標(biāo)主機(jī)接入局域網(wǎng)路由器的時(shí)候會(huì)通過RARP協(xié)議將自己的MAC地址(主機(jī)的mac地址是跟自己的網(wǎng)卡一一對(duì)應(yīng)的,廠家出廠的時(shí)候就確定了)遞交上去,獲取到局域網(wǎng)路由器給自己分配的一個(gè)子網(wǎng)IP,在這個(gè)過程中目標(biāo)主機(jī)的MAC地址被記錄在了局域網(wǎng)路由器的映射表里。至于什么是ARP協(xié)議和為什么需要使用IP和MAC地址進(jìn)行通信下面會(huì)詳細(xì)講解。
這一層常見協(xié)議:IP(Internet Protocol)、ICMP、ARP(Address Resolution Protocol)、RARP(Reverse ARP)。
IP是網(wǎng)絡(luò)層的核心,通過路由選擇將下一條IP封裝后交給鏈路層。ICMP是網(wǎng)絡(luò)層的補(bǔ)充,可以回送報(bào)文,用來檢測(cè)網(wǎng)絡(luò)是否暢通。
IP協(xié)議有一個(gè)生存時(shí)間(TTL),TTL值被發(fā)送端設(shè)置,一般設(shè)置為64,這個(gè)值的含義是該次IP數(shù)據(jù)報(bào)傳遞允許經(jīng)過的路由器跳數(shù),數(shù)據(jù)報(bào)每次經(jīng)過一個(gè)路由器這個(gè)值就減1,當(dāng)TTL的值為0的時(shí)候,路由器就會(huì)將這個(gè)數(shù)據(jù)報(bào)丟棄并且向源端發(fā)送一個(gè)ICMP差錯(cuò)報(bào)文。
引用 一文看懂互聯(lián)網(wǎng)TCP/IP協(xié)議 | 小明學(xué)習(xí)筆記 來舉例:
IP 地址是門牌號(hào),而 IP 協(xié)議負(fù)責(zé)計(jì)算并找到指定門牌,快遞小哥每天出門前要做的事就是 IP 協(xié)議的天職:分揀包裹、規(guī)劃路徑。其實(shí),三五個(gè)節(jié)點(diǎn)的小型網(wǎng)絡(luò)內(nèi)部通信完全不必使用 IP 協(xié)議,因?yàn)檫@些節(jié)點(diǎn)之間本來就能兩兩互通,但會(huì)有個(gè)問題:節(jié)點(diǎn)數(shù)變多后,網(wǎng)速就會(huì)癱瘓,因?yàn)閹捄谋M。(帶寬指固定時(shí)間內(nèi)能傳遞的數(shù)據(jù)包,有點(diǎn)像馬路寬度。)
因此,后來一片網(wǎng)絡(luò)拆分成很多子網(wǎng)絡(luò)(sub networks),每片子網(wǎng)絡(luò)交給一臺(tái)路由器統(tǒng)管。子網(wǎng)絡(luò)中的節(jié)點(diǎn)間可以單獨(dú)通信,不需要 IP 協(xié)議,但由于帶寬限制,如果你想和本網(wǎng)絡(luò)外的節(jié)點(diǎn)溝通時(shí),就得使用一個(gè)設(shè)備:路由器。世界上大多數(shù)的路由器被幾家大運(yùn)營(yíng)商掌管。如上圖,節(jié)點(diǎn) 1 和 2 同屬一個(gè)子網(wǎng),可基于內(nèi)部通信協(xié)議溝通,而 1 和 5 間的聯(lián)絡(luò)必須基于 IP 協(xié)議,通過路由器 1 和 2 之間的路徑交流。路由子網(wǎng)圖
把 IP 協(xié)議的邏輯推廣到整個(gè)互聯(lián)網(wǎng),最終,連接我們手機(jī)客戶端和騰訊服務(wù)器的是無數(shù)個(gè)路由器。網(wǎng)絡(luò)圖
把大網(wǎng)絡(luò)切小的好處顯而易見:節(jié)約帶寬、抬高網(wǎng)速,同時(shí)一只路由器掛了不影響其他節(jié)點(diǎn)間的通信,這就是 IP 協(xié)議的作用。
IP協(xié)議提供非可靠,無連接的數(shù)據(jù)報(bào)傳輸服務(wù),主要用于主機(jī)之間的尋址和選擇數(shù)據(jù)包路由。
非可靠:這意味著它并不保證所要傳輸?shù)臄?shù)據(jù)一定會(huì)到達(dá)目的地。(當(dāng)路由出錯(cuò)導(dǎo)致某個(gè)數(shù)據(jù)傳輸失敗時(shí),會(huì)丟掉此數(shù)據(jù)并發(fā)回一個(gè)ICMP信息回去。可靠性需要由更上層的協(xié)議提供,如TCP協(xié)議)。
無連接:這代表 IP datagram(數(shù)據(jù)報(bào))在傳輸中沒有連接起來,他們是一塊一塊各自分開的,分開獨(dú)立處理。(比如需要向某個(gè)地方發(fā)送兩個(gè)數(shù)據(jù)報(bào)A、B,他們兩個(gè)有可能會(huì)經(jīng)由不同的路徑去到達(dá)目的地,有可能B要比A先到達(dá))。
還有一些協(xié)助IP工作的協(xié)議,比如ARP和RARP,保證數(shù)據(jù)的傳遞除了需要IP地址還需要MAC地址,MAC地址又稱物理地址,跟網(wǎng)卡一一對(duì)應(yīng),由生產(chǎn)廠家來確定,對(duì)于一臺(tái)主機(jī)來說是唯一且不可變的,IP地址根據(jù)網(wǎng)絡(luò)的不同是可變的。
上面兩個(gè)協(xié)議簡(jiǎn)單來說就是:用IP地址找MAC地址(ARP);用MAC地址找IP地址(RARP)
“ARP(地址解析協(xié)議)基本功能就是通過目標(biāo)設(shè)備的 IP 地址,查詢目標(biāo)設(shè)備的 MAC 地址,以保證通信的順利進(jìn)行。以太網(wǎng)中的數(shù)據(jù)幀從一個(gè)主機(jī)到達(dá)網(wǎng)內(nèi)的另一臺(tái)主機(jī)是根據(jù)48位的以太網(wǎng)地址(硬件地址)來確定接口的,而不是根據(jù) 32 位的 IP 地址。內(nèi)核必須知道目的端的硬件地址才能發(fā)送數(shù)據(jù)。P2P 的連接是不需要 ARP 的。 (通過網(wǎng)關(guān)服務(wù)器查詢對(duì)應(yīng)的MAC地址)
擴(kuò)展:
地址解析協(xié)議,即ARP(Address Resolution Protocol),是根據(jù)IP地址獲取物理地址的一個(gè)TCP/IP協(xié)議。主機(jī)發(fā)送信息時(shí)將包含目標(biāo)IP地址的ARP請(qǐng)求廣播到網(wǎng)絡(luò)上的所有主機(jī),并接收返回消息,以此確定目標(biāo)的物理地址;收到返回消息后將該IP地址和物理地址存入本機(jī)ARP緩存中并保留一定時(shí)間,下次請(qǐng)求時(shí)直接查詢ARP緩存以節(jié)約資源。地址解析協(xié)議是建立在網(wǎng)絡(luò)中各個(gè)主機(jī)互相信任的基礎(chǔ)上的,網(wǎng)絡(luò)上的主機(jī)可以自主發(fā)送ARP應(yīng)答消息,其他主機(jī)收到應(yīng)答報(bào)文時(shí)不會(huì)檢測(cè)該報(bào)文的真實(shí)性就會(huì)將其記入本機(jī)ARP緩存;由此攻擊者就可以向某一主機(jī)發(fā)送偽ARP應(yīng)答報(bào)文,使其發(fā)送的信息無法到達(dá)預(yù)期的主機(jī)或到達(dá)錯(cuò)誤的主機(jī),這就構(gòu)成了一個(gè)ARP欺騙。ARP命令可用于查詢本機(jī)ARP緩存中IP地址和MAC地址的對(duì)應(yīng)關(guān)系、添加或刪除靜態(tài)對(duì)應(yīng)關(guān)系等。相關(guān)協(xié)議有RARP、代理ARP。NDP用于在IPv6中代替地址解析協(xié)議。
RARP(反向地址轉(zhuǎn)換協(xié)議)允許局域網(wǎng)的物理機(jī)器從網(wǎng)關(guān)服務(wù)器的 ARP 表或者緩存上請(qǐng)求其 IP 地址。局域網(wǎng)網(wǎng)關(guān)路由器中存有一個(gè)表以映射 MAC 和與其對(duì)應(yīng)的 IP 地址。當(dāng)設(shè)置一臺(tái)新的機(jī)器時(shí),其 RARP 客戶機(jī)程序需要向路由器上的 RARP 服務(wù)器請(qǐng)求相應(yīng)的 IP 地址。假設(shè)在路由表中已經(jīng)設(shè)置了一個(gè)記錄,RARP 服務(wù)器將會(huì)返回 IP 地址給機(jī)器?!?/p>
既然通信的最終結(jié)果都是通過MAC地址進(jìn)行通信,為什么不直接使用MAC地址來進(jìn)行通信呢?
最早這個(gè)世界上的電腦沒這么多的時(shí)候,是沒有路由這個(gè)東西存在的,主機(jī)都在一張網(wǎng)里,所以確實(shí)是直接通過 mac 地址通信的。最初的鏈路層協(xié)議是和 ip 地址無關(guān)的,沒有網(wǎng)絡(luò)層方面的設(shè)定,只有物理層和鏈路層,最初也只有集線器,沒有交換機(jī)路由器,服務(wù)器之間傳輸數(shù)據(jù)全靠 mac 地址。在沒有 ip 地址之前,mac 地址已經(jīng)在使用了?,F(xiàn)在到處都在用的二層交換機(jī),就是根據(jù) mac 地址轉(zhuǎn)發(fā)數(shù)據(jù)。mac 地址的設(shè)計(jì)不攜帶設(shè)備在網(wǎng)絡(luò)中的位置信息,想要通過 mac 地址通信,我們得在所有的設(shè)備上維護(hù)一張很大的表,記錄所有 mac 地址路由在當(dāng)前位置的的下一跳,這顯然是不合理的。
MAC 地址結(jié)構(gòu)一共有 48bit,分為兩部分,前 24bit 是廠商代碼,后 24bit 是廠家自己分配的。假如我們認(rèn)為 MAC 地址可以區(qū)分不同的網(wǎng)絡(luò)的話,那只能是使用廠商代碼來區(qū)分不同的網(wǎng)絡(luò),顯然同品牌網(wǎng)卡不代表在同一個(gè)網(wǎng)絡(luò)。
引用大佬舉的一個(gè)清晰明了的例子:
MAC 地址就像電腦的個(gè)人身份證,IP 地址就像電腦所在的屋子,屋子里可以住著很多人,局域網(wǎng)關(guān)路由就像登記人口的街道辦公室。
IP協(xié)議以及IPv4和IPv6的學(xué)習(xí)傳送至我的這篇文章 IP協(xié)議詳解及IPv4與IPv6協(xié)議的區(qū)別和使用過渡方案
傳輸層
傳輸層的作用是主機(jī)將接收到的數(shù)據(jù)發(fā)送給對(duì)應(yīng)的程序,它建立端口到端口的鏈接(這個(gè)端口并不是說的主機(jī)的硬件端口,而是軟件端口)。剛才說的網(wǎng)絡(luò)層建立主機(jī)到主機(jī)的連接,只要有主機(jī)和端口,就能確定數(shù)據(jù)包是屬于哪個(gè)程序的,同時(shí)他也負(fù)責(zé)接收應(yīng)用層的數(shù)據(jù),然后把他們分成更小的單元(標(biāo)頭和數(shù)據(jù)部分在網(wǎng)絡(luò)層的數(shù)據(jù)部分)傳輸?shù)骄W(wǎng)絡(luò)層。每個(gè)程序都會(huì)監(jiān)聽一個(gè)端口,接收來自這個(gè)端口的數(shù)據(jù),所以傳輸層是建立端口到端口的鏈接。
傳輸層負(fù)責(zé)為我們的請(qǐng)求添加TCP頭部,TCP我們用到的主要有兩個(gè)協(xié)議:TCP和UDP協(xié)議。
TCP協(xié)議是一種可靠的、面向鏈接的基于字節(jié)流的傳輸協(xié)議。
可靠的指的是在傳輸服務(wù)過程中通過我們常說的三次握手、四次揮手來保證數(shù)據(jù)準(zhǔn)確送達(dá),雖然網(wǎng)絡(luò)的不穩(wěn)定性并不保證他一定是準(zhǔn)確送達(dá)的,但是這種機(jī)制是可靠的;
字節(jié)流傳輸指的是將大塊數(shù)據(jù)分割成以報(bào)文段(segment)為單位的數(shù)據(jù)包進(jìn)行管理傳輸,它把數(shù)據(jù)切成一個(gè)個(gè)數(shù)據(jù)包,從第一只數(shù)據(jù)包開始傳,傳送成功就翻倍,發(fā)現(xiàn)失敗就從失敗那只數(shù)據(jù)包重新開始,一直到傳輸完成。
延伸閱讀--為什么要有端口:
“ip 能鎖定一臺(tái)物理機(jī)器,對(duì)應(yīng)著一張網(wǎng)卡,外界發(fā)來的數(shù)據(jù)包網(wǎng)卡都會(huì)接收。但是問題來了,網(wǎng)卡給程序提供了接口,你監(jiān)聽一下我,要是有消息來了,我就轉(zhuǎn)發(fā)給你。這樣應(yīng)用程序就能收到數(shù)據(jù)了。但是問題來了,程序 A 和程序 B 都需要監(jiān)聽網(wǎng)卡接發(fā)數(shù)據(jù),網(wǎng)卡說那我把接到的數(shù)據(jù)都發(fā)給你兩,你們自己看著辦吧。好,小 A 小 B 都接受了。但是又來了 CDEF......,不行了,每個(gè)包都被發(fā)到了所有應(yīng)用程序,每個(gè)應(yīng)用程序都累得不行,最終垮了。
好,那網(wǎng)卡說我給你們加個(gè)表示吧,我們之間可以用一個(gè)號(hào)碼來作為標(biāo)識(shí),我和小 A 之間就用 1 來標(biāo)識(shí),如果外界發(fā)給 1 號(hào)標(biāo)識(shí)的數(shù)據(jù)我就轉(zhuǎn)發(fā)給你,你監(jiān)聽我的時(shí)候得告訴我你監(jiān)聽的時(shí) 1,我就轉(zhuǎn)發(fā) 1 的數(shù)據(jù)包給你。好了其他的 BCD... 都自己弄一個(gè)標(biāo)識(shí)號(hào),只要不重復(fù)就行。這樣大家都省事了。
最后涉及到安全,一個(gè)標(biāo)識(shí)號(hào)只能被一個(gè)應(yīng)用程序監(jiān)聽,因?yàn)槿绻?A 程序和小 B 同時(shí)監(jiān)聽一個(gè)標(biāo)識(shí)號(hào),那就壞了,我傳的數(shù)據(jù)都被 AB 接到,這樣數(shù)據(jù)安全性就沒辦法保證了?!?br> 參考《為什么要有端口,怎么來規(guī)劃端口,看下邊。》
TCP的三次握手與四次揮手
三次握手(開始連接):
來一張圖:
第一次握手:客戶端發(fā)送 syn 包 (syn=j) 到服務(wù)器,并進(jìn)入 SYN_SEND 狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到 syn 包,必須確認(rèn)客戶的 SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè) SYN 包(syn=k),即 SYN+ACK 包,此時(shí)服務(wù)器進(jìn)入 SYN_RECV 狀態(tài);
第三次握手:客戶端收到服務(wù)器的 SYN+ACK 包,向服務(wù)器發(fā)送確認(rèn)包 ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入 ESTABLISHED 狀態(tài),完成三次握手。
注意:握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。除了上述三次握手,TCP 協(xié)議還有其他各種手段來保證通信的可靠性。
理想狀態(tài)下,TCP 連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP 連接都將被一直保持下去。
斷開連接時(shí)服務(wù)器和客戶端均可以主動(dòng)發(fā)起斷開 TCP 連接的請(qǐng)求,斷開過程需要經(jīng)過“四次握手”。
三次握手引用圖
四次揮手(關(guān)閉連接):
第一次: 當(dāng)主機(jī)A完成數(shù)據(jù)傳輸后,將控制位FIN置1,提出停止TCP連接的請(qǐng)求 ;
第二次: 主機(jī)B收到FIN后對(duì)其作出響應(yīng),確認(rèn)這一方向上的TCP連接將關(guān)閉,將ACK置1;
第三次: 由B 端再提出反方向的關(guān)閉請(qǐng)求,將FIN置1 ;
第四次: 主機(jī)A對(duì)主機(jī)B的請(qǐng)求進(jìn)行確認(rèn),將ACK置1,雙方向的關(guān)閉結(jié)束.。
由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式, 大大提高了數(shù)據(jù)通信的可靠性,使發(fā)送數(shù)據(jù)端和接收端在數(shù)據(jù)正式傳輸前就有了交互, 為數(shù)據(jù)正式傳輸打下了可靠的基礎(chǔ)。
名詞解釋
1、ACK 是TCP報(bào)頭的控制位之一,對(duì)數(shù)據(jù)進(jìn)行確認(rèn)。確認(rèn)由目的端發(fā)出, 用它來告訴發(fā)送端這個(gè)序列號(hào)之前的數(shù)據(jù)段都收到了。 比如確認(rèn)號(hào)為X,則表示前X-1個(gè)數(shù)據(jù)段都收到了,只有當(dāng)ACK=1時(shí),確認(rèn)號(hào)才有效,當(dāng)ACK=0時(shí),確認(rèn)號(hào)無效,這時(shí)會(huì)要求重傳數(shù)據(jù),保證數(shù)據(jù)的完整性。
2、SYN 同步序列號(hào),TCP建立連接時(shí)將這個(gè)位置1。
3、FIN 發(fā)送端完成發(fā)送任務(wù)位,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開時(shí),,提出斷開連接的一方將這位置1。
至于 UDP 協(xié)議,傳送數(shù)據(jù)前并不與對(duì)方建立連接,對(duì)接收到的數(shù)據(jù)也不發(fā)送確認(rèn)信號(hào),發(fā)送端不知道數(shù)據(jù)是否會(huì)正確接收,當(dāng)然也不用重發(fā),所以說 UDP 是無連接的、不可靠的一種數(shù)據(jù)傳輸協(xié)議。具體據(jù)知乎用戶陳寶佳的帖子,UDP 傳輸?shù)男畔钚≈挥?8 個(gè)字節(jié),TCP 則是 20 個(gè)字節(jié)。這樣的好處是,UDP 對(duì)系統(tǒng)資源要求更低,開銷更小,數(shù)據(jù)傳輸速率更高,因?yàn)椴槐剡M(jìn)行收發(fā)數(shù)據(jù)的確認(rèn),所以 UDP 的實(shí)時(shí)性更好。他還表示 MSN 采用 TCP 傳輸協(xié)議傳文件,QQ 傳輸文件采用 UDP,所以后者更快。

我們經(jīng)常用的 ping 命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送 UDP 數(shù)據(jù)包,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包, 如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來,那么網(wǎng)絡(luò)就是通的。ping 命令是使用 IP 和網(wǎng)絡(luò)控制信息協(xié)議 (ICMP),因而沒有涉及到任何傳輸協(xié)議(UDP/TCP) 和應(yīng)用程序。它發(fā)送 icmp 回送請(qǐng)求消息給目的主機(jī)。ICMP 協(xié)議規(guī)定:目的主機(jī)必須返回 ICMP 回送應(yīng)答消息給源主機(jī)。如果源主機(jī)在一定時(shí)間內(nèi)收到應(yīng)答,則認(rèn)為主機(jī)可達(dá)。


TCP協(xié)議及UDP協(xié)議的學(xué)習(xí)傳送至我的這兩篇文章:
TCP協(xié)議詳解及實(shí)戰(zhàn)解析【精心整理收藏】
UDP協(xié)議詳解
應(yīng)用層
應(yīng)用層就是我們最經(jīng)常接觸的地方,也是比較簡(jiǎn)單的一層。這一層的主要作用就是將我們的數(shù)據(jù)根據(jù)我們使用的協(xié)議打包或者按照協(xié)議解析從傳輸層過來的各種類型的數(shù)據(jù)數(shù)據(jù),主要協(xié)議有:HTTP、FTP、SMTP、Telnet、NFS、RIP 等等。比如我們開發(fā)中用到較多的http請(qǐng)求進(jìn)行數(shù)據(jù)包裝、發(fā)郵件用到的SMTP、文件傳輸用到的FTP協(xié)議等,都是在這一層進(jìn)行封裝的,封裝完后傳入傳輸層開始數(shù)據(jù)的傳遞。
HTTP協(xié)議的學(xué)習(xí)傳送至我的這篇文章 HTTP協(xié)議詳解(精心整理)
補(bǔ)充:
最底層的以太網(wǎng)協(xié)議(Ethernet)規(guī)定了電子信號(hào)如何組成數(shù)據(jù)包(packet),解決了子網(wǎng)內(nèi)部的點(diǎn)對(duì)點(diǎn)通信。但是,以太網(wǎng)協(xié)議不能解決多個(gè)局域網(wǎng)如何互通,這由 IP 協(xié)議解決。IP 協(xié)議定義了一套自己的地址規(guī)則,稱為 IP 地址。它實(shí)現(xiàn)了路由功能,允許某個(gè)局域網(wǎng)的 A 主機(jī),向另一個(gè)局域網(wǎng)的 B 主機(jī)發(fā)送消息。
所以IP協(xié)議解決了局域網(wǎng)的查找問題,以太網(wǎng)協(xié)議解決了局域網(wǎng)內(nèi)主機(jī)查找問題,TCP協(xié)議解決了主機(jī)直接的端口號(hào)通信問題,應(yīng)用層的HTTP等協(xié)議解決了數(shù)據(jù)打包及解析問題。


結(jié)語:
以上就是對(duì)TCP/IP協(xié)議講解的全部?jī)?nèi)容了,后面會(huì)繼續(xù)更新TCP協(xié)議和UDP協(xié)議的相關(guān)內(nèi)容。
本篇文章很多內(nèi)容參閱了前輩的文章,甚至有些地方感覺寫的實(shí)在精彩是直接拷貝過來的,感謝留下墨寶的前輩大佬。
相關(guān)閱讀請(qǐng)移步:
一文看懂互聯(lián)網(wǎng)TCP/IP協(xié)議 | 小明學(xué)習(xí)筆記
一分鐘了解 TCP/IP 模型
TCP和UDP的區(qū)別
計(jì)算機(jī)網(wǎng)絡(luò)結(jié)構(gòu)模型TCP/IP詳解
TCP的三次握手與四次揮手理解及面試題(很全面)
TCP/IP協(xié)議(百度百科)
TCP 協(xié)議簡(jiǎn)介


