一文讀懂TCP的可靠傳輸原理
TCP下面的IP層是盡力的交付,是不可靠的,所以TCP需要靠自己去完成可靠傳輸。下面,我們先從簡單的停止等待協定來講解可靠傳輸的如何實現的。需要注意可靠傳輸的幾個特點:不遺失、不重複、依序到達。
注意,TCP並沒有使用停止等待協定來實現可靠傳輸。
停止等待協定
傳輸層的資料傳輸單元稱為區段。下面,為了方便,都稱為分組。
停止等待協議的原理非常簡單,發送一個分組後就停止繼續發送,等待收到上一個分組的確認後,再繼續發送後面的分組。
下面透過幾個不同情況來分析:
無錯誤狀況
無錯誤情況非常簡單,如下圖。每發送完一個分組後,就停止發送,等待收到該分組的確認後,再繼續發送後面的分組。
出現錯誤
#出現錯誤分兩種情況,第一種是發送的分組沒有交付成功到目的位址,另一種情況是傳送的資料包有錯誤。透過圖例,我們來分析兩種情況
#首先來看看B的操作:A發送M1分組,該分組如果是錯誤的,B收到後會丟棄該數分組,然後什麼也不做(不會通知A收到了錯誤分組)。如果B沒有收到M1分組,那麼它什麼都不知道,也不會去做任何動作。
接下來看A是如何做的:A發完分組後,遲遲收不到B對M1分組的確認後,當等待的時間超時了,那麼就需要重新發送該M1分組。要實現超時重傳,就需要設定一個超時計時器,當發送的一個分組在超時時間前收到了確認,那麼就重置超時計時器,否則的話就需要重傳分組。
有幾點是需要注意的:
A在傳送完一個分組後,必須也要儲存該分組的副本,以便逾時重傳。當收到這個分組的確認後,就可以丟棄該分組的副本了。
需要為每一個分組做編號,這樣才知道是各個分組的到達狀況。
逾時時間應該設定的比平均傳輸時間稍長一些,以免造成不必要的重傳。
確認遺失和確認遲到
#除了分組在傳送過程中會出現錯誤,在回傳確認的時候,也會出現錯誤-確認遺失和確認遲到。
首先看確認遺失情況,A的分組B收到了,並給A發送了確認,但該確認遺失了,A沒有收到。因為A沒有收到M1的確認,那麼等待超過超時後,就會向B重傳M1。這時候B收到了重複的分組M1,需要做兩個動作:
將重複的分組M1丟棄
向A發送M1的確認。因為既然A重傳了M1,就表示A沒有收到M1的分組。所以B需要繼續發送對M1的確認。
再來看另一種情況,對M1的分組確認遲到了(超過逾時時間後才收到)。 A在收到重複的確認後,會丟棄,其他什麼都不做。
透過上述的逾時重送機制,就可以實現在不可靠的網路傳輸上實現可靠的傳輸。
通道利用率
上述的停止等待協定簡單,但它有一個非常大的缺點-通道的使用率太低。在等待收到確認的這段時間,頻道是完全空閒的,十分浪費。
為了提高通道利用率,可以使用管線傳輸,管線傳輸可以連續傳送多個分組,這樣就可以大幅提高頻道利用率了。
採用管線傳輸的協定有連續ARQ協定和視窗滑動協定。而TCP就是採用滑動視窗協定來完成可靠傳輸的。
以上是一文讀懂TCP的可靠傳輸原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

win10如何重置tcp/ip協定?其實方法很簡單的,使用者可以直接的進入到命令提示符,然後按下ctrl shift enter的組合鍵來進行操作就可以了或者是直接的執行重置命令來進行設置,下面就讓本站來為使用者來仔細的介紹一下windows10重置tcp/ip協定棧的方法吧。 windows10重置tcp/ip協定棧的方法一、管理員權限1、我們使用快捷鍵win R直接開啟運行窗口,然後輸入cmd並按住ctrl shift enter的組合鍵。 2、或者我們可以直接在開始選單中搜尋命令提示符,右鍵點

TCP客戶端一個使用TCP協定實現可連續對話的客戶端範例程式碼:importsocket#客戶端設定HOST='localhost'PORT=12345#建立TCP套接字並連接伺服器client_socket=socket.socket(socket.AF_INET,socket .SOCK_STREAM)client_socket.connect((HOST,PORT))whileTrue:#取得使用者輸入message=input("請輸入要傳送的訊息:&

TCP是電腦網路通訊協定的一種,是一種連線導向的傳輸協定。在Java應用開發中,TCP通訊被廣泛應用於各種場景,例如客戶端和伺服器之間的資料傳輸、音訊視訊即時傳輸等等。 Netty4是一個高效能、高可擴展性、高效能的網路程式框架,能夠優化伺服器和用戶端之間的資料交換流程,使其更有效率可靠。使用Netty4進行TCP通訊的具體實作步驟如下:引入

那這裡面提到的"面向連接",意味著需要 建立連接,使用連接,釋放連接。建立連線是指我們熟知的TCP三次握手。而使用連接,則是透過一發送、一確認的形式,進行資料傳輸。還有就是釋放連接,也就是我們常見的TCP四次揮手。

在TCP通信雙方中,為了描述方便,以下將通信雙方用A和B代替。根據TCP協定規定,如果A關閉連線後B繼續發送數據,B會收到A的RST回應。若B繼續發送數據,系統會發出SIGPIPE訊號告知連接已斷開,停止發送。系統對SIGPIPE訊號的預設處理行為是讓B進程退出。作業系統對SIGPIPE訊號的這種預設處理行為非常不友好,讓我們來分析一下。 TCP通訊是全雙工頻道,相當於兩條單工頻道,連線兩端各負責一條。當對端「關閉」時,雖然本意是關閉整個兩條頻道,但本端只是收到FIN包。依TCP協議的規定,當一

使用一個TCP連線發送多個檔案為什麼會有這篇部落格?最近在看一些相關方面的東西,簡單的使用一下Socket進行程式設計是沒有的問題的,但是這樣只是建立了一些基本概念。對於真正的問題,還是無能為力。當我需要進行檔案的傳輸時,我發現我好像只是發送過去了資料(二進位資料),但是關於檔案的一些資訊卻遺失了(檔案的副檔名)。而且每次我只能使用一個Socket發送一個文件,沒有辦法做到連續發送文件(因為我是依靠關閉流來完成發送文件的,也就是說我其實是不知道文件的長度,所以只能以一個Socket連接代表一個檔案)。

TCP和IP是網際網路中兩個不同的協定:1、TCP是一種運輸層協議,而IP是一種網路層協定;2、TCP提供了資料包的分段、排序、確認和重傳等功能,而IP協定負責為資料包提供來源和目標位址;3、TCP是面向連線的協議,而IP協定是無連線的;4、TCP也提供流量控制和擁塞控制。

曾經有這麼一道經典面試題:從 URL 在瀏覽器被輸入到頁面展現的過程中發生了什麼事?相信大多數準備過的同學都能回答出來,但如果繼續問:收到的HTML 如果包含幾十個圖片標籤,這些圖片是以什麼方式、什麼順序、建立了多少連接、使用什麼協議被下載下來的呢?
