網(wǎng)絡(luò)編程懶人入門(mén)(十三):一泡尿的時(shí)間,快速搞懂TCP和UDP的區(qū)別

本文引用了作者Fundebug的“一文搞懂TCP與UDP的區(qū)別”一文的內(nèi)容,感謝無(wú)私分享。
1、引言
網(wǎng)絡(luò)協(xié)議是每個(gè)搞網(wǎng)絡(luò)通信應(yīng)用開(kāi)發(fā)(比如IM、推送、網(wǎng)關(guān)等等)的程序員都必須要掌握的基礎(chǔ)知識(shí),TCP/IP協(xié)議簇中有兩個(gè)最具有代表性的傳輸層協(xié)議——分別是 TCP 和 UDP。
有過(guò)網(wǎng)絡(luò)通信開(kāi)發(fā)經(jīng)驗(yàn)的同學(xué)們都知道,TCP和UDP協(xié)議是平時(shí)用的最多的兩種協(xié)議,而對(duì)于很多人來(lái)說(shuō),什么時(shí)候以及什么場(chǎng)景下該用TCP還是UDP?這是個(gè)經(jīng)久不息的討論話題。
不同于其它長(zhǎng)篇大論,本文盡量以簡(jiǎn)潔精煉的文字,幫你總結(jié)歸納TCP和UDP協(xié)議的主要區(qū)別,方便那些想掌握這方面知識(shí)又不愿意耗費(fèi)太多時(shí)間去系統(tǒng)地學(xué)習(xí)網(wǎng)絡(luò)理論基礎(chǔ)的同學(xué)快速理解!

推薦閱讀:為了加深理解,本系列的另一篇《網(wǎng)絡(luò)編程懶人入門(mén)(四):快速理解TCP和UDP的差異》也可以一并閱讀。
學(xué)習(xí)交流:
- 移動(dòng)端IM開(kāi)發(fā)入門(mén)文章:《新手入門(mén)一篇就夠:從零開(kāi)發(fā)移動(dòng)端IM》
- 開(kāi)源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK?
(本文已同步發(fā)布于:http://www.52im.net/thread-3793-1-1.html?)
2、快速理解TCP/IP協(xié)議簇
計(jì)算機(jī)與網(wǎng)絡(luò)設(shè)備要相互通信,雙方就必須基于相同的方法。比如:如何探測(cè)到通信目標(biāo)、由哪一邊先發(fā)起通信、使用哪種語(yǔ)言進(jìn)行通信、怎樣結(jié)束通信等規(guī)則都需要事先確定。不同的硬件、操作系統(tǒng)之間的通信,所有的這一切都需要一種規(guī)則。而我們就把這種規(guī)則稱為協(xié)議(protocol)。
TCP/IP 是互聯(lián)網(wǎng)相關(guān)的各類(lèi)協(xié)議族的總稱,比如:TCP,UDP,IP,F(xiàn)TP,HTTP,ICMP,SMTP 等都屬于 TCP/IP 族內(nèi)的協(xié)議。
TCP/IP模型是互聯(lián)網(wǎng)的基礎(chǔ),它是一系列網(wǎng)絡(luò)協(xié)議的總稱。這些協(xié)議可以劃分為四層,分別為鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層。
具體是:
1)鏈路層:負(fù)責(zé)封裝和解封裝IP報(bào)文,發(fā)送和接受ARP/RARP報(bào)文等;
2)網(wǎng)絡(luò)層:負(fù)責(zé)路由以及把分組報(bào)文發(fā)送給目標(biāo)網(wǎng)絡(luò)或主機(jī);
3)傳輸層:負(fù)責(zé)對(duì)報(bào)文進(jìn)行分組和重組,并以TCP或UDP協(xié)議格式封裝報(bào)文;
4)應(yīng)用層:負(fù)責(zé)向用戶提供應(yīng)用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。
下面這張表格進(jìn)行了了歸納:

下面這張圖,更生動(dòng)的反映了TCP/IP協(xié)議族的關(guān)系情況(高清圖從這里下載):

在網(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é)議。
有關(guān)TCP/IP協(xié)議簇的知識(shí),幾本書(shū)都寫(xiě)不完,這里我就不再贅述了,有興趣可以讀一讀《TCP/IP詳解 卷1:協(xié)議(在線閱讀)》。
另外,學(xué)習(xí)知識(shí),我特別喜歡了解技術(shù)之外的一些知識(shí),比如下面兩篇:
《技術(shù)往事:改變世界的TCP/IP協(xié)議(珍貴多圖、手機(jī)慎點(diǎn))》
《5G時(shí)代已經(jīng)到來(lái),TCP/IP老矣,尚能飯否?》
接下來(lái),我們將回到正題,學(xué)習(xí)TCP/IP 中有兩個(gè)具有代表性的傳輸層協(xié)議——TCP 和 UDP。
3、快速理解UDP協(xié)議
3.1 基本介紹
UDP協(xié)議:全稱是用戶數(shù)據(jù)報(bào)協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議。
在OSI模型中,處在第四層——傳輸層,處于IP協(xié)議的上一層(見(jiàn)下圖)。

▲ 上圖引用自《計(jì)算機(jī)網(wǎng)絡(luò)通訊協(xié)議關(guān)系圖》
UDP有不提供數(shù)據(jù)包分組、組裝和不能對(duì)數(shù)據(jù)包進(jìn)行排序的缺點(diǎn),也就是說(shuō),當(dāng)報(bào)文發(fā)送之后,是無(wú)法得知其是否安全完整到達(dá)的。
UDP協(xié)議的幾個(gè)主要特別,我進(jìn)行歸納,下面的下節(jié)將逐一說(shuō)明。
3.2 面向無(wú)連接
首先 UDP 是不需要和 TCP一樣在發(fā)送數(shù)據(jù)前進(jìn)行三次握手建立連接的,想發(fā)數(shù)據(jù)就可以開(kāi)始發(fā)送了。并且也只是數(shù)據(jù)報(bào)文的搬運(yùn)工,不會(huì)對(duì)數(shù)據(jù)報(bào)文進(jìn)行任何拆分和拼接操作。
具體來(lái)說(shuō)就是:
1)在發(fā)送端:應(yīng)用層將數(shù)據(jù)傳遞給傳輸層的 UDP 協(xié)議,UDP 只會(huì)給數(shù)據(jù)增加一個(gè) UDP 頭標(biāo)識(shí)下是 UDP 協(xié)議,然后就傳遞給網(wǎng)絡(luò)層了;
2)在接收端:網(wǎng)絡(luò)層將數(shù)據(jù)傳遞給傳輸層,UDP 只去除 IP 報(bào)文頭就傳遞給應(yīng)用層,不會(huì)任何拼接操作。
3.3 支持單播、多播、廣播
UDP 不止支持一對(duì)一的傳輸方式,同樣支持一對(duì)多,多對(duì)多,多對(duì)一的方式,也就是說(shuō) UDP 提供了單播、多播、廣播的功能。
3.4 面向報(bào)文
UDP協(xié)議是面向報(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)文(見(jiàn)《UDP中一個(gè)包的大小最大能多大?》)。
3.5 不可靠性
UDP的不可靠性首先體現(xiàn)在無(wú)連接上,通信的雙方不需要建立連接,想發(fā)就發(fā),這樣的情況肯定不可靠。
并且收到什么數(shù)據(jù)就傳遞什么數(shù)據(jù),并且也不會(huì)備份數(shù)據(jù),發(fā)送數(shù)據(jù)也不會(huì)關(guān)心對(duì)方是否已經(jīng)正確接收到數(shù)據(jù)了。
再者網(wǎng)絡(luò)環(huán)境時(shí)好時(shí)壞,但是 UDP 因?yàn)闆](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)也很明顯,在某些實(shí)時(shí)性要求高的場(chǎng)景(比如電話會(huì)議)就需要使用 UDP 而不是 TCP(見(jiàn)《網(wǎng)絡(luò)編程懶人入門(mén)(五):快速理解為什么說(shuō)UDP有時(shí)比TCP更有優(yōu)勢(shì)》)。
下面這個(gè)動(dòng)圖可以很好的說(shuō)明UDP的不可靠性:

從上面的動(dòng)圖可以得知,UDP只會(huì)把想發(fā)的數(shù)據(jù)報(bào)文一股腦的丟給對(duì)方,并不在意數(shù)據(jù)有無(wú)安全完整到達(dá)。
3.6 頭部開(kāi)銷(xiāo)小
UDP協(xié)議頭部開(kāi)銷(xiāo)?。ㄈ缦聢D所示),傳輸數(shù)據(jù)報(bào)文時(shí)是很高效的。

▲ 上圖引用自《TCP/IP詳解?-?第11章·UDP協(xié)議》
UDP 頭部包含了以下幾個(gè)數(shù)據(jù):
1)兩個(gè)十六位的端口號(hào),分別為源端口(可選字段)和目標(biāo)端口;
2)整個(gè)數(shù)據(jù)報(bào)文的長(zhǎng)度;
3)整個(gè)數(shù)據(jù)報(bào)文的檢驗(yàn)和(IPv4 可選 字段),該字段用于發(fā)現(xiàn)頭部信息和數(shù)據(jù)中的錯(cuò)誤。
因此 UDP 的頭部開(kāi)銷(xiāo)小,只有8字節(jié),相比 TCP 的至少20字節(jié)要少得多,在傳輸數(shù)據(jù)報(bào)文時(shí)是很高效的。
作為對(duì)比,下圖是TCP協(xié)議的頭部開(kāi)銷(xiāo):

▲ 上圖引用自《TCP/IP詳解?-?第17章·TCP協(xié)議》
3.7 更全面地學(xué)習(xí)UDP協(xié)議
UDP協(xié)議相對(duì)來(lái)說(shuō)比較簡(jiǎn)單易學(xué),如果覺(jué)得理論上有所欠缺,可以通過(guò)網(wǎng)絡(luò)經(jīng)典書(shū)籍《TCP/IP詳解?-?第11章·UDP:用戶數(shù)據(jù)報(bào)協(xié)議》中的章節(jié)來(lái)補(bǔ)充。
其實(shí)生產(chǎn)應(yīng)用時(shí),UDP協(xié)議也有它復(fù)雜的一面,下面這幾篇值得學(xué)習(xí)一下:
《不為人知的網(wǎng)絡(luò)編程(五):UDP的連接性和負(fù)載均衡》
《不為人知的網(wǎng)絡(luò)編程(六):深入地理解UDP協(xié)議并用好它》
《不為人知的網(wǎng)絡(luò)編程(七):如何讓不可靠的UDP變的可靠?》
另外,隨著近年來(lái)Google等互聯(lián)網(wǎng)大廠大力推廣Quic協(xié)議,UDP協(xié)議在新時(shí)代移動(dòng)互聯(lián)網(wǎng)環(huán)境下或許能找到更多的應(yīng)用場(chǎng)景,有興趣的讀者可以學(xué)習(xí)一下QUIC協(xié)議:《網(wǎng)絡(luò)編程懶人入門(mén)(十):一泡尿的時(shí)間,快速讀懂QUIC協(xié)議》、《技術(shù)掃盲:新一代基于UDP的低延時(shí)網(wǎng)絡(luò)傳輸層協(xié)議——QUIC詳解》、《讓互聯(lián)網(wǎng)更快:新一代QUIC協(xié)議在騰訊的技術(shù)實(shí)踐分享》。
4、快速理解TCP協(xié)議
4.1 基本介紹
當(dāng)一臺(tái)計(jì)算機(jī)想要與另一臺(tái)計(jì)算機(jī)通訊時(shí),兩臺(tái)計(jì)算機(jī)之間的通信需要暢通且可靠,這樣才能保證正確收發(fā)數(shù)據(jù)。
例如:當(dāng)你想查看網(wǎng)頁(yè)或查看電子郵件時(shí),希望完整且按順序查看網(wǎng)頁(yè),而不丟失任何內(nèi)容。當(dāng)你下載文件時(shí),希望獲得的是完整的文件,而不僅僅是文件的一部分,因?yàn)槿绻麛?shù)據(jù)丟失或亂序,都不是你希望得到的結(jié)果,于是就用到了TCP。
TCP協(xié)議:全稱是傳輸控制協(xié)議是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由 IETF 的RFC 793定義。
TCP 是面向連接的、可靠的流協(xié)議。流就是指不間斷的數(shù)據(jù)結(jié)構(gòu),你可以把它想象成排水管中的水流。
有關(guān)TCP協(xié)議的理論可以繼續(xù)閱讀《TCP/IP詳解?-?第17章·TCP:傳輸控制協(xié)議》,限于篇幅這里就展開(kāi)了。
接下來(lái)我們逐個(gè)介紹TCP最主要的幾個(gè)特點(diǎn)。
4.2 TCP連接過(guò)程(3次握手)
如下圖所示,這是建立一個(gè)TCP連接的過(guò)程(俗稱“3次握手”):

1)第一次握手:客戶端向服務(wù)端發(fā)送連接請(qǐng)求報(bào)文段。該報(bào)文段中包含自身的數(shù)據(jù)通訊初始序號(hào)。請(qǐng)求發(fā)送后,客戶端便進(jìn)入 SYN-SENT 狀態(tài)。
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)。
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í)連接建立成功。
這里可能大家會(huì)有個(gè)疑惑:為什么 TCP 建立連接需要三次握手,而不是兩次?這是因?yàn)檫@是為了防止出現(xiàn)失效的連接請(qǐng)求報(bào)文段被服務(wù)端接收的情況,從而產(chǎn)生錯(cuò)誤。
下面的動(dòng)畫(huà)演示了3次握手過(guò)程,可能更好懂一些:

▲ 動(dòng)圖引用自《跟著動(dòng)畫(huà)來(lái)學(xué)TCP三次握手和四次揮手》
4.3 TCP斷開(kāi)鏈接(4次揮手)

?
TCP 是全雙工的,如上圖所示,在斷開(kāi)連接時(shí)兩端都需要發(fā)送 FIN 和 ACK。
1)第一次揮手:若客戶端 A 認(rèn)為數(shù)據(jù)發(fā)送完成,則它需要向服務(wù)端 B 發(fā)送連接釋放請(qǐng)求。
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。
3)第三次揮手:B 如果此時(shí)還有沒(méi)發(fā)完的數(shù)據(jù)會(huì)繼續(xù)發(fā)送,完畢后會(huì)向 A 發(fā)送連接釋放請(qǐng)求,然后 B 便進(jìn)入 LAST-ACK 狀態(tài)。
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)。
關(guān)于TCP的4次揮手,下面的動(dòng)畫(huà)或許更生動(dòng)一些:

▲ 動(dòng)圖引用自《跟著動(dòng)畫(huà)來(lái)學(xué)TCP三次握手和四次揮手》
正確理解TCP 3次握手和4次揮手過(guò)程,是非常重要的,限于篇幅,本文沒(méi)辦法進(jìn)一步深入展開(kāi),有興趣的同事可以進(jìn)一步深入閱讀以幾篇專題文章:
《腦殘式網(wǎng)絡(luò)編程入門(mén)(一):跟著動(dòng)畫(huà)來(lái)學(xué)TCP三次握手和四次揮手》
《理論經(jīng)典:TCP協(xié)議的3次握手與4次揮手過(guò)程詳解》
《理論聯(lián)系實(shí)際:Wireshark抓包分析TCP 3次握手、4次揮手過(guò)程》
4.4 TCP協(xié)議要點(diǎn)歸納
1)面向連接:
面向連接,是指發(fā)送數(shù)據(jù)之前必須在兩端建立連接。
建立連接的方法是“三次握手”,這樣能建立可靠的連接。建立連接,是為數(shù)據(jù)的可靠傳輸打下了基礎(chǔ)。
2)僅支持單播傳輸:
每條TCP傳輸連接只能有兩個(gè)端點(diǎn),只能進(jìn)行點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳輸,不支持多播和廣播傳輸方式。
3)面向字節(jié)流:
TCP不像UDP一樣那樣一個(gè)個(gè)報(bào)文獨(dú)立地傳輸,而是在不保留報(bào)文邊界的情況下以字節(jié)流方式進(jìn)行傳輸。
4)可靠傳輸:
對(duì)于可靠傳輸、判斷丟包、誤碼,靠的是TCP的段編號(hào)以及確認(rèn)號(hào)。
TCP為了保證報(bào)文傳輸?shù)目煽?,就給每個(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ì)被重傳。
關(guān)于可靠傳輸?shù)睦碚?,可以深入學(xué)習(xí)《TCP/IP詳解?-?第21章·TCP的超時(shí)與重傳》,這里就不深入展開(kāi)了。
5)提供擁塞控制:
當(dāng)網(wǎng)絡(luò)出現(xiàn)擁塞的時(shí)候,TCP能夠減小向網(wǎng)絡(luò)注入數(shù)據(jù)的速率和數(shù)量,緩解擁塞。
TCP中有關(guān)擁塞控制的文章通都比較枯燥,這篇《通俗易懂-深入理解TCP協(xié)議(下):RTT、滑動(dòng)窗口、擁塞處理》相對(duì)來(lái)說(shuō)講的比較易懂,有興趣可以深入讀讀。
6)TCP提供全雙工通信:
TCP允許通信雙方的應(yīng)用程序在任何時(shí)候都能發(fā)送數(shù)據(jù),因?yàn)門(mén)CP連接的兩端都設(shè)有緩存,用來(lái)臨時(shí)存放雙向通信的數(shù)據(jù)。
當(dāng)然,TCP可以立即發(fā)送一個(gè)數(shù)據(jù)段,也可以緩存一段時(shí)間以便一次發(fā)送更多的數(shù)據(jù)段(最大的數(shù)據(jù)段大小取決于MSS)。
4.5 更全面地學(xué)習(xí)TCP協(xié)議
TCP協(xié)議涉及的內(nèi)容比較豐富,真要方方面面展來(lái)講,三天三夜也講不完。不過(guò),對(duì)于網(wǎng)絡(luò)應(yīng)用的開(kāi)發(fā)者來(lái)說(shuō),根據(jù)自已應(yīng)用所涉及技術(shù)的深度按需學(xué)習(xí)就可以了。
初學(xué)者建議先把理論夯實(shí),比如從《TCP/IP詳解?-?第17章·TCP:傳輸控制協(xié)議》這本經(jīng)典書(shū)籍開(kāi)始。
如果覺(jué)得理論太過(guò)乏味,下面這幾篇生動(dòng)有趣的入門(mén)文章推薦一定要讀一讀:
《網(wǎng)絡(luò)編程懶人入門(mén)(一):快速理解網(wǎng)絡(luò)通信協(xié)議(上篇)》
《網(wǎng)絡(luò)編程懶人入門(mén)(二):快速理解網(wǎng)絡(luò)通信協(xié)議(下篇)》
《網(wǎng)絡(luò)編程懶人入門(mén)(三):快速理解TCP協(xié)議一篇就夠》
《網(wǎng)絡(luò)編程懶人入門(mén)(六):史上最通俗的集線器、交換機(jī)、路由器功能原理入門(mén)》
《腦殘式網(wǎng)絡(luò)編程入門(mén)(一):跟著動(dòng)畫(huà)來(lái)學(xué)TCP三次握手和四次揮手》
《網(wǎng)絡(luò)編程入門(mén)從未如此簡(jiǎn)單(一):假如你來(lái)設(shè)計(jì)網(wǎng)絡(luò),會(huì)怎么做?》
《網(wǎng)絡(luò)編程入門(mén)從未如此簡(jiǎn)單(二):假如你來(lái)設(shè)計(jì)TCP協(xié)議,會(huì)怎么做?》
另外,在學(xué)習(xí)TCP或者網(wǎng)絡(luò)編程實(shí)踐的過(guò)程中,其它的一些網(wǎng)絡(luò)知識(shí)也有必要了解,下面這幾篇可以讓你輕松的學(xué)習(xí),不要錯(cuò)過(guò):
《腦殘式網(wǎng)絡(luò)編程入門(mén)(五):每天都在用的Ping命令,它到底是什么?》
《腦殘式網(wǎng)絡(luò)編程入門(mén)(六):什么是公網(wǎng)IP和內(nèi)網(wǎng)IP?NAT轉(zhuǎn)換又是什么鬼?》
《腦殘式網(wǎng)絡(luò)編程入門(mén)(七):面視必備,史上最通俗計(jì)算機(jī)網(wǎng)絡(luò)分層詳解》
《腦殘式網(wǎng)絡(luò)編程入門(mén)(八):你真的了解127.0.0.1和0.0.0.0的區(qū)別?》
《腦殘式網(wǎng)絡(luò)編程入門(mén)(九):面試必考,史上最通俗大小端字節(jié)序詳解》
在生產(chǎn)應(yīng)用中,必須要涉及到網(wǎng)絡(luò)的高性能、高并發(fā)問(wèn)題,下面這幾篇值得學(xué)習(xí):
《高性能網(wǎng)絡(luò)編程(一):?jiǎn)闻_(tái)服務(wù)器并發(fā)TCP連接數(shù)到底可以有多少》
《高性能網(wǎng)絡(luò)編程(二):上一個(gè)10年,著名的C10K并發(fā)連接問(wèn)題》
《高性能網(wǎng)絡(luò)編程(三):下一個(gè)10年,是時(shí)候考慮C10M并發(fā)問(wèn)題了》
《高性能網(wǎng)絡(luò)編程(四):從C10K到C10M高性能網(wǎng)絡(luò)應(yīng)用的理論探索》
《從根上理解高性能、高并發(fā)(一):深入計(jì)算機(jī)底層,理解線程與線程池》
《從根上理解高性能、高并發(fā)(二):深入操作系統(tǒng),理解I/O與零拷貝技術(shù)》
《從根上理解高性能、高并發(fā)(三):深入操作系統(tǒng),徹底理解I/O多路復(fù)用》
《從根上理解高性能、高并發(fā)(四):深入操作系統(tǒng),徹底理解同步與異步》
《從根上理解高性能、高并發(fā)(五):深入操作系統(tǒng),理解高并發(fā)中的協(xié)程》
《從根上理解高性能、高并發(fā)(六):通俗易懂,高性能服務(wù)器到底是如何實(shí)現(xiàn)的》
《從根上理解高性能、高并發(fā)(七):深入操作系統(tǒng),一文讀懂進(jìn)程、線程、協(xié)程》
隨著TCP協(xié)議應(yīng)用的深度不斷拓展,一定會(huì)遇到各種疑難雜癥:
《不為人知的網(wǎng)絡(luò)編程(一):淺析TCP協(xié)議中的疑難雜癥(上篇)》
《不為人知的網(wǎng)絡(luò)編程(二):淺析TCP協(xié)議中的疑難雜癥(下篇)》
《不為人知的網(wǎng)絡(luò)編程(三):關(guān)閉TCP連接時(shí)為什么會(huì)TIME_WAIT、CLOSE_WAIT》
《不為人知的網(wǎng)絡(luò)編程(四):深入研究分析TCP的異常關(guān)閉》
對(duì)于TCP協(xié)議來(lái)說(shuō),知道的越多越覺(jué)無(wú)知,下面這幾篇或許可以徹底為你解開(kāi)一些疑惑,不可多得:
《不為人知的網(wǎng)絡(luò)編程(十):深入操作系統(tǒng),從內(nèi)核理解網(wǎng)絡(luò)包的接收過(guò)程(Linux篇)》
《不為人知的網(wǎng)絡(luò)編程(十一):從底層入手,深度分析TCP連接耗時(shí)的秘密》
《不為人知的網(wǎng)絡(luò)編程(十二):徹底搞懂TCP協(xié)議層的KeepAlive?;顧C(jī)制》
《不為人知的網(wǎng)絡(luò)編程(十三):深入操作系統(tǒng),徹底搞懂127.0.0.1本機(jī)網(wǎng)絡(luò)通信》
5、總結(jié)一下
TCP和UDP的區(qū)別可以歸納為下面這張表格:

簡(jiǎn)單來(lái)說(shuō),TCP和UDP的區(qū)別就是:
1)TCP向上層提供面向連接的可靠服務(wù) ,UDP向上層提供無(wú)連接不可靠服務(wù);
2)雖然 UDP 并沒(méi)有 TCP 傳輸來(lái)的準(zhǔn)確,但是也能在很多實(shí)時(shí)性要求高的地方有所作為;
3)對(duì)數(shù)據(jù)準(zhǔn)確性要求高,速度可以相對(duì)較慢的,可以選用TCP。
最后,想用一張圖來(lái)生動(dòng)地概括一下TCP與UDP的區(qū)別:

正如上圖所示:TCP就像左邊的妹子——喝起水來(lái)有條不紊、滴水不漏,UDP就像右邊的妹子——甭管能喝到多少、倒就完了。。。
6、系列文章
本文是系列文章中的第13篇,本系列文章的大綱如下:
[1]?網(wǎng)絡(luò)編程懶人入門(mén)(一):快速理解網(wǎng)絡(luò)通信協(xié)議(上篇)
[2]?網(wǎng)絡(luò)編程懶人入門(mén)(二):快速理解網(wǎng)絡(luò)通信協(xié)議(下篇)
[3]?網(wǎng)絡(luò)編程懶人入門(mén)(三):快速理解TCP協(xié)議一篇就夠
[4]?網(wǎng)絡(luò)編程懶人入門(mén)(四):快速理解TCP和UDP的差異
[5]?網(wǎng)絡(luò)編程懶人入門(mén)(五):快速理解為什么說(shuō)UDP有時(shí)比TCP更有優(yōu)勢(shì)
[6]?網(wǎng)絡(luò)編程懶人入門(mén)(六):史上最通俗的集線器、交換機(jī)、路由器功能原理入門(mén)
[7]?網(wǎng)絡(luò)編程懶人入門(mén)(七):深入淺出,全面理解HTTP協(xié)議
[8]?網(wǎng)絡(luò)編程懶人入門(mén)(八):手把手教你寫(xiě)基于TCP的Socket長(zhǎng)連接
[9]?網(wǎng)絡(luò)編程懶人入門(mén)(九):通俗講解,有了IP地址,為何還要用MAC地址?
[11]?網(wǎng)絡(luò)編程懶人入門(mén)(十):一泡尿的時(shí)間,快速讀懂QUIC協(xié)議
[12]?網(wǎng)絡(luò)編程懶人入門(mén)(十一):一文讀懂什么是IPv6
[13]?網(wǎng)絡(luò)編程懶人入門(mén)(十二):快速讀懂Http/3協(xié)議,一篇就夠!
[14]?網(wǎng)絡(luò)編程懶人入門(mén)(十三):一泡尿的時(shí)間,快速搞懂TCP和UDP的區(qū)別(* 本文)
(本文已同步發(fā)布于:http://www.52im.net/thread-3793-1-1.html?)