我正在学习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. 端口编号如何工作以接收MODBUS TCP数据包?
- 2. Python:从端口接收UDP数据包
- 3. Node.js跨端口发送数据包
- 4. 端口扫描器 - icmp数据包
- 5. VB.net 1.1使用CreateProcessWithLogon API创建TCPIP打印机端口
- 6. 如何获取数据库IP地址,oracle中的端口号?
- 7. python中的BPF来嗅探多个TCP端口的数据包
- 8. USB端口号
- 9. 根据相关的端口号
- 10. 在Java中更改UDP数据包的发送IP和端口
- 11. 从端口从端口中bytes.my数据的形式将数据传递到XML()
- 12. 指定端口号和内容数据库中marklogic
- 13. jQuery,ajax,端口号
- 14. ip +端口组合中的端口号是什么?
- 15. 当收到UDP数据包时,该端口与监听端口不匹配
- 16. 端口号和URL的
- 17. SQL Server的端口号
- 18. 服务器和客户端显示的公共端口号不同端口号
- 19. 如何将默认端口号更改为Tomcat端口号8080?
- 20. 在%systemroot%\ system32 \ drivers \ etc \ hosts中包含端口号文件
- 21. 没有端口号的端点
- 22. Wordpress图像中的端口号网址
- 23. 更改systemjs中的默认端口号
- 24. 了解openvswitch中的端口号
- 25. 在tomcat中消除ulr的端口号
- 26. 更改JBoss EAP 6.0.1中的端口号
- 27. IIS中虚拟目录的端口号
- 28. ssis包中csv数据的逗号
- 29. 牛仔放在端口80上的一些数据包
- 30. 如何监听任何端口上的广播数据包?
这并不是说“客户端没有开放端口”,操作系统会在当时将客户端进程绑定到某个可用端口,即只是您并不特别要求客户端和操作系统上的特定端口将您的客户端进程绑定到当时的可用端口 – tkhurana96
服务器需要能够正常响应客户端,这意味着客户端会选择一个随机端口并告诉服务器可以在那里发送响应。 Wireshark显然是监控的最佳工具https://www.wireshark.org/ –