在服务器和客户端

时间:2016-01-06 12:57:05

标签: sockets tcp server bitcoin

相关帖子

此处的帖子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套接字连接中正常工作的是什么吗?

2 个答案:

答案 0 :(得分:2)

TCP连接由套接字对标识,并由4个参数唯一标识:

  • source ip
  • 源端口
  • dest ip
  • dest port

对于建立到服务器的每个连接,套接字基本上都是克隆的,并且正在使用相同的端口。因此,对于每个连接,您都使用相同的服务器端口。所以当有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)和协商数据端口。