目录
首先说明本文只是讲解了端口的基础知识,并基于一些网络资料、书籍和个人的理解进行编写,如有错误,欢迎留言(虽然是写给自己看的,但是放到网络上,觉得应该是要对读者负责任的)
端口是port的译文,可以认为是计算机通信的接口。可以分为物理端口和逻辑端口,文章中我们主要讲解逻辑端口 物理端口指的是实际意义上的端口,比如usb接口、vga接口、交换机、路由器等设备接口 逻辑端口主要讲的是用于tcp/ip通信的端口,作为通信协议中的一种软件的抽象概念,可以简单理解为是用编程语言虚拟出来的通信地址。教材上说:“计算机之间的通信实际上是两个计算机进程之间的通信”。但是现实中进程必须要绑定一个端口之后才能进行数据的发送和接受,因此我们可以这样理解:计算机之间的的通信实际上是两个端口间的数据流动。为了说明方便,剩余文章中的端口都是指逻辑端口端口的概念
端口作为tcp/ip协议的虚拟概念主要用于计算机之间的通信,每个协议的端口总共有65536个,取2的16次方,按照习惯从零开始,所以最大的端口号是65535,我们通常使用五元组(源ip地址、源端口号、目标ip地址、目标端口号、协议号)来确定唯一的会话,五元组相较四元组多了一个协议号,是因为每一个协议的端口号都是单独存在的,就是说tcp和udp都拥有65536个端口,比如tcp的12222端口和udp的12222端口是可以被不同的两个进程使用,两者并不冲突,但是同一个协议的端口号只能被一个进程所使用,否则会引起端口冲突(父进程下的子进程可以同时使用一个端口),简单来说就是:一个进程可以使用多个端口,一个端口只能服务一个进程。至于为什么将在下文的为什么使用端口中解释。端口的基本分组
因为端口众多,为了方便计算机之间的通信,所以官方将端口进行了简单的分组周知端口(Well Known Ports):
周知端口是众所周知的端口号,范围从0到1023,其中80端口分配给WWW服务,53是dns服务的。我们在浏览器的地址栏里输入一个网址的时候(比如www.baidu.com)是不必指定端口号的,因为在默认情况下WWW服务的端口号是“80”。网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在地址栏上指定端口号,方法是在地址后面加上冒号“:”(半角),再加上端口号。比如使用“8080”作为WWW服务的端口,则需要在地址栏里输入“www.baidu.com:8080”。但是有些系统协议使用固定的端口号,它是不能被改变的,比如139端口专门用于NetBIOS与TCP/IP之间的通信,不能手动改变。我们在改变引用程序的端口号时一般会避开这个区间,以免引起端口冲突周知端口的监听需要有root权限注册端口:
从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。动态和/或私有端口:
(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。
下面我们简单介绍一些端口,详细的端口号请查阅维基百科
端口 | 协议 | 说明 |
---|---|---|
udp常用端口 | ||
7 | echo | 将收到的数据包送给发送端 |
25 | smtp | 简单邮件传输协议 |
42 | host name server | 主机名服务 |
49 | tacacs | 登录主机协议 |
53 | dns | 域名服务 |
67 | dhcp | 动态主机配置文件 |
69 | tftp | 简单文件传输协议 |
161 | snmp | 简单网络管理协议 |
162 | snmp | 简单网络管理协议(trap 陷阱) |
220 | imap | 交互邮件访问协议 |
tcp常用端口 | ||
7 | echo | 将收到的数据包送给发送端 |
20 | ftp | 文件传送协议(数据连接) |
21 | ftp | 文件传送协议(控制连接) |
23 | telnet | 远程登录 |
25 | smtp | 简单邮件传送协议 |
53 | dns | 域名服务 |
57 | mtp | 邮件传输协议 |
80 | http | 超文本传送协议 |
我们一直说计算机之间的通信是端口和端口实现的,那端口到底是如何抽象的呢,我们可以简单理解端口其实是数据结构和i/o缓冲,计算机之间的应用程序越来越多,数据的通信也越来越复杂,我们可以想象一下,两个计算机之间的通信像是两个村庄之间进行交流,在村庄人口稀少的时候,一个村庄的信件到达另一个村庄之后,送信员在不知道地址的情况下,会挨家挨户的询问是不是你的信件啊,如果不是就会寻找下一家,一直到找到位置,但经过多年的发展小村庄已经发展成为了大城市,送信员一个一个的送信就不现实了,所以为每个人准备了一个小信箱,送信员把指定的信送到信箱里面,收信人只需要在自己的信箱那里等着就好了。端口也是一样的,如果操作系统每次在数据到达时询问每一个进程所造成的负担是无法承受的,所以将数据放到一段缓冲区里面,等待程序自己去取,上面我们提到 一个进程可以使用多个端口,一个端口只能服务一个进程,就可以理解为如果一个人的信件过多就可以申请多个信箱,但是不能两个人共用一个信箱,这样会使数据不再安全。