三、udp如何實現可靠傳輸?
通過校驗和確保資料的正確性。
首先將資料報的校驗和字段設定為0,然後將傳送端的資料先求反碼和,結果被儲存在校驗和字段中,接收端將傳送端的資料以及校驗和求和取反碼,如果為0,表示資料沒有出錯。
tcp傳輸時將每個位元組的資料都進行了編號,這就是序列號;序列號保證了接收端可以丟棄重複的報文段,還可以記錄報文段的順序,避免資料報亂序。
tcp傳輸過程中每次接收到另一端的資料時,都會進行應答,即傳送ack報文。ack報文的序列號記錄了上一次收到了哪些資料,下一次資料從**開始傳送。
在tcp傳輸過程中,由於確認應答機制,傳送方在傳送資料後會等待接收方傳送的ack報文。如果傳送完資料後,遲遲沒有收到接收方的ack報文,原因可能有:
tcp在解決這個問題的過程中引入了超時重傳的機制,簡單來講,就是傳送方在傳送完資料後,如果在一段時間內沒有收到ack,就重新傳送資料。
等待時間是動態計算的,在linux中(bsd unix和windows下也是這樣)超時以500ms為乙個單位進行控制,每次判定超時重發的超時時間都是500ms的整數倍。重發一次後,仍未響應,那麼等待2×500ms的時間後,再次重傳。等待4×500ms的時間繼續重傳。以乙個指數的形式增長。累計到一定的重傳次數,tcp就認為網路或者對端出現異常,強制關閉連線。
quic是乙個基於udp協議的傳輸層協議,兼具了tcp和udp的特點,保證了資料的正確性、順序性、以及負責丟包處理。
quic對每乙個udp資料報都進行了加密和認證的保護,保證了資料的正確性。udp本身是無序傳輸的,所以多個資料直接傳送即可,由quic對收到的資料進行重排,然後送往上層應用。
quic採用了類似於cookie的技術,如果之前建立過連線,那麼之後可以不用重複握手而直接開始傳送資料,以實現 0-rtt 往返時延。
發生丟包時,tcp會重傳丟失的包。而quic則使用了一種前向糾錯演算法,通過連續的幾個資料報的校驗和,可以直接恢復出丟失的包內容(異或),而不需要重傳。前向糾錯演算法的本質是異或運算:
假如有4個資料,那麼它們可以取4個異或值,其中每乙個資料都可以由另外4個異或計算出來。還可以把abcd和e想象成乙個資料報,如果我們傳輸abcd這四個資料報,第五個資料報傳輸的是e,這五個資料報可以丟失任何1個資料報。接收方收到資料之後,能夠把它丟的資料恢復出來。前向糾錯演算法能處理的是連續資料裡只丟1個包。同時丟失a和b,這個演算法不能解決。
quic通過uuid來標識使用者(而不是 ip + 埠),ip位址即使改變了,quic連線可以繼續存活,因為uuid是保持不變的,所以無需重新進行握手。
quic的缺點是丟包率比較高。
TCP和UDP的區別
tcp transimission control protocol 傳輸控制協議 和udp user datagram protocol 是傳輸層的兩種實現版本!它們之間提供基本的服務又各有所長。因此,根據對特定服務質量的要求,應用層軟體單元可以選擇通過傳輸層的tcp版本或者udp版本來傳輸資料。...
TCP和UDP的區別
tcp和udp都是傳輸層的協議,他們的區別主要如下 1 tcp,全名 傳輸控制協議 是面向連線的,也就是說在傳送方和接收方在傳送資料之前,必須通過三次握手建立連線,相當於現實生活中的打 功能,必須先撥號,接通後才能說話,udp,全名 使用者資料報協議 是無連線的,其中一方向向另一方傳送資料時不需要建...
TCP和UDP的區別
tcp transmission control protocol,傳輸控制協議 是基於連線的協議,也就是說,在正式收發資料前,必須和對方建立可靠的連線。乙個tcp連線必須要經過三次 對話 才能建立起來,其中的過程非常複雜,我們這裡只做簡單 形象的介紹,你只要做到能夠理解這個過程即可。我們來看看這三...