OSI七层协议与TCP连接
概述
為了追求效率,我們寫代碼,不可能去關(guān)注底層知識(shí),但往往到出了問題,或者性能調(diào)優(yōu)。我們就會(huì)速手無策,仔細(xì)為自己查缺補(bǔ)漏,總結(jié)知識(shí)點(diǎn)。
網(wǎng)絡(luò)協(xié)議
互聯(lián)網(wǎng)的本質(zhì)就是一系列的網(wǎng)絡(luò)協(xié)議,讓不同計(jì)算機(jī)能夠互相通信。這個(gè)協(xié)議就叫做OSI協(xié)議,根據(jù)不同的功能和分工,人為劃分七層,當(dāng)然你也可以劃分五層,4層。實(shí)際上這些都是不存在的,只是為了讓人更好理解這些都是做什么用的。
物理層:網(wǎng)絡(luò)通信的數(shù)據(jù)傳輸介質(zhì),連接不同結(jié)點(diǎn)的電纜與設(shè)備構(gòu)成。這些都是專業(yè)的說法,其實(shí)說白了就是雙絞線(網(wǎng)線),光纜這些東西,當(dāng)然也包括無線電波。傳的是比特流,就是0101101。。。這些電信號(hào)。
數(shù)據(jù)鏈路層:物理地址尋址、數(shù)據(jù)的成幀、流量控制、數(shù)據(jù)的檢錯(cuò)、重發(fā),負(fù)責(zé)物理層面的互聯(lián),通信傳輸。接收到比特流,還得人為的分組,讓比特流變得有意義的,這就是數(shù)據(jù)鏈路層干得活。它以太網(wǎng)協(xié)議將電信號(hào)分組,一組電信號(hào)稱之為一個(gè)數(shù)據(jù)包(幀)。然后控制幀在物理信道上傳輸包括糾錯(cuò),調(diào)節(jié)發(fā)送速率(防止高速的發(fā)送方把低速接收方淹沒,需要某種流量控制機(jī)制使發(fā)送方得知接收方當(dāng)前還有多少空間)確保數(shù)據(jù)的可靠性,每一幀都含有報(bào)頭(head)和數(shù)據(jù)(data),報(bào)頭包含發(fā)送者(網(wǎng)卡地址),接收者(網(wǎng)卡地址),數(shù)據(jù)里就是數(shù)據(jù)包的具體內(nèi)容。通過數(shù)據(jù)鏈路層,我們就可以建立局域網(wǎng),并讓同一局域網(wǎng)絡(luò)的兩臺(tái)計(jì)算機(jī)通信,數(shù)據(jù)鏈路層就像是一個(gè)社區(qū)郵差,他認(rèn)識(shí)社區(qū)的每戶人家,社區(qū)中的每個(gè)人都可以將信(幀)交給他,讓他送給同一社區(qū)的另一戶人家。
網(wǎng)絡(luò)層:數(shù)據(jù)在節(jié)點(diǎn)之間創(chuàng)建邏輯鏈路,通過路由選擇算法,按一定的原則在多個(gè)節(jié)點(diǎn)的通信子網(wǎng)中選擇一條到達(dá)目的節(jié)點(diǎn)的最佳路徑過程,說白就是講數(shù)據(jù)傳輸?shù)侥繕?biāo)地址。現(xiàn)在我要找另一社區(qū)的老王,我寫了一封信,交給郵差,郵差并不認(rèn)識(shí)另一個(gè)社區(qū)的人,就把信交給郵局處理,郵局根據(jù)上面的地址(IP)就能查到對(duì)應(yīng)的地址描述,然后交給另一個(gè)社區(qū)的郵局。這封信可能要多個(gè)郵局的轉(zhuǎn)發(fā),才能到達(dá)老王手里。
傳輸層:負(fù)責(zé)建立和斷開通信連接(數(shù)據(jù)流動(dòng)的邏輯通路),記憶數(shù)據(jù)的分隔等數(shù)據(jù)傳輸相關(guān)的管理。當(dāng)發(fā)送大量數(shù)據(jù)時(shí),時(shí)間有點(diǎn)長,網(wǎng)絡(luò)可能會(huì)發(fā)生中斷。怎么保證大量數(shù)據(jù)的準(zhǔn)確性,如果我發(fā)送的這個(gè)文件數(shù)據(jù)包可能有一萬個(gè)包,發(fā)送一個(gè),就告訴一次,我收到了,丟了就再發(fā)一次,保證我都能準(zhǔn)確完整接收到數(shù)據(jù)包,這就是TCP協(xié)議(TCP協(xié)議是會(huì)綁定IP和端口的協(xié)議)。與之對(duì)應(yīng)的還有一個(gè)UDP協(xié)議,適用于發(fā)送少量數(shù)據(jù),發(fā)出去就拉倒,不管你接沒接收,在多人游戲中,一般都是UDP協(xié)議,即使丟幾個(gè)包也只是卡一下,但如果網(wǎng)絡(luò)不好。。那游戲體驗(yàn)?zāi)馨央娔X砸了。
會(huì)話層:不同機(jī)器上的用戶之間建立和管理會(huì)話(服務(wù)器驗(yàn)證登錄,斷電續(xù)傳)。我向老王共享了一個(gè)文件夾,老王通過我的IP地址要訪問我的共享文件夾(建立會(huì)話),這時(shí)就會(huì)要求他輸入我的我腦上的賬號(hào)密碼,這是建立會(huì)話過程中的身份驗(yàn)證,權(quán)限鑒定。老王從我共享的文件夾拷貝數(shù)據(jù),這過程就花了幾分鐘,然后關(guān)閉了和我電腦的共享窗口,這時(shí)我又傳了一個(gè)文件上去。老王有過來連接,這時(shí)會(huì)發(fā)現(xiàn)不需要輸入密碼就能共享到我文件了,這是因?yàn)檫@條會(huì)話還沒斷開(根據(jù)應(yīng)用層設(shè)置的時(shí)間維護(hù)),身份鑒定環(huán)節(jié)就省略了(保持會(huì)話),這時(shí),電腦卡住了,我無奈重啟機(jī)器(斷開會(huì)話),老王重新連接我共享文件夾就要去身份鑒定了。
表示層:處理兩個(gè)通信系統(tǒng)中交換信息的數(shù)據(jù)格式變換,數(shù)據(jù)加密和解密,數(shù)據(jù)壓縮和恢復(fù)。我給老王寫的一封信,準(zhǔn)備早上九點(diǎn)出發(fā)去找他,信里的內(nèi)容是"我上午九點(diǎn)來",可是老王理解成了我九點(diǎn)到他家,雖然信沒看錯(cuò),但因?yàn)椴煌斫?#xff0c;產(chǎn)生了錯(cuò)誤的結(jié)果。表示層就是專門負(fù)責(zé)這些有關(guān)網(wǎng)絡(luò)中計(jì)算機(jī)信息表達(dá)方式的問題,除了編碼外,還包括數(shù)組,浮點(diǎn)數(shù),聲音等多種數(shù)據(jù)結(jié)構(gòu),以達(dá)到在網(wǎng)絡(luò)中傳輸?shù)男畔㈦p方的解釋都是一樣的,在計(jì)算機(jī)內(nèi)部表示法和網(wǎng)絡(luò)的標(biāo)準(zhǔn)表示法之間進(jìn)行轉(zhuǎn)換。
應(yīng)用層:為應(yīng)用程序提供服務(wù)并規(guī)定應(yīng)用程序中通信相關(guān)的細(xì)節(jié)。
TCP協(xié)議三次握手建立連接
兩臺(tái)計(jì)算機(jī)如何交流,就好比我們兩個(gè)人,使用同一種語言自然而然的就能表達(dá)我們的想法,因此計(jì)算機(jī)他們也需要定義共通的東西進(jìn)行交流,TCP/IP為此而生,它不是一個(gè)協(xié)議而是一個(gè)協(xié)議家族的統(tǒng)稱,它們的成員包括TCP協(xié)議,HTTP協(xié)議,IP協(xié)議等等,本章講的是TCP協(xié)議建立連接和斷開連接的過程,客戶端程序想要訪問服務(wù)器某個(gè)應(yīng)用程序就必須發(fā)送一個(gè)通信請(qǐng)求,經(jīng)過三次握手建立連接四次揮手終止連接,下面看看具體過程。
位碼就是TCP標(biāo)志位,有6種標(biāo)示==>建立聯(lián)機(jī)(SYN),確認(rèn)(ACK),傳送(PSH),結(jié)束(FIN),重置(RST),USG(緊急)
狀態(tài)===>CLOSED(初始化狀態(tài)),SYN_SENT(等待狀態(tài)),ESTABLISHED(連接建立狀態(tài)),LISTEN(監(jiān)聽狀態(tài)),SYN_RCVD(表示接收到SYN報(bào)文),
三次握手
抓包工具查看握手過程
第二次握手
?
?第三次握手
?TCP四次揮手?jǐn)嚅_連接
可以發(fā)現(xiàn),三次握手是客戶端先發(fā)起的,而四次揮手客戶端和服務(wù)器都可以率先發(fā)起揮手的動(dòng)作。客戶端和服務(wù)器總共發(fā)送4個(gè)包確認(rèn)連接斷開,也形象稱為四次揮手。
狀態(tài)=====>FIN_WAIT1(主動(dòng)關(guān)閉連接,發(fā)送FIN報(bào)文,進(jìn)入終止等待1),FIN_WAIT2(終止等待2),TIME_WAIT(等待狀態(tài)),CLOSE_WAIT(等待關(guān)閉狀態(tài)),LAST_ACK(最后等待狀態(tài))
四次揮手
抓包工具查看揮手過程
?
第二次揮手
第三次揮手
第四次揮手
握手要三次?揮手要四次?
TCP協(xié)議的雙方是雙工的,也就是說通信雙方都可以向?qū)Ψ桨l(fā)送消息,也都可以獨(dú)立關(guān)閉自己自己一方的通信通道。在這順便說下半雙工,說白了就是不同時(shí),A可以給B發(fā)消息,B也可以給A發(fā)消息,但A給B發(fā)的時(shí)候,B不能給A發(fā)。三次握手確認(rèn)兩件事,知道雙方都準(zhǔn)備好了,初始序列號(hào)進(jìn)行確認(rèn)協(xié)商。如果只有兩次,可能會(huì)造成死鎖。客戶端給服務(wù)器發(fā)送請(qǐng)求連接,服務(wù)器收到這個(gè)請(qǐng)求,并發(fā)送確認(rèn)報(bào)文。發(fā)送完后,服務(wù)器按兩次握手的協(xié)定,認(rèn)為連接已經(jīng)建立,開始發(fā)送數(shù)據(jù)。但這時(shí)因?yàn)槟撤N原因,服務(wù)器的確認(rèn)報(bào)文傳丟了,客戶端懵逼了,不知道服務(wù)器是否收到自己的請(qǐng)求,建立什么序列號(hào)。客戶端就認(rèn)為連接還未建立,忽略服務(wù)器傳來的任何數(shù)據(jù),傻傻的等待服務(wù)器的確認(rèn)報(bào)文,服務(wù)器發(fā)出的數(shù)據(jù)超時(shí)后,就重復(fù)發(fā)出同樣數(shù)據(jù),死鎖就產(chǎn)生了。如果是四次握手哪?四次握手是可行的,但是這樣一來會(huì)造成資源的浪費(fèi),因?yàn)槿挝帐忠呀?jīng)確認(rèn)好所有的事情了,沒必要在浪費(fèi)一次資源。
?
服務(wù)器收到客戶端的請(qǐng)求連接報(bào)文,立即就可以給應(yīng)答建立聯(lián)機(jī)了。但關(guān)閉連接時(shí),服務(wù)器收到這個(gè)關(guān)閉連接的報(bào)文,并不能立即停止,因?yàn)檫€有數(shù)據(jù)未發(fā)送完畢,只能回一個(gè)“我知道啦”的應(yīng)答報(bào)文。只有數(shù)據(jù)全部發(fā)送完畢后,服務(wù)器才發(fā)送說FIN,“我數(shù)據(jù)傳完了”的報(bào)文等待確認(rèn),然后終止連接。所有需要四次揮手。
?
===============================================================
如發(fā)現(xiàn)錯(cuò)誤,請(qǐng)及時(shí)留言,lz及時(shí)修改,避免誤導(dǎo)后來者。感謝!!!
轉(zhuǎn)載于:https://www.cnblogs.com/dslx/p/10686444.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的OSI七层协议与TCP连接的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鼠标按下改变RelativeLayout
- 下一篇: qdu-凑数题(01背包)