DatagramSocket.Receive 未设置端口

DatagramSocket.Receive without port set

我最近开始学习套接字的使用,更具体地说是在 Java。

this link 中显示了一个简单的客户端-服务器 UDP 应用程序。

我的问题是:当这个调用 receive 的 datagramsocket 对象没有设置端口时,客户端如何接收 receive() 方法的响应?

客户端通过 nullary 构造函数初始化其 DatagramSocket,它将套接字绑定到通配符地址上的某个可用端口(以未指定的方式选择)。这与没有设置端口有很大不同——一个端口集,但它是由计算机选择的,而不是由程序明确指定的。

当服务器收到消息时,它不仅提取消息数据,还提取源地址和端口。它将其响应发送到该地址和端口。客户端通过发送原始消息的同一个套接字成功接收到它,因为它仍然绑定到同一个端口,即使您不确切知道是哪个。

第一次使用该套接字发送数据包时,将分配一个临时端口。如果您需要一个特定的端口,那么您可以显式绑定它,例如 bootp 需要它。但是在 most 简单的情况下不需要绑定,你会得到临时端口。

对等点将在 UDP header 中看到此端口,因为其中既有源端口也有目标端口。

作为旁注,此机制对于 TCP 客户端是相同的。当他们调用 connect() 时,除非套接字绑定到特定端口,否则客户端内核将分配一个临时端口,并且该端口将在连接的生命周期内使用。

临时端口通常在特定范围内,UDP 和 TCP 有一种端口池。内核通常有一种机制,从池中从头开始,逐渐递增,直到到达终点,他将从头开始。当然,跳过仍在使用的端口。它被称为临时端口范围,它特定于 os.

how to change/view ephemeral port range in windows machines