重傳機制:針對資料報丟失或者出現定時器超時
確認應答:停止等待協議,傳送之後等待收到應答。
序列號:針對資料報到達接收端主機順序亂掉
流量控制:針對避免網路擁堵時候;針對高效傳輸資料報的流動視窗的控制
擁塞控制:針對剛開始啟動的時候避免一下子傳送大量資料報而導致網路癱瘓的慢啟動演算法和擁塞控制。
校驗和:傳送方和接收方計算校驗和並進行對比確認未出錯
連線管理:三次握手與四次揮手
資料的合理分片和排序
udp:ip資料報大於1500位元組,大於mtu.這個時候傳送方ip層就需要分片(fragmentation).把資料報分成若干片,使每一片都小於mtu.而接收方ip層則需要進行資料報的重組.這樣就會多做許多事情,而更嚴重的是,由於udp的特性,當某一片資料傳送中丟失時,接收方便無法重組資料報.將導致丟棄整個udp資料報.
tcp會按mtu合理分片,接收方會快取未按序到達的資料,重新排序後再交給應用層。
將傳送的資料段都當做是16位的整數,加起來,前面的進製補在後面,最後取反,得到校驗和。
傳送方傳送資料之前計算校驗和,並填充;
接收方收到資料之後,同樣進行計算,將得出的校驗和與傳送方的進行對比。
序列號:tcp傳輸時將每個位元組的資料都進行了編號,這就是序列號。
確認應答:tcp傳輸的過程中,每次接收方收到資料後,都會對傳輸方進行確認應答。也就是傳送ack報文。這個ack報文當中帶有對應的確認序列號,告訴傳送方,接收到了哪些資料,下一次的資料從**發。
有了序列號,不僅僅是應答的作用,接收方還可以根據序列號將資料排序,並且去掉重複序列號的資料。(也是tcp傳輸可靠性的保證之一)
當傳送方 傳送完資料之後,遲遲沒有收到ack,那麼原因可能有:
資料在傳輸過程中由於網路原因等直接全體丟包,接收方根本沒有接收到。
接收方接收到了響應的資料,但是傳送的ack報文響應卻由於網路原因丟包了。
所以引入了超時重傳機制,到了指定時間尚未收到ack報文,就重傳資料。
這個指定時間(最大超時時間)是動態計算的。
自動重傳請求arq協議:
傳送方每次傳送完之後就設定乙個超時計時器,重傳時間應該比資料傳輸的平均往返時間更長一些。
連續arq協議
也叫回退n幀協議。
連續 arq 協議可提高通道利用率。傳送方維持乙個傳送視窗,凡位於傳送視窗內的分組可以連續傳送出去,而不需要等待對方確認。接收方一般採用累計確認,對按序到達的最後乙個分組傳送確認,表明到這個分組為止的所有分組都已經正確收到了。
優點: 通道利用率高,容易實現,即使確認丟失,也不必重傳。
缺點: 不能向傳送方反映出接收方已經正確收到的所有分組的資訊。 比如:傳送方傳送了 5條 訊息,中間第三條丟失(3號),這時接收方只能對前兩個傳送確認。傳送方無法知道後三個分組的下落,而只好把後三個全部重傳一次。這也叫go-back-n(回退 n),表示需要退回來重傳已經傳送過的 n 個訊息。
就是三次握手與四次揮手,保證了可靠的連線
其實就是根據接收方的資料處理能力對傳送方的傳送速度進行控制。
利用滑動視窗實現。
tcp協議的報文頭資訊中,有乙個16位的字段的視窗大小。數字越大,證明接收端接收緩衝區的剩餘空間越大,網路的吞吐量越大。
接收端會在確認應答傳送ack報文時,將自己的即時視窗大小填入,並跟隨ack報文一起傳送過去。而傳送方根據ack報文裡的視窗大小的值的改變進而改變自己的傳送速度。如果接收到視窗大小的值為0,那麼傳送方將停止傳送資料。並定期的向接收端傳送視窗探測資料段,讓接收端把視窗大小告訴傳送端。
注:16位的視窗大小最大能表示65535個位元組(64k),但是tcp的視窗大小最大並不是64k。在tcp首部中40個位元組的選項中還包含了乙個視窗擴大因子m,實際的視窗大小就是16為視窗欄位的值左移m位。每移一位,擴大兩倍。
主要解決在資料傳輸過程中,網路中擁堵的情況,資料報可能會丟失,大量的超時重傳繼續影響傳輸。
擁塞控制的四種演算法:慢開始、擁塞避免、快重傳和快恢復。
so,慢啟動,先傳送少量資料探探路,定義了乙個擁塞視窗(初始為1),每次收到乙個ack應答(每經過乙個rtt往返時間),擁塞視窗加 1。在傳送資料之前,首先將擁塞視窗與接收端反饋的視窗大小比對,取較小的值作為實際傳送的視窗。
擁塞視窗的增長是指數級別的。 為了控制增長速度,引入了擁塞視窗的閾值(ssthresh)。
擁塞避免:當擁塞視窗大小超過閾值時,不能再按照指數來增長,而是線性的增長。
在慢啟動開始的時候,慢啟動的閾值等於視窗的最大值,一旦造成網路擁塞,發生超時重傳時,慢啟動的閾值會為原來的一半(這裡的原來指的是發生網路擁塞時擁塞視窗的大小),同時擁塞視窗重置為 1。
快重傳和快恢復
快速重傳和恢復(fast retransmit and recovery,frr)
沒有 frr,如果資料報丟失了,tcp 將會使用定時器來要求傳輸暫停。在暫停的這段時間內,沒有新的或複製的資料報被傳送。
有了 frr,如果接收機接收到乙個不按順序的資料段,它會立即給傳送機傳送乙個重複確認。如果傳送機接收到三個重複確認,它會假定確認件指出的資料段丟失了,並立即重傳這些丟失的資料段。有了 frr,就不會因為重傳時要求的暫停被耽誤。
當有單獨的資料報丟失時,快速重傳和恢復(frr)能最有效地工作。當有多個資料資訊包在某一段很短的時間內丟失時,它則不能很有效地工作。
tcp異常的情況(常見面試題)
程序終止:程序終止會釋放檔案描述符。仍然可以傳送fin,和正常關閉沒什麼區別
機器重啟:和程序終止的情況相同
機器掉電/網線斷開:接收端認為連線還在,一旦接收端有寫入操作,接收端發現連線已經不在了,就會進行reset,即使沒有寫入操作,tcp自己也內建乙個保活定時器,定期訪問對方是否還在,如果對方不在,也會把連線釋放;
基於tcp的應用層協議有:http、https、ssh、telent、ftp、smtp
tcp一般應用於可靠性傳輸,應用於檔案傳輸,重要狀態更新等重要場景;
udp用於對高速傳輸和實時性要求較高的通訊領域。
如何用udp實現可靠性傳輸?(面試題)
可以參考tcp
引入序列號,保證資料順序;引入確認應答,保證對端收到了資料;引入超時重傳,如果隔一段時間沒有應答,就重新傳送資料。
**:
TCP 如何保證可靠性
1.校驗和 校驗範圍包括tcp首部和資料部分。在傳送方將整個報文段分為多個16位的段,然後將所有段進行反碼相加,將結果存放在校驗和字段中,接收方用相同的方法進行計算,若最終結果為校驗字段所有位是全1則正確 udp中為0是正確 否則出現錯誤。若校驗出包有錯,則丟棄報文段並且不給出響應,這時tcp傳送資...
TCP如何保證可靠性傳輸
校驗和 在資料傳輸的過程中,將傳送的資料段都當做乙個16位的整數。將這些整數加起來。並且前面的進製不能丟棄,補在後面繼續相加,最後取反,得到校驗和。傳送方 在傳送資料之前計算檢驗和,並進行校驗和的填充。接收方 收到資料後,對資料以同樣的方式進行計算,求出校驗和,與傳送方的進行比對。注意 如果接收方比...
TCP 協議如何保證可靠性
tcp 協議保證資料傳輸可靠性的方式主要有 傳送的資料報的二進位制相加然後取反,目的是檢測資料再傳輸過程中的任何變化。如果收到段的檢驗和有差錯,tcp 將丟棄這個報文段和不確認收到此報文段。tcp 給傳送的每乙個包進行編號,這就是序列號。在 tcp 傳輸的過程中,每次接收方收到資料後,都會對傳輸方進...