当服务器接受TCP连接时,端口是否会改变?

53

当客户端使用TCP连接到服务器时,为TCP数据流创建了一个新的套接字。这个连接是否仍然保持在建立连接时的同一端口上,还是会被更改到其他端口上呢?

答案:在TCP连接建立后,客户端和服务器之间的通信将继续通过原始套接字所用的端口进行。因此,连接将保持在相同的端口上,不会更改到其他端口。
3个回答

55
新的socket是一个应用程序级别的概念,因为每个已建立的连接需要一个唯一的文件描述符(也不同于监听文件描述符),它映射到但并不相同于TCP会话。会话本身由源地址和目标地址和端口的组合来标识。源(客户端)端口通常是随机选择的,而目标(服务器)端口是监听端口,不分配额外的端口。

2
会话是由源IP和目标IP及端口以及协议的组合来识别的。因此,它是一个包含5个元素的元组,用于唯一标识连接,而不是4个元素的元组。 - treecoder
1
@treecoder 是哪个级别的协议?传输层还是应用层?例如 <ip1,port1,ip2,port2,tcp><ip1,port1,ip2,port2,http> - smwikipedia
4
对于TCP协议而言,它的协议号总是6,因此对于识别TCP会话来说无关紧要。 - Marcelo Cantos
@smwikipedia 第四层(传输层)。 - Marcelo Cantos
2
@KawaiKx 不,这是传输层,并且对于会话识别而言没有关系,因为协议被定义为所有TCP连接的6。 - Marcelo Cantos

16

服务器使用同一端口进行监听和接受新连接,并与远程客户端通信。

让我给你举个例子(在Linux系统中):

首先,通过Python启动http服务器

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来监听客户端,当一个新的客户端连接上服务器后,它仍然使用端口500与客户端通信,但使用一个新的文件描述符。


11

accept 在服务器端返回的新描述符所关联的套接字将会使用原始套接字在服务器端的相同端口来进行连接(假设客户端是发起连接的)。新的套接字将具有不同的客户端端口号(从服务器的角度看,这是远程端口)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接