TCP/IP 数据包中的端口 no.s

Port no.s in TCP/IP packets

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

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

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

关键就在描述TCP的图中header:

  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,因此自动分配没有帮助。有时自动分配更可取,这样就不会发生冲突。

您可以使用 tcpdump or Wireshark 等工具监控所有这些。他们可以深入各个层次并展示正在发生的事情。

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