一、綜述
1、確認和重傳:接收方收到報文就會確認,傳送方傳送一段時間後沒有收到確認就重傳。
2、資料校驗
3、資料合理分片和排序:
udp:ip資料報大於1500位元組,大於mtu.這個時候傳送方ip層就需要分片(fragmentation).把資料報分成若干片,使每一片都小於mtu.而接收方ip層則需要進行資料報的重組.這樣就會多做許多事情,而更嚴重的是,由於udp的特性,當某一片資料傳送中丟失時,接收方便無法重組資料報.將導致丟棄整個udp資料報.
tcp會按mtu合理分片,接收方會快取未按序到達的資料,重新排序後再交給應用層。
4、流量控制:當接收方來不及處理傳送方的資料,能提示傳送方降低傳送的速率,防止包丟失。
5、擁塞控制:當網路擁塞時,減少資料的傳送。
二、滑動視窗
上面籠統地說了tcp保證可靠傳輸的機制,下面說說如何用滑動視窗來實現。
為什麼要使用滑動視窗
因為傳送端希望在收到確認前,繼續傳送其它報文段。比如說在收到0號報文的確認前還發出了1-3號的報文,這樣提高了通道的利用率。但可以想想,0-4發出去後可能要重傳,所以需要乙個緩衝區維護這些報文,所以就有了視窗。
rtt:往返時間。
視窗是什麼
接收視窗:
「接收視窗」大小取決於應用(比如說tomcat:8080埠的監聽程序)、系統、硬體的限制。圖中,接收視窗是31~50,大小為20。
在接收視窗中,黑色的表示已收到的資料,白色的表示未收到的資料。
當收到視窗左邊的資料,如27,則丟棄,因為這部分已經交付給主機;
當收到視窗左邊的資料,如52,則丟棄,因為還沒輪到它;
當收到已收到的視窗中的資料,如32,丟棄;
當收到未收到的視窗中的資料,如35,快取在視窗中。
傳送視窗:
傳送視窗的大小swnd=min(rwnd,cwnd)。rwnd是接收視窗,cwnd用於擁塞控制,暫時可以理解為swnd= rwnd =20。
圖中分為四個區段,其中p1到p3是傳送視窗。
tips:傳送視窗以位元組為單位。為了方便畫圖,圖中展示得像以報文為單位一樣。但這不影響理解。
三、重傳和確認
什麼時候發確認:這是乙個複雜的策略。我們這裡先簡單地認為每收到乙個報文就發乙個確認。
怎麼確認(累計確認):
情況1:傳送ack=31(為什麼這個也要發,這個確認可以用於後面的擁塞控制)
情況2:傳送ack=34,並把接收視窗左邊緣設定成34,右邊緣設定成53
累計確認的好處:情況1中ack=31比描述收到32和33簡單;壞處:可能要重傳已經接收的資料。
傳送方收到確認時怎麼處理:
情況1:收到ack=31,什麼都不做,或者說繼續傳送可用視窗中的內容,如42~50
情況2:收到ack=34,傳送視窗視窗的左邊緣設定成34,右邊緣設定成53
什麼時候重傳:因為每個報文都有超時計數器,超時才重傳。超時重傳時間的選擇也是乙個策略。
tcp快取和視窗的關係:視窗是快取的一部分。
傳送快取=傳送視窗+ p3右邊的一部分
接收快取=接收視窗+部分已確認但主機還沒處理完的資料。
四、流量控制
一圖流,簡單來說就是接收方處理不過來的時候,就把視窗縮小,並把視窗值告訴傳送端。
當視窗值為0,而接受方把視窗值恢復(比如ack=1,ack=601,rwnd=200),但確認丟失,進入相互等待的死鎖局面。所以如果視窗值為0,傳送端就會開啟乙個持續計數器,每個一段時間詢問一下接收方。
五、擁塞控制
swnd=min(rwnd,cwnd),cwnd就是擁塞視窗大小。
慢開始和擁塞避免
ssthresh:處理擁塞時參照的乙個引數。例子中初始值為16,後來變為12。
當cwnd> ssthresh,cwnd以慢開始的方法指數增長;
當cwnd< ssthresh,cwnd以擁塞避免的方法線性增長。
值得注意的幾個點
1上圖是cwnd隨傳輸輪次的變化,每過乙個rtt就算一輪。
2超時就可以認為是擁塞了
快重傳和快恢復:上乙個演算法的加強版
快重傳:收到3個同樣的確認就立刻重傳,不等到超時;
快恢復:cwnd不是從1重新開始。
TCP如何實現可靠性
tcp傳輸控制協議 tcp 協議是一種面向連線的,為不同主機程序間提供可靠資料傳輸的協議。tcp 協議假定其所使用的網路棧下層協議 如ip 協議 是非可靠的,其自身提供機制保證資料的可靠性傳輸。在目前的網路棧協議族中,在需要提供可靠性資料傳輸的應用中,tcp 協議是首選的,有時也是唯一的選擇。tcp...
TCP如何保證可靠性
重傳機制 針對資料報丟失或者出現定時器超時 確認應答 停止等待協議,傳送之後等待收到應答。序列號 針對資料報到達接收端主機順序亂掉 流量控制 針對避免網路擁堵時候 針對高效傳輸資料報的流動視窗的控制 擁塞控制 針對剛開始啟動的時候避免一下子傳送大量資料報而導致網路癱瘓的慢啟動演算法和擁塞控制。校驗和...
TCP 如何保證可靠性
1.校驗和 校驗範圍包括tcp首部和資料部分。在傳送方將整個報文段分為多個16位的段,然後將所有段進行反碼相加,將結果存放在校驗和字段中,接收方用相同的方法進行計算,若最終結果為校驗字段所有位是全1則正確 udp中為0是正確 否則出現錯誤。若校驗出包有錯,則丟棄報文段並且不給出響應,這時tcp傳送資...