zoo*_*opa 25 network-programming tcp client-server
当客户端使用TCP连接到服务器时,会为TCP流创建一个新套接字.连接是保留在连接的同一端口上还是更改为其他端口?
Mar*_*tos 24
新套接字是引入的应用程序级概念,因为每个已建立的连接都需要一个唯一的文件描述符(也与侦听文件描述符不同),它映射到TCP会话,但与TCP会话不同.会话本身由源和目标地址和端口的组合标识.源(客户端)端口通常是随机选择的,而目标(服务器)端口是监听端口.没有分配额外的端口.
服务器使用相同的端口侦听并接受新连接,并与远程客户端进行通信。
让我给你一个例子(在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与客户端通信,但是使用了新的文件描述符。
与accept服务器上返回的新描述符关联的套接字将使用连接的服务器端上的相同端口作为原始套接字(假设客户端启动连接的"正常"定义).新套接字将具有不同的客户端端口号(从服务器的角度来看远程端口).