相关帖子
此处的帖子In UNIX forum描述了
服务器将继续监听端口号。
服务器将使用connect()
接受客户accept()
请求。一旦服务器接受客户端请求,内核就会为服务器分配一个随机端口号,以便进一步send()
和receive()
,因为服务器上的相同端口号不能用于发送以及正在收听,以前的端口仍在监听新连接
问题
我有一个服务器应用程序S
,它一直在监听端口18333(这实际上是bitcoind
testnet
)。当另一个客户端节点C
在53446(随机端口)上与其连接时。根据上述帖子,S
只能从端口53446发送/接收'C'数据。
但是当我运行bitcoind
testnet
时。这与端口18333中只有一个套接字连接的其他节点完美地通信,而不需要另一个用于发送/接收。下面是片段,我甚至验证了这个
bitcoin-cli -testnet -rpcport=16591 -datadir=/home/user/mytest/1/
{
"id": 1,
"addr": "178.32.61.149:18333"
}
任何人都可以帮助我理解在TCP套接字连接中正常工作的是什么吗?
答案 0 :(得分:2)
TCP连接由套接字对标识,并由4个参数唯一标识:
对于建立到服务器的每个连接,套接字基本上都是克隆的,并且正在使用相同的端口。因此,对于每个连接,您都使用相同的服务器端口。所以当有n个连接时,你有n + 1个套接字使用相同的端口。
TCP内核能够区分所有这些套接字和连接,因为套接字处于侦听状态,或者它属于考虑所有4个参数的套接字对。
因此,您的第二颗子弹是错误的,因为正如我上面所解释的那样使用了相同的端口。
答案 1 :(得分:0)
服务器将使用
connect()
接受客户accept()
请求。如 服务器接受客户端请求后,内核分配一个 服务器的随机端口号,用于进一步send()
和receive()
。
在正常的TCP流量上,情况并非如此。如果Web服务器正在侦听端口80,则发送回客户端的所有数据包都将通过服务器端口80(例如,可以使用WireShark进行验证) - 但每个连接都会有不同的socket
({{ 1}})。该信息在网络数据包的标头中发送 - IP标头中的IP和协议代码(TCP,UDP或其他),端口号作为TCP或UDP标头的一部分。)
但是在通过ftp进行通信时可能会发生更改端口,其中可能存在控制端口(通常为21)和协商数据端口。