TCP/UDP对比总结
目錄
??在計(jì)算機(jī)網(wǎng)絡(luò)中,有三種體系結(jié)構(gòu)劃分方式,第一種是OSI七層協(xié)議體系結(jié)構(gòu),由上到下分別是:應(yīng)用層,表示層,會(huì)話層,運(yùn)輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層,物理層;第二種是TCP/IP四層協(xié)議,由上到下分別是:應(yīng)用層,運(yùn)輸層,網(wǎng)際層,網(wǎng)絡(luò)接口層。第一種劃分方式復(fù)雜又不實(shí)用,第二種劃分方式最下面“網(wǎng)絡(luò)接口層”對(duì)計(jì)算機(jī)網(wǎng)絡(luò)來說,和一般的通信鏈路沒有多大的區(qū)別,所以最后折中為我們常用的五層協(xié)議:應(yīng)用層,運(yùn)輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層,物理層。
??運(yùn)輸層向它上面的應(yīng)用層提供服務(wù),它屬于面向通信部分的最高層,同時(shí)也是用戶功能的最底層。兩個(gè)主機(jī)通過核心網(wǎng)絡(luò)進(jìn)行端到端通信時(shí),只有主機(jī)部分有運(yùn)輸層,核心網(wǎng)絡(luò)部分的路由在轉(zhuǎn)發(fā)分組時(shí)只用到下面三層。
??TCP/UDP作為傳輸層協(xié)議,各自都有著非常廣泛的應(yīng)用場(chǎng)景,下面先對(duì)這兩種協(xié)議做一個(gè)簡(jiǎn)單對(duì)比,然后分別介紹下這兩種協(xié)議。本文僅從原理上介紹兩種協(xié)議,暫并不涉及編程。
1 TCP-UDP對(duì)比
??相同點(diǎn):
??TCP和UDP都是網(wǎng)絡(luò)層之上的,傳輸層協(xié)議,都能都能保護(hù)網(wǎng)絡(luò)層的傳輸,雙方的通信都需要開放端口,TCP和UDP中都存在復(fù)用和分用技術(shù)。
??不同點(diǎn):
??一提到TCP-UDP的區(qū)別,大家最容易想到的便是TCP是可靠傳輸?shù)模琔DP是不可靠傳輸?shù)模旅婢秃?jiǎn)單羅列一下:
| 選項(xiàng) | TCP | UDP |
|---|---|---|
| 可靠性 | 全雙工可靠傳輸無差錯(cuò),不丟失,不重復(fù),且按序到達(dá) | 盡最大努力交付 |
| 建立連接 | 需要建立連接 | 無需建立連接 |
| 數(shù)據(jù)發(fā)送模式 | 面向字節(jié)流 | 面向報(bào)文 |
| 傳輸方式 | 點(diǎn)對(duì)點(diǎn)(不支持廣播和多播) | 一對(duì)一,一對(duì)多,多對(duì)一,多對(duì)多 |
| 首部開銷 | 20字節(jié) | 8字節(jié) |
| 擁塞機(jī)制 | 有 | 無 |
| 流量控制 | 有 | 無 |
| 系統(tǒng)資源占用 | 對(duì)系統(tǒng)資源要求較多 | 對(duì)系統(tǒng)資源要求較少 |
| 實(shí)時(shí)性 | 相對(duì)UDP較低 | 較高,適用于對(duì)高速傳輸和實(shí)時(shí)性要求較高的通信或廣播通信 |
| 確認(rèn)重傳機(jī)制 | TCP提供超時(shí)重發(fā),丟棄重復(fù)數(shù)據(jù),檢驗(yàn)數(shù)據(jù), | 無重傳,只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地 |
??對(duì)于上表中所述“數(shù)據(jù)發(fā)送模式”做一下簡(jiǎn)單補(bǔ)充:
??對(duì)TCP:TCP不關(guān)心應(yīng)用程序一次性把多長(zhǎng)的數(shù)據(jù)報(bào)文發(fā)送到TCP緩存中,而是根據(jù)對(duì)方給出的窗口值和網(wǎng)絡(luò)擁塞程度決定報(bào)文段應(yīng)該包含多少字節(jié).
??對(duì)UDP:一次交付一個(gè)完整的報(bào)文,報(bào)文長(zhǎng)度由應(yīng)用程序給出。
2 UDP介紹
??對(duì)于UDP的介紹以及提點(diǎn)在第一節(jié)比較中已做了詳細(xì)描述,這里提一點(diǎn):雖說UDP的不可靠傳輸特性在很多應(yīng)用場(chǎng)景中大展身手,但是也要盡可能的提高UDP傳輸?shù)目煽啃浴H绾翁岣遀DP的可靠性呢?應(yīng)用程序可以在不影響應(yīng)用的實(shí)時(shí)性的前提下,增加一個(gè)提高可靠性的措施,如采用前向糾錯(cuò)或重傳已丟失的報(bào)文。
3 TCP介紹
??對(duì)于TCP的介紹,主要圍繞一個(gè)主題,為什么說TCP是可靠傳輸,下面會(huì)分別從可靠傳輸?shù)脑砗蛯?shí)現(xiàn),面向連接,流量控制,擁塞控制,幾個(gè)方面進(jìn)行介紹。
??對(duì)TCP的介紹有一個(gè)前提:只介紹單項(xiàng)傳輸,有A傳輸數(shù)據(jù)給B
3.1 可靠傳輸?shù)脑砗蛯?shí)現(xiàn)
3.1.1 可靠傳輸原理
??可靠傳輸?shù)脑碇饕蕾囉趦蓚€(gè)協(xié)議:停止等待協(xié)議和連續(xù)ARQ協(xié)議,下面分別介紹之:
1 停止等待協(xié)議
??當(dāng)A向B傳輸數(shù)據(jù)時(shí),A收到B的確認(rèn)才發(fā)送下一個(gè)分組。如果收不到B的確認(rèn),A會(huì)重傳上一個(gè)未收到確認(rèn)的報(bào)文。具體確認(rèn)重傳機(jī)制如下:當(dāng)A向B發(fā)送數(shù)據(jù)后,A會(huì)開啟一個(gè)超時(shí)計(jì)時(shí)器,計(jì)時(shí)時(shí)間內(nèi)收到B的確認(rèn),發(fā)送下一個(gè)報(bào)文,若計(jì)時(shí)器超時(shí),還沒有收到B發(fā)來的確認(rèn),A重傳上一個(gè)未收到確認(rèn)的報(bào)文。
??在確認(rèn)重傳機(jī)制中存在一個(gè)“確認(rèn)丟失和確認(rèn)遲到”的現(xiàn)象。
??“確認(rèn)丟失”表示B發(fā)給A的確認(rèn)報(bào)文在傳輸過程中丟失,A沒有收到,當(dāng)A的超時(shí)計(jì)數(shù)器超時(shí)后,A會(huì)重傳報(bào)文,B接收到該重傳報(bào)文后,丟棄該報(bào)文并重新發(fā)送確認(rèn)。
??“確認(rèn)遲到”表示B發(fā)給A的確認(rèn)報(bào)文卡在了傳輸過程中的某一個(gè)環(huán)節(jié),A沒有收到,當(dāng)A的超時(shí)計(jì)數(shù)器超時(shí)后,A會(huì)重傳報(bào)文,B接收到該重傳報(bào)文后,丟棄該報(bào)文并重新發(fā)送確認(rèn),A接收到重復(fù)發(fā)來的確認(rèn)報(bào)文后,丟棄該報(bào)文不做任何處理。
2 連續(xù)ARQ協(xié)議
??在A發(fā)送報(bào)文時(shí)使用一個(gè)合適大小的窗口(也即后面提到的滑動(dòng)窗口),A發(fā)送報(bào)文段從該窗口中依次發(fā)送,A每接收到一個(gè)確認(rèn),該窗口就向后移動(dòng)一個(gè)報(bào)文段。此時(shí)B一般不會(huì)收到每個(gè)報(bào)文段都回復(fù)一個(gè)確認(rèn),而是采用累積確認(rèn)的方式,即在B收到幾個(gè)分組后,對(duì)按順序到達(dá)的最后一個(gè)分組發(fā)送確認(rèn),表示到這個(gè)分組為止的所有分組都已經(jīng)收到了。
3.1.2 可靠傳輸實(shí)現(xiàn)
??在面向連接的基礎(chǔ)上,主要是通過以字節(jié)為單位的滑動(dòng)窗口,超時(shí)重傳和選擇確認(rèn)這三種方式,并輔以流量控制和擁塞控制這兩種機(jī)制,來實(shí)現(xiàn)TCP的可靠傳輸。
3.2 TCP面向連接管理
3.2.1 建立連接
??如上圖,是TCP建立連接的示意圖,下面分布說明之:
??1 考試客戶端A和服務(wù)器端B都處于CLOSE狀態(tài);并且A是主動(dòng)打開連接,B是被動(dòng)打開連接;
??2 B的服務(wù)器進(jìn)程創(chuàng)建傳輸控制塊TCB,進(jìn)入LISTEN(收聽)狀態(tài),等待客戶端發(fā)送請(qǐng)求。TCB用來存儲(chǔ)每一個(gè)連接中的一些重要信息,如TCP連接表,到發(fā)送和接收緩存的指針,到重傳隊(duì)列的指針,當(dāng)前的發(fā)送和接受序號(hào)等;
??3 客戶端A也創(chuàng)建TCB,向B發(fā)出連接請(qǐng)求報(bào)文段,其中首部中同部位SYN = 1,選擇一個(gè)初始序列號(hào)seq = x,進(jìn)入SYN-SEND(同步已發(fā)送)狀態(tài)。SYN報(bào)文段不攜帶數(shù)據(jù),占用一個(gè)序列號(hào);
??4 B收到請(qǐng)求報(bào)文段后,如同意連接,向A發(fā)送確認(rèn),其中SYN和ACK都置為1,確認(rèn)號(hào)ack = x+1,選擇一個(gè)初始序列號(hào)seq = y,進(jìn)入SYN-RCVD(同步收到)狀態(tài),該報(bào)文段不攜帶數(shù)據(jù),占用一個(gè)序列號(hào);
??5 A收到B的確認(rèn)后,再給B發(fā)確認(rèn),其中ACK = 1,ack = y+1,seq = x+1。A進(jìn)入ESTABLISHED(已建立連接狀態(tài))。可帶數(shù)據(jù)可不帶,若不攜帶數(shù)據(jù)則不消耗序列號(hào),下次發(fā)送數(shù)據(jù)序列號(hào)依舊是seq = x+1。
??6 B收到A的確認(rèn)后,B進(jìn)入ESTABLISHED(已建立連接狀態(tài))。
3.2.2 釋放連接
??如上圖,是TCP釋放連接的示意圖,下面分布說明之:
??1 A,B都處于 ESTABLISHED狀態(tài),假設(shè)A的進(jìn)程先向B發(fā)出釋放連接報(bào)文段,FIN = 1,seq等于上一次發(fā)送數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)加1;此時(shí)A進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài);
??2 B收到連接釋放報(bào)文段后,發(fā)出確認(rèn),ACK置為1,ack = u+1,seq等于上一次發(fā)送數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)加1;此時(shí)B進(jìn)入CLOSE-WAIT(關(guān)閉等待)狀態(tài);此時(shí)TCP服務(wù)器進(jìn)程通知高層應(yīng)用程序A到B的連接釋放了,此時(shí),A沒有數(shù)據(jù)發(fā)送給B,但是B可以發(fā)送數(shù)據(jù)給A,A要接受;屬于半關(guān)閉狀態(tài);
??3 A收到來自B的確認(rèn)后,進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)送釋放連接報(bào)文段;在此期間,A有可能還會(huì)收到B發(fā)過來的數(shù)據(jù);
??4 當(dāng)B沒有數(shù)據(jù)發(fā)送到A時(shí),向A發(fā)送連接釋放報(bào)文段,FIN = 1,假定B的req = w(假設(shè)在半關(guān)閉狀態(tài)B又向A發(fā)送數(shù)據(jù)),確認(rèn)號(hào)重復(fù)上次的確認(rèn)號(hào)ack = u+1;此時(shí)B處于LAST-ACK(最后確認(rèn))狀態(tài);
??5 A收到B的連接釋放報(bào)文段時(shí),向B發(fā)出確認(rèn),ACK置為1,自己的序列號(hào)req = u+1(根據(jù)TCP規(guī)定,前面發(fā)送的FIN報(bào)文段需要消耗一個(gè)報(bào)文段);此時(shí)A進(jìn)入TIME-WAIT(時(shí)間等待)狀態(tài);此時(shí),連接還沒有釋放,A等到2倍的最長(zhǎng)報(bào)文段壽命MSL(4分鐘)后,才能釋放連接,A進(jìn)入CLOSE狀態(tài),隨時(shí)準(zhǔn)備下一個(gè)連接;
??6 B收到A的確認(rèn)后,進(jìn)入CLOSE狀態(tài),隨時(shí)準(zhǔn)備下一個(gè)連接。
3.3 流量控制
??流量控制往往指點(diǎn)對(duì)點(diǎn)通信量的控制,是端到端的問題。流量控制所要做的就是:抑制發(fā)送端的發(fā)送速率,以便接收端來得及接收。
??主要是由接收方通過發(fā)送給發(fā)送方的控制窗口的大小,開控制發(fā)送方的發(fā)送速率。
3.4 擁塞控制
??擁塞控制是一個(gè)全局性的過程,涉及到所有的主機(jī),所有的路由器等,主要是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,使網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。總之一句話,要做到可用的資源大于對(duì)網(wǎng)絡(luò)資源的總需求,這樣就能防止網(wǎng)絡(luò)擁塞。
??防止網(wǎng)絡(luò)擁塞有兩種方法,“慢開始和擁塞避免”和“快重傳和快恢復(fù)”,下面分別介紹之:
1 慢開始和擁塞避免
??前提:TCP中是以字節(jié)作為窗口的單位,這里為了描述方便,使用報(bào)文段的個(gè)數(shù)作為窗口的大小。
??1 發(fā)送方開始發(fā)送數(shù)據(jù)時(shí),擁塞窗口cwnd設(shè)置為一個(gè)最大報(bào)文段MSS的大小;
??2 發(fā)送方收到確認(rèn)后,發(fā)送方把擁塞窗口cwnd設(shè)置為2,這樣發(fā)送方可以發(fā)送第二,第三個(gè)報(bào)文段;
??3 發(fā)送方每收到一個(gè)報(bào)文段的確認(rèn)后,cwnd的大小加1,由于接收方采用累積確認(rèn)的方式,當(dāng)發(fā)送方接收到報(bào)文段3的確認(rèn)時(shí),發(fā)送方把擁塞窗口cwnd設(shè)置為4;
??4 這樣,每經(jīng)過一個(gè)輪次,cwnd就加倍。所謂輪次。是指把擁塞窗口cwnd所允許的所有報(bào)文段都發(fā)送出去,并收到對(duì)已發(fā)送的最后一個(gè)字節(jié)的確認(rèn),這個(gè)輪次稱為一次往返時(shí)間RTT;
??5 擁塞窗口cwnd以此指數(shù)規(guī)律增長(zhǎng),但并不能一直增長(zhǎng)下去,會(huì)產(chǎn)生擁塞。此時(shí)設(shè)置一個(gè)慢開始門限ssthresh,當(dāng)cwnd大于ssthresh時(shí),使用擁塞避免算法;
以上是慢開始算法,以下是擁塞避免算法
??6 當(dāng)cwnd大于ssthresh時(shí),ssthresh減為當(dāng)前cwnd的一半大小(乘法減小),cwnd從1開始增加(加法增大),繼續(xù)使用慢開始算法,依次循環(huán)使用兩種算法。
總結(jié):
cwnd > ssthresh時(shí),使用慢開始算法
cwnd < ssthresh時(shí),使用擁塞避免算法
cwnd = ssthresh時(shí),兩種算法都能使用
2 快重傳和快恢復(fù)
??1 假設(shè)接收方已經(jīng)接收到第二個(gè)報(bào)文段,緊接著收到第四個(gè)報(bào)文段,沒有收到第三個(gè)報(bào)文段,由于是TCP協(xié)議累積確認(rèn)時(shí)針對(duì)按序到達(dá)的報(bào)文段,此時(shí)不能對(duì)第四個(gè)報(bào)文段確認(rèn),接收方只能發(fā)送第二個(gè)報(bào)文段的確認(rèn);
??2 由于接受方的超時(shí)計(jì)數(shù)器還沒有超時(shí),發(fā)送方接著發(fā)送第五個(gè)報(bào)文段和第六個(gè)報(bào)文段;
??3 接收方收到第五個(gè)報(bào)文段和第六個(gè)報(bào)文段時(shí),還是沒有收到第三個(gè)報(bào)文段,依次在收到第五個(gè)報(bào)文段和第六個(gè)報(bào)文段后向發(fā)送方回復(fù)第二個(gè)報(bào)文段的確認(rèn);
??4 當(dāng)發(fā)送方連續(xù)接收到三個(gè)確認(rèn)報(bào)文后,就會(huì)使用快恢復(fù)算法
以上是快重傳算法,以下是快恢復(fù)算法
??5 當(dāng)發(fā)送方連續(xù)接收到三個(gè)確認(rèn)報(bào)文后,執(zhí)行“乘法減小算法”,把慢開始門限ssthresh減半,cwnd設(shè)置為慢開始門限ssthresh減半后的數(shù)值,然后使用擁塞避免算法。
總結(jié)
以上是生活随笔為你收集整理的TCP/UDP对比总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: weakref:对象的弱引用
- 下一篇: unity3d 在UGUI中制作自适应调