UDP广域网,局域网通信-原理分析,穿透技术

一.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通过了,⑤此时S向D发送C的外网IP和端口。⑥当D收到S发出的这个数据包后,D马上向获取的C的地址发送一个UDP请求包,这个时候,C是会收 到的。当D向C发出数据包后,D的路由器也记录下了C的通信地址,所以,C也有了向D发送数据的通行证。当C接收到D的数据包后,C再向D回一个UDP应 答包,这个时候,他们2者的UDP通信已经建立了,我们也就大功告成了。下面是整个通信的流程图:

 

 

在讲述上述方法的时候,我没有将UDP的丢包考虑进去,因为这里他并不重要,我只是讲述UDP的通信方式。在以后的文章中,我们再来探讨UDP丢包,以及丢包重发功能。

 

 

 

http://stackoverflow.com/questions/1815030/receiving-a-response-through-udp

 

What port a response is assigned is up to the application. UDP is completely stateless, so after firing off a packet the only way an application can expect a response is if it knows the other end is going to send one. Depending on the UDP application, I'd expect that the response would come on the same port for simplicity -- this is not the case for protocols like TCP, which have an intentionally random (and high) source port.

To answer your second question, many routers, even inexpensive home routers, do stateful packet inspection (SPI). Something like this likely happens, but I'm up for being corrected if I'm off:

[Set stage with client, router, Internet, server.]

  1. Client emits UDP packet. (Client在局域网的router背后,Client使用本地udp端口Pc向公网Server的IP和某协商好的端口Ps发送一个packet)
  2. Router passes UDP packet to the Internet. (router将Client的udp packet通过自己新的端口Pr将改packet发送给server的端口Ps)
  3. Router remembers that client sent a UDP packet to server, and establishes a mapping in its memory. (意思是:router将会允许Server发送给router上Pr端口的udp packet通过,且将该packet转发给Client的Pc端口,  ## router 几乎都有这个功能,即记住内网机器主动访问过的外网机器,让该机器在一定时间内获得通行的权利)
  4. Server sends a UDP packet, probably on the same port. (Server发送udp packet到router的Pr端口)
  5. Router receives packet, and checks mapping to find client talked to server recently. (router将从自己Pr端口收到的packet转发给Client的Pc端口)
  6. Router passes packet to client.

How this is implemented is specific to the router, I'd imagine, but that's my understanding of how it works.

(从上面可以看出,Client的UDP发送端口和接收端口必须是同一个,即Pc; 而Server的发送端口和接收端口不一定相同,但建议相同,这样与Client保持一致。)

 

When you create the UDP socket, you must bind it to a port number. If you dont, the operating system will assign an ephemeral port.

The application on the other side must know of this port. When replies are sent back, your router might not know how to route. There are 2 ways to resolve this problem

  1. You can explicitly configure a route to your computer on a particular port.
  2. You can configure your router to track the UDP connection by automatically opening a route to your computer when a particular packet is sent. UPNP protocol is based on this concept.
posted @ 2016-08-05 16:23  微信公众号--共鸣圈  阅读(2082)  评论(0编辑  收藏  举报