我正在学习TCP/IP基础知识。我做了一个服务器 - 客户端聊天应用程序,服务器在其中打开一个端口1024,客户端可以发送消息给它。我对服务器和客户端交换的TCP/IP数据包的内容有点困惑。如果客户端向服务器发送消息,它将通过以太网作为数据包发送。在客户端的以太网帧中,数据字段以TCP/IP格式进行编码。在TCP/IP帧中,目标端口将是1024.但是,源端口的值是什么?客户不开放端口。只有服务器打开一个端口。此外,我想知道是否有任何方法来监视这些在PC中发送和接收的TCP/IP数据包。TCP/IP数据包中的端口号
回答
别忘了还有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,因此自动分配无济于事。有时候自动分配是最好的,所以没有冲突。
谢谢。我在VB中创建了一个TCP服务器和客户端应用程序,并成功地在客户端和服务器之间发送/服务器在笔记本电脑的家庭无线网络中使用端口1234。但是Wireshark没有显示我在该端口的客户端和服务器之间交换的帧。我检查了命令提示符,端口1234显示在那里。可能是什么原因 ? –
确保您在正确的界面上“倾听”。使用WiFi时很容易误听以太网端口,反之亦然。这些是两个不同的硬件接口,“回环”或localhost接口通常是第三个接口。 – tadman
两者都在localhost 127.0.0.1中。所以它与我的wifi没有关系? –
端口号是用于标识服务器/客户端中运行的进程的逻辑实体/编号。就像您的服务器应用程序有一个端口号(您决定的那样),客户端应用程序也将拥有与其关联的一些端口号,由操作系统分配。在cmd提示符下键入netstat -ab,您可以在命令给出的进程列表和相应的端口号中看到与客户端应用程序关联的端口号。
- 1. 比较python数据包的端口号
- 2. 如何从iptables队列中的数据包中提取源端口号和目标端口号
- 3. 端口号分配在UDP数据报和端口号在sockaddr_in
- 4. 抓取数据包的源地址和端口号 - Scapy脚本
- 5. ICMP数据包的源端口和目的端口
- 6. 端口编号如何工作以接收MODBUS TCP数据包?
- 7. wireshark通过端口计数数据包
- 8. 从libpcap捕获的数据包中获取错误的ip和端口号
- 9. 嗅探WOL数据包在端口9
- 10. Node.js跨端口发送数据包
- 11. 端口扫描器 - icmp数据包
- 12. Python:从端口接收UDP数据包
- 13. VB.net 1.1使用CreateProcessWithLogon API创建TCPIP打印机端口
- 14. 端口和端口号的关系?
- 15. 如何在postgresql中获取ubuntu数据库的端口号?
- 16. 如何在MVC5的Web.config中为数据库指定端口号?
- 17. 如何获取数据库IP地址,oracle中的端口号?
- 18. python中的BPF来嗅探多个TCP端口的数据包
- 19. USB端口号
- 20. 端口号htpasswd
- 21. 根据相关的端口号
- 22. 在Java中更改UDP数据包的发送IP和端口
- 23. 如何在java中的端口53上反映UDP数据包?
- 24. 从端口从端口中bytes.my数据的形式将数据传递到XML()
- 25. OpenJMS - 客户端端口号
- 26. 指定端口号和内容数据库中marklogic
- 27. 查找端口号
- 28. 消除端口号
- 29. jQuery,ajax,端口号
- 30. ip +端口组合中的端口号是什么?
这并不是说“客户端没有开放端口”,操作系统会在当时将客户端进程绑定到某个可用端口,即只是您并不特别要求客户端和操作系统上的特定端口将您的客户端进程绑定到当时的可用端口 – tkhurana96
服务器需要能够正常响应客户端,这意味着客户端会选择一个随机端口并告诉服务器可以在那里发送响应。 Wireshark显然是监控的最佳工具https://www.wireshark.org/ –