ethernet - TCP/IP 数据包中的端口号

标签 ethernet tcp

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

最佳答案

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

IETF 互联网协议(protocol)的伟大之处在于它们都是 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 等工具监控所有这些或Wireshark等等。他们可以深入研究各个层面并显示正在发生的事情。

关于ethernet - TCP/IP 数据包中的端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998094/

相关文章:

c - 使用 O_SYNC 时 mmap 非常慢

python - 如何在软件中可靠地生成以太网帧错误?

c - C 代码中打印的 MAC 不正确

sockets - ZeroMQ可以用来接受传统的socket请求吗?

C#配置TCPClient客户端端口

c++ - TCP 套接字(客户端-服务器)recv() 返回 -1 值

c++ - 如何修复 LAN 上的多个 Arduino 导致超时

python - 在扭曲协议(protocol)中定期运行函数

networking - TCP 从已用于监听的端口打开套接字

mysql - 如何从 Arduino 连接到数据库?