請關注 點贊 轉發
入網絡協定,以圖文并茂的方式細說網絡技術細節。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.應用層(檔案傳輸,電子郵件,檔案服務,虛拟終端)
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位):未被使用,全置為06.緊急URG:當URG=1時緊急資料才有效。注意,這裡URG并不是緊急資料,隻是一個标志,标志着緊急資料是否有效7.确認ACK:當ACK=1時确認号才有效,當建立連接配接後全部傳輸的封包都要把ACK設定為18.推送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和SessionCookie:通過用戶端(浏覽器)來緩存個人資訊。當使用者第一次登入時,伺服器會将個人資訊放在了響應中, 浏覽器接收到響應時候會将個人資訊以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)
來自:CSDN,作者:LiangJGo
連結:https://blog.csdn.net/LiangJGo/article/details/90080011