OSI與TCP/IP各層的結(jié)構(gòu)與功能,都有哪些協(xié)議
五層協(xié)議的體系結(jié)構(gòu)
學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)時(shí)盼樟,我們一般采用折中的辦法,中和 OSI 和 TCP/IP 的優(yōu)點(diǎn),采用一種只有五層協(xié)議的體系結(jié)構(gòu)殖氏,這樣既簡(jiǎn)潔又能將概念闡述清楚。接下來(lái)結(jié)合互聯(lián)網(wǎng)的情況姻采,自上而下雅采,簡(jiǎn)要地介紹一下各層的作用。
1慨亲、應(yīng)用層
應(yīng)用層(application-layer)的任務(wù)是通過(guò)應(yīng)用進(jìn)程間的交互來(lái)完成特定網(wǎng)絡(luò)應(yīng)用婚瓜,應(yīng)用層協(xié)議定義的是應(yīng)用進(jìn)程間的通信和交互的規(guī)則。對(duì)于不同的網(wǎng)絡(luò)應(yīng)用需要不同的應(yīng)用層協(xié)議刑棵,在互聯(lián)網(wǎng)中應(yīng)用層協(xié)議很多巴刻,如域名系統(tǒng)DNS,支持萬(wàn)維網(wǎng)應(yīng)用的 HTTP協(xié)議蛉签,支持電子郵件的 SMTP協(xié)議等等冈涧。我們把應(yīng)用層交互的數(shù)據(jù)單元稱為報(bào)文。
域名系統(tǒng)(Domain Name System)
域名系統(tǒng)是因特網(wǎng)的一項(xiàng)核心服務(wù)正蛙,它作為將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù)督弓,能夠更方便地訪問(wèn)互聯(lián)網(wǎng),而不用去記住被機(jī)器直接讀取的IP數(shù)串乒验。例如愚隧,一個(gè)公司的 Web 網(wǎng)站可看作是它在網(wǎng)上的門(mén)戶,而域名就相當(dāng)于其門(mén)牌地址,通常域名都使用該公司的名稱或簡(jiǎn)稱狂塘。上面提到的微軟公司的域名录煤,類(lèi)似的還有:IBM 公司的域名是 www.ibm.com、Oracle 公司的域名是 www.oracle.com荞胡、Cisco公司的域名是 www.cisco.com 等妈踊。
HTTP協(xié)議
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議泪漂。所有的WWW(萬(wàn)維網(wǎng)) 文件都必須遵守這個(gè)標(biāo)準(zhǔn)廊营,設(shè)計(jì) HTTP 最初是為了提供一種發(fā)布和接收 HTML 頁(yè)面的方法。
2萝勤、運(yùn)輸層
運(yùn)輸層(transport layer)的主要任務(wù)是負(fù)責(zé)向兩臺(tái)主機(jī)進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù)露筒。應(yīng)用進(jìn)程利用該服務(wù)傳送應(yīng)用層報(bào)文,“通用的”是指并不針對(duì)某一個(gè)特定的網(wǎng)絡(luò)應(yīng)用敌卓,而是多種應(yīng)用可以使用同一個(gè)運(yùn)輸層服務(wù)慎式,由于一臺(tái)主機(jī)可同時(shí)運(yùn)行多個(gè)線程,因此運(yùn)輸層有復(fù)用和分用的功能趟径;所謂復(fù)用就是指多個(gè)應(yīng)用層進(jìn)程可同時(shí)使用下面運(yùn)輸層的服務(wù)瘪吏,分用和復(fù)用相反,是運(yùn)輸層把收到的信息分別交付上面應(yīng)用層中的相應(yīng)進(jìn)程蜗巧。
運(yùn)輸層主要使用以下兩種協(xié)議:
1掌眠、傳輸控制協(xié)議 TCP--提供面向連接的,可靠的數(shù)據(jù)傳輸服務(wù)惧蛹。
2扇救、用戶數(shù)據(jù)協(xié)議 UDP--提供無(wú)連接的,盡最大努力的數(shù)據(jù)傳輸服務(wù)香嗓。
UDP 的主要特點(diǎn):
UDP 是無(wú)連接的迅腔;
UDP 盡最大努力交付,即不保證可靠交付靠娱,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)沧烈;
UDP 是面向報(bào)文的;
UDP 沒(méi)有擁塞控制像云,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使主機(jī)的發(fā)送速率降低锌雀;
UDP 支持一對(duì)一、一對(duì)多迅诬、多對(duì)一和多對(duì)多的交互通信腋逆;
UDP 的首部開(kāi)銷(xiāo)小,只有8個(gè)字節(jié)侈贷,比TCP的20個(gè)字節(jié)的首部要短惩歉。
TCP 的主要特點(diǎn):
TCP 是面向連接的(就像打電話一樣,通話前需要先撥號(hào)建立連接,通話結(jié)束后要掛機(jī)釋放連接)撑蚌;
每一條 TCP 連接只能有兩個(gè)端點(diǎn)上遥,每一條TCP連接只能是點(diǎn)對(duì)點(diǎn)的(一對(duì)一);
TCP 提供可靠交付的服務(wù)争涌,通過(guò)TCP連接傳送的數(shù)據(jù)粉楚,無(wú)差錯(cuò)、不丟失亮垫、不重復(fù)模软、并且按序到達(dá);
TCP 提供全雙工通信包警, 允許通信雙方的應(yīng)用進(jìn)程在任何時(shí)候都能發(fā)送數(shù)據(jù)撵摆。TCP 連接的兩端都設(shè)有發(fā)送緩存和接收緩存底靠,用來(lái)臨時(shí)存放雙方通信的數(shù)據(jù)害晦;
面向字節(jié)流。TCP 中的“流”指流入進(jìn)程或從進(jìn)程流出的字節(jié)序列暑中;“面向字節(jié)流”的含義是:雖然應(yīng)用程序和 TCP 的交互是一次一個(gè)數(shù)據(jù)塊壹瘟,但 TCP 把應(yīng)用程序交下來(lái)的數(shù)據(jù)僅僅看成是一連串的無(wú)結(jié)構(gòu)的字節(jié)流。
3鳄逾、網(wǎng)絡(luò)層
網(wǎng)絡(luò)層(network layer)負(fù)責(zé)為分組交換網(wǎng)上的不同主機(jī)提供通信服務(wù)稻轨。在發(fā)送數(shù)據(jù)時(shí),網(wǎng)絡(luò)層把運(yùn)輸層產(chǎn)生的報(bào)文段或用戶數(shù)據(jù)報(bào)封裝成分組和包進(jìn)行傳送雕凹。在 TCP/IP 體系結(jié)構(gòu)中殴俱,由于網(wǎng)絡(luò)層使用 IP 協(xié)議,因此分組也叫 IP 數(shù)據(jù)報(bào)枚抵,簡(jiǎn)稱數(shù)據(jù)報(bào)线欲。
注意:不要把運(yùn)輸層的“用戶數(shù)據(jù)報(bào) UDP ”和網(wǎng)絡(luò)層的“ IP 數(shù)據(jù)報(bào)”弄混,另外汽摹,無(wú)論是哪一層的數(shù)據(jù)單元李丰,都可籠統(tǒng)地用“分組”來(lái)表示。網(wǎng)絡(luò)層的另一個(gè)任務(wù)就是選擇合適的路由逼泣,使源主機(jī)運(yùn)輸層所傳下來(lái)的分株趴泌,能通過(guò)網(wǎng)絡(luò)層中的路由器找到目的主機(jī)。
強(qiáng)調(diào):網(wǎng)絡(luò)層中的“網(wǎng)絡(luò)”二字已經(jīng)不是我們通常談到的具體網(wǎng)絡(luò)拉庶,而是指計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)模型中第三層的名稱嗜憔。互聯(lián)網(wǎng)是由大量的異構(gòu)網(wǎng)絡(luò)通過(guò)路由器相互連接起來(lái)的氏仗,互聯(lián)網(wǎng)使用的網(wǎng)絡(luò)層協(xié)議是無(wú)連接的網(wǎng)際協(xié)議和許多路由選擇協(xié)議吉捶,因此互聯(lián)網(wǎng)的網(wǎng)絡(luò)層也叫做網(wǎng)際層或IP層。
4、數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層(data link layer)通常簡(jiǎn)稱為鏈路層帚稠。兩臺(tái)主機(jī)之間的數(shù)據(jù)傳輸谣旁,總是在一段一段的鏈路上傳送的,這就需要使用專(zhuān)門(mén)的鏈路層的協(xié)議滋早。 在兩個(gè)相鄰節(jié)點(diǎn)之間傳送數(shù)據(jù)時(shí)榄审,數(shù)據(jù)鏈路層將網(wǎng)絡(luò)層交下來(lái)的 IP 數(shù)據(jù)報(bào)組裝程幀,在兩個(gè)相鄰節(jié)點(diǎn)間的鏈路上傳送幀杆麸,每一幀包括數(shù)據(jù)和必要的控制信息(如同步信息搁进,地址信息,差錯(cuò)控制等)昔头。
在接收數(shù)據(jù)時(shí)饼问,控制信息使接收端能夠知道一個(gè)幀從哪個(gè)比特開(kāi)始和到哪個(gè)比特結(jié)束。這樣揭斧,數(shù)據(jù)鏈路層在收到一個(gè)幀后莱革,就可從中提出數(shù)據(jù)部分,上交給網(wǎng)絡(luò)層讹开≈咽樱控制信息還使接收端能夠檢測(cè)到所收到的幀中有誤差錯(cuò),如果發(fā)現(xiàn)差錯(cuò)旦万,數(shù)據(jù)鏈路層就簡(jiǎn)單地丟棄這個(gè)出了差錯(cuò)幀闹击,以避免繼續(xù)在網(wǎng)絡(luò)中傳送下去白白浪費(fèi)網(wǎng)絡(luò)資源;如果需要改正數(shù)據(jù)在鏈路層傳輸時(shí)出現(xiàn)差錯(cuò)(數(shù)據(jù)鏈路層不僅要檢錯(cuò)成艘,而且還要糾錯(cuò))赏半,那么就要采用可靠性傳輸協(xié)議來(lái)糾正出現(xiàn)的差錯(cuò),這種方法會(huì)使鏈路層的協(xié)議復(fù)雜些淆两。
5断箫、物理層(physical layer)
在物理層上所傳送的數(shù)據(jù)單位是比特。物理層的作用是實(shí)現(xiàn)相鄰計(jì)算機(jī)節(jié)點(diǎn)之間比特流的透明傳送琼腔,盡可能屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異瑰枫,使其上面的數(shù)據(jù)鏈路層不必考慮網(wǎng)絡(luò)的具體傳輸介質(zhì)是什么〉ち“透明傳送比特流”表示經(jīng)實(shí)際電路傳送后的比特流沒(méi)有發(fā)生變化光坝,對(duì)傳送的比特流來(lái)說(shuō),這個(gè)電路好像是看不見(jiàn)的甥材。
在互聯(lián)網(wǎng)使用的各種協(xié)中最重要和最著名的就是 TCP/IP 兩個(gè)協(xié)議盯另,現(xiàn)在人們經(jīng)常提到的TCP/IP并不一定單指TCP和IP這兩個(gè)具體的協(xié)議,而往往表示互聯(lián)網(wǎng)所使用的整個(gè)TCP/IP協(xié)議族洲赵。
以上我們對(duì)計(jì)算機(jī)網(wǎng)絡(luò)的五層體系結(jié)構(gòu)有了初步的了解鸳惯,下面附送一張七層體系結(jié)構(gòu)圖商蕴。
TCP 三次握手和四次揮手(面試常客)
為了準(zhǔn)確無(wú)誤地把數(shù)據(jù)送達(dá)目標(biāo)處芝发,TCP協(xié)議采用了三次握手策略绪商。
漫畫(huà)圖解:
簡(jiǎn)單示意圖:
客戶端–發(fā)送帶有 SYN 標(biāo)志的數(shù)據(jù)包–一次握手–服務(wù)端
服務(wù)端–發(fā)送帶有 SYN/ACK 標(biāo)志的數(shù)據(jù)包–二次握手–客戶端
客戶端–發(fā)送帶有帶有 ACK 標(biāo)志的數(shù)據(jù)包–三次握手–服務(wù)端
為什么要三次握手
三次握手的目的是建立可靠的通信信道,說(shuō)到通訊辅鲸,簡(jiǎn)單來(lái)說(shuō)就是數(shù)據(jù)的發(fā)送與接收格郁,而三次握手最主要的目的就是雙方確認(rèn)自己與對(duì)方的發(fā)送與接收是正常的。
第一次握手:Client 什么都不能確認(rèn)独悴;Server 確認(rèn)了對(duì)方發(fā)送正常
第二次握手:Client 確認(rèn)了:自己發(fā)送例书、接收正常,對(duì)方發(fā)送刻炒、接收正常决采;Server 確認(rèn)了:自己接收正常,對(duì)方發(fā)送正常
第三次握手:Client 確認(rèn)了:自己發(fā)送坟奥、接收正常树瞭,對(duì)方發(fā)送、接收正常筏勒;Server 確認(rèn)了:自己發(fā)送移迫、接收正常旺嬉,對(duì)方發(fā)送接收正常
所以三次握手就能確認(rèn)雙發(fā)收發(fā)功能都正常管行,缺一不可。
為什么要傳回 SYN
接收端傳回發(fā)送端所發(fā)送的 SYN 是為了告訴發(fā)送端邪媳,我接收到的信息確實(shí)就是你所發(fā)送的信號(hào)了捐顷。
傳了 SYN,為啥還要傳 ACK
雙方通信無(wú)誤必須是兩者互相發(fā)送信息都無(wú)誤,傳了 SYN雨效,證明發(fā)送方到接收方的通道沒(méi)有問(wèn)題迅涮,但是接收方到發(fā)送方的通道還需要 ACK 信號(hào)來(lái)進(jìn)行驗(yàn)證。
斷開(kāi)一個(gè) TCP 連接則需要“四次揮手”:
客戶端-發(fā)送一個(gè) FIN徽龟,用來(lái)關(guān)閉客戶端到服務(wù)器的數(shù)據(jù)傳送
服務(wù)器-收到這個(gè) FIN叮姑,它發(fā)回一 個(gè) ACK,確認(rèn)序號(hào)為收到的序號(hào)加1 据悔。和 SYN 一樣传透,一個(gè) FIN 將占用一個(gè)序號(hào)
服務(wù)器-關(guān)閉與客戶端的連接,發(fā)送一個(gè)FIN給客戶端
客戶端-發(fā)回 ACK 報(bào)文確認(rèn)极颓,并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1
為什么要四次揮手
任何一方都可以在數(shù)據(jù)傳送結(jié)束后發(fā)出連接釋放的通知朱盐,待對(duì)方確認(rèn)后進(jìn)入半關(guān)閉狀態(tài);當(dāng)另一方也沒(méi)有數(shù)據(jù)再發(fā)送的時(shí)候菠隆,則發(fā)出連接釋放通知兵琳,對(duì)方確認(rèn)后就完全關(guān)閉了TCP連接狂秘。
舉個(gè)例子:A 和 B 打電話,通話即將結(jié)束后躯肌,A 說(shuō)“我沒(méi)啥要說(shuō)的了”者春,B回答“我知道了”,但是 B 可能還會(huì)有要說(shuō)的話清女,A 不能要求 B 跟著自己的節(jié)奏結(jié)束通話碧查,于是 B 可能又巴拉巴拉說(shuō)了一通,最后 B 說(shuō)“我說(shuō)完了”校仑,A 回答“知道了”忠售,這樣通話才算結(jié)束。
TCP迄沫、UDP 協(xié)議的區(qū)別
UDP 在傳送數(shù)據(jù)之前不需要先建立連接稻扬,遠(yuǎn)地主機(jī)在收到 UDP 報(bào)文后,不需要給出任何確認(rèn)羊瘩。雖然 UDP 不提供可靠交付泰佳,但在某些情況下 UDP 確是一種最有效的工作方式,比如: QQ 語(yǔ)音尘吗、 QQ 視頻 逝她、直播等等
TCP 提供面向連接的服務(wù),在傳送數(shù)據(jù)之前必須先建立連接睬捶,數(shù)據(jù)傳送結(jié)束后要釋放連接黔宛,TCP 不提供廣播或多播服務(wù)。由于 TCP 要提供可靠的擒贸,面向連接的運(yùn)輸服務(wù)(TCP的可靠體現(xiàn)在TCP在傳遞數(shù)據(jù)之前臀晃,會(huì)有三次握手來(lái)建立連接,而且在數(shù)據(jù)傳遞時(shí)介劫,有確認(rèn)徽惋、窗口、重傳座韵、擁塞控制機(jī)制险绘,在數(shù)據(jù)傳完后,還會(huì)斷開(kāi)連接用來(lái)節(jié)約系統(tǒng)資源)誉碴,這一難以避免增加了許多開(kāi)銷(xiāo)宦棺,如確認(rèn),流量控制翔烁,計(jì)時(shí)器以及連接管理等渺氧。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多,還要占用許多處理機(jī)資源蹬屹。TCP 一般用于文件傳輸侣背、發(fā)送和接收郵件白华、遠(yuǎn)程登錄等場(chǎng)景。
如果對(duì)java微服務(wù)贩耐、分布式弧腥、高并發(fā)、高可用潮太、大型互聯(lián)網(wǎng)架構(gòu)技術(shù)管搪、面試經(jīng)驗(yàn)交流等等感興趣的同學(xué)削樊,可以關(guān)注我踩官,我會(huì)不定期免費(fèi)發(fā)放資料鏈接的诵,如果你有好的學(xué)習(xí)資料可以私聊發(fā)我煌茴,我會(huì)注明出處之后分享給大家。歡迎分享碘赖,歡迎評(píng)論天揖,歡迎轉(zhuǎn)發(fā)摸屠,需要資料的同學(xué)Java后端技術(shù)群:819940388景埃,或關(guān)注微信公眾號(hào):Java資訊庫(kù)媒至,回復(fù)“架構(gòu)”,免費(fèi)的大型互聯(lián)網(wǎng)Java技術(shù)視頻分享給大家谷徙。