我正在学习 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,因此自动分配没有任何帮助。有时自动分配更可取,这样就不会发生冲突。
关于ethernet - TCP/IP 数据包中的端口号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47998094/