TCP 協(xié)議如何保證可靠傳輸


UDP&TCP

UDP:

  • (1) UDP颖系,user datagram protocol,用戶數(shù)據(jù)報協(xié)議辩越,不提供復(fù)雜的控制機(jī)制嘁扼,利用IP提供面向無連接的通信服務(wù),并且它是將應(yīng)用程序發(fā)送過來的數(shù)據(jù)包在收到的那一刻黔攒,立即按照原樣發(fā)送到上的一種機(jī)制趁啸。

  • (2) 即使在網(wǎng)絡(luò)擁堵的情況下,UDP也無法進(jìn)行流量控制等避免網(wǎng)絡(luò)擁塞的行為督惰。此外莲绰,在傳輸過程中如果出現(xiàn)丟包,UDP也不負(fù)責(zé)重發(fā)姑丑,甚至當(dāng)數(shù)據(jù)包的到達(dá)順序亂掉之后也沒有糾正順序的功能蛤签。因此,如果需要這些細(xì)節(jié)控制的話栅哀,就需要在采用UDP協(xié)議的應(yīng)用層去作出處理震肮。

  • (3) 由于UDP面向無連接,所以它可以隨時向?qū)Χ税l(fā)送數(shù)據(jù)包留拾,再加上UDP本身的處理既簡單右高效戳晌,所以UDP經(jīng)常用于如下幾個方面:

使用場景

  • 數(shù)據(jù)包總量比較少的通信,比如DNS痴柔、SNMP沦偎。
  • 視頻、音頻等對實時性要求比較高的多媒體通信咳蔚。
  • 廣播通信豪嚎、多播通信。

TCP:

image.png

  • TCP谈火,控制傳輸協(xié)議侈询,和UDP的差別很大,它充分實現(xiàn)了數(shù)據(jù)傳輸時的各種控制功能:
  • 針對發(fā)送端發(fā)出的數(shù)據(jù)包的確認(rèn)應(yīng)答信號ACK
  • 針對數(shù)據(jù)包丟失或者出現(xiàn)定時器超時的重發(fā)機(jī)制
  • 針對數(shù)據(jù)包到達(dá)接收端主機(jī)順序亂掉的順序控制
  • 針對高效傳輸數(shù)據(jù)包的流動窗口控制
  • 針對避免網(wǎng)絡(luò)擁堵時候的流量控制
  • 針對剛開始啟動的時候避免一下子發(fā)送大量數(shù)據(jù)包而導(dǎo)致網(wǎng)絡(luò)癱瘓的慢啟動算法和擁塞控制糯耍。
    而這些在UDP中都是沒有的扔字!此外,TCP作為一種面向有連接的控制傳輸協(xié)議温技,只有在確認(rèn)對端主機(jī)存在時才會發(fā)送數(shù)據(jù)革为,從而可以控制通信流量的浪費。

TCP通過序列號舵鳞、檢驗和震檩、確認(rèn)應(yīng)答信號、重發(fā)控制系任、連接管理恳蹲、窗口控制虐块、流量控制、擁塞控制實現(xiàn)可靠性嘉蕾。


TCP 協(xié)議如何保證可靠傳輸

  • 應(yīng)用數(shù)據(jù)被分割成 TCP 認(rèn)為最適合發(fā)送的數(shù)據(jù)塊贺奠。
  • TCP 給發(fā)送的每一個包進(jìn)行編號,接收方對數(shù)據(jù)包進(jìn)行排序错忱,把有序數(shù)據(jù)傳送給應(yīng)用層儡率。
  • 校驗和: TCP 將保持它首部和數(shù)據(jù)的檢驗和。這是一個端到端的檢驗和以清,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化儿普。如果收到段的檢驗和有差錯,TCP 將丟棄這個報文段和不確認(rèn)收到此報文段掷倔。
  • TCP 的接收端會丟棄重復(fù)的數(shù)據(jù)眉孩。
  • 流量控制: TCP 連接的每一方都有固定大小的緩沖空間,TCP的接收端只允許發(fā)送端發(fā)送接收端緩沖區(qū)能接納的數(shù)據(jù)勒葱。當(dāng)接收方來不及處理發(fā)送方的數(shù)據(jù)浪汪,能提示發(fā)送方降低發(fā)送的速率,防止包丟失凛虽。TCP 使用的流量控制協(xié)議是可變大小的滑動窗口協(xié)議死遭。 (TCP 利用滑動窗口實現(xiàn)流量控制)
  • 擁塞控制: 當(dāng)網(wǎng)絡(luò)擁塞時,減少數(shù)據(jù)的發(fā)送凯旋。
  • 停止等待協(xié)議: 也是為了實現(xiàn)可靠傳輸?shù)难教叮幕驹砭褪敲堪l(fā)完一個分組就- 停止發(fā)送,等待對方確認(rèn)至非。在收到確認(rèn)后再發(fā)下一個分組钠署。 超時重傳: 當(dāng) TCP 發(fā)出一個段后,它啟動一個定時器睡蟋,等待目的端確認(rèn)收到這個報文段踏幻。如果不能及時收到一個確認(rèn),將重發(fā)這個報文段戳杀。

停止等待協(xié)議

停止等待協(xié)議是為了實現(xiàn)可靠傳輸?shù)模幕驹砭褪敲堪l(fā)完一個分組就停止發(fā)送夭苗,等待對方確認(rèn)信卡。在收到確認(rèn)后再發(fā)下一個分組;
在停止等待協(xié)議中题造,若接收方收到重復(fù)分組傍菇,就丟棄該分組,但同時還要發(fā)送確認(rèn)界赔;


無差錯情況:

image.png

發(fā)送方發(fā)送分組,接收方在規(guī)定時間內(nèi)收到,并且回復(fù)確認(rèn).發(fā)送方再次發(fā)送丢习。


出現(xiàn)差錯情況(超時重傳):

image.png

停止等待協(xié)議中超時重傳是指只要超過一段時間仍然沒有收到確認(rèn)牵触,就重傳前面發(fā)送過的分組(認(rèn)為剛才發(fā)送過的分組丟失了)。因此每發(fā)送完一個分組需要設(shè)置一個超時計時器咐低,其重轉(zhuǎn)時間應(yīng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r間更長一些揽思。這種自動重傳方式常稱為 自動重傳請求 ARQ 。另外在停止等待協(xié)議中若收到重復(fù)分組见擦,就丟棄該分組钉汗,但同時還要發(fā)送確認(rèn)。連續(xù) ARQ 協(xié)議 可提高信道利用率鲤屡。發(fā)送維持一個發(fā)送窗口损痰,凡位于發(fā)送窗口內(nèi)的分組可連續(xù)發(fā)送出去,而不需要等待對方確認(rèn)酒来。接收方一般采用累積確認(rèn)卢未,對按序到達(dá)的最后一個分組發(fā)送確認(rèn),表明到這個分組位置的所有分組都已經(jīng)正確收到了堰汉。


確認(rèn)丟失和確認(rèn)遲到

確認(rèn)丟失:確認(rèn)消息在傳輸過程丟失


image.png

當(dāng)A發(fā)送M1消息辽社,B收到后,B向A發(fā)送了一個M1確認(rèn)消息衡奥,但卻在傳輸過程中丟失爹袁。而A并不知道,在超時計時過后矮固,A重傳M1消息失息,B再次收到該消息后采取以下兩點措施:

丟棄這個重復(fù)的M1消息,不向上層交付档址。
向A發(fā)送確認(rèn)消息盹兢。(不會認(rèn)為已經(jīng)發(fā)送過了,就不再發(fā)送守伸。A能重傳绎秒,就證明B的確認(rèn)消息丟失)。
確認(rèn)遲到 :確認(rèn)消息在傳輸過程中遲到


image.png

A發(fā)送M1消息尼摹,B收到并發(fā)送確認(rèn)见芹。在超時時間內(nèi)沒有收到確認(rèn)消息,A重傳M1消息蠢涝,B仍然收到并繼續(xù)發(fā)送確認(rèn)消息(B收到了2份M1)玄呛。此時A收到了B第二次發(fā)送的確認(rèn)消息。接著發(fā)送其他數(shù)據(jù)和二。過了一會徘铝,A收到了B第一次發(fā)送的對M1的確認(rèn)消息(A也收到了2份確認(rèn)消息)。處理如下:

  • A收到重復(fù)的確認(rèn)后,直接丟棄惕它。
  • B收到重復(fù)的M1后怕午,也直接丟棄重復(fù)的M1。

自動重傳請求 ARQ 協(xié)議

停止等待協(xié)議中超時重傳是指只要超過一段時間仍然沒有收到確認(rèn)淹魄,就重傳前面發(fā)送過的分組(認(rèn)為剛才發(fā)送過的分組丟失了)郁惜。因此每發(fā)送完一個分組需要設(shè)置一個超時計時器,其重轉(zhuǎn)時間應(yīng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r間更長一些揭北。這種自動重傳方式常稱為自動重傳請求ARQ扳炬。

  • 優(yōu)點: 簡單
  • 缺點: 信道利用率低

連續(xù)ARQ協(xié)議

連續(xù) ARQ 協(xié)議可提高信道利用率。發(fā)送方維持一個發(fā)送窗口搔体,凡位于發(fā)送窗口內(nèi)的分組可以連續(xù)發(fā)送出去恨樟,而不需要等待對方確認(rèn)。接收方一般采用累計確認(rèn)疚俱,對按序到達(dá)的最后一個分組發(fā)送確認(rèn)劝术,表明到這個分組為止的所有分組都已經(jīng)正確收到了。

  • 優(yōu)點: 信道利用率高呆奕,容易實現(xiàn)养晋,即使確認(rèn)丟失,也不必重傳梁钾。
  • 缺點: 不能向發(fā)送方反映出接收方已經(jīng)正確收到的所有分組的信息绳泉。 比如:發(fā)送方發(fā)送了 5條 消息,中間第三條丟失(3號)姆泻,這時接收方只能對前兩個發(fā)送確認(rèn)零酪。發(fā)送方無法知道后三個分組的下落,而只好把后三個全部重傳一次拇勃。這也叫 Go-Back-N(回退 N)四苇,表示需要退回來重傳已經(jīng)發(fā)送過的 N 個消息。

滑動窗口

  • TCP 利用滑動窗口實現(xiàn)流量控制的機(jī)制方咆。
  • 滑動窗口(Sliding window)是一種流量控制技術(shù)月腋。早期的網(wǎng)絡(luò)通信中,通信雙方不會考慮網(wǎng)絡(luò)的擁擠情況直接發(fā)送數(shù)據(jù)瓣赂。由于大家不知道網(wǎng)絡(luò)擁塞狀況榆骚,同時發(fā)送數(shù)據(jù),導(dǎo)致中間節(jié)點阻塞掉包煌集,誰也發(fā)不了數(shù)據(jù)寨躁,所以就有了滑動窗口機(jī)制來解決此問題。
  • TCP 中采用滑動窗口來進(jìn)行傳輸控制牙勘,滑動窗口的大小意味著接收方還有多大的緩沖區(qū)可以用于接收數(shù)據(jù)。發(fā)送方可以通過滑動窗口的大小來確定應(yīng)該發(fā)送多少字節(jié)的數(shù)據(jù)。當(dāng)滑動窗口為 0 時方面,發(fā)送方一般不能再發(fā)送數(shù)據(jù)報放钦,但有兩種情況除外,一種情況是可以發(fā)送緊急數(shù)據(jù)恭金,例如操禀,允許用戶終止在遠(yuǎn)端機(jī)上的運(yùn)行進(jìn)程。另一種情況是發(fā)送方可以發(fā)送一個 1 字節(jié)的數(shù)據(jù)報來通知接收方重新聲明它希望接收的下一字節(jié)及發(fā)送方的滑動窗口大小横腿。

流量控制

  • TCP 利用滑動窗口實現(xiàn)流量控制颓屑。
  • 流量控制是為了控制發(fā)送方發(fā)送速率,保證接收方來得及接收耿焊。
  • 接收方發(fā)送的確認(rèn)報文中的窗口字段可以用來控制發(fā)送方窗口大小揪惦,從而影響發(fā)送方的發(fā)送速率。將窗口字段設(shè)置為 0罗侯,則發(fā)送方不能發(fā)送數(shù)據(jù)器腋。

擁塞控制
在某段時間,若對網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分钩杰,網(wǎng)絡(luò)的性能就要變壞纫塌。這種情況就叫擁塞。擁塞控制就是為了防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中讲弄,這樣就可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載措左。擁塞控制所要做的都有一個前提,就是網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷避除。擁塞控制是一個全局性的過程怎披,涉及到所有的主機(jī),所有的路由器驹饺,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素钳枕。相反,流量控制往往是點對點通信量的控制赏壹,是個端到端的問題鱼炒。流量控制所要做到的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來得及接收蝌借。

為了進(jìn)行擁塞控制昔瞧,TCP 發(fā)送方要維持一個 擁塞窗口(cwnd) 的狀態(tài)變量。擁塞控制窗口的大小取決于網(wǎng)絡(luò)的擁塞程度菩佑,并且動態(tài)變化自晰。發(fā)送方讓自己的發(fā)送窗口取為擁塞窗口和接收方的接受窗口中較小的一個。

TCP的擁塞控制采用了四種算法稍坯,即 慢開始 酬荞、 擁塞避免 搓劫、快重傳 和 快恢復(fù)。在網(wǎng)絡(luò)層也可以使路由器采用適當(dāng)?shù)姆纸M丟棄策略(如主動隊列管理 AQM)混巧,以減少網(wǎng)絡(luò)擁塞的發(fā)生枪向。

  • 慢開始: 慢開始算法的思路是當(dāng)主機(jī)開始發(fā)送數(shù)據(jù)時,如果立即把大量數(shù)據(jù)字節(jié)注入到網(wǎng)絡(luò)咧党,那么可能會引起網(wǎng)絡(luò)阻塞秘蛔,因為現(xiàn)在還不知道網(wǎng)絡(luò)的符合情況。經(jīng)驗表明傍衡,較好的方法是先探測一下深员,即由小到大逐漸增大發(fā)送窗口,也就是由小到大逐漸增大擁塞窗口數(shù)值蛙埂。cwnd初始值為1倦畅,每經(jīng)過一個傳播輪次,cwnd加倍箱残。
    image.png

擁塞避免: 擁塞避免算法的思路是讓擁塞窗口cwnd緩慢增大滔迈,即每經(jīng)過一個往返時間RTT就把發(fā)送放的cwnd加1.

快重傳與快恢復(fù):
在 TCP/IP 中,快速重傳和恢復(fù)(fast retransmit and recovery被辑,F(xiàn)RR)是一種擁塞控制算法燎悍,它能快速恢復(fù)丟失的數(shù)據(jù)包。沒有 FRR盼理,如果數(shù)據(jù)包丟失了谈山,TCP 將會使用定時器來要求傳輸暫停。在暫停的這段時間內(nèi)宏怔,沒有新的或復(fù)制的數(shù)據(jù)包被發(fā)送奏路。有了 FRR,如果接收機(jī)接收到一個不按順序的數(shù)據(jù)段臊诊,它會立即給發(fā)送機(jī)發(fā)送一個重復(fù)確認(rèn)鸽粉。如果發(fā)送機(jī)接收到三個重復(fù)確認(rèn),它會假定確認(rèn)件指出的數(shù)據(jù)段丟失了抓艳,并立即重傳這些丟失的數(shù)據(jù)段触机。有了 FRR,就不會因為重傳時要求的暫停被耽誤玷或。 ?當(dāng)有單獨的數(shù)據(jù)包丟失時儡首,快速重傳和恢復(fù)(FRR)能最有效地工作。當(dāng)有多個數(shù)據(jù)信息包在某一段很短的時間內(nèi)丟失時偏友,它則不能很有效地工作蔬胯。

image.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市位他,隨后出現(xiàn)的幾起案子氛濒,更是在濱河造成了極大的恐慌产场,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泼橘,死亡現(xiàn)場離奇詭異涝动,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炬灭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靡菇,“玉大人重归,你說我怎么就攤上這事∠梅铮” “怎么了鼻吮?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長较鼓。 經(jīng)常有香客問我椎木,道長,這世上最難降的妖魔是什么博烂? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任香椎,我火速辦了婚禮,結(jié)果婚禮上禽篱,老公的妹妹穿的比我還像新娘畜伐。我一直安慰自己,他們只是感情好躺率,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布玛界。 她就那樣靜靜地躺著,像睡著了一般悼吱。 火紅的嫁衣襯著肌膚如雪慎框。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天后添,我揣著相機(jī)與錄音笨枯,去河邊找鬼。 笑死吕朵,一個胖子當(dāng)著我的面吹牛猎醇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播努溃,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼硫嘶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梧税?” 一聲冷哼從身側(cè)響起沦疾,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤称近,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哮塞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刨秆,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年忆畅,在試婚紗的時候發(fā)現(xiàn)自己被綠了衡未。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡家凯,死狀恐怖缓醋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绊诲,我是刑警寧澤送粱,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站掂之,受9級特大地震影響抗俄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜世舰,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一动雹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冯乘,春花似錦洽胶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喷好,卻和暖如春翔横,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梗搅。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工禾唁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人无切。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓荡短,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哆键。 傳聞我的和親對象是個殘疾皇子掘托,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 傳輸層提供的服務(wù) 傳輸層的功能 從通信和信息處理的角度看 闪盔,傳輸層向它上面的應(yīng)用層提供通信服務(wù)弯院,它屬于面向通信部分...
    CodeKing2017閱讀 3,631評論 1 9
  • 傳輸層-TCP, TCP頭部結(jié)構(gòu) 泪掀,TCP序列號和確認(rèn)號詳解 TCP主要解決下面的三個問題 1.數(shù)據(jù)的可靠傳輸...
    抓兔子的貓閱讀 4,515評論 1 46
  • 運(yùn)輸層協(xié)議概述 從通信和信息處理的角度看听绳,運(yùn)輸層向它上面的應(yīng)用層提供通信服務(wù),它屬于面向通信部分的最高層异赫,同時也是...
    srtianxia閱讀 2,406評論 0 2
  • 1椅挣、TCP為什么需要3次握手,4次斷開祝辣? “三次握手”的目的是“為了防止已失效的連接請求報文段突然又傳送到了服務(wù)端...
    杰倫哎呦哎呦閱讀 3,477評論 0 6
  • 1.這篇文章不是本人原創(chuàng)的贴妻,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,063評論 6 174