導航:首頁 > 網路連接 > 計算機網路可靠和無差錯

計算機網路可靠和無差錯

發布時間:2023-08-18 23:09:25

❶ TCP協議詳解及實戰解析【精心整理收藏】

TCP協議是在TCP/IP協議模型中的運輸層中很重要的一個協議、負責處理主機埠層面之間的數據傳輸。主要有以下特點:

1.TCP是面向鏈接的協議,在數據傳輸之前需要通過三次握手建立TCP鏈接,當數據傳遞完成之後,需要通過四次揮手進行連接釋放。

2.每一條TCP通信都是兩台主機和主機之間的,是點對點傳輸的協議。

3.TCP提供可靠的、無差錯、不丟失、不重復,按序到達的服務。

4.TCP的通信雙方在連接建立的任何時候都可以發送數據。TCP連接的兩端都設有發送緩存和接收緩存,用來臨時存放雙向通信的數據。

5.面向位元組流。在數據傳輸的過程中如果報文比較長的話TCP會進行數據分段傳輸,每一條分段的TCP傳輸信息都帶有分段的序號,每一段都包含一部分位元組流。接收方根據每段攜帶的的序號信息進行數據拼接,最終拼接出來初始的傳輸數據。但是在整個傳輸的過程中每一段TCP攜帶的都是被切割的位元組流數據。所以說TCP是面向位元組流的。

a.TCP和UDP在發送報文時所採用的方式完全不同。TCP並不關心應用程序一次把多長的報文發送到TCP緩存中,而是根據對方給出的窗口值和當前網路擁塞的程度來決定一個報文段應包含多少個位元組(UDP發送的報文長度是應用程序給出的)。
b.如果應用程序傳送到TCP緩存的數據塊太大,TCP就可以把它劃分短一些再傳。TCP也可以等待積累有足夠多的位元組後再構建成報文段發送出去。

各欄位含義:

源埠:發送端的埠號

目的埠:接收端的埠號

序號:TCP將發送報文分段傳輸的時候會給每一段加上序號,接收端也可以根據這個序號來判斷數據拼接的順序,主要用來解決網路報亂序的問題

確認號:確認號為接收端收到數據之後進行排序確認以及發送下一次期待接收到的序號,數值 = 接收到的發送號 + 1

數據偏移:佔4比特,表示數據開始的地方離TCP段的起始處有多遠。實際上就是TCP段首部的長度。由於首部長度不固定,因此數據偏移欄位是必要的。數據偏移以32位為長度單位,因此TCP首部的最大長度是60(15*4)個位元組。

控制位:

URG:此標志表示TCP包的緊急指針域有效,用來保證TCP連接不被中斷,並且督促 中間層設備要盡快處理這些數據;

ACK:此標志表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1, 為1的時候表示應答域有效,反之為0;

PSH:這個標志位表示Push操作。所謂Push操作就是指在數據包到達接收端以後,立即傳送給應用程序, 而不是在緩沖區中排隊;

RST:這個標志表示連接復位請求。用來復位那些產生錯誤的連接,也被用來拒絕錯誤和非法的數據包;

SYN:表示同步序號,用來建立連接。SYN標志位和ACK標志位搭配使用,當連接請求的時候,SYN=1, ACK=0;連接被響應的時候,SYN=1,ACK=1;這個標志的數據包經常被用來進行埠掃描。掃描者發送 一個只有SYN的數據包,如果對方主機響應了一個數據包回來 ,就表明這台主機存在這個埠;但是由於這 種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一台安全 的主機將會強制要求一個連接嚴格的進行TCP的三次握手;

FIN: 表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據可以傳送了,發送FIN標志 位的TCP數據包後,連接將被斷開。這個標志的數據包也經常被用於進行埠掃描。

窗口:TCP里很重要的一個機制,佔2位元組,表示報文段發送方期望接收的位元組數,可接收的序號范圍是從接收方的確認號開始到確認號加上窗口大小之間的數據。後面會有實例講解。

校驗和:校驗和包含了偽首部、TCP首部和數據,校驗和是TCP強制要求的,由發送方計算,接收方驗證

緊急指針:URG標志為1時,緊急指針有效,表示數據需要優先處理。緊急指針指出在TCP段中的緊急數據的最後一個位元組的序號,使接收方可以知道緊急數據共有多長。

選項:最常用的選項是最大段大小(Maximum Segment Size,MSS),向對方通知本機可以接收的最大TCP段長度。MSS選項只在建立連接的請求中發送。

放在乙太網幀里看TCP的位置

TCP 數據包在 IP 數據包的負載裡面。它的頭信息最少也需要20位元組,因此 TCP 數據包的最大負載是 1480 - 20 = 1460 位元組。由於 IP 和 TCP 協議往往有額外的頭信息,所以 TCP 負載實際為1400位元組左右。

因此,一條1500位元組的信息需要兩個 TCP 數據包。HTTP/2 協議的一大改進, 就是壓縮 HTTP 協議的頭信息,使得一個 HTTP 請求可以放在一個 TCP 數據包裡面,而不是分成多個,這樣就提高了速度。

乙太網數據包的負載是1500位元組,TCP 數據包的負載在1400位元組左右

一個包1400位元組,那麼一次性發送大量數據,就必須分成多個包。比如,一個 10MB 的文件,需要發送7100多個包。

發送的時候,TCP 協議為每個包編號(sequence number,簡稱 SEQ),以便接收的一方按照順序還原。萬一發生丟包,也可以知道丟失的是哪一個包。

第一個包的編號是一個隨機數。為了便於理解,這里就把它稱為1號包。假定這個包的負載長度是100位元組,那麼可以推算出下一個包的編號應該是101。這就是說,每個數據包都可以得到兩個編號:自身的編號,以及下一個包的編號。接收方由此知道,應該按照什麼順序將它們還原成原始文件。

收到 TCP 數據包以後,組裝還原是操作系統完成的。應用程序不會直接處理 TCP 數據包。

對於應用程序來說,不用關心數據通信的細節。除非線路異常,否則收到的總是完整的數據。應用程序需要的數據放在 TCP 數據包裡面,有自己的格式(比如 HTTP 協議)。

TCP 並沒有提供任何機制,表示原始文件的大小,這由應用層的協議來規定。比如,HTTP 協議就有一個頭信息Content-Length,表示信息體的大小。對於操作系統來說,就是持續地接收 TCP 數據包,將它們按照順序組裝好,一個包都不少。

操作系統不會去處理 TCP 數據包裡面的數據。一旦組裝好 TCP 數據包,就把它們轉交給應用程序。TCP 數據包裡面有一個埠(port)參數,就是用來指定轉交給監聽該埠的應用程序。

應用程序收到組裝好的原始數據,以瀏覽器為例,就會根據 HTTP 協議的Content-Length欄位正確讀出一段段的數據。這也意味著,一次 TCP 通信可以包括多個 HTTP 通信。

伺服器發送數據包,當然越快越好,最好一次性全發出去。但是,發得太快,就有可能丟包。帶寬小、路由器過熱、緩存溢出等許多因素都會導致丟包。線路不好的話,發得越快,丟得越多。

最理想的狀態是,在線路允許的情況下,達到最高速率。但是我們怎麼知道,對方線路的理想速率是多少呢?答案就是慢慢試。

TCP 協議為了做到效率與可靠性的統一,設計了一個慢啟動(slow start)機制。開始的時候,發送得較慢,然後根據丟包的情況,調整速率:如果不丟包,就加快發送速度;如果丟包,就降低發送速度。

Linux 內核裡面 設定 了(常量TCP_INIT_CWND),剛開始通信的時候,發送方一次性發送10個數據包,即"發送窗口"的大小為10。然後停下來,等待接收方的確認,再繼續發送。

默認情況下,接收方每收到 兩個 TCP 數據包,就要 發送 一個確認消息。"確認"的英語是 acknowledgement,所以這個確認消息就簡稱 ACK。

ACK 攜帶兩個信息。

發送方有了這兩個信息,再加上自己已經發出的數據包的最新編號,就會推測出接收方大概的接收速度,從而降低或增加發送速率。這被稱為"發送窗口",這個窗口的大小是可變的。

注意,由於 TCP 通信是雙向的,所以雙方都需要發送 ACK。兩方的窗口大小,很可能是不一樣的。而且 ACK 只是很簡單的幾個欄位,通常與數據合並在一個數據包裡面發送。

即使對於帶寬很大、線路很好的連接,TCP 也總是從10個數據包開始慢慢試,過了一段時間以後,才達到最高的傳輸速率。這就是 TCP 的慢啟動。

TCP 協議可以保證數據通信的完整性,這是怎麼做到的?

前面說過,每一個數據包都帶有下一個數據包的編號。如果下一個數據包沒有收到,那麼 ACK 的編號就不會發生變化。

舉例來說,現在收到了4號包,但是沒有收到5號包。ACK 就會記錄,期待收到5號包。過了一段時間,5號包收到了,那麼下一輪 ACK 會更新編號。如果5號包還是沒收到,但是收到了6號包或7號包,那麼 ACK 裡面的編號不會變化,總是顯示5號包。這會導致大量重復內容的 ACK。

如果發送方發現收到 三個 連續的重復 ACK,或者超時了還沒有收到任何 ACK,就會確認丟包,即5號包遺失了,從而再次發送這個包。通過這種機制,TCP 保證了不會有數據包丟失。

TCP是一個滑動窗口協議,即一個TCP連接的發送端在某個時刻能發多少數據是由滑動窗口控制的,而滑動窗口的大小實際上是由兩個窗口共同決定的,一個是接收端的通告窗口,這個窗口值在TCP協議頭部信息中有,會隨著數據的ACK包發送給發送端,這個值表示的是在接收端的TCP協議緩存中還有多少剩餘空間,發送端必須保證發送的數據不超過這個剩餘空間以免造成緩沖區溢出,這個窗口是接收端用來進行流量限制的,在傳輸過程中,通告窗口大小與接收端的進程取出數據的快慢有關。另一個窗口是發送端的擁塞窗口(Congestion window),由發送端維護這個值,在協議頭部信息中沒有,滑動窗口的大小就是通告窗口和擁塞窗口的較小值,所以擁塞窗口也看做是發送端用來進行流量控制的窗口。滑動窗口的左邊沿向右移動稱為窗口合攏,發生在發送的數據被確認時(此時,表明數據已被接收端收到,不會再被需要重傳,可以從發送端的發送緩存中清除了),滑動窗口的右邊沿向右移動稱為窗口張開,發生在接收進程從接收端協議緩存中取出數據時。隨著發送端不斷收到的被發送數據的ACK包,根據ACK包中的確認序號和通告窗口大小使滑動窗口得以不斷的合攏和張開,形成滑動窗口的向前滑動。如果接收進程一直不取數據,則會出現0窗口現象,即滑動窗口左邊沿與右邊沿重合,此時窗口大小為0,就無法再發送數據。

在TCP里,接收端(B)會給發送端(A)報一個窗口的大小,叫Advertised window。

1.在沒有收到B的確認情況下,A可以連續把窗口內的數據都發送出去。凡是已經發送過的數據,在

未收到確認之前都必須暫時保留,以便在超時重傳時使用。

2.發送窗口裡面的序號表示允許發送的序號。顯然,窗口越大,發送方就可以在收到對方確認之前連續

發送更多數據,因而可能獲得更高的傳輸效率。但接收方必須來得及處理這些收到的數據。

3.發送窗口後沿的後面部分表示已發送且已收到確認。這些數據顯然不需要再保留了。

4.發送窗口前沿的前面部分表示不允許發送的,應為接收方都沒有為這部分數據保留臨時存放的緩存空間。

5.發送窗口後沿的變化情況有兩種:不動(沒有收到新的確認)和前移(收到了新的確認)

6.發送窗口前沿的變化情況有兩種:不斷向前移或可能不動(沒收到新的確認)

TCP的發送方在規定時間內沒有收到確認就要重傳已發送的報文段。這種重傳的概念很簡單,但重傳時間的選擇確是TCP最復雜的問題之一。TCP採用了一種自適應演算法,它記錄一個報文段發出的時間,以及收到響應的確認的時間

這兩個時間之差就是報文段的往返時間RTT。TCP保留了RTT的一個加權平均往返時間。超時重傳時間RTO略大於加權平均往返時間

RTT:
即Round Trip Time,表示從發送端到接收端的一去一回需要的時間,tcp在數據傳輸過程中會對RTT進行采樣(即對發送的數據包及其ACK的時間差進行測量,並根據測量值更新RTT值,具體的演算法TCPIP詳解裡面有),TCP根據得到的RTT值更新RTO值,即Retransmission TimeOut,就是重傳間隔,發送端對每個發出的數據包進行計時,如果在RTO時間內沒有收到所發出的數據包的對應ACK,則任務數據包丟失,將重傳數據。一般RTO值都比采樣得到的RTT值要大。

如果收到的報文段無差錯,只是未按序號,中間還缺少一些序號的數據,那麼能否設法只傳送缺少的數據而不重傳已經正確到達接收方的數據?

答案是可以的,選擇確認就是一種可行的處理方法。

如果要使用選項確認SACK,那麼在建立TCP連接時,就要在TCP首部的選項中加上「允許SACK」的選項,而雙方必須都事先商定好。如果使用選擇確認,

那麼原來首部中的「確認號欄位」的用法仍然不變。SACK文檔並沒有明確發送方應當怎麼響應SACK.因此大多數的實現還是重傳所有未被確認的數據塊。

一般說來,我們總是希望數據傳輸的更快一些,但如果發送方把數據發送的過快,接收方就可能來不及接收,這會造成數據的丟失。所謂流量控制就是讓發送方的發送速率不要太快,要讓接收方來得及接收。

計算機網路中的鏈路容量,交換節點中的緩存和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的性能就要變壞。這種情況就叫做擁塞。

擁塞控制方法:

1.慢開始和擁塞避免

2.快重傳和快恢復

3.隨機早期檢測

1.一開始,客戶端和服務端都處於CLOSED狀態

2.先是服務端主動監聽某個埠,處於LISTEN狀態(比如服務端啟動,開始監聽)。

3.客戶端主動發起連接SYN,之後處於SYN-SENT狀態(第一次握手,發送 SYN = 1 ACK = 0 seq = x ack = 0)。

4.服務端收到發起的連接,返回SYN,並且ACK客戶端的SYN,之後處於SYN-RCVD狀態(第二次握手,發送 SYN = 1 ACK = 1 seq = y ack = x + 1)。

5.客戶端收到服務端發送的SYN和ACK之後,發送ACK的ACK,之後處於ESTABLISHED狀態(第三次握手,發送 SYN = 0 ACK = 1 seq = x + 1 ack = y + 1)。

6.服務端收到客戶端的ACK之後,處於ESTABLISHED狀態。

(需要注意的是,有可能X和Y是相等的,可能都是0,因為他們代表了各自發送報文段的序號。)

TCP連接釋放四次揮手

1.當前A和B都處於ESTAB-LISHED狀態。

2.A的應用進程先向其TCP發出連接釋放報文段,並停止再發送數據,主動關閉TCP連接。

3.B收到連接釋放報文段後即發出確認,然後B進入CLOSE-WAIT(關閉等待)狀態。TCP伺服器進程這時應通知高層應用進程,因而從A到B這個方向的連接就釋放了,這時TCP連接處於半關閉狀態,即A已經沒有數據發送了。

從B到A這個方向的連接並未關閉,這個狀態可能會持續一些時間。

4.A收到來自B的確認後,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文端。

5.若B已經沒有向A發送的數據,B發出連接釋放信號,這時B進入LAST-ACK(最後確認)狀態等待A的確認。

6.A再收到B的連接釋放消息後,必須對此發出確認,然後進入TIME-WAIT(時間等待)狀態。請注意,現在TCP連接還沒有釋放掉,必須經過時間等待計時器(TIME-WAIT timer)設置的時間2MSL後,A才進入CLOSED狀態。

7。B收到A發出的確認消息後,進入CLOSED狀態。

以請求網路為例,看一下三次握手真實數據的TCP連接建立過程

我們再來看四次揮手。TCP斷開連接時,會有四次揮手過程,標志位是FIN,我們在封包列表中找到對應位置,理論上應該找到4個數據包,但我試了好幾次,實際只抓到3個數據包。查了相關資料,說是因為伺服器端在給客戶端傳回的過程中,將兩個連續發送的包進行了合並。因此下面會按照合並後的三次揮手解釋,若有錯誤之處請指出。

第一步,當主機A的應用程序通知TCP數據已經發送完畢時,TCP向主機B發送一個帶有FIN附加標記的報文段(FIN表示英文finish)。

第二步,主機B收到這個FIN報文段之後,並不立即用FIN報文段回復主機A,而是先向主機A發送一個確認序號ACK,同時通知自己相應的應用程序:對方要求關閉連接(先發送ACK的目的是為了防止在這段時間內,對方重傳FIN報文段)。

第三步,主機B的應用程序告訴TCP:我要徹底的關閉連接,TCP向主機A送一個FIN報文段。

第四步,主機A收到這個FIN報文段後,向主機B發送一個ACK表示連接徹底釋放。

這是因為服務端在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACK和SYN放在一個報文里發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些數據給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送。

原因有二:
一、保證TCP協議的全雙工連接能夠可靠關閉
二、保證這次連接的重復數據段從網路中消失

先說第一點,如果Client直接CLOSED了,那麼由於IP協議的不可靠性或者是其它網路原因,導致Server沒有收到Client最後回復的ACK。那麼Server就會在超時之後繼續發送FIN,此時由於Client已經CLOSED了,就找不到與重發的FIN對應的連接,最後Server就會收到RST而不是ACK,Server就會以為是連接錯誤把問題報告給高層。這樣的情況雖然不會造成數據丟失,但是卻導致TCP協議不符合可靠連接的要求。所以,Client不是直接進入CLOSED,而是要保持TIME_WAIT,當再次收到FIN的時候,能夠保證對方收到ACK,最後正確的關閉連接。

再說第二點,如果Client直接CLOSED,然後又再向Server發起一個新連接,我們不能保證這個新連接與剛關閉的連接的埠號是不同的。也就是說有可能新連接和老連接的埠號是相同的。一般來說不會發生什麼問題,但是還是有特殊情況出現:假設新連接和已經關閉的老連接埠號是一樣的,如果前一次連接的某些數據仍然滯留在網路中,這些延遲數據在建立新連接之後才到達Server,由於新連接和老連接的埠號是一樣的,又因為TCP協議判斷不同連接的依據是socket pair,於是,TCP協議就認為那個延遲的數據是屬於新連接的,這樣就和真正的新連接的數據包發生混淆了。所以TCP連接還要在TIME_WAIT狀態等待2倍MSL,這樣可以保證本次連接的所有數據都從網路中消失。

硬體速度
網路和伺服器的負載
請求和響應報文的尺寸
客戶端和伺服器之間的距離
TCP 協議的技術復雜性

TCP 連接建立握手;
TCP 慢啟動擁塞控制;
數據聚集的 Nagle 演算法;
用於捎帶確認的 TCP 延遲確認演算法;
TIME_WAIT 時延和埠耗盡。

介紹完畢,就這?
是的,就這。

補充:

大部分內容為網路整理,方便自己學習回顧,參考文章:
TCP 協議簡介
TCP協議圖文詳解
什麼是TCP協議?
wireshark抓包分析——TCP/IP協議
TCP協議的三次握手和四次揮手
TCP協議詳解
TCP帶寬和時延的研究(1)

❷ osi模型的7層是指哪些

OSI參考模型塵歲慎分為7層,分別是物理層,數據鏈路層,網路層,傳輸層,會話層,表示層和應用層。
各層的主要功能及其派敬相應的數據單位如下:



1 物 理 層(Physical Layer)



我們知道,要傳遞信息就要利用一些物理媒體,如雙紐線、同軸電纜等,但具體的物理媒體並不在OSI的7層之內,有人把物理媒體當作第0層,物理層的任務就是為它的上一層提供一個物理連接,以及它們的機械、電氣、功能和過程特性。

如規定使用電纜和接頭 的類型,傳送信號的電壓等。在這一層,數據還沒有被組織,僅作為原始的位流或電氣電壓處理,單位是比特。



2 數 據 鏈 路 層(Data Link Layer)



數據鏈路層負責在兩個相鄰結點間的線路上,無差錯的傳送以幀為單位的數據。每一幀包括一定數量的數據和一些必要的控制信息。和物理層相似,數據鏈路層要負責建立、維持和釋放數據鏈路的連接。在傳送數據時,如果接收點檢測到所傳數據中有差錯,就要通知發方重發這一幀。



3 網 絡 層(Network Layer)



在計算機網路中進行通信的兩個計算機之間可能會經過很多個數據鏈路,也可能還要經過很多通信子網。

網路層的任務就是選擇合適的網間路由和交換結點, 確保數據及時傳送。網路層將數據鏈路層提供的幀組成數據包,包中封裝有網路層包頭,其中含有邏輯地址信息- -源站點和目的站點地址的網路地址。



4 傳 輸 層(Transport Layer)



該雀罩層的任務時根據通信子網的特性最佳的利用網路資源,並以可靠和經濟的方式,為兩個端系統(也就是源站和目的站)的會話層之間,提供建立、維護和取消傳輸連接的功能,負責可靠地傳輸數據。在這一層,信息的傳送單位是報文。



5 會 話 層(Session Layer)



這一層也可以稱為會晤層或對話層,在會話層及以上的高層次中,數據傳送的單位不再另外命名,統稱為報文。會話層不參與具體的傳輸,它提供包括訪問驗證和會話管理在內的建立和維護應用之間通信的機制。如伺服器驗證用戶登錄便是由會話層完成的。



6 表 示 層(Presentation Layer)

這一層主要解決擁護信息的語法表示問題。它將欲交換的數據從適合於某一用戶的抽象語法,轉換為適合於OSI系統內部使用的傳送語法。即提供格式化的表示和轉換數據服務。數據的壓縮和解壓縮, 加密和解密等工作都由表示層負責。



7 應 用 層(Application Layer)



應用層確定進程之間通信的性質以滿足用戶需要以及提供網路與用戶應用軟體之間的介面服務。

(2)計算機網路可靠和無差錯擴展閱讀:


先將要寄的東西打包,這是應用層的數據。那麼現在到了傳輸層,主要是提供一種傳輸方式。類似我們在寄快遞的時候選擇空運或者陸運。空運比較貴嘛,但是快,陸運便宜但是慢。這邊只是一個比喻,實際肯定沒有這么簡單。

傳輸層主要會使用TCP和UDP兩種協議。那麼在選擇完了傳輸方式後,就需要填寫發件人(源地址)和收件人(目標地址)了。填寫完畢以後交給快遞公司,他們會把快遞由一個轉運中心發往另一個轉運中心,並不是直接從源發往目標。這里的轉運中心其實就到二層了。

在傳輸過程中,像乙太網中的MAC地址,是會不停變化的,就像一個快遞由上海發往武漢,會先到上海的某個集散中心,然後發往武漢,然後又在武漢的集散中心轉幾圈,最後發往離目標最近的快遞點,然後才開始配送,最終送到收件人手上。

ISO為了更好的使網路應用更為普及,就推出了OSI參考模型。其含義就是推薦所有公司使用這個規范來控制網路。這樣所有公司都有相同的規范,就能互聯了。提供各種網路服務功能的計算機網路系統是非常復雜的。根據分而治之的原則,ISO將整個通信功能劃分為七個層次,劃分原則是:

(1)網路中各節點都有相同的層次;

(2)不同節點的同等層具有相同的功能;

(3)同一節點內相鄰層之間通過介面通信;

(4)每一層使用下層提供的服務,並向其上層提供服務;

(5)不同節點的同等層按照協議實現對等層之間的通信。

(6)根據功能需要進行分層,每層應當實現定義明確的功能。

(7)向應用程序提供服務

❸ 計算機網路-可靠傳輸-停止等待協議

全雙工通信的雙方既是發送方也是接收方。下面為了討論問題的方便,我們僅考慮A發送數據而B接收數據並發送確認。 因此A叫做發送方,而B叫做接收方 。因為這里是討論可靠傳輸的原理,因此把傳送的數據單元都稱為分組,「停止等待」就是每發送完一個分組就停止發送,等待對方的確認。在收到確認後再發送下一個分組。

圖5-9(a)是最簡單的無差錯情況。A發送分組M1,發完就暫停發送,等待B的確認。B收到了M1就向A發送確認。A在收到了對M1的確認後,就再發送下一個分組M2。同樣,在收到B對M2的確認後,再發送M3。

圖5-9(b)是分組在傳輸過程中出現差錯的情況,B接收M時檢測出了差錯,就丟棄M1,其他什麼也不做(不通知A收到有差錯的分組)①。也可能是M1在傳輸過程中丟失了,這時B當然什麼都不知道。在這兩種情況下,B都不會發送任何信息。可靠傳輸協議是這樣設計的:A只要超過了一段時間仍然沒有收到確認,就認為剛才發送的分組丟失了,因而重傳前面發送過的分組。這就叫做 超時重傳 。要實現超時重傳,就要在每發送完一個分組時設置一個 超時計時器 。如果在超時計時器到期之前收到了對方的確認,就撤銷已設置的超時計時器。其實在圖5-9(a)中,A為每一個己發送的分組都設置了一個超時計時器。但A只要在超時計時器到期之前收到了相應的確認,就撤銷該超時計時器。

這里應注意以下三點:

第一,A在發遞完一個分組後,必須暫時保留已發送的分組的副本(在發生超時重傳時使用)。只有在收到相應的確認後才能清除暫時保留的分組副本。

第二,分組和確認分組都必須進行編號②。這樣才能明確是哪一個發送出去的分組收到了確認,而哪一個分組還沒有收到確認。

①註:在可靠傳輸的協議中,也可以在檢測出有差錯時發送「否認報文」給對方。這樣做的好處是能夠讓發送方及早如道出現了差錯。不過由於這樣處理會使協議復雜化,現在實用的可靠傳輸協議都不使用這種否認報文了。

②註:編號並不是一個非常簡單的問題。分組編號使用的位數總是有限的,同一個號碼會重復使用。例如,10位的編號范圍是0~1023。當編號增加到1023時,再增加一個號就又回到0,然後重復使用這些號碼。因此,在所發送的分組中,必須能夠區分開哪些是新發送的,哪些是重傳的。對於簡單鏈路上傳送的幀,如採用停止等待協議,只要用1位編號即可,也就是發送完0號幀,收到確認後,再發送1號幀,收到確認後,再發送0號幀。但是在運輸層,這種編號方法有時並不能保證可靠傳輸。

第三,超時計時器設置的重傳時間應當比數據在分組傳輸的平均往返時間更長一些。圖5-9(b)中的一段虛線表示如果M正確到達B同時A也正確收到確認的過程。可見重傳時間應設定為比平均往返時間更長一些。顯然,如果重傳時間設定得很長,那麼通信的效率就會很低。但如果重傳時間設定得太短,以致產生不必要的重傳,就浪費了網路資源。然而,在運輸層重傳時間的准確設定是非常復雜的,這是因為已發送出的分組到底會經過哪些網路,以及這些網路將會產生多大的時延(這取決於這些網路當時的擁塞情況),這些都是不確定因素。圖5-9中把往返時間當作固定的(這並不符合網路的實際情況),只是為了講述原理的方便,關於重傳時間應如何選擇, 選擇確認SACK 。

圖5-10(b)說明的是另一種情況,B所發送的對M1的確認丟失了。A在設定的超時重傳時間內沒有收到確認,並無法知道是自己發送的分組出鋁、丟失,或者是B發送的確認丟失了。因此A在超時計時器到期後就要重傳M1,現在應注意B的動作,假定B又收到了重傳的分組M1。這時應採取兩個行動。第一,丟棄這個重復的分組M1,不向上層交付;第二,向A發送確認,不能認為已經發送過確認就不再發送,因為A之所以重傳M1就表示A沒有收到對M,的確認。

圖5-10(b)也是一種可能出現的情況。傳輸過程中沒有出現差錯,但B對分組M1的確認遲到了。A會收到重復的確認。對重復的確認的處理很簡單:收下後就丟棄。B仍然會收到重復的M1,並且同樣要丟棄重復的M1,並重傳確認分組。

通常A最終總是可以收到對所有發出的分組的確認。如果A不斷重傳分組但總是收不到確認,就說明通信線路太差,不能進行通信。

使用上述的確認和重傳機制,我們就可以在不可靠的傳輸網路上實現可靠的通信。

這種可靠傳輸協議常稱為 自動重傳請求ARQ (Automatic Repeat reQuest)。意思是重傳的請求是自動進行的。接收方不需要請求發送方重傳某個出錯的分組。

停止等待協議的優點是簡單,但缺點是信道利用率太低。我們可以用圖5-11來說明這個問題。為簡單起見,假定在A和B之間有一條直通的信道來傳送分組。

假定A發送分組需要的時間是TD。顯然,TD等於分組長度除以數據率。再假定分組正確到達B後,B處理分組的時間可以忽略不計,同時立即發回確認。假定B發送 確認分組需要時間TA 。如果A處理確認分組的時間也可以忽略不計,那麼A在經過時間(TD+RTT+TA)後就可以再發送下一個分組,這里的RTT是往返時間。因為僅僅是在時間TD內才用來傳送有用的數據(包括分組的首部),因此信道的利用率U可用下式計算: U=TD/TD +RTT+TA (5-3)

請注意,更細致的計算還可以在上式分子的時間TD內扣除傳送控制信息(如首部)所花費的時間。但在進行粗略計算時,用近似的式(5-3)就可以了。

我們知道,(5-3)式中的往返時間RTT取決於所使用的信道。例如,假定1200km的信道的往返時間RTT=20ms。分組長度是1200bit,發送速率是1Mbit/s。若忽略處理時間和TA(TA一般都遠小於TD), TD=1200/1*10^6 ,信道的利用率U=5.66%。但若把發送速率提高到10Mbit/s,則U=5.96×10^(-4)。信道在絕大多數時間內都是空閑的。

從圖5-11還可看出,當往返時間RTT遠大於分組發送時間TD時,信道的利用率就會非常低。還應注意的是,圖5-11並沒有考慮出現差錯後的分組重傳。若出現重傳,則對傳送有用的數據信息來說,信道的利用率就還要降低。

為了提高傳輸效率,發送方可以不使用低效率的停止等待協議,而是採用流水線傳輸(如圖5-12所示)。流水線傳輸就是發送方可連續發送多個分組,不必每發完一個分組就停頓下來等待對方的確認。這樣可使信道上一真有數據不間斷地在傳送。顯然,這種傳輸方式可以獲得很高的信道利用率。

閱讀全文

與計算機網路可靠和無差錯相關的資料

熱點內容
為什麼我usb共享網路限速 瀏覽:411
跑路什麼意思網路 瀏覽:867
如何讓自己的網路1秒變快 瀏覽:311
藍牙共享網路沒網速 瀏覽:587
無線網路故障圖 瀏覽:833
怎麼樣能把網路連接的密碼改了 瀏覽:490
如何在區域網內連接其他網路 瀏覽:695
推薦網路工程師的電腦配置 瀏覽:393
番禺網路維護哪個品牌好 瀏覽:700
華東電腦網路安全業務佔比 瀏覽:419
如何搭建網路課 瀏覽:647
ics共享網路方法 瀏覽:281
網路延遲是路由器的原因 瀏覽:869
網路上的刀名有哪些 瀏覽:394
如何網路搜索區域便利店地址 瀏覽:381
東南汽車網路信號 瀏覽:388
無線網橋和有線網路哪個好用 瀏覽:515
為什麼有網路圖 瀏覽:562
蘋果變成2g網路 瀏覽:497
哪個平台看電視不用網路就可以的 瀏覽:975

友情鏈接