Java中的UDP包路由
我有一个关于udp数据包生命/路由的问题。我有一个简单的客户机-服务器UDP方案,在客户机端有一个发送调用,在服务器端有一个接收调用。假设send方法被调用,数据包实际上到达了另一端,但服务器的代码执行尚未到达receive方法调用。这段时间包会发生什么情况。现在,我尝试在receive调用之前用一个简单的命令输入提示符停止执行,稍等片刻,然后让它继续,并注意到数据包已被接收。你能解释一下为什么会发生这种情况,比如它是在不同的OSI级别上缓冲的吗Java中的UDP包路由,java,sockets,udp,packet,osi,Java,Sockets,Udp,Packet,Osi,我有一个关于udp数据包生命/路由的问题。我有一个简单的客户机-服务器UDP方案,在客户机端有一个发送调用,在服务器端有一个接收调用。假设send方法被调用,数据包实际上到达了另一端,但服务器的代码执行尚未到达receive方法调用。这段时间包会发生什么情况。现在,我尝试在receive调用之前用一个简单的命令输入提示符停止执行,稍等片刻,然后让它继续,并注意到数据包已被接收。你能解释一下为什么会发生这种情况,比如它是在不同的OSI级别上缓冲的吗 提前感谢。每个TCP或UDP套接字都有一个发送缓
提前感谢。每个TCP或UDP套接字都有一个发送缓冲区和一个接收缓冲区。您的数据报在发送方排队进入发送缓冲区,然后被发送,然后在接收方排队进入接收缓冲区,然后您从那里读取它 NB与此无关。TCP/IP不遵循OSI模型。它有自己的先前模型。方法调用“receive”不会接收数据包。如果该端口有一个UDP套接字“打开”,则意味着分配了缓冲区空间,而NIC+OS就是在该缓冲区中放置数据的。当你调用“receive”时,它只是看着那里,如果那里有什么东西,它就假装刚刚收到
我应该补充一点,如果缓冲区是空的,那么receive调用会进入阻塞状态,等待操作系统通知某个消息已经到达 这是假设他已经设置了
DatagramSocket
(即DatagramSocket服务器=新的DatagramSocket(端口)
,我想他已经有了,在这种情况下,应该有一个接收缓冲区,正如你所说的那样。@Jared显然是这样。如果他没有创建套接字,数据不会在任何地方排队,问题也不会存在。如果你自己的回答有点推测性,UDP会从NIC得到一个中断,拉出数据,确保它是用于一个非端口-现有端口,将其丢弃,并发出ICMP错误消息。