安卓開發二號 2021-09-19 10:04:40 阅读数:137
這個概念大家一定不陌生,我以前寫過一篇詳細關於TCP的三次握手和四次揮手的文章,可以參考,這裏就不贅述
很多人會將流量控制和擁塞控制搞混,所以單獨拎出來,考究細節
流量控制:如果發送者發送數據過快,接收者來不及接收,那麼就會有分組丟失。流量控制策略就是控制發送者的發送速度,使得接收者來得及接收,達到不丟失分組的目的。流量控制是構成TCP可靠性的一方面。
流量控制主要使用滑動窗口機制實現。下面以上圖講解滑動窗口(也叫接受窗口rwnd)的細節
主機A向主機B發送數據,開始雙方確定的窗口值為400字節,這兩個是前提條件。開始A發送了200字節,之後發生了分組丟失現象,B調整接受窗口大小為300字節。之後A又連續發送了300字節。此時A已經不能發送數據,需等待B的窗口信號。之後B調整窗口為100字節。接收到100字節數據後,調整窗口值為0,錶示暫時不想接受數據。總共B調整了三次窗口大小,進行了三次流量控制
假如,B向A發送了零窗口的報文段後不久,B的接收緩存又有了一些存儲空間。於是B向A發送了rwind=400的報文段,然而這個報文段在傳送中丟失 了。A一直等待收到B發送的非零窗口的通知,而B也一直等待A發送的數據。這樣就死鎖了。為了解决這種死鎖狀態,TCP為每個連接設有一個持續計時器。只 要TCP連接的一方收到對方的零窗口通知,就啟動持續計時器,若持續計時器設置的時間到期,就發送一個零窗口探測報文段(僅攜帶1字節的數據),而對方就在確認這個探測報文段時給出了現在的窗口值。
擁塞控制,大家都能背出來,什麼慢開始、擁塞避免、快重傳、快恢複,大家都耳熟能詳,但是有些細節問題,可以大家沒有留意,比如快重傳階段後,為什麼不直接進入慢開始階段,而是進入擁塞避免階段?
擁塞的概念:在某段時間,對網絡中的某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變化,這種情况叫擁塞。網絡擁塞往往是由許多因素引起的,簡單的提高節點處理機的速度或者擴大結點緩存的存儲空間並不能解决擁塞問題。擁塞問題的是指往往是整個系統的各個部分不匹配,只有各個部分平衡了,問題才會得到解决。
擁塞控制:防止過多的數據注入到網絡,導致網絡中的路由器或鏈路過載。
流量控制和擁塞控制的區別:可以看出流量控制是一個端到端的問題,而擁塞控制是一個全局性問題,設計到所有的主機、所有的路由器。
發送方維持一個擁塞窗口cwnd,大小取决於網絡的擁塞程度,動態地在變化。發送窗口小於等於擁塞窗口,而發送窗口一定不能超過接收窗口。發送方控制擁塞窗口的原則是:只要網絡沒有出現擁塞,擁塞窗口就增大一些,以便把更多的分組發送出去。但是只要網絡出現擁塞,擁塞窗口就减小一些,以减少注入到網絡的分組數。
開始時,如果發送大量數據包,容易導致網絡中路由器緩沖空間耗盡,從而發生擁塞。所以新建連接時,cwnd初始化為1個最大報文段(MSS)大小,每經過一個迭代,擁塞窗口就乘以2,所以也稱為乘法增加階段。擁塞窗口不可能一直增大,所以一般會設置一個慢開始門限ssthresh.
一旦達到慢開始的初始門限ssthresh
,就進入了擁塞避免階段。每一個迭代,擁塞窗口加1,而不是加一倍
快重傳算法規定,發送方只要一連收到三個重複確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器時間到期。快重傳策略是為了防止TCP連接因等待重傳計時器超時而空閑較長的時間。
快重傳和快恢複是搭配使用的,快重傳完成後,立即執行快恢複算法。將ssthresh門限設置為當前擁塞窗口的一半,之後將擁塞窗口設置為新的ssthresh門限(即减半), 進入擁塞避免階段。
這裏可能會有人有疑問,為什麼不直接進入慢開始階段,更徹底得避免擁塞。**主要的原因是考慮到如果網絡出現擁塞得話,就不會收到多次重複確認,所以發送方認為網絡可能沒有出現擁塞,所以不執行慢開始算法,而是將cwnd設置為新得ssthresh門限,執行擁塞避免算法
面試題集可以幫助你查漏補缺,有方向有針對性的學習,為之後進大廠做准備。但是如果你僅僅是看一遍,而不去學習和深究。那麼這份面試題對你的幫助會很有限。最終還是要靠資深技術水平說話。
網上學習 Android的資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那麼很難做到真正的技術提昇。建議先制定學習計劃,根據學習計劃把知識點關聯起來,形成一個系統化的知識體系。
學習方向很容易規劃,但是如果只通過碎片化的學習,對自己的提昇是很慢的。
我搜集整理過這幾年字節跳動,以及騰訊,阿裏,華為,小米等公司的面試題,把面試的要求和技術點梳理成一份大而全的“ Android架構師”面試 Xmind(實際上比預期多花了不少精力),包含知識脈絡 + 分支細節。
在搭建這些技術框架的時候,還整理了系統的高級進階教程,會比自己碎片化學習效果强太多。
CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》
網上學習 Android的資料一大堆,但如果學到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那麼很難做到真正的技術提昇。希望這份系統化的技術體系對大家有一個方向參考。
版权声明:本文为[安卓開發二號]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919100440019T.html