日期:2014-05-16  浏览次数:20672 次

linux下udp的转发问题
我在linux下开发了一个代理程序(接收到客户端发的udp包,然后抓发到指定目的地)

功能上没有问题,现在的现象是:
1. 如果只是转发到相同网络环境(比如电信到电信),效率正常, 如果跨网转发(比如从电信到网通),则转发效率低
2. 用相同功能的程序(比如l2tp服务器),跨网转发的效率比我的代理程序高很多

请高手们给点建议:
比如 udp转发设置 什么选项可以提高转发效率? 或者网卡的什么设置可以提高转发效率? 或者控制转发的数据包大小可以提高转发效率?

我能想到的都试过,还是没有效果,现在没有头绪了。

------解决方案--------------------
你是udp报文的大小都是多大?
------解决方案--------------------
你比如的那个第三条 你也试过了?
你可以去研究一下你说可以的软件程序 看看人家是如何处理的
------解决方案--------------------
l2tp可能是在内核里面转发,你应用程序转发效率肯定比不上内核转发效率高哦!
------解决方案--------------------
我觉得应该是你说的那个L2TP服务器的位置问题吧?本身跨ISP,效率就低。因为两个ISP之间的带宽有限。

你的代理服务器只有网通或者只有电信接口吧?
------解决方案--------------------
以我的经验,要从以下方面着手。

1.SOCKET系统缓冲,这个很重要,因为,哪果缓冲小了的话,可能发过来的包,还没有接收就被丢掉。

2.TTL设置,这个也很重要,因为,包的TTL不同,决定了你转发的路径。

3.就是人为的错,转发上面,尽量IO操作不能被阻塞,稍的耗时的操作另起线程。因为,稍有抖动你的数据就会被复盖或丢掉。

4.socket选项,有些选项可能需要更改,比如质量,延迟,吞吐量。这个可以通过质量选项来设置


其中,第三点难查,其他的,修改后会有明显改善。

应该对你有帮助。

另外,我发个广告。请留意我的UDX协议,
www.goodudx.com.
------解决方案--------------------
上面的同学已经把相关的socket技术细节改进说了,挺好的
不过你这个问题,应该是主要是机制上的问题,不同的运营商之间本身是有数据传输限制的,
一般来说涉及到跨运营商之间发送数据会采用多个线路,这样可以改变运营商之间的限制
只是靠程序改进是很难实现的,因为运营商在机房做了限制,我们的程序是很难改变的