更好閱讀體驗(yàn):《理解 TCP 和 UDP》— By Gitbook
端口與進(jìn)程
TCP 的包是不包含 IP 地址信息的,那是 IP 層上的事,但是有源端口和目的端口。
就是說(shuō),端口這一東西,是屬于 TCP 知識(shí)范疇的。
我們知道兩個(gè)進(jìn)程,在計(jì)算機(jī)內(nèi)部進(jìn)行通信,可以有管道、內(nèi)存共享、信號(hào)量、消息隊(duì)列等方法。
而兩個(gè)進(jìn)程如果需要進(jìn)行通訊最基本的一個(gè)前提是能夠唯一的標(biāo)識(shí)一個(gè)進(jìn)程,在本地進(jìn)程通訊中我們可以使用 「PID(進(jìn)程標(biāo)識(shí)符)」 來(lái)唯一標(biāo)識(shí)一個(gè)進(jìn)程。
但 PID 只在本地唯一,如果把兩個(gè)進(jìn)程放到了不同的兩臺(tái)計(jì)算機(jī),然后他們要通信的話,PID 就不夠用了,這樣就需要另外一種手段了。
解決這個(gè)問(wèn)題的方法就是在運(yùn)輸層使用 「協(xié)議端口號(hào) (protocol port number)」,簡(jiǎn)稱 「端口 (port)」.
我們知道 IP 層的 ip 地址可以唯一標(biāo)識(shí)主機(jī),而 TCP 層協(xié)議和端口號(hào)可以唯一標(biāo)識(shí)主機(jī)的一個(gè)進(jìn)程,這樣我們可以利用:「ip地址+協(xié)議+端口號(hào)」唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程。
在一些場(chǎng)合,也把這種唯一標(biāo)識(shí)的模式稱為「套接字 (Socket)」。
這就是說(shuō),雖然通信的重點(diǎn)是應(yīng)用進(jìn)程,但我們只要把要傳送的報(bào)文交到目的主機(jī)的某一個(gè)合適的端口,剩下的工作就由 TCP 來(lái)完成了。
認(rèn)識(shí)端口
TCP 用一個(gè) 16 位端口號(hào)來(lái)標(biāo)識(shí)一個(gè)端口,可允許有 65536 ( 2的16次方) 個(gè)不同的端口號(hào),范圍在 0 ~ 65535 之間。
端口號(hào)根據(jù)服務(wù)器使用還是客戶端使用,以及常見(jiàn)不常見(jiàn)的維度來(lái)區(qū)分,主要有以下類別:
- 服務(wù)器端使用的端口號(hào)
- 熟知端口號(hào)
- 登記端口號(hào)
- 客戶端使用的端口號(hào)
下面展開(kāi)來(lái)說(shuō)說(shuō)。
端口號(hào)的分類
服務(wù)器端使用的端口號(hào)
熟知端口號(hào):
取值范圍:0 ~ 1023。
可以在 www.iana.org 查到,服務(wù)器機(jī)器一接通電源,服務(wù)器程序就運(yùn)行起來(lái),為了讓因特網(wǎng)上所有的客戶程序都能找到服務(wù)器程序,服務(wù)器程序所使用的端口就必須是固定的,并且總所眾所周知的。
一些常見(jiàn)的端口號(hào):
|應(yīng)用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | HTTPS | SNMP |
| ---| --- | --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |
|熟知端口號(hào)| 21 | 23 | 25 | 53 | 69 | 80 | 443 | 161 |
登記端口號(hào):
取值范圍:1024 ~ 49151。
這類端口沒(méi)有熟知的應(yīng)用程序使用,但是需要登記,以防重復(fù)
客戶端使用的端口號(hào)
取值范圍:49152 ~ 65535。
這類端口僅在客戶端進(jìn)程運(yùn)行時(shí)才動(dòng)態(tài)選擇。
又叫 短暫端口號(hào),表示這種端口的存在時(shí)間是短暫的,客戶進(jìn)程并不在意操作系統(tǒng)給它分配的是哪一個(gè)端口號(hào),因?yàn)榭蛻暨M(jìn)程之所以必須有一個(gè)端口號(hào),是為了讓傳輸層的實(shí)體能夠找到自己。
PS:在/etc/services文件中可以查看所有知名服務(wù)使用的端口。
參考
《后臺(tái)開(kāi)發(fā) 核心技術(shù)與應(yīng)用實(shí)踐》
《計(jì)算機(jī)網(wǎng)絡(luò)》