windows xp(及以上)中的自定义IP / UDP / RTP标头+一般网络问题

时间:2011-01-22 20:05:37

标签: c++ winapi networking udp firewall

很多问题,对不起!

我正在进行语音聊天(VoIP)应用程序,我正在考虑自定义实现IP和UDP标头,以及主要是seq号的小额外信息。声音很像RTP是的,但我主要只是对seq数字或时间戳感兴趣,并试图实现我自己的整个RTP声音,就像一场涉及所有复杂性和数据不太可能使用的噩梦。

应用程序的目标操作系统是windows xp及更高版本。我已经阅读了关于Windows中Raw套接字主题的http://msdn.microsoft.com/en-us/library/ms740548%28v=vs.85%29.aspx,现在我只想要一些确认。 我也有一些常见的网络问题。

以下是以下问题;

1)根据MSDN,您无法使用不在网络列表中的源发送自定义IP数据包。我从安全PoV中了解到这一点,但有什么方法可以解决这个问题吗?我的想法是让两个客户端打开UDP通信到非NAT保护的服务器,然后让客户端欺骗源头,使其看起来像来自服务器而不是彼此的数据包,从而消除了对服务器作为通过NAT的数据中继,这将改善延迟。 我听说过winpcap,但我不希望每个客户都安装任何第三方应用程序。考虑到DoS攻击的数量肯定必须有一些解决方法,比如欺骗网络表,操作系统用来检查源头是否合法?这会引发反病毒系统吗? 我觉得用IP头和上面的玩具实际玩具真的很有趣,而不仅仅是使用预定义的标题。

2)我一直遇到像JRTPLIB这样的免费RTP库的问题(这可能是非常好的,但我不想为我工作)让它们工作,比我几乎可以忍受的更多,并且正在思考我只是在UDP上编写自己的解释。像RTP这样的应用程序级protc是否只是在UDP有效负载内直接构建其头部,然后是实际数据?我怀疑这是考虑到封装过程,但只是想确定。 如果是这样,一个人不需要创建一个RAW套接字来实现应用程序级协议,只需要一个普通的UDP套接字然后你自己的有效负载解释吗?

3)与UDP相比,RTP没有提供任何性能提升,因为它增加了更多的报头,它所做的就是确保数据包根据时间戳和序列号以一种正确的方式到达,对吧? 它是真的 - 在您的基本VoIP项目需求中使用RTP实现而不是自己添加基本排序是有用的吗?我意识到,对于视频会议,你可能真的不希望帧无序播放,但在音频对话中,你真的会注意到它吗?

4)如果#1中的解决方案不适用且我必须使用服务器作为客户端之间的数据中继,那么组播是否是减少服务器负载的良好解决方案?路由硬件是否支持多播?

5)与问题1)有关。为什么路由器/防火墙允许UDP打孔?例如,两个客户端首先连接到服务器,然后服务器将客户端端口/ IP提供给其他客户端,因此客户端可以在这些端口上相互通信。 为什么防火墙允许从另一个IP接收数据而不是在该端口上进行连接时使用的IP?听起来像一个很容易被过滤的大安全漏洞?我知道源IP欺骗会欺骗它,但是这个?

6)要在双方(NAT后面的客户端,非NAT的服务器)之间建立UDP会话,客户端只需向服务器发送数据包,然后允许会话通过防火墙?这意味着客户端也可以从服务器接收。 根据维基的文章,http://en.wikipedia.org/wiki/UDP_hole_punching

7)SIP是否依赖于RTP?出于某种原因,我得到了这样的印象,但我找不到支持它的数据。我可能计划将来在我的VoIP客户端添加软电话功能,并希望确保我有一个良好的基础(如果我真的必须RTP,否则我自己的UDP解释)

提前致谢!

1 个答案:

答案 0 :(得分:1)

1,此应用程序似乎不需要原始套接字

2,是

3,RTP运行在UDP之上,当然它增加了开销。在许多方面,RTP(忽略RTCP)几乎已经是最低限度了,如果你实现了一个中途的替代方案,它最多可以节省几个字节,你将无法使用任何众多的RTP测试工具

7,SIP完全独立于RTP。 SIP用于启动会话。 SDP是通常由SIP传输的协议,它是 SDP 协商和控制RTP视频/语音语音。