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.
我最近开始学习套接字的使用,更具体地说是在 Java。
在 this link 中显示了一个简单的客户端-服务器 UDP 应用程序。
我的问题是:当这个调用 receive 的 datagramsocket 对象没有设置端口时,客户端如何接收 receive() 方法的响应?
客户端通过 nullary 构造函数初始化其 DatagramSocket
,它将套接字绑定到通配符地址上的某个可用端口(以未指定的方式选择)。这与没有设置端口有很大不同——是一个端口集,但它是由计算机选择的,而不是由程序明确指定的。
当服务器收到消息时,它不仅提取消息数据,还提取源地址和端口。它将其响应发送到该地址和端口。客户端通过发送原始消息的同一个套接字成功接收到它,因为它仍然绑定到同一个端口,即使您不确切知道是哪个。
第一次使用该套接字发送数据包时,将分配一个临时端口。如果您需要一个特定的端口,那么您可以显式绑定它,例如 bootp 需要它。但是在 most 简单的情况下不需要绑定,你会得到临时端口。
对等点将在 UDP header 中看到此端口,因为其中既有源端口也有目标端口。
作为旁注,此机制对于 TCP 客户端是相同的。当他们调用 connect()
时,除非套接字绑定到特定端口,否则客户端内核将分配一个临时端口,并且该端口将在连接的生命周期内使用。
临时端口通常在特定范围内,UDP 和 TCP 有一种端口池。内核通常有一种机制,从池中从头开始,逐渐递增,直到到达终点,他将从头开始。当然,跳过仍在使用的端口。它被称为临时端口范围,它特定于 os.