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

前言

在咱們開始學習網絡編程的時候,咱們發現一些名詞出現的頻率極其高,好比 TCP/IP、UDP、OSI 七層網絡模型等。這確定不是偶然,由於它們極其重要,纔會被人反覆說起。尤爲在面試的時候,面試官喜歡把它們拿來,看成考察面試者基礎功底的重要環節。爲了避免讓文章顯得冗餘,咱們今天只談網絡中的 TCP、UDP 和端口html

協議、TCP 和 UDP

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

能夠絕不誇張地說計算機網絡的構建與發展,奠定石就是各類網絡協議。它們定義了信息通信的方式,以及如何收發信息等,好比:面試

  • IP 協議負責將多個包交換網絡鏈接起來,並管理通信 IP 源地址和目標地址的協議編程

  • TCP 和 UDP 協議則是位於應用層和 IP 層之間,負責它們之間信息傳輸的重要協議微信

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

TCP 和 UDP 的特色

用一個不算嚴謹的說法總結 TCP 就是,女孩子若是遇到 TCP 這樣的男生,就嫁了吧。由於TCP的核心特色就是靠譜。他的特定包括,面向鏈接、可靠、基於字節流控制的傳輸,就像一個管道同樣將應用層和 IP 層鏈接起來socket

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

TCP 和 UDP 的特色總結ide

pic_1.png

TCP 和 UDP 的使用場景

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

好比在開發一個遊戲的的程序是,對於玩家登錄帳號,由於咱們要確保不一樣的玩家能登錄到本身的帳號,這個時候就要應用 TCP 協議。而對於控制遊戲中角色的移動,咱們只需根據玩家鼠標的點擊移動角色,若是由於小几率的網絡問題,對於玩家來講,再次進行角色移動操做便可,成本和風險在可控範圍內,所以就可使用 UDP 協議

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

可不要所以就以爲 UDP 很是難用,正相反,其實有大量的服務是基於 UDP 協議的。好比 DNS 解析服務。每一臺電腦訪問外網網頁,都須要經過 DNS 服務解析域名,從中找到對應的 IP 地址。這個時候若是 DNS 出了問題,咱們其實只須要再一次進行 DNS 尋址查詢便可。惟一的反作用,可能就是有一丁點兒延遲罷了

pic_2.png

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

所以,咱們明白了,在平常的開發過程當中,咱們應該根據不一樣的應用場景,選擇對應的 TCP 或者 UDP 做爲網絡傳輸協議,而不能由於咱們對 UDP 不熟悉,就從心理上抗拒它

端口及其特色

若是 IP 是用來定位街區的,那麼端口就是對應於該街區中每一戶的門牌號。在通信過程當中,數據經過各類通信協議最終抵達設備(如計算機)後,這裏的設備就至關於一個街區,而在設備計算機內部有不少程序在跑,數據進來以後,必需要給它一個對應的門牌號(即端口號),程序才方便進行後續操做

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

pic_3.png

程序通常不止是監聽指定的端口號,並且也會明確對應的傳輸協議。因此咱們在進行數據傳輸的時候,既要指定對應的端口號,也要指定對應的通信協議,不少人僅僅會說:程序 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

參考資料:

tail_qrcode.jpg
相關文章
相關標籤/搜索