TCP為什么是可靠性的?
可靠傳輸就是通過TCP連接傳送的數據是沒有差錯、不會丟失、不重復并且按序到達的。TCP是通過序列號、檢驗和、確認應答信號、重發(fā)機制、連接管理、窗口控制、流量控制、擁塞控制一起保證TCP傳輸的可靠性的。
總結:
TCP保證可靠性一般有以下幾種方法:
- 檢驗和:在數據傳輸過程中,吧傳輸的數據當作一個16位整數。吧所有的數據加起來,最前面的進位補到最后一位,然后取反得到校驗和。發(fā)送方和接收方驗證校驗和是否相同。不相同則數據傳輸有誤,相同也可能有問題。
- 確認應答:ACK和序列號(一應一答)機制保證數據的完整性(三次握手于四次揮手過程中通過比對Seq和ACK來實現)
- 超時重傳:發(fā)送數據包在一定的時間周期內沒有收到相應的ACK,等待一定的時間,超時之后就認為這個數據包丟失,就會重新發(fā)送(也就是發(fā)送數據后,長時間沒收到回應,會把數據再發(fā)一次。)
- 連接管理:三次握手,四次揮手
- 最大消息長度:理想的情況下是該長度的數據剛好不被網絡層分塊。
- 擁塞控制:控制傳輸上流量(發(fā)送數據時開始是慢啟動,先發(fā)送一點點數據去探測網絡擁塞不擁塞,如果不擁塞了,則大量的發(fā)送數據。如果突然擁塞了,則又很慢的發(fā)送數據。這樣是為了盡可能快的發(fā)送數據,避免網絡擁塞造成一系列問題)
- 流量控制:TCP利用滑動窗口實現流量控制,流量控制是為了控制發(fā)送方的發(fā)送速率,保證接收方來的及時接收
原理解析
一、檢驗和
檢驗和:通過檢驗和的方式,接收端可以檢測出來數據是否有差錯和異常,假如有差錯就會直接丟棄TCP 段,重新發(fā)送。
TCP在計算檢驗和時,會在TCP首部加上一個12字節(jié)的偽首部。
檢驗和總共計算3 部分:
- TCP首部
- TCP數據
- TCP偽首部;
計算方式如下:在數據傳輸的過程中,將發(fā)送的數據段都當做一個16位的整數。將這些整數加起來。并且前面的進位不能丟棄,補在后面,最后取反,得到校驗和。
- 發(fā)送方:在發(fā)送數據之前計算檢驗和,并進行校驗和的填充。
- 接收方:收到數據后,對數據以同樣的方式進行計算,求出校驗和,與發(fā)送方的進行比對。
注意:如果接收方比對校驗和與發(fā)送方不一致,那么數據一定傳輸有誤。但是如果接收方比對校驗和與發(fā)送方一致,數據不一定傳輸成功。
二、序列號/確認應答
序列號/確認應答機制過程如下:
- 發(fā)送端每次發(fā)送數據時,TCP就給每個數據包分配一個序列號并且在一個特定的時間內等待接收端對分配的這個序列號進行確認,如果發(fā)送端在一個特定時間內沒有收到接收端的確認,則發(fā)送端會重傳此數據包。
- 接收端利用序列號對接收的數據進行確認,以便檢測對方發(fā)送的數據是否有丟失或者亂序等,接收端一旦收到已經順序化的數據,它就將這些數據按正確的順序重組成數據流并傳遞到高層進行處理。
上述過程中,只要發(fā)送端有一個包傳輸,接收端沒有回應確認包(ACK包),發(fā)送端就會認為數據丟包,然后進行重發(fā)?;蛘呓邮斩说膽鸢?,發(fā)送端沒有收到也會重發(fā)數據。這就可以保證數據的完整性。
另外:序列號的作用不僅僅是應答的作用,有了序列號能夠將接收到的數據根據序列號排序,并且去掉重復序列號的數據。這也是TCP傳輸可靠性的保證之一。
三、超時重傳
首先,TCP可靠性中最重要的一個機制是處理數據超時和重傳。正是因為有這樣的重傳機制作為保障,在我們傳輸過程發(fā)生錯誤的時候,可以通過重傳機制進行收尾。
超時重傳原理
TCP協(xié)議要求在發(fā)送端每發(fā)送一個報文段,就啟動一個定時器并等待確認信息;接收端成功接收新數據后返回確認信息。若在定時器超時前數據未能被確認,TCP就認為報文段中的數據已丟失或損壞,需要對報文段中的數據重新組織和重傳。
導致重傳的情況
首先,發(fā)送方沒有接收到響應的ACK報文原因可能有兩點:
- 數據在傳輸過程中由于網絡原因等直接全體丟包,接收方根本沒有接收到。
- 接收方接收到了響應的數據,但是發(fā)送的ACK報文響應卻由于網絡原因丟包了。
那么發(fā)生上述情況,我們的發(fā)送方在發(fā)送完數據后等待一個時間,時間到達沒有接收到ACK報文,那么對剛才發(fā)送的數據進行重新發(fā)送。
- 如果是剛才第一個原因,接收方收到二次重發(fā)的數據后,便進行ACK應答。
- 如果是第二個原因,接收方發(fā)現接收的數據已存在(判斷存在的根據就是序列號,所以上面說序列號還有去除重復數據的作用),那么直接丟棄,仍舊發(fā)送ACK應答。
我們知道,一來一回的時間總是差不多的,都會有一個類似于平均值的概念。比如發(fā)送一個包到接
收端收到這個包一共是0.5s,然后接收端回發(fā)一個確認包給發(fā)送端也要0.5s,這樣的兩個時間就是
RTT(往返時間)。然后可能由于網絡原因的問題,時間會有偏差,稱為抖動(方差)。所以,超時重傳的時間大概是比往返時間+抖動值還要稍大的時間。
注意:在重發(fā)的過程中,假如一個包經過多次的重發(fā)也沒有收到對端的確認包,那么就會認為接收端異常,強制關閉連接。并且通知應用通信異常強行終止。
四、連接管理
連接管理就是三次握手與四次揮手的過程,過程如下圖所示:
五、最大消息長度
在建立TCP連接的時候,雙方約定一個最大的長度(MSS)作為發(fā)送的單位,重傳的時候也是以這個單位來進行重傳。
理想的情況下是該長度的數據剛好不被網絡層分塊。
雙方協(xié)商最大報文消息長度流程如下所示:
六、擁塞控制
滑動窗口控制解決了兩臺主機之間因傳送速率而可能引起的丟包問題,在一方面保證了TCP數據傳送的可靠性。然而如果網絡非常擁堵,此時再發(fā)送數據就會加重網絡負擔,那么發(fā)送的數據段很可能超過了最大生存時間也沒有到達接收方,就會產生丟包問題。為此TCP引入慢啟動機制,先發(fā)出少量數據,就像探路一樣,先摸清當前的網絡擁堵狀態(tài)后,再決定按照多大的速度傳送數據。
發(fā)送開始時定義擁塞窗口大小為1;每次收到一個ACK應答,擁塞窗口加1;而在每次發(fā)送數據時,發(fā)送窗口取擁塞窗口與接送段接收窗口最小者。
慢啟動:在啟動初期以指數增長方式增長;設置一個慢啟動的閾值,當以指數增長達到閾值時就停 止指數增長,按照線性增長方式增加至擁塞窗口;線性增長達到網絡擁塞時立即把擁塞窗口置回 1,進行新一輪的“慢啟動”,同時新一輪的閾值變?yōu)樵瓉淼囊话搿?/p>
擁塞控制算法主要有:慢啟動、擁塞避免、快重傳和快恢復;
他們的傳播過程圖如下所示:
1、慢啟動
通常在一條TCP連接開始時,cwnd 被設置為 1 個 MSS(最大報文段),也即 cwnd = 1 該階段,每當TCP發(fā)送方將發(fā)送窗口的數據發(fā)送完,并順利接收到所有的確認后,就會將擁塞窗口大小翻倍,也即慢啟動階段,cwnd 以指數形式增長,如下圖所示;注意這里忽略了接收窗口的影響,擁塞窗口會一直增長直到到達慢開始門限 ssthresh,開始執(zhí)行擁塞避免算法。
2、擁塞避免
? 該階段的擁塞窗口變?yōu)榫€性增長,每次 cwnd + 1
,也即每次增加一個 MSS;
? 隨著擁塞窗口的增加,發(fā)送速率不斷提高,當TCP遇到分組超時重傳時,即認為發(fā)生了網絡擁塞,此時將更新 擁塞窗口閾值 為當前擁塞窗口閾值的一半,下圖中是更新為 24 的一半即 12 更新 cwnd 的值為1然后繼續(xù)執(zhí)行慢啟動——擁塞避免,如下圖所示;
? 如果TCP發(fā)送方接收到連續(xù)的3個重復確認,則認為是正常的網絡包丟失,而不是網絡擁塞造成的(這正是快重傳算法的功勞)重傳丟失的分組執(zhí)行快恢復算法;
3、快重傳
? 所謂的快重傳算法,就是讓發(fā)送方盡快重傳,而不是等待計時器超時再重傳;
? (1)要求接收方不要等待自己發(fā)送數據時才捎帶確認,而是要立即發(fā)送確認;
? (2)即使是失序的報文段,也要立即發(fā)送對已收到的報文段的重復確認;
? (3)發(fā)送方一旦收到3個連續(xù)的重復確認就認為發(fā)生數據丟包,就將相應的報文段立即重傳,而不是等待該報文的重傳計時器超時再重傳;
4、快恢復
如果發(fā)送方收到了3個重復確認,就執(zhí)行快恢復;
然后將快開始門限(慢啟動閾值)和擁塞窗口閾值都設置為原來的一半,然后執(zhí)行慢啟動——擁塞避免;
七、流量控制
流量控制:如果發(fā)送方把數據發(fā)送得過快,接收方可能會來不及接收,這就會造成數據的丟失。
所謂流量控制就是讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收。利用滑動窗口機制可以很方便地在TCP連接上實現對發(fā)送方的流量控制。
TCP 流量控制是通過滑動窗口機制來實現的,下面我們來看一下:
滑動窗口機制
滑動窗口技術通過動態(tài)改變窗口大小來調節(jié)兩臺主機間數據傳輸,相互連接的主機間存在兩個滑動窗口:
- 一個用于接收數據(可用窗口)
- 一個用于發(fā)送數據(發(fā)送窗口)
根據接收端的接收情況,動態(tài)去調整窗口大小,然后來控制發(fā)送端的數據流量。文章來源:http://www.zghlxwxcb.cn/news/detail-406244.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-406244.html
到了這里,關于TCP為什么是可靠的(怎么保證有效傳輸的)?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!