当客户端使用TCP连接到服务器时,为TCP数据流创建了一个新的套接字。这个连接是否仍然保持在建立连接时的同一端口上,还是会被更改到其他端口上呢?
答案:在TCP连接建立后,客户端和服务器之间的通信将继续通过原始套接字所用的端口进行。因此,连接将保持在相同的端口上,不会更改到其他端口。当客户端使用TCP连接到服务器时,为TCP数据流创建了一个新的套接字。这个连接是否仍然保持在建立连接时的同一端口上,还是会被更改到其他端口上呢?
答案:在TCP连接建立后,客户端和服务器之间的通信将继续通过原始套接字所用的端口进行。因此,连接将保持在相同的端口上,不会更改到其他端口。服务器使用同一端口进行监听和接受新连接,并与远程客户端通信。
让我给你举个例子(在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与客户端通信,但使用一个新的文件描述符。
accept
在服务器端返回的新描述符所关联的套接字将会使用原始套接字在服务器端的相同端口来进行连接(假设客户端是发起连接的)。新的套接字将具有不同的客户端端口号(从服务器的角度看,这是远程端口)。
<ip1,port1,ip2,port2,tcp>
或<ip1,port1,ip2,port2,http>
? - smwikipedia