TCP 和 UDP 怎么選?讓麒麟傳書(shū)告訴你
麒麟傳書(shū)
一個(gè)輕量級(jí)的即時(shí)通信軟件,用于局域網(wǎng)內(nèi)的實(shí)時(shí)通信和文件共享。同一局域網(wǎng)廣播域下的用戶可以自動(dòng)互相添加好友,顯示好友信息,在好友聊天框界面互相收發(fā)文字、文件和文件夾。

麒麟傳書(shū)介紹
麒麟傳書(shū)使用 UDP 協(xié)議來(lái)發(fā)送和接收 UDP 廣播數(shù)據(jù),傳輸局域網(wǎng)內(nèi)的好友上線離線消息,在接收到好友上線或離線消息后更新好友狀態(tài),同時(shí)建立心跳機(jī)制來(lái)保證獲取到好友的在線狀態(tài)。
麒麟傳書(shū)使用 TCP 協(xié)議主動(dòng)連接好友監(jiān)聽(tīng)的端口,進(jìn)行 socket 連接,從而在連接成功后通過(guò) TCP 進(jìn)行文字、文件、文件夾等數(shù)據(jù)傳輸,同時(shí)對(duì)數(shù)據(jù)傳輸過(guò)程進(jìn)行維護(hù)。
麒麟傳書(shū)使用 TCP 協(xié)議來(lái)監(jiān)聽(tīng)本機(jī)指定的端口,等待好友進(jìn)行連接,在連接成功后進(jìn)行數(shù)據(jù)傳輸。
TCP/IP 協(xié)議介紹
TCP/IP 協(xié)議是一個(gè)包括了很多協(xié)議的協(xié)議簇,比如:TCP,UDP,IP,F(xiàn)TP,HTTP,ICMP,SMTP 等協(xié)議。
TCP/IP 模型是互聯(lián)網(wǎng)的基礎(chǔ),其所包含的協(xié)議可以劃分為四層,分別為鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。
鏈路層:負(fù)責(zé)封裝和解封裝 IP 報(bào)文,發(fā)送和接受 ARP/RARP 報(bào)文等。
網(wǎng)絡(luò)層:負(fù)責(zé)路由以及把分組報(bào)文發(fā)送給目標(biāo)網(wǎng)絡(luò)或主機(jī)。
傳輸層:負(fù)責(zé)對(duì)報(bào)文進(jìn)行分組和重組,并以 TCP 或 UDP 協(xié)議格式封裝報(bào)文。
應(yīng)用層:負(fù)責(zé)向用戶提供應(yīng)用程序,比如 HTTP、FTP、Telnet、DNS、SMTP 等。

在網(wǎng)絡(luò)體系結(jié)構(gòu)中網(wǎng)絡(luò)通信的建立必須是在通信雙方的對(duì)等層進(jìn)行,不能交錯(cuò)。在整個(gè)數(shù)據(jù)傳輸過(guò)程中,數(shù)據(jù)在發(fā)送端時(shí)經(jīng)過(guò)各層時(shí)都要附加上相應(yīng)層的協(xié)議頭和協(xié)議尾(僅數(shù)據(jù)鏈路層需要封裝協(xié)議尾)部分,也就是要對(duì)數(shù)據(jù)進(jìn)行協(xié)議封裝,以標(biāo)識(shí)對(duì)應(yīng)層所用的通信協(xié)議。
UDP 協(xié)議介紹
UDP 協(xié)議全稱是用戶數(shù)據(jù)報(bào)協(xié)議,用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議,在 OSI 模型中處于第四層——傳輸層,即 IP 協(xié)議的上一層。UDP 的缺點(diǎn)是不提供數(shù)據(jù)包分組、組裝和不能對(duì)數(shù)據(jù)包進(jìn)行排序,當(dāng)報(bào)文發(fā)送之后,是無(wú)法得知其是否安全完整到達(dá)的。
UDP 協(xié)議具有以下幾個(gè)特點(diǎn):
1. 面向無(wú)連接
UDP 是一個(gè)非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接,并且也只是抓取數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)上,不會(huì)對(duì)數(shù)據(jù)報(bào)文進(jìn)行任何拆分和拼接操作。
2. 有單播,多播,廣播的功能
UDP 不止支持一對(duì)一的傳輸方式,同樣支持一對(duì)多,多對(duì)多,多對(duì)一的方式。
3. 面向報(bào)文
發(fā)送方的 UDP 對(duì)應(yīng)用程序交下來(lái)的報(bào)文,在添加首部后就向下交付 IP 層。UDP 對(duì)應(yīng)用層交下來(lái)的報(bào)文,既不合并,也不拆分,而是保留這些報(bào)文的邊界。因此,應(yīng)用程序必須選擇合適大小的報(bào)文
4. 不可靠性
首先不可靠性體現(xiàn)在無(wú)連接上,不需要維護(hù)連接狀態(tài),當(dāng) UDP 想傳送時(shí)就簡(jiǎn)單地去抓取來(lái)自應(yīng)用程序的數(shù)據(jù),并盡可能快地把它扔到網(wǎng)絡(luò)上。
UDP 沒(méi)有擁塞控制,一直會(huì)以恒定的速度發(fā)送數(shù)據(jù)。即使網(wǎng)絡(luò)條件不好,也不會(huì)對(duì)發(fā)送速率進(jìn)行調(diào)整。這樣實(shí)現(xiàn)的弊端就是在網(wǎng)絡(luò)條件不好的情況下可能會(huì)導(dǎo)致丟包,但是優(yōu)點(diǎn)是能應(yīng)用于某些實(shí)時(shí)性要求高的場(chǎng)景(比如電話會(huì)議)。
5. 頭部開(kāi)銷(xiāo)小,傳輸高效
UDP 頭部包含了以下幾個(gè)數(shù)據(jù):
兩個(gè)十六位的端口號(hào),分別為源端口(可選字段)和目標(biāo)端口
整個(gè)數(shù)據(jù)報(bào)文的長(zhǎng)度
整個(gè)數(shù)據(jù)報(bào)文的檢驗(yàn)和(IPv4 可選字段),該字段用于發(fā)現(xiàn)頭部信息和數(shù)據(jù)中的錯(cuò)誤
因此 UDP 的頭部開(kāi)銷(xiāo)小,只有 8 個(gè)字節(jié),在傳輸數(shù)據(jù)報(bào)文時(shí)是很高效的。
TCP 協(xié)議介紹
TCP(Transmission Control Protocol,傳輸控制協(xié)議)是面向連接的協(xié)議,也就是說(shuō),在收發(fā)數(shù)據(jù)前,必須和對(duì)方建立可靠的連接。
1. TCP 連接過(guò)程
建立一個(gè) TCP 連接的過(guò)程為(三次握手的過(guò)程):
1.1 第一次握手
客戶端向服務(wù)端發(fā)送連接請(qǐng)求報(bào)文段。該報(bào)文段中包含自身的數(shù)據(jù)通訊初始序號(hào)。請(qǐng)求發(fā)送后,客戶端便進(jìn)入 SYN-SENT 狀態(tài)。
1.2 第二次握手
服務(wù)端收到連接請(qǐng)求報(bào)文段后,如果同意連接,則會(huì)發(fā)送一個(gè)應(yīng)答,該應(yīng)答中也會(huì)包含自身的數(shù)據(jù)通訊初始序號(hào),發(fā)送完成后便進(jìn)入 SYN-RECEIVED 狀態(tài)。
1.3 第三次握手
當(dāng)客戶端收到連接同意的應(yīng)答后,還要向服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文??蛻舳税l(fā)完這個(gè)報(bào)文段后便進(jìn)入 ESTABLISHED 狀態(tài),服務(wù)端收到這個(gè)應(yīng)答后也進(jìn)入 ESTABLISHED 狀態(tài),此時(shí)連接建立成功。
TCP 建立連接需要三次握手是為了防止出現(xiàn)失效的連接請(qǐng)求報(bào)文段被服務(wù)端接收的情況,從而產(chǎn)生錯(cuò)誤。

2. TCP 斷開(kāi)連接
斷開(kāi)一個(gè) TCP 連接的過(guò)程為(四次握手的過(guò)程):
TCP 是全雙工的,在斷開(kāi)連接時(shí)兩端都需要發(fā)送 FIN 和 ACK。
2.1 第一次握手
若客戶端 A 認(rèn)為數(shù)據(jù)發(fā)送完成,則它需要向服務(wù)端 B 發(fā)送連接釋放請(qǐng)求。
2.2 第二次握手
B 收到連接釋放請(qǐng)求后,會(huì)告訴應(yīng)用層要釋放 TCP 鏈接。然后會(huì)發(fā)送 ACK 包,并進(jìn)入 CLOSE_WAIT 狀態(tài),此時(shí)表明 A 到 B 的連接已經(jīng)釋放,不再接收 A 發(fā)的數(shù)據(jù)了。但是因?yàn)?TCP 連接是雙向的,所以 B 仍舊可以發(fā)送數(shù)據(jù)給 A。
2.3 第三次握手
B 如果此時(shí)還有沒(méi)發(fā)完的數(shù)據(jù)會(huì)繼續(xù)發(fā)送,完畢后會(huì)向 A 發(fā)送連接釋放請(qǐng)求,然后 B 便進(jìn)入 LAST-ACK 狀態(tài)。
2.4 第四次握手
A 收到釋放請(qǐng)求后,向 B 發(fā)送確認(rèn)應(yīng)答,此時(shí) A 進(jìn)入 TIME-WAIT 狀態(tài)。該狀態(tài)會(huì)持續(xù) 2MSL(最大段生存期,指報(bào)文段在網(wǎng)絡(luò)中生存的時(shí)間,超時(shí)會(huì)被拋棄) 時(shí)間,若該時(shí)間段內(nèi)沒(méi)有 B 的重發(fā)請(qǐng)求的話,就進(jìn)入 CLOSED 狀態(tài)。當(dāng) B 收到確認(rèn)應(yīng)答后,也便進(jìn)入 CLOSED 狀態(tài)。

3. TCP 協(xié)議的特點(diǎn)
3.1 面向連接
面向連接,是指發(fā)送數(shù)據(jù)之前必須在兩端建立連接。建立連接的方法是“三次握手”,保證數(shù)據(jù)的可靠傳輸。
3.2 僅支持單播傳輸
每條 TCP 傳輸連接只能有兩個(gè)端點(diǎn),只能進(jìn)行點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳輸,不支持多播和廣播傳輸方式。
3.3 面向字節(jié)流
TCP 不像 UDP 那樣一個(gè)個(gè)報(bào)文獨(dú)立地傳輸,而是在不保留報(bào)文邊界的情況下以字節(jié)流方式進(jìn)行傳輸。
3.4 可靠傳輸
對(duì)于可靠傳輸,判斷丟包,誤碼靠的是 TCP 的段編號(hào)以及確認(rèn)號(hào)。TCP 為了保證報(bào)文傳輸?shù)目煽浚徒o每個(gè)包一個(gè)序號(hào),同時(shí)序號(hào)也保證了傳送到接收端實(shí)體的包的按序接收。然后接收端實(shí)體對(duì)已成功收到的字節(jié)發(fā)回一個(gè)相應(yīng)的確認(rèn)(ACK);如果發(fā)送端實(shí)體在合理的往返時(shí)延(RTT)內(nèi)未收到確認(rèn),那么對(duì)應(yīng)的數(shù)據(jù)(假設(shè)丟失了)將會(huì)被重傳。
3.5 提供擁塞控制
當(dāng)網(wǎng)絡(luò)出現(xiàn)擁塞的時(shí)候,TCP 能夠減小向網(wǎng)絡(luò)注入數(shù)據(jù)的速率和數(shù)量,緩解擁塞
3.6 TCP 提供全雙工通信
TCP 允許通信雙方的應(yīng)用程序在任何時(shí)候都能發(fā)送數(shù)據(jù),因?yàn)?TCP 連接的兩端都設(shè)有緩存,用來(lái)臨時(shí)存放雙向通信的數(shù)據(jù)。當(dāng)然,TCP 可以立即發(fā)送一個(gè)數(shù)據(jù)段,也可以緩存一段時(shí)間以便一次發(fā)送更多的數(shù)據(jù)段(最大的數(shù)據(jù)段大小取決于 MSS)
TCP 和 UDP 的比較
1.對(duì)比

2. 總結(jié)
TCP 向上層提供面向連接的可靠服務(wù) ,UDP 向上層提供無(wú)連接不可靠服務(wù)。
雖然 UDP 并沒(méi)有 TCP 傳輸來(lái)的準(zhǔn)確,但是也能在很多實(shí)時(shí)性要求高的地方有所作為。
對(duì)數(shù)據(jù)準(zhǔn)確性要求高,速度可以相對(duì)較慢的,可以選用 TCP。

現(xiàn)在優(yōu)麒麟誠(chéng)邀大家 參與體驗(yàn)【有獎(jiǎng)體驗(yàn)征集】80份禮品,邀你秀出最潮KMRE玩法,中獎(jiǎng)率超高不要錯(cuò)過(guò)!活動(dòng)--,歡迎優(yōu)客們 點(diǎn)擊http://m.eply168.cn/downloads/ 下載優(yōu)麒麟?yún)⑴c哦~