10分鐘理解TCP、UDP 和端口號

DNS 通信 電腦 Transmission 程序員 春節家書 啟迪雲Tuscloud 2019-05-27

前言

在我們開始學習網絡編程的時候,我們發現一些名詞出現的頻率極其高,比如 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 的特點總結

10分鐘理解TCP、UDP 和端口號


TCP 和 UDP 的使用場景

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

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

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

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

10分鐘理解TCP、UDP 和端口號


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

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

端口及其特點

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

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

10分鐘理解TCP、UDP 和端口號


程序一般不止是監聽指定的端口號,而且也會明確對應的傳輸協議。所以我們在進行數據傳輸的時候,既要指定對應的端口號,也要指定對應的通訊協議,很多人僅僅會說:程序 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

來源:https://mp.weixin.qq.com/s/mhL7duXHzKaF_BAP5xCeKw

相關推薦

推薦中...