当客户端使用TCP连接到服务器时,会为TCP流创建一个新套接字。连接是保留在连接的同一端口上还是更改为其他端口?
答案 0 :(得分:19)
新套接字是一种应用程序级概念,因为每个已建立的连接都需要一个唯一的文件描述符(也与侦听文件描述符不同),它映射到TCP会话,但与TCP会话不同。会话本身由源和目标地址和端口的组合标识。源(客户端)端口通常是随机选择的,而目标(服务器)端口是监听端口。没有分配额外的端口。
答案 1 :(得分:6)
与服务器上accept
返回的新描述符相关联的套接字将使用连接服务器端上与原始套接字相同的端口(假设客户端启动连接的“正常”定义)。新套接字将具有不同的客户端端口号(从服务器的角度来看远程端口)。
答案 2 :(得分:3)
服务器使用相同的端口来侦听和接受新连接,并与远程客户端进行通信。
让我给你一个例子(在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
查看端口5000的网络状态:
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与客户端通信,但是使用了新的文件描述符