為什么TCP協(xié)議是可靠的片吊?TCP協(xié)議是怎么保證數(shù)據(jù)的可靠的?
答:能夠保證TCP協(xié)議可靠的算法有檢驗和协屡,連接管理機制俏脊,ACK應(yīng)答機制,快速重傳和超時重傳機制肤晓,滑動窗口機制爷贫,擁塞控制機制,這些機制共同保證TCP協(xié)議的可靠性材原。
檢驗和:TCP檢驗和的計算與UDP一樣沸久,在計算時要加上12byte的偽首部季眷,檢驗范圍包括TCP首部及數(shù)據(jù)部分余蟹,但是UDP的檢驗和字段為可選的,而TCP中是必須有的子刮。計算方法為:在發(fā)送方將整個報文段分為多個16位的段威酒,然后將所有段進行反碼相加窑睁,將結(jié)果存放在檢驗和字段中,接收方用相同的方法進行計算葵孤,如最終結(jié)果為檢驗字段所有位是全1則正確(UDP中為0是正確)担钮,否則存在錯誤∮热裕可以保證接收方能判斷當前報文是否屬于自己要接受的報文箫津,如果為0,那就是宰啦,不為0苏遥,則不是,丟棄此報文赡模。抽象些來說就像是取快遞田炭,你的電話姓名和快遞上的信息一致,你才能確定這是你的快遞漓柑,才會去取教硫,不會錯拿別人的快遞。
序列號:TCP 對每個報文進行編號辆布,這些編號就是序列號瞬矩。而序列號有多種作用
a:保證可靠性,當接收到的數(shù)據(jù)失序時锋玲,就能立馬知道
b:去除重復(fù)的報文丧鸯,數(shù)據(jù)傳輸過程中的確認應(yīng)答,重發(fā)控制嫩絮,重復(fù)控制等功能都要依靠序列號來實先丛肢。
c:提高效率,可以實現(xiàn)多次發(fā)送剿干,一次確認蜂怎。
ACK應(yīng)答機制:發(fā)送的每一條消息,都需要對方發(fā)送一條消息來回復(fù)消息是否被收到置尔。
主要實現(xiàn)是TCP的首部來控制杠步,當ACK =1 時ack才有效,ack等于期望下一個傳輸過來的序號榜轿,也就是上一次接收消息的序號+1幽歼。這樣就可以保證消息能被確認接收。(三次握手和四次揮手都在用這個機制)
連接管理機制:三次握手建立連接與四次揮手斷開連接谬盐,保證了TCP的全雙工工作甸私。
快重傳和超時重傳:保證了數(shù)據(jù)能夠不丟失的傳輸數(shù)據(jù)。(注意:超時重傳機制和快重傳機制飞傀,同時存在皇型。誰先檢驗到報文失序诬烹,誰就生效。)
-
快重傳:發(fā)送方連續(xù)收到3個接收方發(fā)送的同一個ack時弃鸦,此時快速重傳ack序號以及其之后的所有數(shù)據(jù)報绞吁。
快重傳 -
超時重傳:當發(fā)送方發(fā)送了數(shù)據(jù)給接收方,當時超過了約定的時間(RTO)也沒有接收到確認消息唬格,此時重傳此報文家破。(Tips:RTO也就是重傳超時時間,這個時間由TCP的自適應(yīng)算法生成)
超時重傳
滑動窗口:滑動窗口既提高了報文傳輸?shù)男使焊冢脖苊饬税l(fā)送方發(fā)送過多的數(shù)據(jù)而導(dǎo)致接收方無法正常處理的異常员舵。數(shù)據(jù)的發(fā)送方和接收方都有滑動窗口,對于發(fā)送方來說藕畔,窗口內(nèi)就是可以發(fā)送的報文马僻,當窗口的前沿緊挨的報文發(fā)送并且確認時,窗口向后移動注服。而窗口的后沿可以向前移動韭邓,當接收方處理不了那么多的報文時,就會發(fā)送消息告訴發(fā)送方溶弟,此時滑動窗口就需要縮小女淑,所以后沿前移。但是TCP非常不建議窗口后沿前移辜御。
說到滑動窗口鸭你,就不得不梳理一下消息發(fā)送的過程中的緩存機制:
發(fā)送方和接收方的滑動窗口工作流程:
伴隨著效率的提升,也會有問題產(chǎn)生擒权,如果消息沒被確認怎么辦如圖所示袱巨,假如31,32碳抄,33愉老,34,報文發(fā)送了剖效,32嫉入,33,34都被確認了璧尸,31沒被確認怎么辦呢咒林?這時就重新發(fā)送31,并且31之后的數(shù)據(jù)報全部重新發(fā)送爷光。
在圖中我們還會發(fā)現(xiàn)窗口的前沿和后沿會移動垫竞,窗口前沿和后沿都向后移動,意味著前沿緊挨的報文發(fā)送并被確認瞎颗,而后沿的前移意味著件甥,接收端處理那么多消息,請縮小窗口的大小哼拔。
所以解決了發(fā)送的數(shù)據(jù)過多引有,導(dǎo)致接收端無法正常接收的異常。
擁塞控制:擁塞控制使得宏觀網(wǎng)絡(luò)中的資源能夠合理的應(yīng)用倦逐。實現(xiàn)的算法有四個譬正,慢開始,擁塞避免檬姥,快速回復(fù)曾我,和快速重傳.
1.慢開始指一開始發(fā)送報文時,不清楚網(wǎng)絡(luò)中的情況健民,試探性的發(fā)送1cwnd(擁塞窗口)的數(shù)據(jù)量抒巢。
2.如果沒有到ssthresh(慢開始門限值),則以指數(shù)形式增長秉犹,一直到門限值蛉谜;
3.當?shù)竭_門限值時,此時采用擁塞避免算法讓擁塞窗口緩慢增長崇堵,即每經(jīng)過一個RTT(往返時間)就把發(fā)送方的擁塞窗口+1型诚,不能是指數(shù)性增長了,一直到發(fā)生網(wǎng)絡(luò)擁塞為止鸳劳。
4.當發(fā)生網(wǎng)絡(luò)擁塞時狰贯,把ssthresh的值設(shè)置為出現(xiàn)擁塞時發(fā)送窗口大小的一半,然后把擁塞窗口設(shè)置為1赏廓,再次執(zhí)行慢開始算法涵紊。
5.在發(fā)送方知道只是丟失了個別的報文段時,采用快恢復(fù)算法幔摸,將門限值設(shè)置成擁塞窗口大小的一半栖袋,并將擁塞窗口設(shè)置為當前門限值,并執(zhí)行擁塞避免算法抚太。
6.當發(fā)送方一連收到3個對同一個報文段的重復(fù)確認時塘幅,采用快速重傳算法,立即進行重傳尿贫,這樣就不會出現(xiàn)超時电媳,可以使整個網(wǎng)絡(luò)的吞吐量提高約20%。
————————————————
版權(quán)聲明:本文為CSDN博主「nZk丶」的原創(chuàng)文章庆亡,遵循CC 4.0 BY-SA版權(quán)協(xié)議匾乓,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43729854/article/details/107633250