TCP/IP協(xié)議模型詳解(精心整理)

“TCP/IP協(xié)議”可謂是我們?nèi)粘9ぷ髦薪佑|到的最多的數(shù)據(jù)傳輸協(xié)議了,也是在網(wǎng)絡(luò)訪問過程中的底層協(xié)議〖危可能很多小伙伴也跟我一樣雖然對這個“協(xié)議”很熟悉苛茂,卻傻傻分不清楚這個東西到底是什么以及整個工作流程是怎么樣的,在拖延了也迷迷糊糊的用了無數(shù)天之后鸠窗,終于下定決心好好梳理一番協(xié)議相關(guān)的知識妓羊。在拜讀了無數(shù)前輩們辛苦整理的文章和帖子之后,最終寫下本篇文章詳細(xì)的梳理一下“TCP/IP協(xié)議”到底是什么以及整個工作流程稍计,一是加深自己的學(xué)習(xí)印象躁绸,二來作為自己學(xué)習(xí)的記錄,方便日后回顧重溫丙猬。

本篇文章僅僅針對網(wǎng)絡(luò)協(xié)議小白涨颜,很多知識都比較基礎(chǔ),可能也會有點啰嗦茧球,但盡可能使用淺顯易懂的語言來描述清楚庭瑰,如有不足之處歡迎指正。

首先我們要弄清楚一個定義:
我們常說的TCP/IP不是一個協(xié)議抢埋,而是一個協(xié)議模型弹灭。
TCP/IP 的定義為傳輸控制協(xié)議/網(wǎng)絡(luò)協(xié)議模型(Transmission Control Protocol/Internet Protocol)(不要被他長長的名字嚇到了,只是一個模型的官方名揪垄,大部分的時間我們都統(tǒng)稱為TCP/IP協(xié)議)穷吮。
這個模型描述了數(shù)據(jù)在網(wǎng)絡(luò)傳輸?shù)恼麄€流程,可以簡單理解為【程序發(fā)起數(shù)據(jù)傳輸請求饥努、通過端口將數(shù)據(jù)發(fā)出捡鱼、通過網(wǎng)絡(luò)傳遞、接受程序收到數(shù)據(jù)】這個流程的模型酷愧。在這個模型里面用到了很多協(xié)議驾诈,但是TCP、IP協(xié)議在整個模型中占比最為重要溶浴,所以整個模型以TCP/IP來命名乍迄。
也有人把TCP/IP作為一個協(xié)議族的統(tǒng)稱,里面包括了 IP 協(xié)議士败、IMCP 協(xié)議闯两、TCP 協(xié)議、以及 http谅将、ftp漾狼、pop3 協(xié)議等,這些都是在TCP/IP協(xié)議模型里使用到的協(xié)議戏自。

與之相關(guān)的還有一個協(xié)議模型我們可以簡單了解下--OSI/RM:開放系統(tǒng)互連基本參考模型(Open systems Interconnection Reference Model)邦投,簡稱為OSI。這個模型在1983正式成為國際標(biāo)準(zhǔn)擅笔,但是在這個模型發(fā)布之前因特網(wǎng)已經(jīng)大范圍的發(fā)布了志衣,當(dāng)時的因特網(wǎng)采用的TCP/IP協(xié)議模型,所以TCP/IP協(xié)議成為了使用范圍最廣的協(xié)議標(biāo)準(zhǔn)模型猛们,也在1984年成為美國的計算機(jī)網(wǎng)絡(luò)標(biāo)準(zhǔn)念脯,而OSI則就不了了之了。

好了弯淘,進(jìn)入正題绿店,先用一個簡單的數(shù)據(jù)請求流程圖來了解一下TCP/IP協(xié)議模型:
請求業(yè)務(wù)流程

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

我們都聽說過TCP/IP協(xié)議是分層的浆竭,如果把分層的概念用到我們的圖上的話浸须,就是下圖所示:
加入分層模型的請求業(yè)務(wù)流程圖
可以看到使用TCP/IP協(xié)議對我們的業(yè)務(wù)進(jìn)行劃分,可以分出來四層邦泄,分別是:應(yīng)用層删窒、傳輸層、網(wǎng)絡(luò)層顺囊、鏈路層肌索。(很多人對于分層的命名會有不同,但是每層的功能和含義是一樣的)
互聯(lián)網(wǎng)中信息以數(shù)據(jù)包的單位傳輸特碳,不同的協(xié)議層對數(shù)據(jù)包有不同的稱謂诚亚,在傳輸層叫做段 (segment),在網(wǎng)絡(luò)層叫做數(shù)據(jù)報 (datagram)测萎,在鏈路層叫做幀 (frame)亡电。

還有一個圖可以對整個流程進(jìn)行比較清晰的概括:
網(wǎng)絡(luò)收藏圖

一共四層,可以看到在每一層都會添加或者剝離不同的頭部進(jìn)行數(shù)據(jù)的發(fā)送和解析硅瞧,再來一張百度大大清晰的數(shù)據(jù)結(jié)構(gòu)層面的流程圖:
來源百度
在每一層都會封裝進(jìn)去這一層的首部信息份乒,最終封裝完成的數(shù)據(jù)以幀的形式在外部網(wǎng)絡(luò)通過網(wǎng)線、無線網(wǎng)等方式進(jìn)行傳輸腕唧,最終接受方會一層層剝離信息拿到原始的數(shù)據(jù)給程序使用或辖。

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

百度分層模型

相信通過以上的幾個圖片大家對于網(wǎng)絡(luò)分層的概念和每一層進(jìn)行的操作已經(jīng)很清楚了但惶,先簡單說一下每層大概的作用吧(以接收數(shù)據(jù)的路線來看)耳鸯,對整體流程有個大概的認(rèn)識湿蛔,后面會對每一層的功能和作用以及涉及到的相關(guā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ù)傳遞給對應(yīng)的主機(jī)
傳輸層:
傳輸層負(fù)責(zé)接收來自網(wǎng)絡(luò)層的數(shù)據(jù)阳啥,然后根據(jù)端口號將數(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%,請合理安排耐心閱讀)

鏈路層

鏈路層的作用是接受上一層傳過來的數(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,常用的則是點對點協(xié)議(PPP)以及幀中繼等協(xié)議叠殷。
其中最出名的是以太網(wǎng)協(xié)議改鲫,以太網(wǎng)協(xié)議通過網(wǎng)卡來進(jìn)行數(shù)據(jù)通信。每個網(wǎng)卡都有自己的獨特的一個地址林束,就是MAC地址像棘。以太網(wǎng)數(shù)據(jù)以幀為單位,包括標(biāo)頭和數(shù)據(jù)部分壶冒。以太網(wǎng)在子網(wǎng)內(nèi)通過廣播的形式發(fā)送數(shù)據(jù)缕题,如果兩臺設(shè)備在同一個子網(wǎng)里的話可以正常進(jìn)行數(shù)據(jù)通信,但是如果這兩臺設(shè)備不在一個子網(wǎng)里的話就無法進(jìn)行數(shù)據(jù)傳輸了胖腾,以太網(wǎng)協(xié)議就無法進(jìn)行數(shù)據(jù)通信了烟零。這就需要通過網(wǎng)絡(luò)層來區(qū)分每臺設(shè)備所在的網(wǎng)絡(luò)是哪個子網(wǎng),如果在同一個子網(wǎng)就通過廣播發(fā)送數(shù)據(jù)咸作,不在同一個子網(wǎng)就通過路由發(fā)送數(shù)據(jù)锨阿。這就導(dǎo)致了網(wǎng)絡(luò)層的產(chǎn)生。(每個子網(wǎng)有自己的IP地址记罚,可以通過IP地址進(jìn)行查找和區(qū)分)

說一個子網(wǎng)在生活中的例子:
比如機(jī)場系統(tǒng)是將IP地址的主機(jī)編碼分出一些位來挪用為子網(wǎng)編碼墅诡。
  我們可以在172.50.0.0地址中,將第3個字節(jié)挪用出來表示各個子網(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分配給長沙機(jī)務(wù)段作為長沙機(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)缺脉。

再舉一個子網(wǎng)的例子:
我們自己可以通過公司內(nèi)和自己連接在一個無線網(wǎng)下的同事查詢對比公網(wǎng)IP痪欲,會發(fā)現(xiàn)同處于一個無線網(wǎng)下的機(jī)器通過百度查詢IP地址的時候(直接在百度輸入IP搜索),查詢的結(jié)果為路由器連接的公網(wǎng)IP地址攻礼,會查詢出同樣的結(jié)果业踢,因為我們都處于路由器的子網(wǎng)之下。但是每臺機(jī)器都會有一個路由器分配的本機(jī)IP地址礁扮,用來進(jìn)行數(shù)據(jù)發(fā)送和接收知举,這個就是同一個子網(wǎng)下的不同機(jī)器分配了不同的子網(wǎng)Ip地址。

擴(kuò)展一點以太網(wǎng)幀的傳播:
交換機(jī)的工作原理:交換機(jī)從某一節(jié)點收到一個以太網(wǎng)幀后太伊,便在其內(nèi)存中地址表進(jìn)行查找(MAC地址)雇锡,如果有就將數(shù)據(jù)傳輸?shù)皆摰刂罚绻麤]有就將該數(shù)據(jù)包廣播到所有節(jié)點僚焦,與此匹配的MAC地址收到后就會做出應(yīng)答锰提,最后交換機(jī)就可以將這個地址保存到MAC地址表。(基于IPv4協(xié)議芳悲,在IPv4中廣泛的使用單播立肘、廣播、組播的方式名扛。而在IPv6的應(yīng)用環(huán)境中谅年,使用單播,組播肮韧、任意播的新方式融蹂,放棄廣播的使用,在IPv6的環(huán)境中不再有廣播的存在惹苗。)

網(wǎng)絡(luò)層

網(wǎng)絡(luò)層的作用是:網(wǎng)絡(luò)層的主要作用就是確定每個數(shù)據(jù)包的發(fā)送路線殿较,就是建立發(fā)送端主機(jī)和接收端主機(jī)之間的連接路徑以及進(jìn)行IP報傳遞(尋址、選擇數(shù)據(jù)包理由桩蓉、數(shù)據(jù)發(fā)送及是否進(jìn)行切片分段發(fā)送)淋纲。兩臺主機(jī)可以在同一個網(wǎng)絡(luò)也可能在不同的外部網(wǎng)絡(luò),因此需要先區(qū)分主機(jī)是不是在同一個子網(wǎng)院究。兩臺主機(jī)之間的數(shù)據(jù)傳輸需要知道對方的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)路由器的時候會通過RARP協(xié)議將自己的MAC地址(主機(jī)的mac地址是跟自己的網(wǎng)卡一一對應(yīng)的菩颖,廠家出廠的時候就確定了)遞交上去,獲取到局域網(wǎng)路由器給自己分配的一個子網(wǎng)IP为障,在這個過程中目標(biāo)主機(jī)的MAC地址被記錄在了局域網(wǎng)路由器的映射表里晦闰。至于什么是ARP協(xié)議和為什么需要使用IP和MAC地址進(jìn)行通信下面會詳細(xì)講解。

這一層常見協(xié)議:IP(Internet Protocol)鳍怨、ICMP呻右、ARP(Address Resolution Protocol)、RARP(Reverse ARP)鞋喇。
IP是網(wǎng)絡(luò)層的核心声滥,通過路由選擇將下一條IP封裝后交給鏈路層。ICMP是網(wǎng)絡(luò)層的補(bǔ)充侦香,可以回送報文落塑,用來檢測網(wǎng)絡(luò)是否暢通。
IP協(xié)議有一個生存時間(TTL)罐韩,TTL值被發(fā)送端設(shè)置憾赁,一般設(shè)置為64,這個值的含義是該次IP數(shù)據(jù)報傳遞允許經(jīng)過的路由器跳數(shù)伴逸,數(shù)據(jù)報每次經(jīng)過一個路由器這個值就減1缠沈,當(dāng)TTL的值為0的時候,路由器就會將這個數(shù)據(jù)報丟棄并且向源端發(fā)送一個ICMP差錯報文错蝴。

引用 一文看懂互聯(lián)網(wǎng)TCP/IP協(xié)議 | 小明學(xué)習(xí)筆記 來舉例:
IP 地址是門牌號洲愤,而 IP 協(xié)議負(fù)責(zé)計算并找到指定門牌,快遞小哥每天出門前要做的事就是 IP 協(xié)議的天職:分揀包裹顷锰、規(guī)劃路徑柬赐。其實,三五個節(jié)點的小型網(wǎng)絡(luò)內(nèi)部通信完全不必使用 IP 協(xié)議官紫,因為這些節(jié)點之間本來就能兩兩互通肛宋,但會有個問題:節(jié)點數(shù)變多后,網(wǎng)速就會癱瘓束世,因為帶寬耗盡酝陈。(帶寬指固定時間內(nèi)能傳遞的數(shù)據(jù)包,有點像馬路寬度毁涉。)
因此沉帮,后來一片網(wǎng)絡(luò)拆分成很多子網(wǎng)絡(luò)(sub networks),每片子網(wǎng)絡(luò)交給一臺路由器統(tǒng)管。子網(wǎng)絡(luò)中的節(jié)點間可以單獨通信穆壕,不需要 IP 協(xié)議待牵,但由于帶寬限制,如果你想和本網(wǎng)絡(luò)外的節(jié)點溝通時喇勋,就得使用一個設(shè)備:路由器缨该。世界上大多數(shù)的路由器被幾家大運營商掌管。

路由子網(wǎng)圖
如上圖川背,節(jié)點 1 和 2 同屬一個子網(wǎng)贰拿,可基于內(nèi)部通信協(xié)議溝通,而 1 和 5 間的聯(lián)絡(luò)必須基于 IP 協(xié)議渗常,通過路由器 1 和 2 之間的路徑交流壮不。
把 IP 協(xié)議的邏輯推廣到整個互聯(lián)網(wǎng),最終皱碘,連接我們手機(jī)客戶端和騰訊服務(wù)器的是無數(shù)個路由器。
網(wǎng)絡(luò)圖

把大網(wǎng)絡(luò)切小的好處顯而易見:節(jié)約帶寬隐孽、抬高網(wǎng)速癌椿,同時一只路由器掛了不影響其他節(jié)點間的通信,這就是 IP 協(xié)議的作用菱阵。

IP協(xié)議提供非可靠踢俄,無連接的數(shù)據(jù)報傳輸服務(wù),主要用于主機(jī)之間的尋址和選擇數(shù)據(jù)包路由晴及。
非可靠:這意味著它并不保證所要傳輸?shù)臄?shù)據(jù)一定會到達(dá)目的地都办。(當(dāng)路由出錯導(dǎo)致某個數(shù)據(jù)傳輸失敗時,會丟掉此數(shù)據(jù)并發(fā)回一個ICMP信息回去虑稼×斩ぃ可靠性需要由更上層的協(xié)議提供,如TCP協(xié)議)蛛倦。
無連接:這代表 IP datagram(數(shù)據(jù)報)在傳輸中沒有連接起來歌懒,他們是一塊一塊各自分開的,分開獨立處理溯壶。(比如需要向某個地方發(fā)送兩個數(shù)據(jù)報A及皂、B,他們兩個有可能會經(jīng)由不同的路徑去到達(dá)目的地且改,有可能B要比A先到達(dá))验烧。

還有一些協(xié)助IP工作的協(xié)議,比如ARP和RARP又跛,保證數(shù)據(jù)的傳遞除了需要IP地址還需要MAC地址碍拆,MAC地址又稱物理地址,跟網(wǎng)卡一一對應(yīng),由生產(chǎn)廠家來確定倔监,對于一臺主機(jī)來說是唯一且不可變的直砂,IP地址根據(jù)網(wǎng)絡(luò)的不同是可變的。

上面兩個協(xié)議簡單來說就是:用IP地址找MAC地址(ARP)浩习;用MAC地址找IP地址(RARP)

“ARP(地址解析協(xié)議)基本功能就是通過目標(biāo)設(shè)備的 IP 地址静暂,查詢目標(biāo)設(shè)備的 MAC 地址,以保證通信的順利進(jìn)行谱秽。以太網(wǎng)中的數(shù)據(jù)幀從一個主機(jī)到達(dá)網(wǎng)內(nèi)的另一臺主機(jī)是根據(jù)48位的以太網(wǎng)地址(硬件地址)來確定接口的洽蛀,而不是根據(jù) 32 位的 IP 地址。內(nèi)核必須知道目的端的硬件地址才能發(fā)送數(shù)據(jù)疟赊。P2P 的連接是不需要 ARP 的郊供。 (通過網(wǎng)關(guān)服務(wù)器查詢對應(yīng)的MAC地址)

擴(kuò)展:
地址解析協(xié)議,即ARP(Address Resolution Protocol)近哟,是根據(jù)IP地址獲取物理地址的一個TCP/IP協(xié)議驮审。主機(jī)發(fā)送信息時將包含目標(biāo)IP地址的ARP請求廣播到網(wǎng)絡(luò)上的所有主機(jī),并接收返回消息吉执,以此確定目標(biāo)的物理地址疯淫;收到返回消息后將該IP地址和物理地址存入本機(jī)ARP緩存中并保留一定時間,下次請求時直接查詢ARP緩存以節(jié)約資源戳玫。地址解析協(xié)議是建立在網(wǎng)絡(luò)中各個主機(jī)互相信任的基礎(chǔ)上的熙掺,網(wǎng)絡(luò)上的主機(jī)可以自主發(fā)送ARP應(yīng)答消息,其他主機(jī)收到應(yīng)答報文時不會檢測該報文的真實性就會將其記入本機(jī)ARP緩存咕宿;由此攻擊者就可以向某一主機(jī)發(fā)送偽ARP應(yīng)答報文币绩,使其發(fā)送的信息無法到達(dá)預(yù)期的主機(jī)或到達(dá)錯誤的主機(jī),這就構(gòu)成了一個ARP欺騙府阀。ARP命令可用于查詢本機(jī)ARP緩存中IP地址和MAC地址的對應(yīng)關(guān)系缆镣、添加或刪除靜態(tài)對應(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 表或者緩存上請求其 IP 地址川队。局域網(wǎng)網(wǎng)關(guān)路由器中存有一個表以映射 MAC 和與其對應(yīng)的 IP 地址力细。當(dāng)設(shè)置一臺新的機(jī)器時,其 RARP 客戶機(jī)程序需要向路由器上的 RARP 服務(wù)器請求相應(yīng)的 IP 地址固额。假設(shè)在路由表中已經(jīng)設(shè)置了一個記錄眠蚂,RARP 服務(wù)器將會返回 IP 地址給機(jī)器《孵铮”

既然通信的最終結(jié)果都是通過MAC地址進(jìn)行通信逝慧,為什么不直接使用MAC地址來進(jìn)行通信呢?
最早這個世界上的電腦沒這么多的時候,是沒有路由這個東西存在的笛臣,主機(jī)都在一張網(wǎng)里云稚,所以確實是直接通過 mac 地址通信的。最初的鏈路層協(xié)議是和 ip 地址無關(guān)的沈堡,沒有網(wǎng)絡(luò)層方面的設(shè)定静陈,只有物理層和鏈路層,最初也只有集線器诞丽,沒有交換機(jī)路由器鲸拥,服務(wù)器之間傳輸數(shù)據(jù)全靠 mac 地址。在沒有 ip 地址之前僧免,mac 地址已經(jīng)在使用了⌒谈希現(xiàn)在到處都在用的二層交換機(jī),就是根據(jù) mac 地址轉(zhuǎn)發(fā)數(shù)據(jù)懂衩。mac 地址的設(shè)計不攜帶設(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)卡不代表在同一個網(wǎng)絡(luò)著觉。

引用大佬舉的一個清晰明了的例子:
MAC 地址就像電腦的個人身份證,IP 地址就像電腦所在的屋子惊暴,屋子里可以住著很多人饼丘,局域網(wǎng)關(guān)路由就像登記人口的街道辦公室。

IP協(xié)議以及IPv4和IPv6的學(xué)習(xí)傳送至我的這篇文章 IP協(xié)議詳解及IPv4與IPv6協(xié)議的區(qū)別和使用過渡方案

傳輸層

傳輸層的作用是主機(jī)將接收到的數(shù)據(jù)發(fā)送給對應(yīng)的程序辽话,它建立端口到端口的鏈接(這個端口并不是說的主機(jī)的硬件端口肄鸽,而是軟件端口)。剛才說的網(wǎng)絡(luò)層建立主機(jī)到主機(jī)的連接油啤,只要有主機(jī)和端口典徘,就能確定數(shù)據(jù)包是屬于哪個程序的,同時他也負(fù)責(zé)接收應(yīng)用層的數(shù)據(jù)益咬,然后把他們分成更小的單元(標(biāo)頭和數(shù)據(jù)部分在網(wǎng)絡(luò)層的數(shù)據(jù)部分)傳輸?shù)骄W(wǎng)絡(luò)層逮诲。每個程序都會監(jiān)聽一個端口,接收來自這個端口的數(shù)據(jù),所以傳輸層是建立端口到端口的鏈接梅鹦。

傳輸層負(fù)責(zé)為我們的請求添加TCP頭部裆甩,TCP我們用到的主要有兩個協(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ù)分割成以報文段(segment)為單位的數(shù)據(jù)包進(jìn)行管理傳輸媒殉,它把數(shù)據(jù)切成一個個數(shù)據(jù)包担敌,從第一只數(shù)據(jù)包開始傳,傳送成功就翻倍廷蓉,發(fā)現(xiàn)失敗就從失敗那只數(shù)據(jù)包重新開始全封,一直到傳輸完成。

延伸閱讀--為什么要有端口:
“ip 能鎖定一臺物理機(jī)器桃犬,對應(yīng)著一張網(wǎng)卡刹悴,外界發(fā)來的數(shù)據(jù)包網(wǎng)卡都會接收。但是問題來了攒暇,網(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......奸笤,不行了惋啃,每個包都被發(fā)到了所有應(yīng)用程序,每個應(yīng)用程序都累得不行揭保,最終垮了肥橙。
好,那網(wǎng)卡說我給你們加個表示吧秸侣,我們之間可以用一個號碼來作為標(biāo)識存筏,我和小 A 之間就用 1 來標(biāo)識宠互,如果外界發(fā)給 1 號標(biāo)識的數(shù)據(jù)我就轉(zhuǎn)發(fā)給你,你監(jiān)聽我的時候得告訴我你監(jiān)聽的時 1椭坚,我就轉(zhuǎn)發(fā) 1 的數(shù)據(jù)包給你予跌。好了其他的 BCD... 都自己弄一個標(biāo)識號,只要不重復(fù)就行善茎。這樣大家都省事了券册。
最后涉及到安全,一個標(biāo)識號只能被一個應(yīng)用程序監(jiān)聽垂涯,因為如果小 A 程序和小 B 同時監(jiān)聽一個標(biāo)識號烁焙,那就壞了,我傳的數(shù)據(jù)都被 AB 接到耕赘,這樣數(shù)據(jù)安全性就沒辦法保證了骄蝇。”
參考《為什么要有端口操骡,怎么來規(guī)劃端口九火,看下邊〔嵴校》

TCP的三次握手與四次揮手

三次握手(開始連接):
第一次握手:客戶端發(fā)送 syn 包 (syn=j) 到服務(wù)器岔激,并進(jìn)入 SYN_SEND 狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到 syn 包是掰,必須確認(rèn)客戶的 SYN(ack=j+1)虑鼎,同時自己也發(fā)送一個 SYN 包(syn=k),即 SYN+ACK 包键痛,此時服務(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 連接一旦建立胁勺,在通信雙方中的任何一方主動關(guān)閉連接之前,TCP 連接都將被一直保持下去独旷。
斷開連接時服務(wù)器和客戶端均可以主動發(fā)起斷開 TCP 連接的請求署穗,斷開過程需要經(jīng)過“四次握手”寥裂。

來一張圖:
三次握手引用圖

四次揮手(關(guān)閉連接):
第一次: 當(dāng)主機(jī)A完成數(shù)據(jù)傳輸后,將控制位FIN置1,提出停止TCP連接的請求 案疲;
第二次: 主機(jī)B收到FIN后對其作出響應(yīng)封恰,確認(rèn)這一方向上的TCP連接將關(guān)閉,將ACK置1;
第三次: 由B 端再提出反方向的關(guān)閉請求,將FIN置1 褐啡;
第四次: 主機(jī)A對主機(jī)B的請求進(jìn)行確認(rèn)诺舔,將ACK置1,雙方向的關(guān)閉結(jié)束.备畦。

由TCP的三次握手和四次斷開可以看出低飒,TCP使用面向連接的通信方式, 大大提高了數(shù)據(jù)通信的可靠性懂盐,使發(fā)送數(shù)據(jù)端和接收端在數(shù)據(jù)正式傳輸前就有了交互褥赊, 為數(shù)據(jù)正式傳輸打下了可靠的基礎(chǔ)。

名詞解釋
1允粤、ACK 是TCP報頭的控制位之一崭倘,對數(shù)據(jù)進(jìn)行確認(rèn)。確認(rèn)由目的端發(fā)出类垫, 用它來告訴發(fā)送端這個序列號之前的數(shù)據(jù)段都收到了司光。 比如確認(rèn)號為X,則表示前X-1個數(shù)據(jù)段都收到了悉患,只有當(dāng)ACK=1時,確認(rèn)號才有效残家,當(dāng)ACK=0時,確認(rèn)號無效售躁,這時會要求重傳數(shù)據(jù)坞淮,保證數(shù)據(jù)的完整性。
2陪捷、SYN 同步序列號回窘,TCP建立連接時將這個位置1。
3市袖、FIN 發(fā)送端完成發(fā)送任務(wù)位啡直,當(dāng)TCP完成數(shù)據(jù)傳輸需要斷開時,,提出斷開連接的一方將這位置1苍碟。

至于 UDP 協(xié)議酒觅,傳送數(shù)據(jù)前并不與對方建立連接,對接收到的數(shù)據(jù)也不發(fā)送確認(rèn)信號微峰,發(fā)送端不知道數(shù)據(jù)是否會正確接收舷丹,當(dāng)然也不用重發(fā),所以說 UDP 是無連接的蜓肆、不可靠的一種數(shù)據(jù)傳輸協(xié)議颜凯。具體據(jù)知乎用戶陳寶佳的帖子谋币,UDP 傳輸?shù)男畔钚≈挥?8 個字節(jié),TCP 則是 20 個字節(jié)装获。這樣的好處是瑞信,UDP 對系統(tǒng)資源要求更低,開銷更小穴豫,數(shù)據(jù)傳輸速率更高凡简,因為不必進(jìn)行收發(fā)數(shù)據(jù)的確認(rèn),所以 UDP 的實時性更好精肃。他還表示 MSN 采用 TCP 傳輸協(xié)議傳文件秤涩,QQ 傳輸文件采用 UDP,所以后者更快司抱。

網(wǎng)絡(luò)圖

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

網(wǎng)絡(luò)引用圖惜纸,這兩張圖清晰的解釋特別好

TCP協(xié)議及UDP協(xié)議的學(xué)習(xí)傳送至我的這兩篇文章:
TCP協(xié)議詳解及實戰(zhàn)解析【精心整理收藏】
UDP協(xié)議詳解

應(yīng)用層

應(yīng)用層就是我們最經(jīng)常接觸的地方面氓,也是比較簡單的一層卡辰。這一層的主要作用就是將我們的數(shù)據(jù)根據(jù)我們使用的協(xié)議打包或者按照協(xié)議解析從傳輸層過來的各種類型的數(shù)據(jù)數(shù)據(jù),主要協(xié)議有:HTTP拱绑、FTP综芥、SMTP、Telnet猎拨、NFS毫痕、RIP 等等。比如我們開發(fā)中用到較多的http請求進(jìn)行數(shù)據(jù)包裝迟几、發(fā)郵件用到的SMTP、文件傳輸用到的FTP協(xié)議等栏笆,都是在這一層進(jìn)行封裝的类腮,封裝完后傳入傳輸層開始數(shù)據(jù)的傳遞。

HTTP協(xié)議的學(xué)習(xí)傳送至我的這篇文章 HTTP協(xié)議詳解(精心整理)

補(bǔ)充:
最底層的以太網(wǎng)協(xié)議(Ethernet)規(guī)定了電子信號如何組成數(shù)據(jù)包(packet)蛉加,解決了子網(wǎng)內(nèi)部的點對點通信蚜枢。但是缸逃,以太網(wǎng)協(xié)議不能解決多個局域網(wǎng)如何互通,這由 IP 協(xié)議解決厂抽。IP 協(xié)議定義了一套自己的地址規(guī)則需频,稱為 IP 地址。它實現(xiàn)了路由功能筷凤,允許某個局域網(wǎng)的 A 主機(jī)昭殉,向另一個局域網(wǎng)的 B 主機(jī)發(fā)送消息。
所以IP協(xié)議解決了局域網(wǎng)的查找問題藐守,以太網(wǎng)協(xié)議解決了局域網(wǎng)內(nèi)主機(jī)查找問題挪丢,TCP協(xié)議解決了主機(jī)直接的端口號通信問題,應(yīng)用層的HTTP等協(xié)議解決了數(shù)據(jù)打包及解析問題卢厂。


以太網(wǎng)協(xié)議解決子網(wǎng)內(nèi)部主機(jī)查找

IP協(xié)議解決局域網(wǎng)之間的查找

結(jié)語:
以上就是對TCP/IP協(xié)議講解的全部內(nèi)容了乾蓬,后面會繼續(xù)更新TCP協(xié)議和UDP協(xié)議的相關(guān)內(nèi)容。
本篇文章很多內(nèi)容參閱了前輩的文章慎恒,甚至有些地方感覺寫的實在精彩是直接拷貝過來的任内,感謝留下墨寶的前輩大佬。

相關(guān)閱讀請移步:
一文看懂互聯(lián)網(wǎng)TCP/IP協(xié)議 | 小明學(xué)習(xí)筆記
一分鐘了解 TCP/IP 模型
TCP和UDP的區(qū)別
計算機(jī)網(wǎng)絡(luò)結(jié)構(gòu)模型TCP/IP詳解
TCP的三次握手與四次揮手理解及面試題(很全面)
TCP/IP協(xié)議(百度百科)
TCP 協(xié)議簡介

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末融柬,一起剝皮案震驚了整個濱河市死嗦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丹鸿,老刑警劉巖越走,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異靠欢,居然都是意外死亡廊敌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門门怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骡澈,“玉大人,你說我怎么就攤上這事掷空±吲梗” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵坦弟,是天一觀的道長护锤。 經(jīng)常有香客問我,道長酿傍,這世上最難降的妖魔是什么烙懦? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赤炒,結(jié)果婚禮上氯析,老公的妹妹穿的比我還像新娘亏较。我一直安慰自己,他們只是感情好掩缓,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布雪情。 她就那樣靜靜地躺著,像睡著了一般你辣。 火紅的嫁衣襯著肌膚如雪巡通。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天绢记,我揣著相機(jī)與錄音扁达,去河邊找鬼。 笑死蠢熄,一個胖子當(dāng)著我的面吹牛跪解,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播签孔,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼叉讥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饥追?” 一聲冷哼從身側(cè)響起图仓,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎但绕,沒想到半個月后救崔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡捏顺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年六孵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幅骄。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡劫窒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拆座,到底是詐尸還是另有隱情主巍,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布挪凑,位于F島的核電站孕索,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏躏碳。R本人自食惡果不足惜檬果,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧选脊,春花似錦、人聲如沸脸甘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丹诀。三九已至钝的,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铆遭,已是汗流浹背硝桩。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留枚荣,地道東北人碗脊。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像橄妆,于是被迫代替她去往敵國和親衙伶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348