前言

在我們開始學習網路編程的時候,我們發現一些名詞出現的頻率極其高,比如 TCP/IP、UDP、OSI 七層網路模型等。這肯定不是偶然,因為它們極其重要,才會被人反覆提及。尤其在面試的時候,面試官喜歡把它們拿來,當作考察面試者基礎功底的重要環節。為了不讓文章顯得冗餘,我們今天只談網路中的 TCP、UDP 和埠

協議、TCP 和 UDP

在瞭解 TCP(Transmission Control Protocol 即傳輸控制協議) 和 UDP(User Datagram Protocol 即用戶數據包協議) 之前,我們先要知道一個名詞,即協議。它到底是什麼?它其實就是一套約定成俗的規則。就像開會的時候,我們達成了一些共識,先開發那個介面,項目什麼時候上線等等。

可以毫不誇張地說計算機網路的構建與發展,奠基石就是各種網路協議。它們定義了信息通訊的方式,以及如何收發信息等,比如:

  • IP 協議負責將多個包交換網路連接起來,並管理通訊 IP 源地址和目標地址的協議
  • TCP 和 UDP 協議則是位於應用層和 IP 層之間,負責它們之間信息傳輸的重要協議

既然是協議,大家都必須遵守,否則,今天張三定一個協議,李四不同意,他明天再定一個協議,這就亂了套。因此,不同的大廠和許多公司就聯合起來組成一個組織,將這些協議統一規範起來。你就必須得用這些規定好的協議,否則就無法通信。這才實現了「地球村」的夢想。今天無論用什麼設備,在世界的任何角落,用哪種國家的語言,都可以很方便地使用網路進行通信

TCP 和 UDP 的特點

用一個不算嚴謹的說法總結 TCP 就是,女孩子如果遇到 TCP 這樣的男生,就嫁了吧。因為TCP的核心特點就是靠譜。他的特定包括,面向連接、可靠、基於位元組流控制的傳輸,就像一個管道一樣將應用層和 IP 層連接起來

而與之相對應的,UDP 就像二十多歲的浪子。他們不夠可靠,但卻充滿熱情。一切以效率為先,他們可以馬上答應你很多事情,並且願意立馬付出實踐。你這一秒說佛珠浪漫,他不管身處何處,立馬搭飛機給你去取,下一秒說想去聽周杰倫的演唱會,他立馬給你訂票。當然,人的精力和時間都有限,所以就可能出現不可控的意外,比如根本沒有足夠的錢買門票等。這和UDP相仿,它提供無連接通信,但不對傳送的數據包提供可靠性保證

TCP 和 UDP 的特點總結

TCP 和 UDP 的使用場景

不同的人,因性格不同,做事的方式也不一樣,你不能說這樣就一定好,那樣就一定不好,對於 TCP 和 UDP 也是一樣,在不同的場景中,他們各有各的妙用

比如在開發一個遊戲的的程序是,對於玩家登陸賬號,因為我們要確保不同的玩家能登陸到自己的賬號,這個時候就要應用 TCP 協議。而對於控制遊戲中角色的移動,我們只需根據玩家滑鼠的點擊移動角色,如果因為小概率的網路問題,對於玩家來說,再次進行角色移動操作即可,成本和風險在可控範圍內,因此就可以使用 UDP 協議

我們從以上可以看出,如果是基礎服務功能,則最好使用 TCP 協議,保證服務的可靠性。以確保過程中,每一個網路包能夠正確抵達目的地。而相較於 UDP ,程序員則需要自己去進一步做丟包情況和位元組傳輸順序的處理

可不要因此就覺得 UDP 非常難用,正相反,其實有大量的服務是基於 UDP 協議的。比如 DNS 解析服務。每一臺電腦訪問外網網頁,都需要通過 DNS 服務解析域名,從中找到對應的 IP 地址。這個時候如果 DNS 出了問題,我們其實只需要再一次進行 DNS 定址查詢即可。唯一的副作用,可能就是有一丁點兒延遲罷了

另一個 UDP 的應用就是 IP 電話, 我們常把它稱作 VoIP(Voice over IP),它的原理可以簡化的理解為,把撥打電話從以往的電話通訊,轉移到網路通訊上,類似於我們現在的微信通話。當你和某人通話的時候,用的就是 UDP ,想像一下,其實我們這個時候需要的並不是可靠性,而是實時性。如果不幸中間有一點信息損失了,比如你媽說:「過年給我把對象帶回來,不然就別回來了」。由於信息損失一部分,像這樣——「過年給 把對象帶 來,不然 別回 了」,其實我們是可以理解一整句話的意思的。而如果用 TCP,我們可能說一句話,別人 30 秒之後才能聽到,這顯然是不能忍受的

因此,我們明白了,在日常的開發過程中,我們應該根據不同的應用場景,選擇對應的 TCP 或者 UDP 作為網路傳輸協議,而不能因為我們對 UDP 不熟悉,就從心理上抗拒它

埠及其特點

如果 IP 是用來定位街區的,那麼埠就是對應於該街區中每一戶的門牌號。在通訊過程中,數據通過各種通訊協議最終抵達設備(如計算機)後,這裡的設備就相當於一個街區,而在設備計算機內部有很多程序在跑,數據進來之後,必須要給它一個對應的門牌號(即埠號),程序才方便進行後續操作

埠號屬於傳輸協議的一部分,因此我們可以說,數據通過 IP 地址發送對應的數據到指定設備上,而通過埠號把數據發送到指定的服務或程序上

程序一般不止是監聽指定的埠號,而且也會明確對應的傳輸協議。所以我們在進行數據傳輸的時候,既要指定對應的埠號,也要指定對應的通訊協議,很多人僅僅會說:程序 A 監聽著 33001 埠,這個是不正確的,至少是不完全正確的。相應的,我們應該這樣說:程序 A 使用 TCP 協議,監聽 33001 埠,當然你也可以說:程序 A 使用 UDP 協議,監聽 33001 埠

指定傳輸協議和埠,顯而易見的好處在於,當我們進行埠轉發或者構建網路防火牆的時候,我們可以很方便的通過協議和埠進行隔離。以防止不可預見的意外發生。對於計算機來說,通過這種方式可以防止外網各種不必要的數據,進入本地區域網

你可能會想,這麼多埠號,如果大家都用同一個,那不是也有衝突。沒錯,這就需要一個專門的組織來管理它們,IANA( Internet Assigned Numbers Authority 即互聯網號碼分配局 ),它負責管理埠註冊。大多數主流的程序,都有一個明確的已註冊埠,比如常見的 FTP 監聽 20、 21 埠,而 HTTP 服務監聽 80 埠等。如果有一個程序想註冊某個埠,那麼 IANA 會先去查一查這個埠是否已被註冊,如果已經被註冊了,它則會拒絕申請

埠號根據範圍分為三種

  1. Well-Known Ports(即公認埠號)

它是一些眾人皆知著名的埠號,這些埠號固定分配給一些服務,我們上面提到的 HTTP 服務、 FTP服務等都屬於這一類。知名埠號的範圍是:0-1023

  1. Registered Ports(即註冊埠)

它是不可以動態調整的埠段,這些埠沒有明確定義服務哪些特定的對象。不同的程序可以根據自己的需要自己定義,註冊埠號的範圍是:1024-49151

  1. Dynamic, private or ephemeral ports(即動態、私有或臨時埠號)

顧名思義,這些埠號是不可以註冊的,這一段的埠被用作一些私人的或者定製化的服務,當然也可以用來做動態埠服務,這一段的範圍是:49152–65535

參考資料:

  • List of TCP and UDP port numbers
  • Understanding TCP/IP Network Stack & Writing Network Apps
  • UDP and TCP, two ways of sending traffic
  • TCP and UDP Ports Explained
  • TCP/IP Ports and Sockets Explained

推薦閱讀:
相關文章