網絡協議-傳輸層協議-傳輸層定義及端口號


傳輸層的定義及通信處理

我們前面介紹 IP 報文首部格式的時候提到其中有一個協議字段(Protocol),用來標識網絡層的上一層所采用的是哪一種傳輸層協議,根據這個字段的協議號就可以識別 IP 傳輸的數據部分究竟是 TCP 的內容還是 UDP 的內容。

同樣,傳輸層的 TCP 和 UDP,為了識別自己所傳輸的數據部分究竟是應該發送給應用層的哪個應用,也設定了這樣的一個編號。

網絡層可以根據 IP 地址將數據包發送到指定主機,但是到達目標主機后該由哪個應用程序來處理呢?這個就是傳輸層干的事情,傳輸層使用端口號這種識別碼識別在傳輸層上一層的應用層中所要進行處理的具體程序。

TCP/IP 的眾多協議大多以客戶端/服務端的形式運行,客戶端是請求的發起方,而服務端是請求的處理端。另外,作為服務端的程序有必要提前啟動,准備接收客戶端的請求,否則客戶端的請求過來,無法進行相應的處理。以下是一個 TCP 請求的簡化流程:

這些服務端程序在 UNIX 系統中叫守護進程,例如 Nginx、PHP-FPM、MySQL、Redis 等后台服務都是守護進程。

確認一個請求究竟發送給哪個服務端程序,可以通過所收到數據包的目標端口號進行識別。例如,當收到 TCP 的建立連接請求時,如果目標端口號是 80,則轉給 Nginx/Apache,然后 Nginx/Apache 會繼續對該連接上的通信傳輸進行處理,比如如果請求的是靜態資源則可以直接返回,如果是動態請求需要繼續轉發給相應的 CGI 處理程序進行處理,比如 PHP-FPM。

傳輸協議 TCP 和 UDP 都是通過接收數據中的目標端口號識別目標處理程序。

端口號詳解

數據鏈路和網絡層中的地址,分別指的是 MAC 地址和 IP 地址,前者用來識別同一鏈路中的不同計算機,后者用來識別計算機網路中互連的主機和路由器。在傳輸層中也有類似於地址的概念,那就是端口號,端口號用來識別同一台計算機中進行通信的不同應用程序,因此,它也被稱為程序地址。

一台計算機可以同時運行多個程序,例如瀏覽器、電子郵件客戶端、PhpStorm、QQ等,傳輸層正是利用端口號識別本機中正在運行的程序,並准確進行數據傳輸。實際上,通過源 IP 地址、目標 IP 地址、協議號(TCP/UDP)、源端口號、目標端口號這五個信息就可以唯一識別一個通信,五項中任何一個字段值不同,就被認為是不同的通信:

在實際進行通信時,需要事先綁定端口號。端口號的有效范圍介於 0~65535 之間。確定端口號的方式分為兩種:

  • 標准既定的端口號(靜態方法):每個應用程序都有指定的端口號,但也不是任意指定,其中低於 1024 的端口號一般是系統預留的知名端口號,比如 HTTP 端口號一般是 80,SSH 端口號一般是 22,FTP 端口號一般是 21,SMTP 端口號一般是 25 等等。除此之外,還有一些端口號也被正式注冊,它們分布在 1024 到 49151 之間,比如 MySQL 端口號是 3306,Redis 端口號是 6379,Memcache 端口號是 11211。關於知名端口號和注冊端口號的最新信息,請查看這里:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml。
  • 時序分配法(動態方法):服務端必須確定監聽端口號,但是客戶端不需要確定端口號,可以交由操作系統動態分配,操作系統可以為每個應用程序分配互不沖突的端口號,系統分配的端口號范圍介於 49152 到 65535 之間。

我們在編寫自己的服務端應用程序設置監聽端口號時,一般只需要高於 1024 並避開系統已安裝的其它應用程序已經注冊的端口號即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM