2017-12-27 1547 views
2

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

+0

这并不是说“客户端没有开放端口”,操作系统会在当时将客户端进程绑定到某个可用端口,即只是您并不特别要求客户端和操作系统上的特定端口将您的客户端进程绑定到当时的可用端口 – tkhurana96

+0

服务器需要能够正常响应客户端,这意味着客户端会选择一个随机端口并告诉服务器可以在那里发送响应。 Wireshark显然是监控的最佳工具https://www.wireshark.org/ –

回答

2

别忘了还有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,因此自动分配无济于事。有时候自动分配是最好的,所以没有冲突。

您可以使用诸如tcpdumpWireshark之类的工具监视所有这些。他们可以深入到各个层面并显示发生了什么。

+0

谢谢。我在VB中创建了一个TCP服务器和客户端应用程序,并成功地在客户端和服务器之间发送/服务器在笔记本电脑的家庭无线网络中使用端口1234。但是Wireshark没有显示我在该端口的客户端和服务器之间交换的帧。我检查了命令提示符,端口1234显示在那里。可能是什么原因 ? –

+0

确保您在正确的界面上“倾听”。使用WiFi时很容易误听以太网端口,反之亦然。这些是两个不同的硬件接口,“回环”或localhost接口通常是第三个接口。 – tadman

+0

两者都在localhost 127.0.0.1中。所以它与我的wifi没有关系? –

1

端口号是用于标识服务器/客户端中运行的进程的逻辑实体/编号。就像您的服务器应用程序有一个端口号(您决定的那样),客户端应用程序也将拥有与其关联的一些端口号,由操作系统分配。在cmd提示符下键入netstat -ab,您可以在命令给出的进程列表和相应的端口号中看到与客户端应用程序关联的端口号。