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