引言
TCP巨復(fù)雜!同時在八股計算機網(wǎng)絡(luò)中也經(jīng)常被問到,必須會!這篇文章將讓小白有個大體框架,知道怎么個事,面試中可以有話說,也能讓佬更加鞏固知識點。
TCP是一個可靠的傳輸協(xié)議,為了保證它的可靠性,出現(xiàn)七七八八的機制,它可能有數(shù)據(jù)的破壞、丟包、重復(fù)以及分片順序混亂等問題,TCP通過序列號、確認應(yīng)答、重發(fā)控制、連接管理以及窗口控制等機制來實現(xiàn)可靠性傳輸。
有什么問題,或者疑惑,歡迎評論留言,開始進入正題
重傳機制
簡要:針對數(shù)據(jù)包丟失進行重傳
在網(wǎng)絡(luò)傳輸?shù)倪^程中,難免有包丟失情況,這時就需要重傳,也就是重傳機制去管控。
TCP實現(xiàn)可靠傳輸?shù)姆绞街痪褪峭ㄟ^序列號和確認應(yīng)答保證。
常見的重傳機制有:超時重傳、快速重傳、SACK、D-SACK
超時重傳:數(shù)據(jù)包丟失或者確認信息丟失,超過一定時間后進行數(shù)據(jù)重傳。
快速重傳:在接收到三次相同的ACK值,就找到對應(yīng)位置進行重傳后面發(fā)送的報文,但是會導(dǎo)致發(fā)送已經(jīng)接收到的數(shù)據(jù),做了無用功浪費資源。
SACK方法:選擇性確認,需要在TCP頭中加入SACK的東西,可以將已收到的數(shù)據(jù)信息發(fā)送給發(fā)送方,就可以知道哪些數(shù)據(jù)沒傳,只重傳丟失的數(shù)據(jù)
DSACK:直接發(fā)送SACK信息來告訴發(fā)送方有哪些數(shù)據(jù)被重復(fù)接受了。
滑動窗口
簡:在接收窗口大小內(nèi)不斷發(fā)數(shù)據(jù),避免發(fā)一個等確認信息才能再發(fā)
發(fā)送方每次等待一個確認消息才能繼續(xù)發(fā)送,效率太低,于是采用滑動窗口,在接收窗口大小內(nèi)可以不斷發(fā)送數(shù)據(jù)。無需等待確認信息。通常窗口是由接收方?jīng)Q定的,告訴發(fā)送方自己有多少緩沖區(qū)來接收數(shù)據(jù)。一般發(fā)送窗口約等于接收窗口,因為傳輸過程存在時延
TCP頭中有個window字段(表示窗口大?。?,告訴發(fā)送端自己還有多少緩沖區(qū)可以接收數(shù)據(jù)。于是發(fā)送端根據(jù)接收端處理能力發(fā)送數(shù)據(jù),不會到時接受端處理不過來
流量控制
簡:控制發(fā)送數(shù)據(jù)速率,避免對方處理不過來
讓發(fā)送方根據(jù)接收方的實際接受能力控制發(fā)送的數(shù)據(jù)量的機制
栗子:
A對B發(fā)送數(shù)據(jù),B對A進行流量控制(下面數(shù)據(jù)為舉例)
發(fā)送窗口范圍(4條,一條100字節(jié))內(nèi)發(fā)送3條數(shù)據(jù),就收到B的累計確認,并發(fā)送rwnd=300 進行流量控制(接受窗口改成3條,發(fā)送窗口相應(yīng)變成3條)。
A收到累計確認會刪除前面三條緩存(如果有丟失,后面繼續(xù)傳丟失文件)然后在窗口范圍(3條)內(nèi)發(fā)送3條。收到B累計確認,并發(fā)送rwnd=100進行流量,(接受窗口改成3條,發(fā)送窗口相應(yīng)變成3條)。
反復(fù),若rwnd=0,A不能再發(fā)送,等B有緩存處理時,又會發(fā)送rwnd=300(有三條緩存)然后A再發(fā)送數(shù)據(jù),但如果A沒收到,AB無線等待對方,會有持續(xù)計時器,一定時間發(fā)送1字節(jié)探測,等待B回應(yīng) 。
擁塞控制
簡:面對網(wǎng)絡(luò)中發(fā)生擁塞的機制
在網(wǎng)絡(luò)出現(xiàn)擁堵時,如果繼續(xù)發(fā)送大量數(shù)據(jù)包,可能會導(dǎo)致數(shù)據(jù)包時延、丟失,這時重傳只會加重網(wǎng)絡(luò)負擔(dān),導(dǎo)致更大延遲和包丟失,就陷入二性循環(huán),發(fā)生超時重傳就認為網(wǎng)絡(luò)出現(xiàn)堵塞。
擁塞控制主要包括四個算法:慢啟動,擁塞避免,擁塞發(fā)生,快速恢復(fù)
慢啟動
TCP剛剛建立有個慢啟動的過程,就是一點點提高發(fā)送數(shù)據(jù)包的數(shù)量,當(dāng)發(fā)送方每收到一個ACK,擁塞窗口(cwnd)的大小就會加1表示可以比之前多發(fā)1個,cwnd數(shù)量呈指數(shù)倍增加,1248。當(dāng)cwnd>= 慢啟動門限ssthresh就會使用擁塞避免算法。
指數(shù)倍增加:
初始cwnd若為1,加1,為2.,可以發(fā)兩個ACK,(cwnd兩個,最多發(fā)2個)。
收到兩個ACK,加2,為4,可以發(fā)四個ACK。
收到四個ACK,加4,為8,可以發(fā)八個ACK。
擁塞避免算法
每當(dāng)收到一個ACK時,cwnd增加1/cwnd。因為可以發(fā)cwnd個,所以cwnd*(1/cwnd)=1個,這樣cwnd數(shù)量就會變成線性增長。我們可以看到前面兩種算法都是讓他增加,網(wǎng)絡(luò)慢慢進入擁塞狀態(tài),于是出現(xiàn)丟包現(xiàn)象,需要對丟失的包重傳,進入擁塞發(fā)送算法
擁塞發(fā)生算法
發(fā)生后進行數(shù)據(jù)包重傳
超時重傳:門限變成cwnd/2,再重置cwnd為初始值
快速重傳:認為只是少部分數(shù)據(jù)丟失,cwnd設(shè)置原來一半,門限=cwnd。進入快速恢復(fù)算法
快速恢復(fù)算法
-
擁塞窗口
cwnd = ssthresh + 3
( 3 的意思是確認有 3 個數(shù)據(jù)包被收到了); -
重傳丟失的數(shù)據(jù)包;
-
如果再收到重復(fù)的 ACK,那么 cwnd 增加 1;
-
如果收到新數(shù)據(jù)的 ACK 后,把 cwnd 設(shè)置為第一步中的 ssthresh 的值,原因是該 ACK 確認了新的數(shù)據(jù),說明從 duplicated ACK 時的數(shù)據(jù)都已收到,該恢復(fù)過程已經(jīng)結(jié)束,可以回到恢復(fù)之前的狀態(tài)了,也即再次進入擁塞避免狀態(tài);
借用小林的圖:文章來源:http://www.zghlxwxcb.cn/news/detail-857550.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-857550.html
到了這里,關(guān)于八股文——TCP四大機制!小白也能懂!(重傳機制、滑動窗口、流量控制、擁塞控制)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!