📜  访问和中继端口(1)

📅  最后修改于: 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() 函数删除指定的端口映射。