小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【很干】一篇搞懂TCP、UDP特性

 丘山三也君 2022-02-22

初衷

陸陸續(xù)續(xù)面了幾家公司,發(fā)現(xiàn)面試官問的不少問題我明明知道,可是我根本不知道怎么講出來、講準(zhǔn)確,復(fù)習(xí)刷面經(jīng)時看到許多問題我都默認(rèn)我會然后帶過,這就使得自己白白浪費了許多次面試機(jī)會,因此開始寫文章記錄并且用自己的話表達(dá)。

之前有看到一句很喜歡的話,分享給大家,共勉。

知識的學(xué)習(xí)在于點滴記錄,堅持不懈;知識的學(xué)習(xí)要有深度和廣度,不能只流于表面,坐井觀天;知識要善于總結(jié),不僅能夠理解,更知道如何表達(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)答,我們自然可以想到用序列號(seq)確認(rèn)應(yīng)答號(ack)來表示

接著,三次握手四次揮手過程中發(fā)起連接方和發(fā)起端開方需要發(fā)送帶有一個標(biāo)志位(SYN/FIN置1)的報文,自然也就有標(biāo)志位;

下面我們引入報文結(jié)構(gòu)

圖片

補(bǔ)充一下上面沒講到的:

·首部長度:標(biāo)識這個TCP報頭(首部首部,自然就不帶數(shù)據(jù)部分了!) 報頭長度是會變的!注意選項這個字段,可以為空,也可以附帶別的信息,因此又首部長度來記錄·窗口大小:接收方在接收到報文以后會確認(rèn)應(yīng)答,這個返回的報文中就會告訴發(fā)送方自己的緩沖區(qū)還能接受多少數(shù)據(jù),用于流量控制·校驗和:這個檢驗和覆蓋全部數(shù)據(jù),而IP協(xié)議的檢驗和是覆蓋報文頭部信息。用于差錯檢驗,如果接收方發(fā)現(xiàn)不對勁,直接丟棄。·緊急指針:記錄數(shù)據(jù)中哪些數(shù)據(jù)屬于緊急數(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ò)狀況。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多