計算機網路 之 TCP和UDP的埠號解析

scutwang發表於2014-09-05

前言:今天瞭解一下tcp和udp報文的埠。發現一直以來都只是知道埠用於區分同一IP的伺服器的不同服務,已經埠的大小。在查詢traceroute的資料的時候,才瞭解到一些之前沒注意到的東西。

 

(一) 準備知識:埠的介紹

  這一部分本該是介紹埠的作用等知識。但是網上上太多博文了。所以權且借用一篇博文供大家參考——《理解IP和埠》

(二) 埠的範圍

  在 TCP 和 UDP(如下圖) 的報文結構中都用源埠和目標埠號。

  

   如上圖,其長度都是16個bit,所以埠號範圍是0到(2^16-1),即 0到 65535。其中0到1023是IANA規定的系統埠,即系統保留視窗。

 

  More Advanced,

  根據RFC 6335的文件。埠號事實上分為三個範圍:

  o 系統埠,即公認的埠,從 0 到 1023 。

  o 使用者埠,又稱為註冊埠,從 1024 到 49151 。

  o 臨時埠,又稱動態埠(Ephemeral Port),從 49152 到 65535。


 

(三)各埠範圍用途

  ① 系統埠,為系統預設保留埠,用於提供已存在的服務。例如HTTP為80埠,DNS服務為53埠。

  ② 使用者埠,即為使用者程式自行繫結的埠。一般開發人員開發新服務時,都會繫結此區間內的埠。

  附註:上述埠繫結的服務,在wikipedia上有相應的詞條:List of TCP and UDP port numbers

  ③ 臨時埠,此類埠,一般沒有被公認繫結到那些服務上,可以用於提供任何用途。

 

(四)下面說一下臨時埠

  在一般情況下,當客戶端和服務端建立聯絡時,一般都通過一個四元組(server IP, server port, client IP, client port)來區分服務。除client Port外,其他三個基本都是確定的。對於client Port,除非客戶端程式顯式地指定一個埠號,否則,IP 棧自動選取一個埠來繫結服務,進而進行服務的區分。在這裡,這個埠號就是從臨時埠號中選取的。。

  當連線斷開後,該埠允許被重用。注意,大部分IP棧不會在該埠釋放後,就馬上重用它,而是等到臨時埠都被使用過了,才會重新使用該埠。這也就解釋了為什麼每一次執行客戶端程式獲得的都不是同一個埠

  另外,不同的作業系統對臨時埠的範圍規定不一樣。由於連線都是由四元組區分,所以臨時埠號的數量限制了同一時間內連線同一主機的獨立連線的數量。特別地,當使用FTP時,假如同一時間內需要有大量檔案同時傳輸,很容易就出現臨時埠號不足,進而IP棧會丟擲“地址已經被使用”的錯誤。

  附:在NCFTP的官網上提供了一份詳細介紹臨時埠的文件——《The Ephemeral Port Range》,其中就有提到具體的作業系統的臨時埠數量。有興趣可以看一下。

 

相關文章