在咱們開始學習網絡編程的時候,咱們發現一些名詞出現的頻率極其高,好比 TCP/IP、UDP、OSI 七層網絡模型等。這確定不是偶然,由於它們極其重要,纔會被人反覆說起。尤爲在面試的時候,面試官喜歡把它們拿來,看成考察面試者基礎功底的重要環節。爲了避免讓文章顯得冗餘,咱們今天只談網絡中的 TCP、UDP 和端口html
在瞭解 TCP(Transmission Control Protocol 即傳輸控制協議) 和 UDP(User Datagram Protocol 即用戶數據包協議) 以前,咱們先要知道一個名詞,即協議。它究竟是什麼?它其實就是一套約定成俗的規則。就像開會的時候,咱們達成了一些共識,先開發那個接口,項目何時上線等等。程序員
能夠絕不誇張地說計算機網絡的構建與發展,奠定石就是各類網絡協議。它們定義了信息通信的方式,以及如何收發信息等,好比:面試
IP 協議負責將多個包交換網絡鏈接起來,並管理通信 IP 源地址和目標地址的協議編程
TCP 和 UDP 協議則是位於應用層和 IP 層之間,負責它們之間信息傳輸的重要協議微信
既然是協議,你們都必須遵照,不然,今天張三定一個協議,李四不一樣意,他明天再定一個協議,這就亂了套。所以,不一樣的大廠和許多公司就聯合起來組成一個組織,將這些協議統一規範起來。你就必須得用這些規定好的協議,不然就沒法通訊。這才實現了「地球村」的夢想。今天不管用什麼設備,在世界的任何角落,用哪一種國家的語言,均可以很方便地使用網絡進行通訊網絡
用一個不算嚴謹的說法總結 TCP 就是,女孩子若是遇到 TCP 這樣的男生,就嫁了吧。由於TCP的核心特色就是靠譜。他的特定包括,面向鏈接、可靠、基於字節流控制的傳輸,就像一個管道同樣將應用層和 IP 層鏈接起來socket
而與之相對應的,UDP 就像二十多歲的浪子。他們不夠可靠,但卻充滿熱情。一切以效率爲先,他們能夠立刻答應你不少事情,而且願意立馬付出實踐。你這一秒說佛珠浪漫,他無論身處何處,立馬搭飛機給你去取,下一秒說想去聽周杰倫的演唱會,他立馬給你訂票。固然,人的精力和時間都有限,因此就可能出現不可控的意外,好比根本沒有足夠的錢買門票等。這和UDP相仿,它提供無鏈接通訊,但不對傳送的數據包提供可靠性保證tcp
TCP 和 UDP 的特色總結ide
不一樣的人,因性格不一樣,作事的方式也不同,你不能說這樣就必定好,那樣就必定很差,對於 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 會先去查一查這個端口是否已被註冊,若是已經被註冊了,它則會拒絕申請
端口號根據範圍分爲三種
它是一些衆人皆知著名的端口號,這些端口號固定分配給一些服務,咱們上面提到的 HTTP 服務、 FTP服務等都屬於這一類。知名端口號的範圍是:0-1023
它是不能夠動態調整的端口段,這些端口沒有明肯定義服務哪些特定的對象。不一樣的程序能夠根據本身的須要本身定義,註冊端口號的範圍是:1024-49151
顧名思義,這些端口號是不能夠註冊的,這一段的端口被用做一些私人的或者定製化的服務,固然也能夠用來作動態端口服務,這一段的範圍是:49152–65535