OSI七層協(xié)議
1.物理層
很久很久以前,那時候還沒有現(xiàn)在的外星人超級電腦,或者華為的P30。比較調(diào)皮的小明想要把自己機器上寫好的一些個人游戲心得(如何玩好王者農(nóng)藥)發(fā)給小紅(?;ǎ?,希望博得芳心。小明個人比較勤,游戲總結(jié)心得總結(jié)的比較詳細(大概有100M)。但是到底怎么才能從自己的機器上傳給小紅的機器呢,進過一番打聽,他發(fā)現(xiàn)遠在太平洋另一端的科學家已經(jīng)發(fā)明了一種技術(shù) 物理層,專門用來解決小明這種單身狗問題。該層主要定義物理設備標準,如網(wǎng)線的接口類型、光纖的接口類型、各種傳輸介質(zhì)的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉(zhuǎn)化為電流強弱來進行傳輸,到達目的地后在轉(zhuǎn)化為1、0,也就是我們常說的數(shù)模轉(zhuǎn)換與模數(shù)轉(zhuǎn)換)。這一層的數(shù)據(jù)叫做比特。
他很興奮,通過一個月的努力終于搭建起了這個物理層。
2.數(shù)據(jù)鏈路層:
然而上天卻好像和小明開了一個玩笑,樓下的小潤發(fā)超市的網(wǎng)線、光纖最近賣光了,但是這個物理層傳輸數(shù)據(jù)只能通過網(wǎng)線傳輸。到底怎么辦。
此時,他體內(nèi)的雄性激素促使著他的大腦以光速運轉(zhuǎn)。終于他餓了,無奈得走去學校飯?zhí)萌龢浅月槔睜C。此時聽到隔壁坐著的那位王叔叔(老王)說,科學家已經(jīng)發(fā)明了一種技術(shù)可以通過無線電來傳輸。What?這不是完美解決了自己的困擾嗎。小明連忙對隔壁老王說謝謝,老王留下了幸福的淚水!
右通過一番努力查資料,小明發(fā)現(xiàn):這種技術(shù)可以通過電線我能發(fā)數(shù)據(jù)流,也可以通過其它介質(zhì)來傳輸。然后還要保證了傳輸過去的比特流是正確的,有糾錯功能。定義了如何讓格式化數(shù)據(jù)以進行傳輸,以及如何讓控制對物理介質(zhì)的訪問。這一層通常還提供錯誤檢測和糾正,以確保數(shù)據(jù)的可靠傳輸。
小明把層技術(shù)稱為:數(shù)據(jù)鏈路層
3.網(wǎng)絡層:
由于小明家離小紅家比較遠,無線電信號無法傳輸?shù)侥睦铮沁@完全難不到小明。他通過在離小紅家的路上搭建了多個節(jié)點(路由器,交換機),用于信號的傳輸。但是由于他有時候被雄性激素沖昏了頭腦,搭建的信號節(jié)點有點亂,而且很多。那他又想用最短的路徑來傳輸怎么辦呢?在小明沮喪走回家的時候已深夜,他看見今天看到的那位王叔叔匆匆的從自己家走出來,他連忙拉住王叔叔,向他訴說自己的煩惱,希望王叔叔能給自己一些幫助。當小明說完后,王叔叔從緊張變?yōu)楹吞@,和小明說:其實已經(jīng)有人發(fā)明了網(wǎng)絡層。即路由器,交換機那些具有尋址功能的設備所實現(xiàn)的功能。這一層定義的是IP地址,通過IP地址尋址。所以產(chǎn)生了IP協(xié)議。該層能選擇最佳路徑,這就是路由要做的事。
4.傳輸層為了趁熱打鐵,小明通宵查資料來學習相關(guān)信息,并且簡單搭建好網(wǎng)絡層,開始傳輸數(shù)據(jù),趁著傳輸過程好好睡一覺。當他起來的時候,噩夢才剛剛開始,因為他傳輸?shù)臄?shù)據(jù)太大(100M)只傳輸了一部分,而且斷斷續(xù)續(xù)的,有一部分數(shù)據(jù)根本傳不出去。那怎么辦?
“加一層傳輸層!”:王叔叔在樓下大聲喊著,“資料在你媽媽的床頭柜”,王叔叔繼續(xù)說。小明連忙找到資料,上面寫著:“
發(fā)正確的發(fā)比特流數(shù)據(jù)到另一臺計算機了,但是當我發(fā)大量數(shù)據(jù)時候,可能需要好長時間,例如一個視頻格式的,網(wǎng)絡會中斷好多次(事實上,即使有了物理層和數(shù)據(jù)鏈路層,網(wǎng)絡還是經(jīng)常中斷,只是中斷的時間是毫秒級別的)。
那么,我還須要保證傳輸大量文件時的準確性。于是,我要對發(fā)出去的數(shù)據(jù)進行封裝。就像發(fā)快遞一樣,一個個地發(fā)。
例如TCP,是用于發(fā)大量數(shù)據(jù)的,我發(fā)了1萬個包出去,另一臺電腦就要告訴我是否接受到了1萬個包,如果缺了3個包,就告訴我是第1001,234,8888個包丟了,那我再發(fā)一次。這樣,就能保證對方把這個視頻完整接收了。
例如UDP,是用于發(fā)送少量數(shù)據(jù)的。我發(fā)20個包出去,一般不會丟包,所以,我不管你收到多少個。在多人互動游戲,也經(jīng)常用UDP協(xié)議,因為一般都是簡單的信息,而且有廣播的需求。如果用TCP,效率就很低,因為它會不停地告訴主機我收到了20個包,或者我收到了18個包,再發(fā)我兩個!如果同時有1萬臺計算機都這樣做,那么用TCP反而會降低效率,還不如用UDP,主機發(fā)出去就算了,丟幾個包你就卡一下,算了,下次再發(fā)包你再更新。
TCP協(xié)議是會綁定IP和端口的協(xié)議,下面會介紹IP協(xié)議?!?/p>
通過如此這般的操作,他!小明同學終于把自己100M的游戲心得發(fā)送給了小紅。
5.會話層(解除與建立與別的接口的聯(lián)系)
然而,小紅根本不玩游戲。得知這個消息后,小明楞逼了。但是他沒有放棄,而是把自己猜到小紅喜歡的信息都發(fā)給他,但是小明每發(fā)一次,難道我每次都要調(diào)用TCP去打包,然后調(diào)用IP協(xié)議去找路由,這一來一回就是一天,那怎么辦呢?
他又翻了翻王叔叔的筆記本資料,寫著:會話層可以幫助我們建立和管理應用程序之間的通信,封裝了調(diào)用TCP去打包,然后調(diào)用IP協(xié)議去找路由等操作,如此一來,他只需要十幾二十分鐘就能夠成功搭建好傳輸數(shù)據(jù)的機器。
6.表示層(數(shù)據(jù)格式化,代碼轉(zhuǎn)換,數(shù)據(jù)加密)
有一次,小明傳了一份數(shù)據(jù),是關(guān)于如何選購化妝品的文章,小紅對此非常感興趣,但是當小紅想用自己的window開該文件時發(fā)現(xiàn)根本無法打開,后來小紅在下課的時候和小明說自己無法打開這個文件,小明想自己用Linux系統(tǒng)明明完整地發(fā)送給了小紅啊,那就奇怪了,但是出于耍帥,小明只是輕輕地說“我放學后再發(fā)你一份!”。
這時雖然小明不知道是出了什么問題,但是他堅信老王叔叔的資料筆記會有答案的。
果然!上清清楚楚的寫著:“現(xiàn)在我能保證應用程序自動收發(fā)包和尋址了。但是我要用Linux給window發(fā)包,兩個系統(tǒng)語法不一致,就像安裝包一樣,exe是不能在linux下用的,shell在window下也是不能直接運行的。于是需要表示層(presentation),幫我們解決不同系統(tǒng)之間的通信語法問題?!?/p>
小明立即用了一個通宵手動搭好了表示層,傳輸了一份完美的文件給小紅。
7.應用層(文件傳輸,電子郵件,文件服務,虛擬終端)
官方OSI說明圖
TCP/IP協(xié)議
TCP/IP協(xié)議是由七層模型簡化成四層而來。(TPC/IP協(xié)議其實泛指了四層模型中的全部協(xié)議,區(qū)別開TCP協(xié)議,IP協(xié)議)
七層有底向上分別是:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡層、傳輸層、會話層、表示層、應用層。
簡化后的四層分別是:主機到網(wǎng)絡層(比特)、網(wǎng)絡層(數(shù)據(jù)幀)、傳輸層(數(shù)據(jù)包)、應用層(數(shù)據(jù)段)。
每一層對于上一層來講是透明的,上層只需要使用下層提供的接口,并不關(guān)心下層是如何實現(xiàn)的。
與OSI七層協(xié)議的對比:
傳輸層:
網(wǎng)絡層是主機與主機之間的通訊,而傳輸層則是進程之間的通訊。
為何要有傳輸層?應為進程是資源分配的基本單位,計算機之間的信息傳輸也只是一臺計算機的進程傳輸?shù)搅硗庖慌_計算機的進程中。
一臺計算機如何找到另外一臺計算機呢?那就是通過IP協(xié)議來完成的(復用,多個進程都可以把信息通過傳輸層到IP層,再傳輸?shù)搅硗庖慌_計算機中)。
那如何找到另外一臺計算機的進程(pid)?那就是用端口(分用,到達另外一臺計算機后還要通過端口號找到對應進程)。
傳輸層主要有兩種協(xié)議:UDP和TCP
一、UDP協(xié)議特點:無連接,傳輸數(shù)據(jù)時不需要建立連接,減小開銷
盡最大努力交付,不確??煽拷桓?/p>
面向報文
沒有擁塞控制、確保信息實時性
支持一對一,一對多,多對一,多對多
首部開銷小,只有8個字節(jié)
UDP的首部格式(UDP頭):源端口,發(fā)送方的端口
目標端口,接收方的端口
長度,首部長度 + 用戶數(shù)據(jù)包的長度(可以沒有數(shù)據(jù)包,所用最小值為8)
檢驗和,檢查UDP用戶數(shù)據(jù)傳輸中是否與錯,有錯就丟棄(檢查首部長度 + 用戶數(shù)據(jù)包)
二、TCP協(xié)議A、特點:面向連接的協(xié)議。數(shù)據(jù)傳輸之前都要建立連接(三次揮手),數(shù)據(jù)傳輸結(jié)束都要釋放連接(四次揮手)
一條TCP連接只能有兩個端點,端點是socket(結(jié)構(gòu) IP地址:端口號),并非主機或進程。
可靠交付
全雙工通信(一端既可以做發(fā)送方也可以做接收方)
面向字節(jié)流
B、為何TCP是可靠的呢?其實TCP是依賴停止 等待協(xié)議和連續(xù)ARQ 協(xié)議+滑動窗口協(xié)議才達到可靠的目的a、等待協(xié)議特點:資源利用率非常低
工作原理:客戶發(fā)送一次數(shù)據(jù)到服務端,必須等到服務端響應后才發(fā)第二次數(shù)據(jù),中間的等待時間RTT占了大部分時間,中間如果出現(xiàn)差錯(超時或確認丟失)都需要從新傳輸。
b、連續(xù)ARQ協(xié)議連續(xù)ARQ協(xié)議工作原理:維持一個發(fā)送窗口(記錄了當前可以發(fā)送的數(shù)據(jù)包數(shù)量n),在窗口內(nèi)的數(shù)據(jù)都可以連續(xù)發(fā)送出去,服務器只在接收完一個發(fā)送窗口的數(shù)據(jù)后才回響應(累計確認),發(fā)送端接收到響應就把發(fā)送窗口移動n位,開始新一輪數(shù)據(jù)發(fā)送。
以上只是簡單了解TCP協(xié)議的發(fā)送流程,如果要清楚發(fā)送細節(jié),必須知道TCP報文首部
TCP報文段的首部格式
雖然說TCP是面向字節(jié)流的,但是TCP傳輸?shù)臄?shù)據(jù)單元卻是報文段,報文段由首部和數(shù)據(jù)兩部分組成,如圖:
1.源端口和目標端口(各占兩字節(jié))
2.序號(占4字節(jié)):TCP連接傳輸?shù)臄?shù)據(jù)每一個字節(jié)都有一個序號,而一個報文段可能會有多個字節(jié)的數(shù)據(jù),這個序號指的是TCP報文段中起始的序號,下一個報文段的序號則是該序號加上報文數(shù)據(jù)長度(三次握手和四次揮手時說的SYN或ACK會消耗一個序號就是指該序號)
3.確認號(占4字節(jié)):因為一次數(shù)據(jù)傳輸會分成多個報文段,接收方接收完一次報文段后如果要發(fā)送確認(有可能不用確認,因為是接收完發(fā)送窗口的報文段才確認的),則會攜帶一個確認號,表示接收方想要接收的下一個報文的序號
4.數(shù)據(jù)偏移(占4字位):數(shù)據(jù)部分的起始位置離報文段起始位置的距離,就是報文首部的長度,單位是4字節(jié),所以4位能表示最大值是十進制的15,就是15 x 4字節(jié) = 60字節(jié),TCP報文首部最大長度為60字節(jié)
5.保留(占6位):未被使用,全置為0
6.緊急URG:當URG=1時緊急數(shù)據(jù)才有效。注意,這里URG并不是緊急數(shù)據(jù),只是一個標志,標志著緊急數(shù)據(jù)是否有效
7.確認ACK:當ACK=1時確認號才有效,當建立連接后全部傳輸?shù)膱笪亩家袮CK設置為1
8.推送PSH:接收方機器會有一個接收,當接收緩存慢了才回把接收到的數(shù)據(jù)交付到接收應用進程中,而如果發(fā)送端把報文的PSH設為1,接收方接收到該報文會立即交付到應用的進程中
9.復位RST:兩個作用,1、當RST=1時,表示TCP連接中出現(xiàn)嚴重差錯,必須釋放連接,然后重新建立運輸連接。2、當RST=1時,拒絕一個非法的報文段或拒絕打開一個連接。
10.同步SYN:用于同步序號(告訴另外一方,他們之間從該序號開始傳輸報文段),當SYN=1,ACK=0表示這時一個連接請求報文。
11.終止FIN:用于釋放一個連接。當FIN=1時,表明此報文的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放運輸連接。
12.窗口(占2字節(jié)),是一個接收窗口,接收方允許發(fā)送方發(fā)送的數(shù)據(jù)量
13.檢驗和(占2字節(jié)):檢驗接收過來的報文段(報文首部和用戶數(shù)據(jù))是否有誤
14.緊急指針(占2字節(jié)):當URG=1時才有效,指出緊急數(shù)據(jù)未尾位置(開始位置是整個報文段中用戶數(shù)據(jù)的開頭)
15.選項,長度可變,最長40字節(jié)
那到底TCP是如何實現(xiàn)可靠傳輸?shù)哪兀?/p>
TCP可靠傳輸?shù)膶崿F(xiàn)
一、通過滑動窗口來發(fā)送數(shù)據(jù)
發(fā)送窗口有兩部分組成,已發(fā)送的報文段 和 能夠發(fā)送但未發(fā)送的報文段(等待已發(fā)送報文段全部接收完發(fā)回來的確認就可以發(fā)送了)
當收到確認后發(fā)送窗口會向右移動到7位置,作為窗口的起始位置。
發(fā)送窗口,發(fā)送窗口有可能會收縮(因為接收窗口有可能因為接收緩存不夠而變?。?/p>
二、超時重傳時間的選擇采用一個根據(jù)RTT動態(tài)計算的時間,并不是直接采用一個固定的時間RTT:發(fā)送一個報文段到收到對應的ACK所花費的時間RTO:超時重傳時間RTTs是一個加權(quán)平均RTT時間RTTd是RTTs偏差的加權(quán)平均RTO = RTTs + 4 * RTTd如果發(fā)生了重傳 ,這次的RTT會讓RTTs會變大,此時是不會用該RTT來計算RTTs的
三、確認SACK是一個TCP報文首部的選項。當數(shù)據(jù)傳輸過程中,接收方可能會未按順收到部分報文段,此時序號告訴發(fā)送方從新傳輸這些報文段,SACK選項就是用于告訴發(fā)送方需要傳輸那些報文段的
TCP傳輸連接管理
連接的三個階段:建立連接、數(shù)據(jù)傳輸、連接釋放在建立連接的過程中要解決三個問題:1、使每一方都知道對方的存在2、協(xié)商一些參數(shù)3、能夠運輸實體資源
主動建立連接的一端叫客戶端,被動等待連接建立的一方叫服務器
連接建立(三次握手)
每次發(fā)送一個seq時,都會消耗一個序號,所以會發(fā)現(xiàn)在確認時,ack總等于另一端請求的seq+1
為何需要第三次握手?
假設沒有第三次握手(即A再次確認)在很久很久以前,A發(fā)了一個連接請求給B,但是網(wǎng)絡滯留的原因,請求沒有到達B,所以B也沒有確認返回給A,所以A右發(fā)送了一個連接請求給B,此時B收到了連接請求并返回了一個確認給A,此時連端開始愉快的數(shù)據(jù)傳輸之旅。當傳輸結(jié)束時,分別斷開連接,各自干各自的活兒。但是過了一段時間,之間滯留在網(wǎng)絡中的A發(fā)出的連接請求到達了B中,B以為A又要傳輸數(shù)據(jù),便右回了一個確認給A,但是A并不需要輸出傳輸,也沒有理會這個確認,而B卻在傻傻等待A傳輸數(shù)據(jù),這個就會浪費B的資源。但是如果有第三次A的確認,A這個滯留的連接傳給B,B返回一個確認,但是A不想傳輸數(shù)據(jù)了,便沒有回一個確認給B(第三次握手),B沒有收到該確認也不會等待A傳輸數(shù)據(jù)。
連接釋放(四次揮手)
第一次揮手:客戶端發(fā)送連接,F(xiàn)IN=1標志著A已經(jīng)完成了數(shù)據(jù)的發(fā)送。
第二次揮手:B回了一個確認,此時A與B的發(fā)送連接就斷開了。
第三次揮手:因為TCP連接是全雙工通信的,B還保留著一個對A大發(fā)送連接,如果等到B也不需要發(fā)送數(shù)據(jù)給A時,B會發(fā)送一個連接給A,seq等于一個大于或等于v的值(因為A與B斷開發(fā)送連接到B與A斷開發(fā)送連接期間有可能B向A發(fā)送了數(shù)據(jù),就是消耗序號)。
第四次揮手:當A收到B的連接時,要回一個響應給B,但是此時會有一個2MSL長的等待時間,時間一過,就真正的斷開與B的全部連接了。
為什么需要2MSL的等待時間?
MSL:最長報文壽命當A發(fā)送確認給A后,如果此時出現(xiàn)了一些狀況(連接被丟棄等),確認無法到達B中,B會重新發(fā)送一個連接給A,但是A就停止了,B就一直等待(其實有一個?;顣r間)。如果有了這個等待時間,就算A的ACK確認丟失了,B也會再從新發(fā)送一個連接給A,A接收到該連接后,會從新計算等待時間。A會再確認一次
應用層
一、HTTP協(xié)議特點:支持客戶端 / 服務器模式
簡單快速
靈活
無連接,在完成一次請求獲得響應后就會斷開
無狀態(tài),沒有記憶的,請求完一次后,就結(jié)束了,后面如果要再獲得數(shù)據(jù)必須從新請求
請求報文的結(jié)構(gòu)
請求頭部:用于設置請求的的一些參數(shù)如:ContentType請求空行:就算請求數(shù)據(jù)為空,都要有空行,表示請求首部的結(jié)束
從瀏覽器地址欄鍵入URL,回車后會盡力的流程:DNS解析
TCP連接
發(fā)送HTTP請求
服務器處理請求,并返回HTTP報文
瀏覽器解析渲染頁面
連接結(jié)束
GET請求與POST請求的區(qū)別
HTTP報文層面:GET請求信息放在URL中,POST放在報文體中數(shù)據(jù)庫層面:GET符合冪等性和安全性,POST不符合其他層面:GET可以被緩存、儲存,而POST不行
Cookie和Session的區(qū)別
為什么會有這兩種技術(shù)?在使用一些需要登錄的網(wǎng)站時,每次訪問,都會需要驗證個人信息,即登錄。這樣做比較繁瑣,能否將個人的賬號和密碼存起來,訪問的時候直接用存取來的個人信息進行驗證呢?解決這個問題的就是Cookie和Session
Cookie:通過客戶端(瀏覽器)來緩存?zhèn)€人信息。當用戶第一次登錄時,服務器會將個人信息放在了響應中, 瀏覽器接收到響應時候會將個人信息以Cookie的形式訪問瀏覽器中保存起來,在下一次訪問服務器的時候會帶上該Cookie,Cookie中有個人信息,服務器能解析出來,所以不同再次登錄驗證了。(不夠安全,對服務器的開銷?。?/p>
Session通過服務端來緩存信息,根據(jù)請求中是否包含Session id的字段,如果不存在則創(chuàng)建一個,并返回給瀏覽器緩存起來。如果存在則通過該Session id在服務器存儲中獲得對應的Session信息,直接驗證。(安全,服務器的開銷變大)
HTTP與HTTPS的區(qū)別:
1、HTTPS需要到CA申請證書,HTTP不需要2、HTTPS密文傳輸、HTTP明文傳輸3、連接方式不同,HTTPS默認使用443端口,HTTP使用80端口4、HTTPS = HTTP + 加密+認證+完整性保護,較HTTP安全
其實也不一定就安全,原因是用戶不會再訪問時候加上http:// 或 https://, 瀏覽器就默認會加上http://,然后通過轉(zhuǎn)發(fā)的方式轉(zhuǎn)成https:// 這個過程http就有可能會被劫持了。
此時會用到一個技術(shù) HSTS(HTTP Strict Transort Security)
編輯:黃飛
評論