初衷陸陸續(xù)續(xù)面了幾家公司,發(fā)現(xiàn)面試官問的不少問題我明明知道,可是我根本不知道怎么講出來、講準(zhǔn)確,復(fù)習(xí)刷面經(jīng)時看到許多問題我都默認(rèn)我會然后帶過,這就使得自己白白浪費了許多次面試機(jī)會,因此開始寫文章記錄并且用自己的話表達(dá)。 之前有看到一句很喜歡的話,分享給大家,共勉。
我的文章不會講的很深,更多是用自己的話去總結(jié)學(xué)習(xí)的知識,如果有不同看法,歡迎評論區(qū)交流! 進(jìn)入正題吧! 眾所周知,TCP/UDP是屬于傳輸層的協(xié)議,我將從下面幾個方面進(jìn)行探討: 1.TCP/UDP報文結(jié)構(gòu)2.何為面向字節(jié)流/面向報文流3.TCP和UDP的不同4.TCP特性 TCP/UDP報文結(jié)構(gòu)TCP報文結(jié)構(gòu)在上圖之前我們先重新審視一下TCP這個協(xié)議; 首先,它位于傳輸層,而傳輸層的主要功能就是建立端口到端口的通信,那不難得到,報文結(jié)構(gòu)是需要記錄端口號的,即 我們再考慮一下,TCP可靠的這個特點,直觀的來看就是擁有確認(rèn)應(yīng)答機(jī)制,那關(guān)于發(fā)送和確認(rèn)的應(yīng)答,我們自然可以想到用 接著,三次握手四次揮手過程中發(fā)起連接方和發(fā)起端開方需要發(fā)送帶有一個標(biāo)志位(SYN/FIN置1)的報文,自然也就有標(biāo)志位; 下面我們引入報文結(jié)構(gòu)
補(bǔ)充一下上面沒講到的: ·首部長度:標(biāo)識這個TCP報頭(首部首部,自然就不帶數(shù)據(jù)部分了!) 報頭長度是會變的!注意 以上,TCP報文首部大小是20字節(jié)(選項字段為0); UDP報文結(jié)構(gòu)UDP也是傳輸層協(xié)議,自然也有 UDP不像TCP那么可靠,自然就不會有流量控制、確認(rèn)應(yīng)答機(jī)制這些相關(guān)字段;
·UDP長度:是 首部+數(shù)據(jù) 的大小,無數(shù)據(jù)的情況下會是最小8字節(jié)·檢驗和:同TCP,覆蓋報頭和數(shù)據(jù)進(jìn)行的; 何為面向字節(jié)流/面向報文我相信大家在刷面經(jīng)的過程中一定看到過,TCP是面向字節(jié)流,UDP是面向報文的,但具體是什么意思,又存在什么樣的問題呢? TCP是面向字節(jié)流:“字節(jié)就是字節(jié)”,也就是說對于TCP協(xié)議來說,信息沒有什么特殊的,大家都是字節(jié),因此TCP就沒有邊界的的概念; 如果是客戶端連續(xù)發(fā)送數(shù)據(jù),服務(wù)器端的緩沖區(qū)如果足夠大,就會一次性接收過來,這就是沒有邊界的意思。 UDP是面向報文:客戶端連續(xù)發(fā)送數(shù)據(jù),服務(wù)器端緩沖區(qū)不論有多大,都是一次一次接受,客戶端發(fā)多少次,服務(wù)器端接收多少次,這就是有邊界的概念 至此!我們引出一個問題 ·TCP面向字節(jié)存在什么問題? 答:粘包!當(dāng)客戶端連續(xù)發(fā)送數(shù)據(jù),服務(wù)器端一次接收過來,就會造成多個包粘在一起的情況!或者某些包被分隔開與其他包粘在了一起; ·如何解決這個問題? 答: 1.我們可以協(xié)定規(guī)定一個包大小是多少,不滿足的部分用0等特殊字符補(bǔ)滿。 2.或者人為規(guī)定結(jié)束符號例如'@ # $ %'等,只要沒遇到符號,就表示沒結(jié)束前一個包。 TCP和UDP的不同這里請讀者自己想想,兩者各自的特點是什么? TCP安全,UDP快,這個不難想到; TCP的安全我們放到下面下一個大標(biāo)題去講,這里講一下UDP的快! 首先UDP報頭短只有8字節(jié),TCP最小都要20字節(jié),并且UDP不需要進(jìn)行三次握手四次揮手的相關(guān)操作,省去了建立連接銷毀的過程,快就快在這里! 所以,如果面試官問你dns為什么要用udp協(xié)議,我想你心里已經(jīng)有答案了,甚至還能給他講一講別的! TCP特性這里內(nèi)容較多,我單獨摘出來講; ·確認(rèn)應(yīng)答機(jī)制: 接收方在確認(rèn)應(yīng)答時,會將發(fā)送的seq序號+1作為ACK返回
如果發(fā)送方發(fā) 1 2 3 4,2包丟了,1 3 4順利到達(dá),接收方仍會返回ACK為2的報文(意思是給我2我沒2) ·超時重傳機(jī)制 數(shù)據(jù)發(fā)送出去丟了怎么辦! TCP維護(hù)了一個超時重傳計時器,在數(shù)據(jù)發(fā)出去后就開始計時,時間到了還沒有收到確認(rèn)應(yīng)答,就會重新發(fā)送這個數(shù)據(jù)。 ·流量控制 記得我們之前分析TCP報頭結(jié)構(gòu)時候有一個窗口的字段嗎?沒錯他就是搞這個的; 接收端數(shù)據(jù)處理能力是有限的,如果發(fā)的太快,就會積攢到接收端的緩沖區(qū),這時候繼續(xù)發(fā)那不就溢出來了?(怎么突然想到紫薇爾康) 因此維護(hù)了一個字段用于接收方向發(fā)送方傳遞信息,你就傳xxx這么多就行了,多了我要不了; 多說一句,那緩沖區(qū)滿了咋辦?當(dāng)然是將窗口值寫0,發(fā)送方就不發(fā)了; 那再多說一句,不讓發(fā)了就下班了?其實并不是,發(fā)送方定期會發(fā)送一個數(shù)據(jù),用于探測對方的窗口大小。 ·滑動窗口 這個問題面試官問到了!心里清楚,根本不知道怎么講! 我們思路回到剛才確認(rèn)應(yīng)答機(jī)制,每發(fā)送一個需要等待一個ack才能發(fā)下一次,這其中有什么缺點,應(yīng)該不用我多少了吧? 滑動窗口就是讓發(fā)送端無需等待確認(rèn)應(yīng)答就可以進(jìn)行下一次發(fā)送!
那上面這個圖跟窗口有啥關(guān)系???我們們慢慢講; 我們先要明確窗口大小的含義:即無需確認(rèn)就可以繼續(xù)發(fā)送數(shù)據(jù)的最大值; 發(fā)送完1 2 3 4后收到確認(rèn)應(yīng)答就繼續(xù)發(fā)送5 6 7 8,窗口從包含1 2 3 4滑到了包含5 6 7 8;是不是有點眉目了? 那這里存在一個問題,前面有包在發(fā)送期間丟了怎么辦? 注意!只有確認(rèn)應(yīng)答過的數(shù)據(jù)才會從 發(fā)送緩沖區(qū) 刪除掉,不然滑動窗口左側(cè)就會卡在這里不向右滑。比如:發(fā)送1 2 3 4 時 2丟了,確認(rèn)1時ack是2(表示我要2),接受到3 4還是會返回索要2的ack; 這里有個細(xì)節(jié),就是發(fā)送端接收到值2的ack時,代表第一個包收到了,滑動窗口就會右移一格; 注意上面說的是發(fā)送期間 在發(fā)送方發(fā)送1 2 3 4后等待應(yīng)答的過程中,服務(wù)器端會返回值為2 3 4 5的ACK,這時候如果其中的3丟了,有影響嗎? 答案是沒有影響,既然它能收到值為5的ack,自然說明前面都接收到了! 這個窗口的大小誰來指定呢? 答:TCP報頭結(jié)構(gòu)里的窗口字段(和流量控制結(jié)合起來了),發(fā)送方緩存的數(shù)據(jù)維護(hù)如下
可用窗口就是應(yīng)答報文的窗口大??; 大概過程大家可以再結(jié)合下面的圖理解
如果圖片還不能夠讓你搞懂原理,可以用下面的工具進(jìn)行模擬,開箱即用哦!滑動窗口模擬器[1] ·擁塞控制-四大算法 這個就是大頭了! RTT:報文 發(fā)送出去+應(yīng)答接受回來 的一小段時間 擁塞窗口:這是一個根據(jù)網(wǎng)絡(luò)狀態(tài)會變化的量,先知道這里即可。 閾值:一個界限,界限前后調(diào)用不同算法; 四大算法: ·慢啟動: 一開始使擁塞窗口為1去探測網(wǎng)絡(luò)狀態(tài),每次接收到一個ACK就會+1; 即在一個RTT時間內(nèi),擁塞窗口大小成指數(shù)增長,你品品; ·擁塞避免 慢啟動以后窗口大小指數(shù)增長,那什么時候轉(zhuǎn)換策略呢? 對咯,是到閾值就會轉(zhuǎn)變策略,會變成線性增長; ·快速重傳 當(dāng)我們發(fā)送一系列的報文比如有1 2 3 4,1在發(fā)送過程中丟掉了,2 3 4順利到達(dá),那么就會返回3個值為2的ACK,(注意這時網(wǎng)絡(luò)是ok的,報文的發(fā)送返回是很快的 在一個RTT時間內(nèi),還不至于讓超時重傳機(jī)制計入),發(fā)送端就會立刻重傳2的的報文; ·快速恢復(fù) 那快速重傳后 擁塞窗口繼續(xù)線程增長? NoNoNo!正確操作是,發(fā)生快速重傳后,閾值就設(shè)為 擁塞窗口的一半,窗口也等于自身的一半,然后繼續(xù)開始線性增長探測網(wǎng)絡(luò)情況; 如果是超時重傳怎么恢復(fù)? 答:閾值設(shè)為擁塞窗口的一半,擁塞窗口設(shè)1,然后重新開始慢啟動; 關(guān)于個人理解的滑動窗口和擁塞窗口 他們都是在發(fā)送端維護(hù)的窗口,只不過滑動窗口的大小是由接收端控制的,這一點是要好好再思考思考; 其次總不能應(yīng)答報文說要多少就是多少吧?因此引入了擁塞窗口,去快快+慢慢增長去探測網(wǎng)絡(luò)狀況。 |
|
|