【UDP】 - 虚拟机Nat模式下,UDP阻塞接收不到数据的问题

1、问题:

客户端:Udp通信,recvfrom阻塞接收数据。

服务端:当收到客户端发送的数据时,立刻反馈数据至客户端,客户端能收到反馈数据,但是如果等待两分钟之后再反馈至客户端,此时客户端不能收到数据

其中,客户端运行在虚拟机中,虚拟机采用Nat模式与主机相连。

2、现象:

服务端:wireshark能抓到发往客户端的数据

客户端:客户端主机能抓到发往客户端的数据,虚拟机抓不到

说明,服务端发送的数据已经到达客户端虚拟机所在的主机,但是并没有将数据从主机发送至虚拟机

3、原因:

由于客户端所在主机能够收到数据,而虚拟机收不到,所以猜测可能和虚拟机的网络连接方式有关,我的Ubuntu虚拟机采用Nat方式连接主机,经过查阅相关资料,发现这个解释可能有点靠谱:

经查资料,当虚拟机采用nat模式时,由于虚拟机与主机之间通过地址转换模式进行连接,此时在主机中维护了一张地址转换表,所以虚拟机可以通过主机访问到外部网络,外部网络是需要通过地址转换表来找到虚拟机的。

而地址转换表是会更新的,因为它要解除一些端口的占用,所以就会造成当等到时间过长时,此时地址转换表已经更新,udp数据包无法发送至正确的地址,所以就会造成客户端udp无法正常接收数据。

4、解决方法:

将虚拟机的网络连接方式改为桥接模式就可以了。(我的ubuntu虚拟机还需要手动设置静态IP地址)

或者采用TCP连接方式?(此方式未进行验证)

PS:此前一直对UDP面向无连接的,不可靠的通信没有概念,通过这个问题算是对这个特点有了一定的了解。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值