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

zoo*_*opa 25 network-programming tcp client-server

当客户端使用TCP连接到服务器时,会为TCP流创建一个新套接字.连接是保留在连接的同一端口上还是更改为其他端口?

Mar*_*tos 24

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

  • @treecoder对于TCP,协议始终为6,因此与标识TCP会话无关。 (3认同)
  • 会话由源和目标 ip 和端口以及协议的组合标识。因此,它是唯一标识连接的 5 元组,而不是 4 元组。 (2认同)
  • @KawaiKx 不,它是传输层,与会话识别目的无关,因为所有 TCP 连接的协议被定义为 6。 (2认同)

Jay*_*llo 8

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

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

首先,http server通过python 启动?

xiongyu@ubuntu:~$ sudo python -m SimpleHTTPServer 500
Serving HTTP on 0.0.0.0 port 500 ...
Run Code Online (Sandbox Code Playgroud)

第二次使用nc命令连接到http server,此处我们通过以下方式启动两个客户端:

xiongyu@ubuntu:~$ nc 0.0.0.0 500
Run Code Online (Sandbox Code Playgroud)

使用netstat查看端口号为5000的netstate:

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
Run Code Online (Sandbox Code Playgroud)

您可以看到,http服务器使用端口500 LISTEN作为客户端,在新客户端连接到服务器之后,它仍然使用端口500与客户端通信,但是使用了新的文件描述符。


Mar*_*ins 6

accept服务器上返回的新描述符关联的套接字将使用连接的服务器端上的相同端口作为原始套接字(假设客户端启动连接的"正常"定义).新套接字将具有不同的客户端端口号(从服务器的角度来看远程端口).