前言:今天了解一下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》,其中就有提到具体的操作系统的临时端口数量。有兴趣可以看一下。