【问题标题】:On successful TCP connection between server and client在服务器和客户端之间成功的 TCP 连接
【发布时间】:2016-04-10 13:55:07
【问题描述】:

相关帖子

In UNIX forum 此处的帖子描述

  • 服务器将继续侦听端口号。

  • 服务器将使用accept() 接受客户端connect() 请求。一旦服务器接受客户端请求,内核就会为服务器分配一个随机端口号,用于进一步的send()receive(),因为服务器上的相同端口号不能用于发送和侦听,并且之前的端口仍在监听新的连接

问题

我有一个服务器应用程序S,它一直在监听端口 18333(这实际上是bitcoindtestnet)。当另一个客户端节点 C 在 53446(随机端口)上与其连接时。根据上面的帖子,S 将只能从端口 53446 发送/接收“C”的数据。

但是当我运行 bitcoind testnet 时。这与其他节点完美通信,在端口 18333 中只有一个套接字连接,而无需另一个用于发送/接收。下面是sn-p,我什至验证了这一点

bitcoin-cli -testnet -rpcport=16591 -datadir=/home/user/mytest/1/ 

  {
    "id": 1,
    "addr": "178.32.61.149:18333"
  }

谁能帮助我了解 TCP 套接字连接的正确工作方式是什么?

【问题讨论】:

  • 我不太确定你在问什么。您是否混淆了源端口和目标端口?
  • 您能否提供关于在简单的客户端-服务器应用程序中应该发生什么的指针?或许到时候,我会尝试与比特币相匹配。
  • Google 首次点击“tcp 源目标端口”:stackoverflow.com/questions/21253474/…

标签: sockets tcp server bitcoin


【解决方案1】:

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

  • 源IP
  • 源端口
  • 目标ip
  • 目的港

对于与服务器建立的每个连接,基本上都会克隆套接字并使用相同的端口。因此,对于每个连接,您都有一个使用相同服务器端口的套接字。所以当有 n 个连接时,你有 n+1 个套接字使用相同的端口。

TCP 内核能够区分所有这些套接字和连接,因为套接字要么处于侦听状态,要么属于考虑所有 4 个参数的套接字对。

因此,您的第二个项目符号是错误的,因为正在使用与我上面解释的相同的端口。

【讨论】:

  • 谢谢!我现在明白了。但我的问题实际上是针对比特币应用程序的。服务器正在监听 18333 端口。假设许多客户端通过相同的目标端口连接到该服务器。那么服务器端的18333端口可以用来收发数据吗?是否没有锁定仅收听连接?但不知何故,比特币通过同一个端口进行通信和监听
  • 否,因为每个连接都有自己的套接字,并且仍然有一个监听套接字。在上面的解释中用 +1 表示。如果没有连接,则只有侦听套接字。它只会用于监听新的传入连接。
【解决方案2】:

服务器将使用accept() 接受客户端connect() 请求。作为 一旦服务器接受客户端请求,内核分配一个 服务器的随机端口号用于进一步的send()receive()

在正常的 TCP 流量中,情况并非如此。如果网络服务器正在侦听端口 80,则发送回客户端的所有数据包都将通过服务器端口 80(例如,这可以使用 WireShark 进行验证) - 但每个连接都会有不同的socketsrcIP:port - dstIP:port) .该信息在网络数据包的标头中发送 - IP 标头中的 IP 和协议代码(TCP、UDP 或其他),作为 TCP 或 UDP 标头一部分的端口号)。

但是当通过ftp 进行通信时,可能会更改端口,其中可能有一个控制端口(通常为 21)和一个协商的数据端口。

【讨论】:

  • 当然端口号不是ip头的一部分,而是tcp头或udp头。 ip 地址是 ip 标头的一部分。我想这就是你的意思,但我建议调整这个答案以避免投票。
  • @PhilipStuyck - 是的,当然 - 现在更新了,谢谢。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多