📅  最后修改于: 2023-12-03 15:41:45.415000             🧑  作者: Mango
在计算机网络中,端口(Port)是为进程提供的一种通信机制,可以通过唯一的端口号标识出不同的进程。在 TCP/IP 协议族中,端口被分成两类:已知端口和动态端口。
已知端口号在 0-1023 范围内,主要用于标识一些特殊的服务(如 HTTP、FTP 等),由 IANA(Internet Assigned Numbers Authority)统一分配。动态端口号在 1024-65535 范围内,用于标识在计算机上运行的进程。
访问端口指的是客户端在与服务器建立连接时使用的端口,也称为源端口。当客户端向服务器发送请求时,会将源端口号随请求一同发送给服务器,服务器接收到请求后,用该端口号向客户端回复响应。
在编写网络应用程序时,通常需要指定源端口号。可以通过在 socket()
函数中调用 bind()
函数实现。以下是一个 Python 示例:
import socket
# 创建 socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口号
s.bind(('127.0.0.1', 8080))
# 发送请求
s.connect(('127.0.0.1', 8888))
# 接收响应
data = s.recv(1024)
# 关闭 socket
s.close()
中继端口指的是在使用 NAT(Network Address Translation)时,路由器用于将公网 IP 地址转换为内网 IP 地址时使用的端口。当内网计算机向公网发起请求时,路由器会记录源 IP、源端口、目标 IP、目标端口等信息,并在转发响应时使用记录的端口将响应发送给正确的内网计算机。
在编写网络应用程序时,通常不需要直接操作中继端口,因为 NAT 是由路由器完成的。但是,在某些情况下,如使用 UPnP(Universal Plug and Play)协议自动配置路由器端口映射时,可能需要了解中继端口。以下是一个 Python 示例:
import miniupnpc
# 创建 UPnP 对象
u = miniupnpc.UPnP()
# 发现路由器
u.discover()
# 获取路由器 IP 地址
router_ip = u.selectigd().getexternalipaddress()
# 配置端口映射
u.selectigd().addportmapping(8080, 'TCP', '192.168.1.2', 8080, 'Test', '')
# 获取端口映射信息
mapping = u.selectigd().getspecificportmapping(0, 'TCP')
# 删除端口映射
u.selectigd().deleteportmapping(8080, 'TCP')
# 关闭 UPnP
u.selectigd().deleteportmapping(8080, 'TCP')
以上示例中,通过创建 UPnP 对象,调用 discover()
函数发现路由器,选择一个 IGD(Internet Gateway Device)对象,调用 getexternalipaddress()
函数获取路由器的公网 IP 地址,调用 addportmapping()
函数在路由器上配置端口映射,调用 getspecificportmapping()
函数获取指定的端口映射信息,调用 deleteportmapping()
函数删除指定的端口映射。