理解 TCP(一):埠

JerryC發表於2017-03-02

更好閱讀體驗:《理解 TCP 和 UDP》— By Gitbook

埠與程式

TCP 的包是不包含 IP 地址資訊的,那是 IP 層上的事,但是有源埠和目的埠。
就是說,埠這一東西,是屬於 TCP 知識範疇的。

我們知道兩個程式,在計算機內部進行通訊,可以有管道、記憶體共享、訊號量、訊息佇列等方法。
而兩個程式如果需要進行通訊最基本的一個前提是能夠唯一的標識一個程式,在本地程式通訊中我們可以使用 「PID(程式識別符號)」 來唯一標識一個程式。
但 PID 只在本地唯一,如果把兩個程式放到了不同的兩臺計算機,然後他們要通訊的話,PID 就不夠用了,這樣就需要另外一種手段了。

解決這個問題的方法就是在運輸層使用 「協議埠號 (protocol port number)」,簡稱 「埠 (port)」.
我們知道 IP 層的 ip 地址可以唯一標識主機,而 TCP 層協議和埠號可以唯一標識主機的一個程式,這樣我們可以利用:「ip地址+協議+埠號」唯一標示網路中的一個程式。
在一些場合,也把這種唯一標識的模式稱為「套接字 (Socket)」

這就是說,雖然通訊的重點是應用程式,但我們只要把要傳送的報文交到目的主機的某一個合適的埠,剩下的工作就由 TCP 來完成了。

認識埠

TCP 用一個 16 位埠號來標識一個埠,可允許有 65536 ( 2的16次方) 個不同的埠號,範圍在 0 ~ 65535 之間。

埠號根據伺服器使用還是客戶端使用,以及常見不常見的維度來區分,主要有以下類別:

  1. 伺服器端使用的埠號
    • 熟知埠號
    • 登記埠號
  2. 客戶端使用的埠號

下面展開來說說。

埠號的分類

伺服器端使用的埠號

熟知埠號
取值範圍:0 ~ 1023。
可以在 www.iana.org 查到,伺服器機器一接通電源,伺服器程式就執行起來,為了讓因特網上所有的客戶程式都能找到伺服器程式,伺服器程式所使用的埠就必須是固定的,並且總所眾所周知的。

一些常見的埠號:

應用程式 FTP TELNET SMTP DNS TFTP HTTP HTTPS SNMP
熟知埠號 21 23 25 53 69 80 443 161

登記埠號
取值範圍:1024 ~ 49151。
這類埠沒有熟知的應用程式使用,但是需要登記,以防重複

客戶端使用的埠號

取值範圍:49152 ~ 65535。
這類埠僅在客戶端程式執行時才動態選擇。
又叫 短暫埠號,表示這種埠的存在時間是短暫的,客戶程式並不在意作業系統給它分配的是哪一個埠號,因為客戶程式之所以必須有一個埠號,是為了讓傳輸層的實體能夠找到自己。

PS:在/etc/services檔案中可以檢視所有知名服務使用的埠。

參考

《後臺開發 核心技術與應用實踐》
《計算機網路》

相關文章