一.UDP局域网通信。
这个比较简单,关于局域网中的2台或者更多的计算机之间的UDP通信,网络上一大把,直接复制粘贴就可以使用,原理也非常简单。所以,本文不做详细介绍。
二.UDP广域通信(包括路由器穿透技术)
广域网中的通信就比局域网复杂多了,而且会出现很多情况,每种情况的处理方式不同,下面一一道来。
1. 2台直接连接广域网中的计算机的UDP通信:
这种情况是最简单的一种,因为这2台计算机直接暴露在广域网环境下,他们都拥有独立的外网IP地址。这种情况我们可以直接利用2台计算机的外网IP和端口建立UDP数据通信,和局域网非常类似。
2. 1台通过路由器上网的计算机与1台直接连接外网的计算机的UDP通信(不考虑路由器端口映射的情况):
这种情况就和上面的情况不一样了。我们将通过路由上网的计算机称作A,将直接连接外网的计算机称作S。要实现A和S的UDP相互通信,只有一个办法。就是A主动和S联系,也就是说,A先向S发送UDP数据包。一定不能反向,因为S根本不知道A的通信地址。就算是知道了,S向A发送的数据包也会被A的路由器所拦截,因为在A的路由器看来,S主动发出的UDP数据包是不请自来的,是不安全的,所以会主动摒弃掉。但是,当A主动和S联系后,A的路由器就会记录下S的地址,我们可以理解为一个通行证,这个时候S在向A发数据的时候,S已经拥有了通向A的通行证,所以,路由器会友好的将这个数据包传递到A。从而,我们就建立起了A到S的通信。同理,我们可以推出N台通过路由器上网的计算机和一台直接连接外网的计算机间的UDP通信。而这个时候,我们S就充当起了服务器的作用,用于和每台其他客户机的连接并传递数据,现在我们所用的大多数广域网的通信软件,都是采用服务器转发的机制来实现计算机间的通信。
3. 2台都通过路由器上网的计算机之间的UDP通信:
这种情况就变得非常复杂了,如果要实现2台通过路由器上网的计算机间的UDP通信,我们必须要在他们直接搭建一个桥梁,这个桥梁就是直接连接外网的S(服务器)。虽然这种方式不推荐,但是抱着研究学习的态度,我还是研究了下。可能在现实的项目中根本用不到这种方式,因为我们完全可以通过服务器转发的方式来完成所有计算机(不管是内网还是外网)的相互通信。
下面开始本篇文章的重点,2台内网计算机(通过路由器等设备上网的计算机)的UDP穿透。首先,我们把这2台计算机称为C和D。如果C或者D直接向对方发送UDP数据包,即便是他们已经知道对方通过路由器转换后的外网IP和端口,他们也不会收到来自对方的任何数据包,原因在第二种情况中已经说明,他们的路由器都会认为对方的数据包是不请自来的,不安全,都会一一摒弃掉。这个时间,我们就需要服务器S了,他要在他们两者中充当介绍人的身份。
通过第二种方式,我们已经知道了内网计算机怎样和外网计算机之间建立UDP通信,所以,我们的C和D都可以分别和S建立UDP通信,他们与S的通道是可以一一打通的。这个时候,我们的S端,已经有了C和D通过路由器转换后的外网通信IP和端口,并且保存下来,在接下来的步骤中有重要作用。这个时候,①C向S发出请求,告知C想和D通信并且请求D的外网IP和端口。②S端口收到C的请求后,向C发送有关D外网地址的数据包。③C收到有关D的通信地址数据包后,非常重要的一步来了,C马上向D的通信地址发出一个UDP数据包,可以是任何内容,因为这个数据包D根本不会收到。但之所以要这样做的原因是让C的路由器记录下D的通信地址,也就是说,让D在C的路由器处获得通往C的通行证。④这个时候,C马上向S发送数据包,让S告诉D,C已经允许D通过了,⑤并且向D发送C的外网IP和端口。⑥当D收到S发出的这个数据包后,D马上向获取的C的地址发送一个UDP请求包,这个时候,C是会收到的。当D向C发出数据包后,D的路由器也记录下了C的通信地址,所以,C也有了向D发送数据的通行证。当C接收到D的数据包后,C再向D回一个UDP应答包,这个时候,他们2者的UDP通信已经建立了,我们也就大功告成了。下面是整个通信的流程图: