1. TCP與UDP區(qū)別
TCP 是面向連接的断国,UDP 是面向無(wú)連接的
TCP提供可靠的服務(wù),UDP盡最大努力交付,即不保證可靠交付
TCP 保證數(shù)據(jù)順序,UDP 不保證
TCP數(shù)據(jù)無(wú)邊界 UDP有邊界
TCP速度慢 UDP速度快
TCP面向字節(jié)流 UDP面向報(bào)文
TCP連接只能是點(diǎn)到點(diǎn)的;UDP支持一對(duì)一,一對(duì)多,多對(duì)一和多對(duì)多的交互通信
TCP對(duì)系統(tǒng)資源要求較多维费,UDP對(duì)系統(tǒng)資源要求較少。
TCP有流量控制促王,擁塞控制 UDP沒(méi)有
2. 為什么UDP有時(shí)比TCP更有優(yōu)勢(shì)?
UDP以其簡(jiǎn)單犀盟、傳輸快的優(yōu)勢(shì),在越來(lái)越多場(chǎng)景下取代了TCP,如實(shí)時(shí)游戲蝇狼。
(1)網(wǎng)速的提升給UDP的穩(wěn)定性提供可靠網(wǎng)絡(luò)保障阅畴,丟包率很低,如果使用應(yīng)用層重傳迅耘,能夠確保傳輸?shù)目煽啃浴?/p>
(2)TCP為了實(shí)現(xiàn)網(wǎng)絡(luò)通信的可靠性恶阴,使用了復(fù)雜的擁塞控制算法,建立了繁瑣的握手過(guò)程豹障,由于TCP內(nèi)置的系統(tǒng)協(xié)議棧中冯事,極難對(duì)其進(jìn)行改進(jìn)。
采用TCP血公,一旦發(fā)生丟包昵仅,TCP會(huì)將后續(xù)的包緩存起來(lái),等前面的包重傳并接收到后再繼續(xù)發(fā)送累魔,延時(shí)會(huì)越來(lái)越大摔笤,基于UDP對(duì)實(shí)時(shí)性要求較為嚴(yán)格的情況下,采用自定義重傳機(jī)制垦写,能夠把丟包產(chǎn)生的延遲降到最低吕世,盡量減少網(wǎng)絡(luò)問(wèn)題對(duì)游戲性造成影響。
3. 為什么TCP客戶端最后還要發(fā)送一次確認(rèn)呢梯投?
一句話命辖,主要防止已經(jīng)失效的連接請(qǐng)求報(bào)文突然又傳送到了服務(wù)器,從而產(chǎn)生錯(cuò)誤分蓖。
如果使用的是兩次握手建立連接尔艇,假設(shè)有這樣一種場(chǎng)景,客戶端發(fā)送了第一個(gè)請(qǐng)求連接并且沒(méi)有丟失么鹤,只是因?yàn)樵诰W(wǎng)絡(luò)結(jié)點(diǎn)中滯留的時(shí)間太長(zhǎng)了终娃,由于TCP的客戶端遲遲沒(méi)有收到確認(rèn)報(bào)文,以為服務(wù)器沒(méi)有收到蒸甜,此時(shí)重新向服務(wù)器發(fā)送這條報(bào)文棠耕,此后客戶端和服務(wù)器經(jīng)過(guò)兩次握手完成連接余佛,傳輸數(shù)據(jù),然后關(guān)閉連接窍荧。此時(shí)此前滯留的那一次請(qǐng)求連接衙熔,網(wǎng)絡(luò)通暢了到達(dá)了服務(wù)器,這個(gè)報(bào)文本該是失效的搅荞,但是,兩次握手的機(jī)制將會(huì)讓客戶端和服務(wù)器再次建立連接框咙,這將導(dǎo)致不必要的錯(cuò)誤和資源的浪費(fèi)咕痛。
如果采用的是三次握手,就算是那一次失效的報(bào)文傳送過(guò)來(lái)了喇嘱,服務(wù)端接受到了那條失效報(bào)文并且回復(fù)了確認(rèn)報(bào)文茉贡,但是客戶端不會(huì)再次發(fā)出確認(rèn)。由于服務(wù)器收不到確認(rèn)者铜,就知道客戶端并沒(méi)有請(qǐng)求連接腔丧。
4. 為什么客戶端最后還要等待2MSL?
MSL(Maximum Segment Lifetime)作烟,TCP允許不同的實(shí)現(xiàn)可以設(shè)置不同的MSL值愉粤。
第一,保證客戶端發(fā)送的最后一個(gè)ACK報(bào)文能夠到達(dá)服務(wù)器拿撩,因?yàn)檫@個(gè)ACK報(bào)文可能丟失衣厘,站在服務(wù)器的角度看來(lái),我已經(jīng)發(fā)送了FIN+ACK報(bào)文請(qǐng)求斷開(kāi)了压恒,客戶端還沒(méi)有給我回應(yīng)影暴,應(yīng)該是我發(fā)送的請(qǐng)求斷開(kāi)報(bào)文它沒(méi)有收到,于是服務(wù)器又會(huì)重新發(fā)送一次探赫,而客戶端就能在這個(gè)2MSL時(shí)間段內(nèi)收到這個(gè)重傳的報(bào)文型宙,接著給出回應(yīng)報(bào)文,并且會(huì)重啟2MSL計(jì)時(shí)器伦吠。
第二妆兑,防止類似與“三次握手”中提到了的“已經(jīng)失效的連接請(qǐng)求報(bào)文段”出現(xiàn)在本連接中∶牵客戶端發(fā)送完最后一個(gè)確認(rèn)報(bào)文后箭跳,在這個(gè)2MSL時(shí)間中,就可以使本連接持續(xù)的時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文段都從網(wǎng)絡(luò)中消失潭千。這樣新的連接中不會(huì)出現(xiàn)舊連接的請(qǐng)求報(bào)文谱姓。
5. 為什么建立連接是三次握手,關(guān)閉連接確是四次揮手呢刨晴?
建立連接的時(shí)候屉来, 服務(wù)器在LISTEN狀態(tài)下路翻,收到建立連接請(qǐng)求的SYN報(bào)文后,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶端茄靠。
而關(guān)閉連接時(shí)茂契,服務(wù)器收到對(duì)方的FIN報(bào)文時(shí),僅僅表示對(duì)方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù)慨绳,而自己也未必全部數(shù)據(jù)都發(fā)送給對(duì)方了掉冶,所以己方可以立即關(guān)閉,也可以發(fā)送一些數(shù)據(jù)給對(duì)方后脐雪,再發(fā)送FIN報(bào)文給對(duì)方來(lái)表示同意現(xiàn)在關(guān)閉連接厌小,因此,己方ACK和FIN一般都會(huì)分開(kāi)發(fā)送战秋,從而導(dǎo)致多了一次璧亚。
6. 如果已經(jīng)建立了連接,但是客戶端突然出現(xiàn)故障了怎么辦脂信?
TCP還設(shè)有一個(gè)毖Ⅲ活計(jì)時(shí)器,顯然狰闪,客戶端如果出現(xiàn)故障疯搅,服務(wù)器不能一直等下去,白白浪費(fèi)資源埋泵。服務(wù)器每收到一次客戶端的請(qǐng)求后都會(huì)重新復(fù)位這個(gè)計(jì)時(shí)器秉撇,時(shí)間通常是設(shè)置為2小時(shí),若兩小時(shí)還沒(méi)有收到客戶端的任何數(shù)據(jù)秋泄,服務(wù)器就會(huì)發(fā)送一個(gè)探測(cè)報(bào)文段琐馆,以后每隔75秒發(fā)送一次。若一連發(fā)送10個(gè)探測(cè)報(bào)文仍然沒(méi)反應(yīng)恒序,服務(wù)器就認(rèn)為客戶端出了故障瘦麸,接著就關(guān)閉連接。
7. 什么時(shí)候使用TCP
當(dāng)對(duì)網(wǎng)絡(luò)通訊質(zhì)量有要求的時(shí)候歧胁,比如:整個(gè)數(shù)據(jù)要準(zhǔn)確無(wú)誤的傳遞給對(duì)方滋饲,這往往用于一些要求可靠的應(yīng)用,比如HTTP喊巍、HTTPS屠缭、FTP等傳輸文件的協(xié)議,POP崭参、SMTP等郵件傳輸?shù)膮f(xié)議呵曹。 在日常生活中,常見(jiàn)使用TCP協(xié)議的應(yīng)用如下: 瀏覽器,用的HTTP FlashFXP奄喂,用的FTP Outlook铐殃,用的POP、SMTP Putty跨新,用的Telnet富腊、SSH QQ文件傳輸
8. 什么時(shí)候應(yīng)該使用UDP:
當(dāng)對(duì)網(wǎng)絡(luò)通訊質(zhì)量要求不高的時(shí)候,要求網(wǎng)絡(luò)通訊速度能盡量的快域帐,這時(shí)就可以使用UDP赘被。 比如,日常生活中肖揣,常見(jiàn)使用UDP協(xié)議的應(yīng)用如下: QQ語(yǔ)音 QQ視頻 TFTP
TCP協(xié)議
TCP協(xié)議位于傳輸層民假, 提供可靠的字節(jié)流服務(wù)。所謂的字節(jié)流服務(wù)(Byte Stream Service) 是指许饿, 為了方便傳輸, 將大塊數(shù)據(jù)分割成以報(bào)文段(segment) 為單位的數(shù)據(jù)包進(jìn)行管理舵盈。 而可靠的傳輸服務(wù)是指陋率, 能夠把數(shù)據(jù)準(zhǔn)確可靠地傳給對(duì)方。 即TCP 協(xié)議為了更容易傳送大數(shù)據(jù)才把數(shù)據(jù)分割秽晚, 而且 TCP 協(xié)議能夠確認(rèn)數(shù)據(jù)最終是否送達(dá)到對(duì)方瓦糟。所以,TCP連接相當(dāng)于兩根管道(一個(gè)用于服務(wù)器到客戶端赴蝇,一個(gè)用于客戶端到服務(wù)器)菩浙,管道里面數(shù)據(jù)傳輸是通過(guò)字節(jié)碼傳輸,傳輸是有序的句伶,每個(gè)字節(jié)都是一個(gè)一個(gè)來(lái)傳輸劲蜻。
TCP 的包頭格式
字段說(shuō)明
URG 緊急指針是否有效。為1考余,表示某一位需要被優(yōu)先處理
ACK 確認(rèn)號(hào)是否有效僅當(dāng)ACK=1時(shí)先嬉,確認(rèn)號(hào)字段才有效。TCP規(guī)定楚堤,在連接建立后所有報(bào)文的傳輸都必須把ACK置1疫蔓;
PSH 提示接收端應(yīng)用程序立即從TCP緩沖區(qū)把數(shù)據(jù)讀走。當(dāng)兩個(gè)應(yīng)用進(jìn)程進(jìn)行交互式通信時(shí)身冬,有時(shí)在一端的應(yīng)用進(jìn)程希望在鍵入一個(gè)命令后立即就能收到對(duì)方的響應(yīng)衅胀,這時(shí)候就將PSH=1;
RST 當(dāng)RST=1酥筝,表明TCP連接中出現(xiàn)嚴(yán)重差錯(cuò)滚躯,必須釋放連接,然后再重新建立連接;
SYN 在連接建立時(shí)用來(lái)同步序號(hào)哀九。當(dāng)SYN=1剿配,ACK=0,表明是連接請(qǐng)求報(bào)文阅束,若同意連接呼胚,則響應(yīng)報(bào)文中應(yīng)該使SYN=1,ACK=1息裸;
FIN 用來(lái)釋放連接蝇更。當(dāng)FIN=1,表明此報(bào)文的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢呼盆,并且要求釋放年扩;
TCP 的包頭有哪些內(nèi)容,分別有什么用
源端口和目的端口访圃,各占2個(gè)字節(jié)厨幻,分別寫入源端口和目的端口;
接下來(lái)是包的序號(hào)腿时。主要是為了解決亂序問(wèn)題况脆。號(hào),占4個(gè)字節(jié),TCP連接中傳送的字節(jié)流中的每個(gè)字節(jié)都按順序編號(hào)。例如村怪,一段報(bào)文的序號(hào)字段值是 301 ,而攜帶的數(shù)據(jù)共有100字段盛末,顯然下一個(gè)報(bào)文段(如果還有的話)的數(shù)據(jù)序號(hào)應(yīng)該從401開(kāi)始;
確認(rèn)序號(hào)否淤。發(fā)出去的包應(yīng)該有確認(rèn)悄但,這樣能知道對(duì)方是否收到,如果沒(méi)收到就應(yīng)該重新發(fā)送石抡,這個(gè)解決的是不丟包的問(wèn)題.占4個(gè)字節(jié)算墨,是期望收到對(duì)方下一個(gè)報(bào)文的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)。例如汁雷,B收到了A發(fā)送過(guò)來(lái)的報(bào)文净嘀,其序列號(hào)字段是501,而數(shù)據(jù)長(zhǎng)度是200字節(jié)侠讯,這表明B正確的收到了A發(fā)送的到序號(hào)700為止的數(shù)據(jù)挖藏。因此,B期望收到A的下一個(gè)數(shù)據(jù)序號(hào)是701厢漩,于是B在發(fā)送給A的確認(rèn)報(bào)文段中把確認(rèn)號(hào)置為701膜眠;
狀態(tài)位。SYN 是發(fā)起一個(gè)鏈接,ACK 是回復(fù)宵膨,RST 是重新連接架谎,F(xiàn)IN 是結(jié)束連接。因?yàn)?TCP 是面向連接的辟躏,因此需要雙方維護(hù)連接的狀態(tài)谷扣,這些狀態(tài)位的包會(huì)引起雙方的狀態(tài)變更
窗口大小,TCP 要做流量控制捎琐,需要通信雙方各聲明一個(gè)窗口会涎,標(biāo)識(shí)自己當(dāng)前的處理能力。
通過(guò)對(duì) TCP 頭的解析瑞凑,我們知道要掌握 TCP 協(xié)議末秃,應(yīng)該重點(diǎn)關(guān)注以下問(wèn)題:
- 順序問(wèn)題
- 丟包問(wèn)題
- 連接維護(hù)
- 流量控制
- 擁塞控制
TCP是面向連接的協(xié)議,也就是說(shuō)籽御,在收發(fā)數(shù)據(jù)前练慕,必須和對(duì)方建立可靠的連接。一個(gè)TCP連接必須要經(jīng)過(guò)三次“對(duì)話”才能建立起來(lái)技掏,三次“對(duì)話”的目的是使數(shù)據(jù)包的發(fā)送和接收同步铃将,經(jīng)過(guò)三次“對(duì)話”之后,主機(jī)A才向主機(jī)B正式發(fā)送數(shù)據(jù)
TCP連接的建立(三次握手)
tcp的三次握手是很有意思的零截,基本思想就是“讓我知道你已經(jīng)知道”了麸塞。服務(wù)器監(jiān)聽(tīng)請(qǐng)求秃臣,客戶端發(fā)起連接請(qǐng)求(第一次連接)涧衙,請(qǐng)求在路上可能存在丟失的風(fēng)險(xiǎn),所以當(dāng)請(qǐng)求到了服務(wù)器后如果服務(wù)器同意建立連接會(huì)給客戶端一個(gè)回信(第二次連接)奥此,告訴它:我已經(jīng)收到請(qǐng)求弧哎,可以連接。但是回信也存在一個(gè)問(wèn)題稚虎,那就是回信能不能到客戶端撤嫩?它需要客戶端給他一個(gè)回信說(shuō)我已經(jīng)收到批準(zhǔn)通知了,如果客戶端一直不回復(fù)的話意味著客戶端沒(méi)有收到批準(zhǔn)通知蠢终。因此客戶端一收到批準(zhǔn)通知就立馬回復(fù)(第三次握手):我收到你的批準(zhǔn)通知了序攘。至此,三次握手結(jié)束寻拂。
一個(gè)很類似的例子就是投簡(jiǎn)歷:先投簡(jiǎn)歷程奠,然后對(duì)方公司會(huì)通知你通過(guò)簡(jiǎn)歷篩選,你收到這個(gè)通知后一般會(huì)回復(fù)一下我知道了祭钉。 這種“讓我知道你已經(jīng)知道了”的想法是一種約定俗成的可靠信息交互的基本方式瞄沙,基于此想法構(gòu)建的信息交互框架叫做協(xié)議。
最開(kāi)始的時(shí)候客戶端和服務(wù)器都是處于CLOSED狀態(tài)。主動(dòng)打開(kāi)連接的為客戶端距境,被動(dòng)打開(kāi)連接的是服務(wù)器申尼。
TCP服務(wù)器進(jìn)程先創(chuàng)建傳輸控制塊TCB,時(shí)刻準(zhǔn)備接受客戶進(jìn)程的連接請(qǐng)求垫桂,此時(shí)服務(wù)器就進(jìn)入了LISTEN(監(jiān)聽(tīng))狀態(tài)师幕;
TCP客戶進(jìn)程也是先創(chuàng)建傳輸控制塊TCB,然后向服務(wù)器發(fā)出連接請(qǐng)求報(bào)文伪货,這時(shí)報(bào)文首部中的同部位SYN=1们衙,同時(shí)選擇一個(gè)初始序列號(hào) seq=x ,此時(shí)碱呼,TCP客戶端進(jìn)程進(jìn)入了 SYN-SENT(同步已發(fā)送狀態(tài))狀態(tài)蒙挑。TCP規(guī)定,SYN報(bào)文段(SYN=1的報(bào)文段)不能攜帶數(shù)據(jù)愚臀,但需要消耗掉一個(gè)序號(hào)忆蚀。
TCP服務(wù)器收到請(qǐng)求報(bào)文后,如果同意連接姑裂,則發(fā)出確認(rèn)報(bào)文馋袜。確認(rèn)報(bào)文中應(yīng)該 ACK=1,SYN=1舶斧,確認(rèn)號(hào)是ack=x+1欣鳖,同時(shí)也要為自己初始化一個(gè)序列號(hào) seq=y,此時(shí)茴厉,TCP服務(wù)器進(jìn)程進(jìn)入了SYN-RCVD(同步收到)狀態(tài)泽台。這個(gè)報(bào)文也不能攜帶數(shù)據(jù),但是同樣要消耗一個(gè)序號(hào)矾缓。
TCP客戶進(jìn)程收到確認(rèn)后怀酷,還要向服務(wù)器給出確認(rèn)。確認(rèn)報(bào)文的ACK=1嗜闻,ack=y+1蜕依,自己的序列號(hào)seq=x+1,此時(shí)琉雳,TCP連接建立样眠,客戶端進(jìn)入ESTABLISHED(已建立連接)狀態(tài)。TCP規(guī)定翠肘,ACK報(bào)文段可以攜帶數(shù)據(jù)檐束,但是如果不攜帶數(shù)據(jù)則不消耗序號(hào)。
當(dāng)服務(wù)器收到客戶端的確認(rèn)后也進(jìn)入ESTABLISHED狀態(tài)锯茄,此后雙方就可以開(kāi)始通信了厢塘。
TCP連接的釋放(四次揮手)
釋放連接的時(shí)候也是如此:客戶端發(fā)起關(guān)閉連接的請(qǐng)求茶没,關(guān)閉連接意味著客戶端結(jié)束了自己的工作即發(fā)送數(shù)據(jù),但此時(shí)仍然處于數(shù)據(jù)傳輸?shù)倪^(guò)程中晚碾,服務(wù)器可能未數(shù)據(jù)傳輸完畢抓半,因此當(dāng)請(qǐng)求到服務(wù)器時(shí)服務(wù)器知道了這個(gè)請(qǐng)求,但服務(wù)器數(shù)據(jù)傳輸未完成無(wú)法關(guān)閉連接格嘁,因此服務(wù)器先發(fā)送一個(gè)ack告訴客戶端關(guān)閉請(qǐng)求已收到笛求,但老子正忙,一會(huì)再關(guān)糕簿,你再等一會(huì)探入。等服務(wù)器工作完成了,就把fin信號(hào)發(fā)送給客戶端懂诗,此時(shí)服務(wù)器要等著客戶端給他一個(gè)回信蜂嗽,讓服務(wù)器知道客戶端已經(jīng)知道了。因此客戶端收到后就給服務(wù)器一個(gè)回信殃恒,為了防止回信丟失植旧,客戶端就再等2MSL個(gè)時(shí)間,之所以是2個(gè)离唐,是因?yàn)樯婕暗絹?lái)回病附,第一個(gè)MSL中是回信在路上的最大時(shí)間,第二個(gè)MSL是萬(wàn)一回信沒(méi)到服務(wù)端亥鬓,服務(wù)端重發(fā)的FIN確認(rèn)在路上的時(shí)間(不知道這樣理解對(duì)不對(duì))完沪。
數(shù)據(jù)傳輸完畢后,雙方都可釋放連接嵌戈。最開(kāi)始的時(shí)候覆积,客戶端和服務(wù)器都是處于ESTABLISHED狀態(tài),然后客戶端主動(dòng)關(guān)閉咕别,服務(wù)器被動(dòng)關(guān)閉技健。
- 客戶端進(jìn)程發(fā)出連接釋放報(bào)文写穴,并且停止發(fā)送數(shù)據(jù)惰拱。釋放數(shù)據(jù)報(bào)文首部,F(xiàn)IN=1啊送,其序列號(hào)為seq=u(等于前面已經(jīng)傳送過(guò)來(lái)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1)偿短,此時(shí),客戶端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)馋没。 TCP規(guī)定昔逗,F(xiàn)IN報(bào)文段即使不攜帶數(shù)據(jù),也要消耗一個(gè)序號(hào)篷朵。
- 服務(wù)器收到連接釋放報(bào)文勾怒,發(fā)出確認(rèn)報(bào)文婆排,ACK=1,ack=u+1笔链,并且?guī)献约旱男蛄刑?hào)seq=v段只,此時(shí),服務(wù)端就進(jìn)入了CLOSE-WAIT(關(guān)閉等待)狀態(tài)鉴扫。TCP服務(wù)器通知高層的應(yīng)用進(jìn)程赞枕,客戶端向服務(wù)器的方向就釋放了,這時(shí)候處于半關(guān)閉狀態(tài)坪创,即客戶端已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了炕婶,但是服務(wù)器若發(fā)送數(shù)據(jù),客戶端依然要接受莱预。這個(gè)狀態(tài)還要持續(xù)一段時(shí)間柠掂,也就是整個(gè)CLOSE-WAIT狀態(tài)持續(xù)的時(shí)間。
- 客戶端收到服務(wù)器的確認(rèn)請(qǐng)求后依沮,此時(shí)陪踩,客戶端就進(jìn)入FIN-WAIT-2(終止等待2)狀態(tài),等待服務(wù)器發(fā)送連接釋放報(bào)文(在這之前還需要接受服務(wù)器發(fā)送的最后的數(shù)據(jù))悉抵。
- 服務(wù)器將最后的數(shù)據(jù)發(fā)送完畢后肩狂,就向客戶端發(fā)送連接釋放報(bào)文,F(xiàn)IN=1姥饰,ack=u+1傻谁,由于在半關(guān)閉狀態(tài),服務(wù)器很可能又發(fā)送了一些數(shù)據(jù)列粪,假定此時(shí)的序列號(hào)為seq=w审磁,此時(shí),服務(wù)器就進(jìn)入了LAST-ACK(最后確認(rèn))狀態(tài)岂座,等待客戶端的確認(rèn)态蒂。
- 客戶端收到服務(wù)器的連接釋放報(bào)文后,必須發(fā)出確認(rèn)费什,ACK=1钾恢,ack=w+1,而自己的序列號(hào)是seq=u+1鸳址,此時(shí)瘩蚪,客戶端就進(jìn)入了TIME-WAIT(時(shí)間等待)狀態(tài)。注意此時(shí)TCP連接還沒(méi)有釋放稿黍,必須經(jīng)過(guò)2?*?MSL(最長(zhǎng)報(bào)文段壽命)的時(shí)間后疹瘦,當(dāng)客戶端撤銷相應(yīng)的TCB后,才進(jìn)入CLOSED狀態(tài)巡球。
- 服務(wù)器只要收到了客戶端發(fā)出的確認(rèn)言沐,立即進(jìn)入CLOSED狀態(tài)邓嘹。同樣,撤銷TCB后险胰,就結(jié)束了這次的TCP連接吴超。可以看到鸯乃,服務(wù)器結(jié)束TCP連接的時(shí)間要比客戶端早一些鲸阻。
UDP協(xié)議
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)
(1) UDP是一個(gè)非連接的協(xié)議缨睡,傳輸數(shù)據(jù)之前源端和終端不建立連接鸟悴,當(dāng)它想傳送時(shí)就簡(jiǎn)單地去抓取來(lái)自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上奖年。在發(fā)送端细诸,UDP傳送數(shù)據(jù)的速度僅僅是受應(yīng)用程序生成數(shù)據(jù)的速度、計(jì)算機(jī)的能力和傳輸帶寬的限制陋守;在接收端震贵,UDP把每個(gè)消息段放在隊(duì)列中,應(yīng)用程序每次從隊(duì)列中讀一個(gè)消息段水评。
(2) 由于傳輸數(shù)據(jù)不建立連接猩系,因此也就不需要維護(hù)連接狀態(tài),包括收發(fā)狀態(tài)等中燥,因此一臺(tái)服務(wù)機(jī)可同時(shí)向多個(gè)客戶機(jī)傳輸相同的消息寇甸。
(3) UDP信息包的標(biāo)題很短,只有8個(gè)字節(jié)疗涉,相對(duì)于TCP的20個(gè)字節(jié)信息包的額外開(kāi)銷很小拿霉。
(4) 吞吐量不受擁擠控制算法的調(diào)節(jié),只受應(yīng)用軟件生成數(shù)據(jù)的速率咱扣、傳輸帶寬绽淘、源端和終端主機(jī)性能的限制。
(5)UDP使用盡最大努力交付闹伪,即不保證可靠交付沪铭,因此主機(jī)不需要維持復(fù)雜的鏈接狀態(tài)表(這里面有許多參數(shù))。
(6)UDP是面向報(bào)文的祭往。發(fā)送方的UDP對(duì)應(yīng)用程序交下來(lái)的報(bào)文伦意,在添加首部后就向下交付給IP層火窒。既不拆分硼补,也不合并,而是保留這些報(bào)文的邊界熏矿,因此已骇,應(yīng)用程序需要選擇合適的報(bào)文大小离钝。
UDP包頭
UDP 的特點(diǎn)
溝通簡(jiǎn)單,不需要大量的數(shù)據(jù)結(jié)構(gòu)褪储,處理邏輯和包頭字段
它不會(huì)建立連接卵渴,但是會(huì)監(jiān)聽(tīng)這個(gè)地方,誰(shuí)都可以傳給它數(shù)據(jù)鲤竹,它也可以傳給任何人數(shù)據(jù)浪读,甚至可以同時(shí)傳給多個(gè)人數(shù)據(jù)。
不會(huì)根據(jù)網(wǎng)絡(luò)的情況進(jìn)行擁塞控制辛藻,無(wú)論是否丟包碘橘,它該怎么發(fā)還是怎么發(fā)
UDP應(yīng)用場(chǎng)景
需要資源少,網(wǎng)絡(luò)情況穩(wěn)定的內(nèi)網(wǎng)吱肌,或者對(duì)于丟包不敏感的應(yīng)用痘拆,比如 DHCP 就是基于 UDP 協(xié)議的。
不需要一對(duì)一溝通氮墨,建立連接纺蛆,而是可以廣播的應(yīng)用。因?yàn)樗幻嫦蜻B接规揪,所以可以做到一對(duì)多桥氏,承擔(dān)廣播或者多播的協(xié)議。
需要處理速度快猛铅,可以容忍丟包识颊,但是即使網(wǎng)絡(luò)擁塞,也毫不退縮奕坟,一往無(wú)前的時(shí)候
基于 UDP 的幾個(gè)例子
直播祥款。直播對(duì)實(shí)時(shí)性的要求比較高,寧可丟包月杉,也不要卡頓的刃跛,所以很多直播應(yīng)用都基于 UDP 實(shí)現(xiàn)了自己的視頻傳輸協(xié)議
實(shí)時(shí)游戲。游戲的特點(diǎn)也是實(shí)時(shí)性比較高苛萎,在這種情況下桨昙,采用自定義的可靠的 UDP 協(xié)議,自定義重傳策略腌歉,能夠把產(chǎn)生的延遲降到最低蛙酪,減少網(wǎng)絡(luò)問(wèn)題對(duì)游戲造成的影響
物聯(lián)網(wǎng)。一方面翘盖,物聯(lián)網(wǎng)領(lǐng)域中斷資源少桂塞,很可能知識(shí)個(gè)很小的嵌入式系統(tǒng),而維護(hù) TCP 協(xié)議的代價(jià)太大了馍驯;另一方面阁危,物聯(lián)網(wǎng)對(duì)實(shí)時(shí)性的要求也特別高玛痊。比如 Google 旗下的 Nest 簡(jiǎn)歷 Thread Group,推出了物聯(lián)網(wǎng)通信協(xié)議 Thread狂打,就是基于 UDP 協(xié)議的