發(fā)布時間:2022-08-22 16:30:32  訪問次數(shù):532
發(fā)布人:優(yōu)洱士電腦維修
 
10分鐘理解TCP、UDP 和端口號
在我們開始學習網(wǎng)絡(luò)編程的時候,我們發(fā)現(xiàn)一些名詞出現(xiàn)的頻率極其高,比如 TCP/IP、UDP、OSI 七層網(wǎng)絡(luò)模型等。這肯定不是偶然,因為它們極其重要,才會被人反復提及。尤其在面試的時候,面試官喜歡把它們拿來,當作考察面試者基礎(chǔ)功底的重要環(huán)節(jié)。為了不讓文章顯得冗余,我們今天只談網(wǎng)絡(luò)中的 TCP、UDP 和端口。
協(xié)議、TCP 和 UDP
在了解 TCP(Transmission Control Protocol 即傳輸控制協(xié)議) 和 UDP(User Datagram Protocol 即用戶數(shù)據(jù)包協(xié)議) 之前,我們先要知道一個名詞,即協(xié)議。它到底是什么?它其實就是一套約定成俗的規(guī)則。就像開會的時候,我們達成了一些共識,先開發(fā)那個接口,項目什么時候上線等等。
可以毫不夸張地說計算機網(wǎng)絡(luò)的構(gòu)建與發(fā)展,奠基石就是各種網(wǎng)絡(luò)協(xié)議。它們定義了信息通訊的方式,以及如何收發(fā)信息等,比如:
IP 協(xié)議負責將多個包交換網(wǎng)絡(luò)連接起來,并管理通訊 IP 源地址和目標地址的協(xié)議
TCP 和 UDP 協(xié)議則是位于應用層和 IP 層之間,負責它們之間信息傳輸?shù)闹匾獏f(xié)議
既然是協(xié)議,大家都必須遵守,否則,今天張三定一個協(xié)議,李四不同意,他明天再定一個協(xié)議,這就亂了套。因此,不同的大廠和許多公司就聯(lián)合起來組成一個組織,將這些協(xié)議統(tǒng)一規(guī)范起來。你就必須得用這些規(guī)定好的協(xié)議,否則就無法通信。這才實現(xiàn)了“地球村”的夢想。今天無論用什么設(shè)備,在世界的任何角落,用哪種國家的語言,都可以很方便地使用網(wǎng)絡(luò)進行通信。
TCP 和 UDP 的特點
用一個不算嚴謹?shù)恼f法總結(jié) TCP 就是,女孩子如果遇到 TCP 這樣的男生,就嫁了吧。因為TCP的核心特點就是靠譜。他的特定包括,面向連接、可靠、基于字節(jié)流控制的傳輸,就像一個管道一樣將應用層和 IP 層連接起來。
而與之相對應的,UDP 就像二十多歲的浪子。他們不夠可靠,但卻充滿熱情。一切以效率為先,他們可以馬上答應你很多事情,并且愿意立馬付出實踐。你這一秒說佛珠浪漫,他不管身處何處,立馬搭飛機給你去取,下一秒說想去聽周杰倫的演唱會,他立馬給你訂票。當然,人的精力和時間都有限,所以就可能出現(xiàn)不可控的意外,比如根本沒有足夠的錢買門票等。這和UDP相仿,它提供無連接通信,但不對傳送的數(shù)據(jù)包提供可靠性保證。
TCP 和 UDP 的特點總結(jié)
TCP 和 UDP 的使用場景
不同的人,因性格不同,做事的方式也不一樣,你不能說這樣就一定好,那樣就一定不好,對于 TCP 和 UDP 也是一樣,在不同的場景中,他們各有各的妙用。
比如在開發(fā)一個游戲的的程序是,對于玩家登陸賬號,因為我們要確保不同的玩家能登陸到自己的賬號,這個時候就要應用 TCP 協(xié)議。而對于控制游戲中角色的移動,我們只需根據(jù)玩家鼠標的點擊移動角色,如果因為小概率的網(wǎng)絡(luò)問題,對于玩家來說,再次進行角色移動操作即可,成本和風險在可控范圍內(nèi),因此就可以使用 UDP 協(xié)議。
我們從以上可以看出,如果是基礎(chǔ)服務(wù)功能,則***使用 TCP 協(xié)議,保證服務(wù)的可靠性。以確***程中,每一個網(wǎng)絡(luò)包能夠正確抵達目的地。而相較于 UDP ,程序員則需要自己去進一步做丟包情況和字節(jié)傳輸順序的處理。
可不要因此就覺得 UDP 非常難用,正相反,其實有大量的服務(wù)是基于 UDP 協(xié)議的。比如 DNS 解析服務(wù)。每一臺電腦訪問外網(wǎng)網(wǎng)頁,都需要通過 DNS 服務(wù)解析域名,從中找到對應的 IP 地址。這個時候如果 DNS 出了問題,我們其實只需要再一次進行 DNS 尋址查詢即可。唯一的副作用,可能就是有一丁點兒延遲罷了。
另一個 UDP 的應用就是 IP 電話, 我們常把它稱作 VoIP(Voice over IP),它的原理可以簡化的理解為,把撥打電話從以往的電話通訊,轉(zhuǎn)移到網(wǎng)絡(luò)通訊上,類似于我們現(xiàn)在的微信通話。當你和某人通話的時候,用的就是 UDP ,想象一下,其實我們這個時候需要的并不是可靠性,而是實時性。如果不幸中間有一點信息損失了,比如你媽說:“過年給我把對象帶回來,不然就別回來了”。由于信息損失一部分,像這樣——“過年給 把對象帶 來,不然 別回 了”,其實我們是可以理解一整句話的意思的。而如果用 TCP,我們可能說一句話,別人 30 秒之后才能聽到,這顯然是不能忍受的。
因此,我們明白了,在日常的開發(fā)過程中,我們應該根據(jù)不同的應用場景,選擇對應的 TCP 或者 UDP 作為網(wǎng)絡(luò)傳輸協(xié)議,而不能因為我們對 UDP 不熟悉,就從心理上抗拒它。
端口及其特點
如果 IP 是用來定位街區(qū)的,那么端口就是對應于該街區(qū)中每一戶的門牌號。在通訊過程中,數(shù)據(jù)通過各種通訊協(xié)議最終抵達設(shè)備(如計算機)后,這里的設(shè)備就相當于一個街區(qū),而在設(shè)備計算機內(nèi)部有很多程序在跑,數(shù)據(jù)進來之后,必須要給它一個對應的門牌號(即端口號),程序才方便進行后續(xù)操作。
端口號屬于傳輸協(xié)議的一部分,因此我們可以說,數(shù)據(jù)通過 IP 地址發(fā)送對應的數(shù)據(jù)到指定設(shè)備上,而通過端口號把數(shù)據(jù)發(fā)送到指定的服務(wù)或程序上。
程序一般不止是監(jiān)聽指定的端口號,而且也會明確對應的傳輸協(xié)議。所以我們在進行數(shù)據(jù)傳輸?shù)臅r候,既要指定對應的端口號,也要指定對應的通訊協(xié)議,很多人僅僅會說:程序 A 監(jiān)聽著 33001 端口,這個是不正確的,至少是不完全正確的。相應的,我們應該這樣說:程序 A 使用 TCP 協(xié)議,監(jiān)聽 33001 端口,當然你也可以說:程序 A 使用 UDP 協(xié)議,監(jiān)聽 33001 端口。
指定傳輸協(xié)議和端口,顯而易見的好處在于,當我們進行端口轉(zhuǎn)發(fā)或者構(gòu)建網(wǎng)絡(luò)防火墻的時候,我們可以很方便的通過協(xié)議和端口進行隔離。以防止不可預見的意外發(fā)生。對于計算機來說,通過這種方式可以防止外網(wǎng)各種不必要的數(shù)據(jù),進入本地局域網(wǎng)。
你可能會想,這么多端口號,如果大家都用同一個,那不是也有沖突。沒錯,這就需要一個專門的組織來管理它們,IANA( Internet Assigned Numbers Authority 即互聯(lián)網(wǎng)號碼分配局 ),它負責管理端口注冊。大多數(shù)主流的程序,都有一個明確的已注冊端口,比如常見的 FTP 監(jiān)聽 20、 21 端口,而 HTTP 服務(wù)監(jiān)聽 80 端口等。如果有一個程序想注冊某個端口,那么 IANA 會先去查一查這個端口是否已被注冊,如果已經(jīng)被注冊了,它則會拒絕申請。
端口號根據(jù)范圍分為三種
1. Well-Known Ports(即公認端口號)
它是一些眾人皆知著名的端口號,這些端口號固定分配給一些服務(wù),我們上面提到的 HTTP 服務(wù)、 FTP服務(wù)等都屬于這一類。知名端口號的范圍是:0-1023。
2. Registered Ports(即注冊端口)
它是不可以動態(tài)調(diào)整的端口段,這些端口沒有明確定義服務(wù)哪些特定的對象。不同的程序可以根據(jù)自己的需要自己定義,注冊端口號的范圍是:1024-49151。
3. Dynamic, private or ephemeral ports(即動態(tài)、私有或臨時端口號)
顧名思義,這些端口號是不可以注冊的,這一段的端口被用作一些私人的或者定制化的服務(wù),當然也可以用來做動態(tài)端口服務(wù),這一段的范圍是:49152–65535。