当服务器接受 TCP 连接时端口会改变吗?
Posted
技术标签:
【中文标题】当服务器接受 TCP 连接时端口会改变吗?【英文标题】:Does the port change when a server accepts a TCP connection? 【发布时间】:2011-03-01 04:15:53 【问题描述】:当客户端使用 TCP 连接到服务器时,会为 TCP 流创建一个新的套接字。连接是保持在建立连接的同一端口上还是更改为其他端口?
【问题讨论】:
【参考方案1】:新的套接字是一个应用程序级别的概念,因为每个建立的连接都需要一个唯一的文件描述符(也不同于侦听文件描述符),它映射到 TCP 会话,但不同于 TCP 会话。会话本身由源地址和目标地址以及端口的组合来标识。源(客户端)端口通常是随机选择的,而目标(服务器)端口是监听端口。没有分配额外的端口。
【讨论】:
会话由源和目标 ip 和端口以及协议的组合来标识。因此,它是唯一标识连接的 5 元组,而不是 4 元组。 @treecoder 哪个级别的协议?运输层?还是应用级别?例如。<ip1, port1, ip2, port2, tcp>
或 <ip1, port1, ip2, port2, http>
?
@treecoder 对于 TCP,协议总是 6,因此与识别 TCP 会话无关。
@smwikipedia 第 4 层(传输)。
@KawaiKx 不,它是传输层,与会话识别目的无关,因为所有 TCP 连接的协议都定义为 6。【参考方案2】:
服务器使用同一个端口监听和接受新连接,并与远程客户端通信。
我给你举个例子,(在linux系统中):
首先,通过python启动一个http server
:
xiongyu@ubuntu:~$ sudo python -m SimpleHTTPServer 500
Serving HTTP on 0.0.0.0 port 500 ...
第二次使用nc
命令连接http server
,这里我们启动两个客户端:
xiongyu@ubuntu:~$ nc 0.0.0.0 500
使用netstat
查看500端口的网络状态:
xiongyu@ubuntu:~$ netstat -natp |grep ':500'
tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN 54661/python
tcp 0 0 127.0.0.1:51586 127.0.0.1:500 ESTABLISHED 57078/nc
tcp 0 0 127.0.0.1:51584 127.0.0.1:500 ESTABLISHED 54542/nc
tcp 0 0 127.0.0.1:500 127.0.0.1:51586 ESTABLISHED -
tcp 0 0 127.0.0.1:500 127.0.0.1:51584 ESTABLISHED 54661/python
可以看到,http服务器使用500到LISTEN
的端口给客户端,新的客户端连接到服务器后,它仍然使用500端口与客户端通信,但使用了新的文件描述符。
【讨论】:
【参考方案3】:与服务器上accept
返回的新描述符关联的套接字将在连接的服务器端使用与原始套接字相同的端口(假设客户端启动连接的“正常”定义)。新的套接字将有一个不同的客户端端口号(从服务器的角度来看是远程端口)。
【讨论】:
以上是关于当服务器接受 TCP 连接时端口会改变吗?的主要内容,如果未能解决你的问题,请参考以下文章
Docker:服务器是不是在主机“localhost”(::1) 上运行并接受端口 5432 上的 TCP/IP 连接?