【问题标题】:Port no.s in TCP/IP packetsTCP/IP 数据包中的端口号
【发布时间】:2017-12-27 20:12:55
【问题描述】:

我正在学习 TCP/IP 基础知识。我制作了一个服务器-客户端聊天应用程序,其中服务器打开一个端口 1024,客户端可以向它发送消息。我对服务器和客户端交换的 TCP/IP 数据包的内容有点困惑。如果客户端向服务器发送消息,它会通过以太网作为数据包发送。在来自客户端的以太网帧中,数据字段以 TCP/IP 格式编码。在 TCP/IP 帧中,目的端口是 1024。但是源端口的值是多少?客户端未打开任何端口。只有服务器打开一个端口。另外我想知道是否有任何方法可以监控这些在 PC 中发送和接收的 TCP/IP 数据包。

【问题讨论】:

  • 这并不是说“客户端没有打开端口”,操作系统会在那个时候将你的客户端进程绑定到某个可用的端口,即只是你没有专门要求客户端上的特定端口端和操作系统将您的客户端进程绑定到当时的可用端口
  • 服务器需要能够响应客户端,所以通常这意味着客户端选择一个随机端口并告诉服务器它可以在那里发送它的响应。 Wireshark 无疑是监控wireshark.org 的最佳工具
  • 客户端确实打开了一个端口。连接后查看客户端主机上的netstat 输出。

标签: ethernet tcp-ip


【解决方案1】:

别忘了multiple layers involve here。 TCP、IP 和以太网是不同的,即使它们经常结合使用。分开很重要,要牢记。以太网(第 2 层)是一种将各个计算机连接在一起的协议,但它并不关心它们拥有什么 IP 地址。 IP 连接更大规模的计算机,它可以通过各种“第二层”网络技术进行路由和发送,而以太网只是其中之一。

IETF 互联网协议的优点在于它们都是thoroughly documented,因此您可以了解它们在内部是如何工作的。对于在 IP 之上运行的 TCP,端口号位于 TCP 层中。 IP 本身并不关心它们,它只关心源地址和目标地址。

关键就在描述 TCP 标头的图表中:

  0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

源端口和目标端口必须填写。这是系统的 IP 堆栈如何跟踪哪些数据包与哪些连接相关的关键组件。

通常,当您编写连接到服务器的代码时,您的连接源自(有点)随机源端口。当您创建侦听端口的服务器进程时,可以自动分配或专门设置该端口。

对于 HTTP 之类的服务,如果您希望其他客户端连接到该服务,则您希望该端口固定为 80,因此自动分配没有任何帮助。有时自动分配更可取,因此不会发生冲突。

您可以使用tcpdumpWireshark 等工具监控所有这些。他们可以深入了解各个层并显示正在发生的事情。

【讨论】:

  • 谢谢。我在 VB 中创建了一个 TCP 服务器和客户端应用程序,并成功地在客户端和服务器之间发送/接收数据。服务器在我的笔记本电脑的家庭 wifi 网络中使用端口 1234。但是 Wireshark 没有显示我在该端口中的客户端和服务器之间交换的帧。我检查了命令提示符,那里显示端口 1234 处于活动状态。可能是什么原因?
  • 确保您在正确的界面上“聆听”。使用 WiFi 时很容易误听以太网端口,反之亦然。这是两个不同的硬件接口,“环回”或本地主机接口通常是第三个。
  • 两者都在 localhost 127.0.0.1 中。所以这和我的wifi无关?
  • 没错。当您将流量发送到 localhost 时,它会通过环回接口,通常是 lolo0 或类似的东西,具体取决于您的操作系统。网络堆栈根据您的路由表通过适当的设备引导 IP 流量,因此如果您在错误的设备上侦听,您将看不到它。有时会有“监听所有接口”选项,但这可能就像消防水管一样,所以要小心。
  • 你是对的。我不得不使用其他一些名为 RawCap 的软件来捕获环回帧并将其转储到 pcap 文件中。 Wireshark 可以打开该文件:-)。
【解决方案2】:

端口号是一个逻辑实体/编号,用于标识在服务器/客户端中运行的进程。就像您的服务器应用程序有一个端口号(由您决定)一样,客户端应用程序也将有一些与之关联的端口号,由操作系统分配。在cmd提示符下输入netstat -ab,你可以在命令给出的进程列表和对应的端口号中看到与你的客户端应用关联的端口号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多