A. 計算機網路自學筆記:TCP
如果你在學習這門課程,僅僅為了理解網路工作原理,那麼只要了解TCP是可靠傳輸,數據傳輸丟失時會重傳就可以了。如果你還要參加研究生考試或者公司面試等,那麼下面內容很有可能成為考查的知識點,主要的重點是序號/確認號的編碼、超時定時器的設置、可靠傳輸和連接的管理。
1 TCP連接
TCP面向連接,在一個應用進程開始向另一個應用進程發送數據之前,這兩個進程必須先相互「握手」,即它們必須相互發送某些預備報文段,以建立連接。連接的實質是雙方都初始化與連接相關的發送/接收緩沖區,以及許多TCP狀態變數。
這種「連接」不是一條如電話網路中端到端的電路,因為它們的狀態完全保留在兩個端系統中。
TCP連接提供的是全雙工服務 ,應用層數據就可在從進程B流向進程A的同時,也從進程A流向進程B。
TCP連接也總是點對點的 ,即在單個發送方與單個接收方之間建立連接。
一個客戶機進程向伺服器進程發送數據時,客戶機進程通過套接字傳遞數據流。
客戶機操作系統中運行的 TCP軟體模塊首先將這些數據放到該連接的發送緩存里 ,然後會不時地從發送緩存里取出一塊數據發送。
TCP可從緩存中取出並放入報文段中發送的數據量受限於最大報文段長MSS,通常由最大鏈路層幀長度來決定(也就是底層的通信鏈路決定)。 例如一個鏈路層幀的最大長度1500位元組,除去數據報頭部長度20位元組,TCP報文段的頭部長度20位元組,MSS為1460位元組。
報文段被往下傳給網路層,網路層將其封裝在網路層IP數據報中。然後這些數據報被發送到網路中。
當TCP在另一端接收到一個報文段後,該報文段的數據就被放人該連接的接收緩存中。應用程序從接收緩存中讀取數據流(注意是應用程序來讀,不是操作系統推送)。
TCP連接的每一端都有各自的發送緩存和接收緩存。
因此TCP連接的組成包括:主機上的緩存、控制變數和與一個進程連接的套接字變數名,以及另一台主機上的一套緩存、控制變數和與一個進程連接的套接字。
在這兩台主機之間的路由器、交換機中,沒有為該連接分配任何緩存和控制變數。
2報文段結構
TCP報文段由首部欄位和一個數據欄位組成。數據欄位包含有應用層數據。
由於MSS限制了報文段數據欄位的最大長度。當TCP發送一個大文件時,TCP通常是將文件劃分成長度為MSS的若干塊。
TCP報文段的結構。
首部包括源埠號和目的埠號,它用於多路復用/多路分解來自或送至上層應用的數據。另外,TCP首部也包括校驗和欄位。報文段首部還包含下列欄位:
32比特的序號欄位和32比特的確認號欄位。這些欄位被TCP發送方和接收方用來實現可靠數據傳輸服務。
16比特的接收窗口欄位,該欄位用於流量控制。該欄位用於指示接收方能夠接受的位元組數量。
4比特的首部長度欄位,該欄位指示以32比特的字為單位的TCP首部長度。一般TCP首部的長度就是20位元組。
可選與變長的選項欄位,該欄位用於當發送方與接收方協商最大報文段長度,或在高速網路環境下用作窗口調節因子時使用。
標志欄位ACK比特用於指示確認欄位中的ACK值的有效性,即該報文段包括一個對已被成功接收報文段的確認。 SYN和FIN比特用於連接建立和拆除。 PSH、URG和緊急指針欄位通常沒有使用。
•序號和確認號
TCP報文段首部兩個最重要的欄位是序號欄位和確認號欄位。
TCP把數據看成一個無結構的但是有序的位元組流。TCP序號是建立在傳送的位元組流之上,而不是建立在傳送的報文段的序列之上。
一個報文段的序號是該報文段首位元組在位元組流中的編號。
例如,假設主機A上的一個進程想通過一條TCP連接向主機B上的一個進程發送一個數據流。主機A中的TCP將對數據流中的每一個位元組進行編號。假定數據流由一個包含4500位元組的文件組成(可以理解為應用程序調用send函數傳遞過來的數據長度),MSS為1000位元組(鏈路層一次能夠傳輸的位元組數),如果主機決定數據流的首位元組編號是7。TCP模塊將為該數據流構建5個報文段(也就是分5個IP數據報)。第一個報文段的序號被賦為7;第二個報文段的序號被賦為1007,第三個報文段的序號被賦為2007,以此類推。前面4個報文段的長度是1000,最後一個是500。
確認號要比序號難理解一些。前面講過,TCP是全雙工的,因此主機A在向主機B發送數據的同時,也可能接收來自主機B的數據。從主機B到達的每個報文段中的序號欄位包含了從B流向A的數據的起始位置。 因此主機B填充進報文段的確認號是主機B期望從主機A收到的下一報文段首位元組的序號。
假設主機B已收到了來自主機A編號為7-1006的所有位元組,同時假設它要發送一個報文段給主機A。主機B等待主機A的數據流中位元組1007及後續所有位元組。所以,主機B會在它發往主機A的報文段的確認號欄位中填上1007。
再舉一個例子,假設主機B已收到一個來自主機A的包含位元組7-1006的報文段,以及另一個包含位元組2007-3006的報文段。由於某種原因,主機A還沒有收到位元組1007-2006的報文段。
在這個例子中,主機A為了重組主機B的數據流,仍在等待位元組1007。因此,A在收到包含位元組2007-3006的報文段時,將會又一次在確認號欄位中包含1007。 因為TCP只確認數據流中至第一個丟失報文段之前的位元組數據,所以TCP被稱為是採用累積確認。
TCP的實現有兩個基本的選擇:
1接收方立即丟棄失序報文段;
2接收方保留失序的位元組,並等待缺少的位元組以填補該間隔。
一條TCP連接的雙方均可隨機地選擇初始序號。 這樣做可以減少將那些仍在網路中的來自兩台主機之間先前連接的報文段,誤認為是新建連接所產生的有效報文段的可能性。
•例子telnet
Telnet由是一個用於遠程登錄的應用層協議。它運行在TCP之上,被設計成可在任意一對主機之間工作。
假設主機A發起一個與主機B的Telnet會話。因為是主機A發起該會話,因此主機A被標記為客戶機,主機B被標記為伺服器。用戶鍵入的每個字元(在客戶機端)都會被發送至遠程主機。遠程主機收到後會復制一個相同的字元發回客戶機,並顯示在Telnet用戶的屏幕上。這種「回顯」用於確保由用戶發送的字元已經被遠程主機收到並處理。因此,在從用戶擊鍵到字元顯示在用戶屏幕上之間的這段時間內,每個字元在網路中傳輸了兩次。
現在假設用戶輸入了一個字元「C」,假設客戶機和伺服器的起始序號分別是42和79。前面講過,一個報文段的序號就是該報文段數據欄位首位元組的序號。因此,客戶機發送的第一個報文段的序號為42,伺服器發送的第一個報文段的序號為79。前面講過,確認號就是主機期待的數據的下一個位元組序號。在TCP連接建立後但沒有發送任何數據之前,客戶機等待位元組79,而伺服器等待位元組42。
如圖所示,共發了3個報文段。第一個報文段是由客戶機發往伺服器,其數據欄位里包含一位元組的字元「C」的ASCII碼,其序號欄位里是42。另外,由於客戶機還沒有接收到來自伺服器的任何數據,因此該報文段中的確認號欄位里是79。
第二個報文段是由伺服器發往客戶機。它有兩個目的:第一個目的是為伺服器所收到的數據提供確認。伺服器通過在確認號欄位中填入43,告訴客戶機它已經成功地收到位元組42及以前的所有位元組,現在正等待著位元組43的出現。第二個目的是回顯字元「C」。因此,在第二個報文段的數據欄位里填入的是字元「C」的ASCII碼,第二個報文段的序號為79,它是該TCP連接上從伺服器到客戶機的數據流的起始序號,也是伺服器要發送的第一個位元組的數據。
這里客戶機到伺服器的數據的確認被裝載在一個伺服器到客戶機的數據的報文段中,這種確認被稱為是捎帶確認.
第三個報文段是從客戶機發往伺服器的。它的唯一目的是確認已從伺服器收到的數據。
3往返時延的估計與超時
TCP如同前面所講的rdt協議一樣,採用超時/重傳機制來處理報文段的丟失問題。最重要的一個問題就是超時間隔長度的設置。顯然,超時間隔必須大於TCP連接的往返時延RTT,即從一個報文段發出到收到其確認時。否則會造成不必要的重傳。
•估計往返時延
TCP估計發送方與接收方之間的往返時延是通過採集報文段的樣本RTT來實現的,就是從某報文段被發出到對該報文段的確認被收到之間的時間長度。
也就是說TCP為一個已發送的但目前尚未被確認的報文段估計sampleRTT,從而產生一個接近每個RTT的采樣值。但是,TCP不會為重傳的報文段計算RTT。
為了估計一個典型的RTT,採取了某種對RTT取平均值的辦法。TCP據下列公式來更新
EstimatedRTT=(1-)*EstimatedRTT+*SampleRTT
即估計RTT的新值是由以前估計的RTT值與sampleRTT新值加權組合而成的。
參考值是a=0.125,因此是一個加權平均值。顯然這個加權平均對最新樣本賦予的權值
要大於對老樣本賦予的權值。因為越新的樣本能更好地反映出網路當前的擁塞情況。從統計學觀點來講,這種平均被稱為指數加權移動平均
除了估算RTT外,還需要測量RTT的變化,RTT偏差的程度,因為直接使用平均值設置計時器會有問題(太靈敏)。
DevRTT=(1-β)*DevRTT+β*|SampleRTT-EstimatedRTT|
RTT偏差也使用了指數加權移動平均。B取值0.25.
•設置和管理重傳超時間隔
假設已經得到了估計RTT值和RTT偏差值,那麼TCP超時間隔應該用什麼值呢?TCP將超時間隔設置成大於等於估計RTT值和4倍的RTT偏差值,否則將造成不必要的重傳。但是超時間隔也不應該比估計RTT值大太多,否則當報文段丟失時,TCP不能很快地重傳該報文段,從而將給上層應用帶來很大的數據傳輸時延。因此,要求將超時間隔設為估計RTT值加上一定餘量。當估計RTT值波動較大時,這個余最應該大些;當波動比較小時,這個餘量應該小些。因此使用4倍的偏差值來設置重傳時間。
TimeoutInterval=EstimatedRTT+4*DevRTT
4可信數據傳輸
網際網路的網路層服務是不可靠的。IP不保證數據報的交付,不保證數據報的按序交付,也不保證數據報中數據的完整性。
TCP在IP不可靠的盡力而為服務基礎上建立了一種可靠數據傳輸服務。
TCP提供可靠數據傳輸的方法涉及前面學過的許多原理。
TCP採用流水線協議、累計確認。
TCP推薦的定時器管理過程使用單一的重傳定時器,即使有多個已發送但還未被確認的報文段也一樣。重傳由超時和多個ACK觸發。
在TCP發送方有3種與發送和重傳有關的主要事件:從上層應用程序接收數據,定時器超時和收到確認ACK。
從上層應用程序接收數據。一旦這個事件發生,TCP就從應用程序接收數據,將數據封裝在一個報文段中,並將該報文段交給IP。注意到每一個報文段都包含一個序號,這個序號就是該報文段第一個數據位元組的位元組流編號。如果定時器還沒有計時,則當報文段被傳給IP時,TCP就啟動一個該定時器。
第二個事件是超時。TCP通過重傳引起超時的報文段來響應超時事件。然後TCP重啟定時器。
第三個事件是一個來自接收方的確認報文段(ACK)。當該事件發生時,TCP將ACK的值y與變數SendBase(發送窗口的基地址)進行比較。TCP狀態變數SendBase是最早未被確認的位元組的序號。就是指接收方已正確按序接收到數據的最後一個位元組的序號。TCP採用累積確認,所以y確認了位元組編號在y之前的所有位元組都已經收到。如果Y>SendBase,則該ACK是在確認一個或多個先前未被確認的報文段。因此發送方更新其SendBase變數,相當於發送窗口向前移動。
另外,如果當前有未被確認的報文段,TCP還要重新啟動定時器。
快速重傳
超時觸發重傳存在的另一個問題是超時周期可能相對較長。當一個報文段丟失時,這種長超時周期迫使發送方等待很長時間才重傳丟失的分組,因而增加了端到端時延。所以通常發送方可在超時事件發生之前通過觀察冗餘ACK來檢測丟包情況。
冗餘ACK就是接收方再次確認某個報文段的ACK,而發送方先前已經收到對該報文段的確認。
當TCP接收方收到一個序號比所期望的序號大的報文段時,它認為檢測到了數據流中的一個間隔,即有報文段丟失。這個間隔可能是由於在網路中報文段丟失或重新排序造成的。因為TCP使用累計確認,所以接收方不向發送方發回否定確認,而是對最後一個正確接收報文段進行重復確認(即產生一個冗餘ACK)
如果TCP發送方接收到對相同報文段的3個冗餘ACK.它就認為跟在這個已被確認過3次的報文段之後的報文段已經丟失。一旦收到3個冗餘ACK,TCP就執行快速重傳 ,
即在該報文段的定時器過期之前重傳丟失的報文段。
5流量控制
前面講過,一條TCP連接雙方的主機都為該連接設置了接收緩存。當該TCP連接收到正確、按序的位元組後,它就將數據放入接收緩存。相關聯的應用進程會從該緩存中讀取數據,但沒必要數據剛一到達就立即讀取。事實上,接收方應用也許正忙於其他任務,甚至要過很長時間後才去讀取該數據。如果應用程序讀取數據時相當緩慢,而發送方發送數據太多、太快,會很容易使這個連接的接收緩存溢出。
TCP為應用程序提供了流量控制服務以消除發送方導致接收方緩存溢出的可能性。因此,可以說 流量控制是一個速度匹配服務,即發送方的發送速率與接收方應用程序的讀速率相匹配。
前面提到過,TCP發送方也可能因為IP網路的擁塞而被限制,這種形式的發送方的控制被稱為擁塞控制(congestioncontrol)。
TCP通過讓接收方維護一個稱為接收窗口的變數來提供流量控制。接收窗口用於告訴發送方,該接收方還有多少可用的緩存空間。因為TCP是全雙工通信,在連接兩端的發送方都各自維護一個接收窗口變數。 主機把當前的空閑接收緩存大小值放入它發給對方主機的報文段接收窗口欄位中,通知對方它在該連接的緩存中還有多少可用空間。
6 TCP連接管理
客戶機中的TCP會用以下方式與伺服器建立一條TCP連接:
第一步: 客戶機端首先向伺服器發送一個SNY比特被置為1報文段。該報文段中不包含應用層數據,這個特殊報文段被稱為SYN報文段。另外,客戶機會選擇一個起始序號,並將其放置到報文段的序號欄位中。為了避免某些安全性攻擊,這里一般隨機選擇序號。
第二步: 一旦包含TCP報文段的用戶數據報到達伺服器主機,伺服器會從該數據報中提取出TCPSYN報文段,為該TCP連接分配TCP緩存和控制變數,並向客戶機TCP發送允許連接的報文段。這個允許連接的報文段還是不包含應用層數據。但是,在報文段的首部卻包含3個重要的信息。
首先,SYN比特被置為1。其次,該 TCP報文段首部的確認號欄位被置為客戶端序號+1最後,伺服器選擇自己的初始序號,並將其放置到TCP報文段首部的序號欄位中。 這個允許連接的報文段實際上表明了:「我收到了你要求建立連接的、帶有初始序號的分組。我同意建立該連接,我自己的初始序號是XX」。這個同意連接的報文段通常被稱為SYN+ACK報文段。
第三步: 在收到SYN+ACK報文段後,客戶機也要給該連接分配緩存和控制變數。客戶機主機還會向伺服器發送另外一個報文段,這個報文段對伺服器允許連接的報文段進行了確認。因為連接已經建立了,所以該ACK比特被置為1,稱為ACK報文段,可以攜帶數據。
一旦以上3步完成,客戶機和伺服器就可以相互發送含有數據的報文段了。
為了建立連接,在兩台主機之間發送了3個分組,這種連接建立過程通常被稱為 三次握手(SNY、SYN+ACK、ACK,ACK報文段可以攜帶數據) 。這個過程發生在客戶機connect()伺服器,伺服器accept()客戶連接的階段。
假設客戶機應用程序決定要關閉該連接。(注意,伺服器也能選擇關閉該連接)客戶機發送一個FIN比特被置為1的TCP報文段,並進人FINWAIT1狀態。
當處在FINWAIT1狀態時,客戶機TCP等待一個來自伺服器的帶有ACK確認信息的TCP報文段。當它收到該報文段時,客戶機TCP進入FINWAIT2狀態。
當處在FINWAIT2狀態時,客戶機等待來自伺服器的FIN比特被置為1的另一個報文段,
收到該報文段後,客戶機TCP對伺服器的報文段進行ACK確認,並進入TIME_WAIT狀態。TIME_WAIT狀態使得TCP客戶機重傳最終確認報文,以防該ACK丟失。在TIME_WAIT狀態中所消耗的時間是與具體實現有關的,一般是30秒或更多時間。
經過等待後,連接正式關閉,客戶機端所有與連接有關的資源將被釋放。 因此TCP連接的關閉需要客戶端和伺服器端互相交換連接關閉的FIN、ACK置位報文段。
B. 計網筆記3 數據鏈路層
在物理層提供服務的基礎上,向網路層提供服務,最基本的服務試講源自網路層來的數據可靠低傳輸到相鄰節點的目標機網路層。主要作用是加強物理層傳輸原始比特流的功能,將物理層提供的可能出錯的物理連接改造稱為邏輯上無差錯的數據鏈路,是之對網路層表現為一條無差錯的鏈路。
功能一:為網路層提供服務。分為無確認無連接服務、有確認無連接服務、有確認面向連接服務
功能二:鏈路管理,即連接的建立、維持、釋放(用於面向連接的服務)
功能三:組幀
功能四:流量控制(限制發送方)
功能五:差錯控制:(幀錯/位錯)
形象理解:加入網路層是BOSS,數據鏈路層就是小秘書,來保障下面傳上來的數據正確。
封裝成幀:就是在一端數據前後添加首部和尾部,構成一個幀。接收端在收到物理層上交的比特流後,就能根據首部和尾部的標記,識別幀的開始和結束。
首部和尾部包含許多的控制信息,他們的一個重要作用:確定幀的界限
幀同步:接收方應當能從收到的二進制比特流中區分出幀的起始和終止。
透明傳輸是指不管所傳輸的數據是什麼樣的比特組合,都應當能夠在鏈路上傳送。因此鏈路層就「看不見」有什麼妨礙數據傳輸的東西。
比特差錯:實際的通信鏈路都不是理想的,比特在傳輸過程中可能會產生差錯:1可能會變成0,0也可能會變成1.稱為比特差錯。
在一段時間內,傳輸錯誤的比特占所傳輸比特綜述的比率稱為誤碼率BER(Bit Error Rate)
使用差錯檢測碼來監測數據在傳輸過程中是否產生了比特差錯,是數據鏈路層要解決的重要問題之一。
在待發送的數據後面添加一位奇偶校驗位,使整個數據中的1的個數為奇數(奇校驗)或偶數(偶校驗)。
如果有奇數個位發生誤碼,則奇偶性發生變化,可以檢查出誤碼
如果有偶數個位發生誤碼,則奇偶性不發生變化,不能檢查出誤碼(漏檢)
過程:
檢錯碼只能檢測出幀在傳輸過程中出現了差錯,但不能定位錯誤,無法糾正錯誤。
想要糾正傳書中的差錯,可以使用冗餘信息更多的糾錯碼進行前向糾錯。但糾錯碼的開銷比較大,在計算機網路中較少使用。
循環冗餘校驗CRC有很好的檢測能力(漏檢率非常低),雖然計算比較復雜,但是囈語用硬體實現,因此廣泛用於數據鏈路層
在計算機網路中通常採用檢錯重傳來糾正傳輸中的差錯,或僅僅是丟棄檢測到差錯的幀,取決於數據鏈路層向其上層提供的是可靠傳輸還是不可靠傳輸服務。
共享信道要著重考慮的一個問題就是如何協調多個發送和接收站點對一個共享傳輸媒體的佔用,即 媒體接入控制 (Medium Access Control).
C. 【網路協議筆記】計算機之間的通信和連接方式
計算機之間的通信是通過網路進行的,網路是計算機之間的一種通信方式。
那我們要如何進行網路通信呢?
首先我們需要知道對方的IP地址,通過IP地址獲取MAC地址(ARP廣播)。
然後把數據通過網卡傳送到對方的網路中。
如果網卡發現數據的目標MAC地址是自己,就會將數據傳遞給上一層進行處理。
如果網卡發現數據的目標MAC地址不是是自己,就會將數據丟掉。
圖片備用地址
下面我們看一下具體的連接方式。
兩台計算機之間最簡單的連接方式就是網線直連(交叉線)。
圖片備用地址
如果需要連接多台電腦怎麼辦?
第一個出現的同軸電纜的方式,是半雙工通信方式。
容易沖突(沖突域),而且只要一個連接點出問題全域癱瘓。
一台設備在發送數據的時候,另一台設備只能接收數據,不能發送數據。
採用的也是半雙工通信,但是比同軸電纜有個特甜:如果一台設備的連接出現問題也不會影響其他設備。
集線器和同軸電纜都是沒有智商的,是個機械性的設備。
只要有設備發數據,就把數據轉給其它所有已連接設備,設備越多效率越低。
圖片備用地址
下面是集線器傳輸數據的動態圖
圖片備用地址
網橋連接的是同一個網段的計算機。
它可以記錄左右兩邊的MAC地址,減少沒必要的廣播和傳輸,從而起到隔絕沖突域的作用。
圖片備用地址
交換器就比網橋更牛逼了,他可以記錄每一個網路節點的IP和MAC地址。
還有交換機是全雙工通信,沒有沖突域。
而且不會發數據發到其他設備,所以比集線器安全(不會因為抓包而攔截數據)。
但是首次發送數據時,還是會ARP廣播所有設備,因為此時交換機還不知道源和目標的MAC地址。
圖片備用地址
以上的設備必須是在同一個網段和廣播域,但是不能把所有的電腦用交換連接起來。
好幾億台的電腦用過廣播尋找對應IP地址的Mac地址,那這網路遭遇「廣播風暴」了。
所以路由的作用就出來了,路由是隔絕廣播域,如果是在不同網段之間轉發數據,就直接去尋找路由。
那如何去尋找路由呢? 是通過網關。我們在設置IP地址時,甚至的默認網關地址就是路由的地址。
(一般IP地址的最後設置成1。比如 192.168.0.1)。
主機發數據前,首先會判斷目標主機的IP地址跟它是否在同一個網段。
如果在同一個網段:ARP廣播,直接發送數據;
如果不在同一個網段:通過路由器轉發數據。
圖片備用地址
歡迎大家的意見和交流
email: [email protected]
D. 計算機網路自學筆記:選路演算法
網路層必須確定從發送方到接收方分組所經過的路徑。選路就是在網路中的路由器里的給某個數據報確定好路徑(即路由)。
一 台主機通常直接與一台路由器相連接,該路由器即為該主機的默認路由器,又稱為該主機的默認網關。 每當某主機向外部網路發送一個分組時,該分組都被傳送給它的默認網關。
如果將源主機的默認網關稱為源路由器,把目的主機的默認網關稱為目的路由器。為一個分組從源主機到目的主機選路的問題於 是可歸結為從源路由器到目的路由器的選路問題。
選路演算法的目標很簡單:給定一組路由器以及連接路由器的鏈路,選路演算法要找到一條從源路由器到目的路由器的最好路徑,通常一條好路徑是指具有最低費用的路徑。
圖 G=(N,E)是一個 N 個節點和 E 條邊的集合,其中每條邊是來自 N 的一對節點。在網 絡選路的環境中,節點表示路由器,這是做出分組轉發決定的節點,連接節點的邊表示路由 器之間的物理鏈路。
一條邊有一個值表示它的費用。通常一條邊的費用可反映出對應鏈路的物理長度、鏈路速度或與該鏈路相關的費用。
對於 E 中的任一條邊(xy)可以用 c(xy )表示節點 x 和 y 間邊的費用。一般考慮的都是無向 圖,因此邊(xy)與邊(y x)是相同的並且開銷相等。節點 y 也被稱為節點 x 的鄰居。
在圖中為各條邊指派了費用後,選路演算法的目標自然是找出從源到目的間的最低費用路徑。圖 G=(N,E)中的一條路徑(Path)是一個節點的序列,使得每一對以(x1,x2), (x2,x3),…,是 E 中的邊。路徑的費用是沿著路徑所有邊費用的總和。
從廣義上來說,我們對 選路演算法分類的一種方法就是根據該演算法是全局性還是分布式來區分的。
.全局選路演算法: 用完整的、全局性的網路信息來計算從源到目的之間的最低費用路徑。
實際上, 具有全局狀態信息的演算法常被稱作鏈路狀態 LS 演算法, 因為該演算法必須知道網路中每條鏈路的費用。
.分布式選路演算法: 以迭代的、分布式的方式計算出最低費用路徑。通過迭代計算並與相鄰節點交換信息,逐漸計算出到達某目的節點或一組目的節點的最低費用路徑。
DV 演算法是分布式選路演算法, 因為每個節點維護到網路中的所有其他節點的費用(距離)估計的矢量。
選路演算法的第二種廣義分類方法是根據演算法是靜態的還是動態的來分類。
一: 鏈路狀態選路演算法 LS
在鏈路狀態演算法中,通過讓每個節點向所有其他路由器廣播鏈路狀態分組, 每個鏈路狀態分組包含它所連接的鏈路的特徵和費用, 從而網路中每個節點都建立了關於整個網路的拓撲。
Dijkstra 演算法計算從源節點到網路中所有其他節點的最低費用路徑.
Dijkstra 演算法是迭代演算法,經演算法的第 k 次迭代後,可知道到 k 個目的節點的最低費用路徑。
定義下列記號:
D(V)隨著演算法進行本次迭代,從源節點到目的節點的最低費用路徑的費用。
P(v)從源節點到目的節點 v 沿著當前最低費用路徑的前一節點(,的鄰居)。
N`節點子集;如果從源節點到目的節點 v 的最低費用路徑已找到,那麼 v 在 N`中。
Dijkstra 全局選路演算法由一個初始化步驟和循環組成。循環執行的次數與網路中的節點個數相同。在結束時,演算法會計算出從源節點 u 到網路中每個其他節點的最短路徑。
考慮圖中的網路,計算從 u 到所有可能目的地的最低費用路徑。
.在初始化階段 ,從 u 到與其直接相連的鄰居 v、x、w 的當前已知最低費用路徑分別初始化為 2,1 和 5。到 y 與 z 的費用被設為無窮大,因為它們不直接與 u 連接。
.在第一次迭代時, 需要檢查那些還未加到集合 N`中的節點,找出在前一次迭代結束時具有最低費用的節點。那個節點是 x 其費用是 1,因此 x 被加到集合 N`中。然後更新所有節點的 D(v),產生下表中第 2 行(步驟)所示的結果。到 v 的路徑費用未變。經過節點 x 到 w 的 路徑的費用被確定為 4。因此沿從 u 開始的最短路徑到 w 的前一個節點被設為 x。類似地, 到 y 經過 x 的費用被計算為 2,且該表項也被更新。
.在第二次迭代時 ,節點 v 與 y 被發現具有最低費用路徑 2。任意選擇將 y 加到集合 N` 中,使得 N』中含有 u、x 和 y。通過更新,產生如表中第 3 行所示的結果。
.以此類推…
當 LS 演算法結束時,對於每個節點都得到從源節點沿著它的最低費用路徑的前繼節點, 對於每個前繼節點,又有它的前繼節點,按照此方式可以構建從源節點到所有目的節點的完 整路徑。
根據從 u 出發的最短路徑,可以構建一個節點(如節點 u)的轉發表。
二 距離矢量選路演算法 DV
LS 演算法是一種使用全局信息的演算法,而距離矢量演算法是一種迭代的、非同步的和分布式的演算法。
Bellman-Ford 方程:
設 dx(y)是從節點 x 到節點 y 的最低費用路徑的費用,則有 dx(y) = min {c(x,v) + dv(y) }
PS: 方程中的 min,是指取遍 x 的所有鄰居。
Bellman-Ford 方程含義相當直觀,意思是從 x 節點出發到 y 的最低費用路徑肯定經過 x 的某個鄰居,而且 x 到這個鄰居的費用加上這個鄰居到達目的節點 y 費用之和在所有路徑 中其總費用是最小的。 實際上,從 x 到 v 遍歷之後,如果取從 v 到 y 的最低費用路徑,該路 徑費用將是 c(x,v)+ dv(y)。因此必須從遍歷某些鄰居 v 開始,從 x 到 y 的最低費用是對所有鄰 居的 c(x,v)+dv(y)的最小值。
在該 DV 演算法中,當節點 x 看到它的直接相連的鏈路費用變化,或從某個鄰居接收到一 個距離矢量的更新時,就根據 Bellman-Ford 方程更新其距離矢量表。
三 LS 與 DV 選路演算法的比較
DV 和 LS 演算法採用不同的方法來解決計算選路問題。
在 DV 演算法中,每個節點僅與它的直接相連鄰居交換信息,但它為它的鄰居提供了從其 自己到網路中(它所知道的)所有其他節點的最低費用估計。
在 LS 演算法中,每個節點(經廣播)與所有其他節點交換信息,但它僅告訴它們與它直接 相連鏈路的費用。
·報文復雜性:
LS 演算法要求每個節點都知道網路中每條鏈路的費用,需要發送 O(nE)個消息。
DV 演算法要求在每次迭代時,在兩個直接相連鄰居之間交換報文,演算法收斂所需的時間 依賴於許多因素。當鏈路費用改變時,DV 演算法僅當在會導致該節點的最低費用路徑發生改 變時,才傳播已改變的鏈路費用。
·收效速度:
DV演算法收斂較慢,且在收斂時會遇到選路環路。DV演算法還會遭受到計數到無窮的問題。
•健壯性: 在 LS 演算法中,如果一台路由器發生故障、或受到破壞,路由器會向其連接的鏈路廣播 不正確費用,導致整個網路的錯誤。
在 Dv 演算法下, 每次迭代時,其中一個節點的計算結果會傳遞給它的鄰居,然後在下次迭代時再間接地傳遞給鄰居的鄰居。在這種情況下,DV 演算法中一個不正確的計算結果也會擴散到整個網路。
四.層次選路
兩個原因導致層次的選路策略:
•規模: 隨著路由器數目增長,選路信息的計算、存儲及通信的開銷逐漸增高。
•管理自治: 一般來說,一個單位都會要求按自己的意願運行路由器(如運行其選擇的某 種選路演算法),或對外部隱藏其內部網路的細節。
層次的選路策略是通過將路由器劃分成自治系統 AS 來實施的。
每個 AS 由一組通常在相同管理控制下的路由器組成(例如由相同的 ISP 運營或屬於相同 的公司網路)。在相同的 AS 內的路由器都全部運行同樣的選路演算法。
在一個自治系統內運行的選路演算法叫做自治系統內部選路協議。 在一個 AS 邊緣的一台 或多台路由器,來負責向本 AS 之外的目的地轉發分組,這些路由器被稱為網關路由器
在各 AS 之間,AS 運行相同的自治系統間選路協議。
E. 計算機網路筆記——數據鏈路層
封裝成幀 :在一段數據的前後部分添加 首部 和 尾部 ,這樣就構成了一個幀。
接收端在收到物理層上交的比特流後,就能根據首部和尾部的標記,從收到的比特流中識別幀的開始和結束.
首部和尾部包含許多的控制信息,他們的一個重要作用: 幀定界 (確定幀的界限)。
幀同步 :接收方應當能從接收到的二進制比特流中區分出幀的起始和終止。
1. 字元計數法
2. 字元(節)填充法
3. 零比特填充法
4. 違規編碼法。
位元組計數法 : Count欄位的脆弱性(其值若有差錯將導致災難性後果)
字元填充法 : 實現上的復雜性和不兼容性
目前較普遍使用的幀同步法是 比特填充 和 違規編碼法 。
差錯源於雜訊:
冗餘編碼: 在數據前面添加校驗數據,和最終收到的數據比對是否有誤,有誤證明傳輸出錯
板栗🌰
一段晦澀的話
「可靠傳輸」:數據鏈路層發送端發送什麼,接收端就收到什麼。
鏈路層使用CRC檢驗,能夠實現無比特差錯的傳輸,但這還不是可靠傳輸。
原理: 多個校驗位同時檢驗一個數據
構成: 檢驗位和數據位
檢驗位個數:海明不等式 2^r >= k + r + 1 計算得出(r為檢驗位個數,k為數據位位數)
檢驗位位置:2的(1-r次方)
編碼: (以數據D = 101101為例)
最終傳輸數據(海明碼): 00 1 0 011 1 01
校驗:
🌰🌰板栗+1
F. 計算機網路第1章(概述)
計算機網路微課堂 的筆記整理
筆記也放到了 我的github 和 我的gitee 上
代表著主機
代表伺服器
代表著路由器
代表著網路
中國互聯網路信息中心CNNIC
網路:網路(Network)由若干 結點(Node) 和連接這些結點的 鏈路(Link) 組成。
互連網(互聯網):多個網路通過路由器互連起來,這樣就構成了一個覆蓋范圍更大的網路,即互連網(互聯網)。因此,互聯網又稱為「網路的網路(Network of Networks)」。
網際網路:網際網路(Internet)是世界上最大的互連網路(用戶數以億計,互連的網路數以百萬計)。
網際網路服務提供者 ISP ( I nternet S ervice P rovider)
中國的三大 ISP :中國電信,中國聯通和中國移動
基於ISP的三層結構的網際網路
端系統之間通信的含義
「主機 A 和主機 B 進行通信」實際上是指:「運行在主機 A 上的某個程序和運行在主機 B 上的另一個程序進行通信」。 即「主機 A 的某個進程和主機 B 上的另一個進程進行通信」。簡稱為「計算機之間通信」。
端系統之間的通信方式通常可劃分為兩大類:
客戶-伺服器方式:
對等連接方式:
網路核心部分是互聯網中最復雜的部分。
網路中的核心部分要向網路邊緣中的大量主機提供連通性,使邊緣部分中的任何一個主機都能夠向其他主機通信(即傳送或接收各種形式的數據)。
在網路核心部分起特殊作用的是 路由器 (router)。
路由器 是實現 分組交換 (packet switching) 的關鍵構件,其任務是 轉發 收到的分組,這是網路核心部分最重要的功能。
發送方
路由器
接收方
報文交換中的交換結點也採用存儲轉發方式,但報文交換對報文的大小沒有限制,這就要求交換結點需要較大的緩存空間。報文交換主要用於早期的電報通信網,現在較少使用, 通常被較先進的分組交換方式所取代 。
分析:
電路交換:
報文交換:
分組交換:
按交換技術分類:
按使用者分類:
按傳輸介質分類:
按覆蓋范圍分類:
作用范圍通常為幾十到幾千公里,因而有時也稱為遠程網(long haul network)。廣域網是互聯網的核心部分,其任務是通過長距離(例如,跨越不同的國家)運送主機所發送的數據。
作用范圍一般是一個城市,可跨越幾個街區甚至整個城市
一般用微型計算機或工作站通過高速通信線路相連(速率通常在 10 Mbit/s 以上),但地理上范圍較小(1 km 左右)
就是在個人工作的地方把個人使用的電子設備用無線技術連接起來的網路。
按拓撲結構分類:
時延時指數據(一個報文或分組,甚至比特)從網路(或鏈路)的一端傳送到另一端所需的時間。
網路時延由幾部分組成:
主機或路由器發送數據幀所需要的時間,也就是從發送數據幀的第一個比特算起,到該幀的最後一個比特發送完畢所需的時間。
電磁波在信道中傳播一定的距離需要花費的時間。
主機或路由器在收到分組時要花費一定時間進行處理
分組在進過網路傳輸時,要經過許多路由器。但分組在進入路由器後要先在輸入隊列中排隊等待處理。
時延帶寬積 = 傳播時延 * 帶寬
互聯網上的信息不僅僅單方向傳輸而是雙向交互的。因此,我們有時很需要知道 雙向交互一次所需的時間 。
利用率有 信道利用率 和 網路利用率 兩種。
物理層問題
數據鏈路層問題
網路層問題
運輸層問題
應用層問題
總結
例子:主機的瀏覽器如何與Web伺服器進行通信
解析:
主機和Web伺服器之間基於網路的通信,實際上是主機中的 瀏覽器應用進程 與Web伺服器中的 Web伺服器應用進程 之間基於 網路的通信
體系結構的各層在整個過程中起到怎樣的作用?
1、發送方發送
G. 計算機網路自頂向下方法讀書筆記
link
Client發送一個特殊的 SYN報文段 (標志位SYN置為1)。隨機產生一個初始序號值seq=x,發送給Server,Client進入SYN_SENT狀態,等待Server確認。
Server收到數據包後由標志位SYN=1知道Client請求建立連接,會為該TCP連接分配TCP緩存和變數。並向client發送允許連接報文段的ACK報文段(ACK標志位設置為1),報文段中SYN=1, ack=x+1,並隨機產生一個服務端的初始序號seq=y。發送後,Server進入SYN_RCVD狀態。
Client收到確認後,也要給該連接分配緩存和變數。將發送一個ACK報文段對伺服器的允許連接的報文段進行確認。設置ack=y+1。因為連接已被建立了SYN被置為0。Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。以後每個階段中SYN都將被置為0.
Client(也可以是server,後面流程相反)設置seq=u, 發送一個FIN報文段(FIN標志位設置為1),Client進入FIN_WAIT_1狀態。表示client沒有數據要發送給server了。
Server收到FIN後,發送一個ACK報文段給Client,ack=u+1,並隨機產生一個服務端的初始序號seq=v, Server進入CLOSE_WAIT狀態。表示「同意」client關閉請求
Server發送一個FIN報文段,用來請求關閉Server到Client的數據傳送,同時包含ack=u+1,並隨機產生一個服務端的初始序號seq=w,server進入LAST_ACK狀態。
Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK報文段ack=w+1給Server, Server收到後進入CLOSED狀態。client在等待了某個固定時間(兩個最大段生命周期,2MSL)之後,沒有收到伺服器端的 ACK ,認為伺服器端已經正常關閉連接,於是自己也關閉連接,進入 CLOSED 狀態。(目的是如果server由於網路原因沒有收到最後的ACK,server將會再發送一個FIN,但若此時client已經CLOSED,則無法回復。因此引入了等待2MSL的流程)。自此就完成了四次揮手,主機中的連接資源也被釋放。
其中 生存時間(TTL) 欄位用來確保數據不會永遠在網路中循環。每當一台路由器處理數據報時,該欄位的值減1。若TTL欄位減為0,則該數據報必須丟棄。
跨網路通信需要經過路由器,同一網路間的通信不需要。127隻有127.0.0.1一個地址可用,代表當前計算機自己。255.255.255.255是 廣播地址 。當一台主機向廣播地址發出數據報時,該報文會交付給網路中的所有主機。
H. 計算機網路交換技術的數據交換
數據交換的基本概念
通常將數據在通信子網中各節點間的數據傳輸過程稱為數據交換。 (circuit switched network)
線路交換是相對於分組交換的一個概念。電路交換要求必須首先在通信雙方之間建立連接通道。在連接建立成功之後,雙方的通信活動才能開始。通信雙方需要傳遞的信息都是通過已經建立好
的連接來進行傳遞的,而且這個連接也將一直被維持到雙方的通信結束。在某次通信活動的整個過程中,這個連接將始終佔用著連接建立開始時,通信系統分配給它的資源(通道、帶寬、時隙、碼字等等),這也體現了電路交換區別於分組交換的本質特徵。
線路交換的特點是:數據傳輸可靠、迅速、有序,但線路利用率低、浪費嚴重,不適合計算機網路。 (message switched network)
是數據交換的三種方式之一,報文整個地發送,一次一跳。報文交換是分組交換的前身,是由列奧納德·克萊因饒克於1961年提出的。
報文交換的主要特點是:存儲接受到的報文,判斷其目標地址以選擇路由,最後,在下一跳路由空閑時,將數據轉發給下一跳路由。報文交換系統現今都由分組交換或電路交換網路所承載。
報文交換採用存儲-轉發方式進行傳送,無需事先建立線路,事後更無需拆除。它的優點是:線路利用率高、故障的影響小、可以實現多目的報文;缺點是:延遲時間長且不定、對中間節點的要求高、通信不可靠、失序等,不適合計算機網路。
報文的優點是:高效、靈活、迅速、可靠、經濟,但存在如下的缺點:有一定的延遲時間、額外的開銷會影響傳輸效率、實現技術復雜等。 (packet switched network)
分組交換是一種數位通信網路。它將資料組合成適當大小的區塊,稱為封包,再通過網路來傳輸。這個傳送封包的網路是共享的,每個單位都可以獨立把封包再傳送出去,而且配置自己需要的資源。
封包交換的基本原則是最佳化的使用連線負載能力,最小化回應時間,以及增進通訊的健全性。
分組交換適用於計算機網路,在實際應用中有兩種類型:虛電路方式和數據報方式。虛電路方式類似線路交換,只不過對信道的使用是非獨占方式;數據報方式類似報文交換。
I. 計算機網路筆記——數據鏈路層(停等協議、GBN、SR)
流量控制:防止發送端發送和接收端接收速度不匹配造成傳輸錯誤
傳輸層和數據鏈路層均有流量控制,但是控制手法不一樣
傳輸層:端到端,接收端向發送端發送一個窗口公告。告訴發送端目前我能接收多少
數據鏈路層:點到點,接收端接收不下的就不回復確認(ack),讓發送端自己重傳
涉及協議較多分批寫
優點 :最簡單的控制協議
缺點 :但是性能較弱,信道利用率低
控制方法 :
發送方:發送一個幀
接收方:接收到幀後返回改幀的ack
發送方:接收到ack後發送下一個幀
差錯控制 :
注意 :
滑動窗口協議是基於停止等待協議的優化版本
停止等待協議性能是因為需要等待ack之後才能發送下一個幀,在傳送的很長時間內信道一直在等待狀態
滑動窗口則利用緩沖思想,允許連續發送(未收到ack之前)多個幀,以加強信道利用
窗口 :其實就是緩沖幀的一個容器,將處理好的幀發送到緩沖到窗口,可以發送時就可以直接發送,藉此優化性能。一個幀對應一個窗口。
GBN是滑動窗口中的一種,其中 發送窗口 > 1 , 接收窗口=1 因發送錯誤後需要退回到最後正確連續幀位置開始重發,故而得名。
控制方法 :
發送端:在將發送窗口內的數據連續發送
接收端:收到一個之後向接收端發送累計確認的ack
發送端:收到ack後窗口後移發送後面的數據
累計確認 :累計確認允許接收端一段時間內發送一次ack而不是每一個幀都需要發送ack。該確認方式確認代表其前面的幀都以正確接收到
eg:發送端發送了編號 0,1,2,3,4,5 的幀,等待一段時間後(超過3的超時計時器)累計收到的ack對應 0,2 幀,則證明已經成功 0,1,2 均已經成功接收, 3 傳輸錯誤。並且哪怕 4,5 兩個幀接收成功後也不會返回 4,5 的ack會一直等待從 3 開始重傳
差錯控制 :
發送幀丟失、ack丟失、ack遲到 等處理方法基本和停等協議相同,不同的是採用累計確認恢復的方式,當前面的幀出錯之後後面幀無論是否發送成功都要重傳
優點:信道利用率高(利用窗口有增加發送端佔用,並且減少ack回復次數)
缺點:累計確認使得該方法只接收正確順序的幀,而不接受亂序的幀,錯誤重傳浪費嚴重
發送窗口大小問題
窗口理論上是越多性能越好,但是窗口不能無限大,n比特編碼最大隻能2^(n-1)個窗口,否則會造成幀無法區分(本質就是留了一個比特區分兩組幀)
SR協議可以說是GBN的plus版本,在GBN的基礎上改回每一個幀都要確認的機制,解決了累計確認只接收順序幀的弊端只需要重發錯誤幀。
其中 發送窗口 > 1 , 接收窗口 > 1 , 接收窗口 > 發送窗口 (建議接 收窗口 = 發送窗口 接收窗口少了溢出多了浪費).
控制方法 :
發送端:將窗口內的數據連續發送
接收端:收到一個幀就將該幀緩存到窗口中並回復一個ack
接收端:接收到順序幀後將數據提交給上層並接收窗口後移(若接收到的幀不是連續的順序幀時接收窗口不移動)
發送端:接收到順序幀的ack後發送窗口後移(同理發送窗口接收到的ack不連續也不移動)
差錯控制 :
發送幀丟失、ack丟失、ack遲到 三類處理方式仍然和停等協議相同,不同的是SR向上層提交的是多個連續幀,停等只提交一個幀(不連續的幀要等接收或重傳完成後才會提交)
發送窗口大小問題
同GBN一樣,發送窗口和接收窗口都不能無限多,且不說緩存容量問題,當兩組幀同時發送時會造成無法區分,大小上限仍然是2^(n-1)個窗口(本質就是留了一個比特寫組號)
窗口大小這里留一張截圖,方便理解
假設窗口大小都為3(圖中編號到了3是借4窗口的圖,正常應編號到2,但是不妨礙理解)
左邊是錯誤重發,第一組的0幀ack丟失了
右邊是正常收發
三種協議對比:
停等協議:單線程的傻子,簡單不易出錯,但是效率極其低下
GBN:假的多線程(接收端太坑啦),接收端是情種,只等待自己哪一個幀,丟棄了後來的幀
SR:多線程,接收端有收藏癖,等待集齊一套召喚神龍(提交給上層這只神龍……)