前言:今天了解一下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》,其中就有提到具體的操作系統的臨時端口數量。有興趣可以看一下。