2012-02-24 74 views
2

这是我的场景。使用Tcp/Udp发送数据

我有我的设备(android手机)。 而我知道另一个设备(这是互联网中的一些远程设备)的IP地址

那么我该如何发送数据到其他设备? 我是否使用Tcp或Udp协议?

编辑:而且我知道有公共IP地址和私人IP地址(如当设备通过WiFi连接时)。在这种情况下,甚至可以使用Tcp或Udp?

回答

5

您正在寻找的是一个常见问题(通常的解决方案)。你想从一个设备(电脑/电话/等..)发送数据到另一个。下面是它在幕后的工作方式:

世界上有很多计算机。每台计算机都有一个标识 - 一个名称,如果你愿意的话,称为计算机的IP地址。 IP地址有许多版本/标准,而当前标准将IP地址命名为“111.222.333.444”。只有12个数字的数字排列如此多 - 并且保留了整个IP地址范围。换句话说,计算机没有足够的IP地址。

现在,路由器被发明,除其他原因之外,以解决这个问题。路由器为其局域网(LAN)内的所有计算机提供一个公共(WAN)IP地址。每户平均有一台路由器,这可以节省很多IP地址。不幸的是,它也打破了计算机之间的直接沟通,因为如何与三台使用同一名称的计算机进行通信?当计算机C共享相同的WAN IP地址时,如何从计算机C的计算机B识别计算机A?首先,让我们澄清 - 就像IP地址有几个版本和标准一样,所以有几种类型的路由器。顺便说一句,并不是路由器是计算机之间直接通信的问题 - 它实际上是路由器的网络地址转换(NAT)的基础技术。无论如何,有几种类型的NAT,虽然这些类型的互联网上的信息相对较少,但您仍然可以通过Wikipedia并阅读几篇大学的研究论文。类型有Full Cone NAT,Restricted NAT,Port Restricted NAT和Symmetric NAT。

因此,LAN中的计算机共享相同的WAN IP。这是个问题。什么是一个解决方案?如果我们指示路由器将所有到达某个端口的传入流量路由到本地局域网中的某台计算机,该怎么办?例如,如果三台LAN计算机共享1.1.1.1的WAN IP,我们可以设置一个称为端口转发的过程来指示路由器将到达端口6000的所有数据包路由到192.168.1.101:3500。

uPnP只是一个奇特的技术(并不总是出现在路由器中 - 或者更重要的是,几乎没有默认启用),允许您使用代码进行端口转发。

如果我们不能使用uPnP端口转发,因为并非所有设备都启用它,必须有另一种解决方案 - 并且存在:打孔。

打孔有两种风格:UDP和TCP,但TCP打孔有点复杂,因为TCP本质上是第一个面向连接的协议。 UDP打孔更容易,因为您可以在没有连接的情况下发送数据包(事实上,是否真的有连接这样的东西?)

您可以阅读维基百科和其他网站上的UDP打孔程序。虽然这个概念是这样的。任何发送出站数据包的计算机都会收到回复,这意味着路由器将允许入站数据包的回复。起初,两台计算机不会期望彼此的回复,因此每台计算机发送的第一个数据包将被路由器拒绝。但是,如果我们继续发送数据包,则路由器将允许其余数据包通过,因为每台计算机都会收到答复。只要这个打孔的连接通过偶尔保持活动的数据包保持活动状态,它就会保持活跃状态​​。不幸的是,这种UDP打孔方法对于对称NAT来说是不成功的(在下面的链接中进行了解释)。这就是为什么最终解决方案只需通过自己的服务器代理连接和流量。这需要一个电脑农场,所以它的成本很高。但是这个最终的解决方案被称为TURN。 STUN是一个Web服务,您可以查询以确定您的NAT类型和公共IP(而不是解析cmyip.com)。只是你在个人研究中遇到的一些术语。

玩这些概念有所帮助。这里有一些资源,让您开始:

类型的NAT:http://think-like-a-computer.com/2011/09/16/types-of-nat/

对称NAT穿透的方法(基本上是由垃圾邮件多了很多包了很多更多的端口):http://www.goto.info.waseda.ac.jp/~wei/file/wei-apan-v10.pdf

Lidgren网络库(内置NAT穿越,这是一个C#库):http://code.google.com/p/lidgren-network-gen3/w/list

+1

谢谢杰森!回复晚了非常抱歉。 我实际上已经开始工作了。使用打孔技术。 – SatheeshJM 2012-04-02 18:19:21

+0

@SatheeshJM:嗨,我正在寻找相同的,你可以提供一些我的参考或代码。提前致谢。 – 2014-06-06 06:40:34

0

在大多数实际情况下,您可以通过将数据发送到其他手机从其中获取数据的中间设备向其他设备发送数据。可以在两个设备之间直接使用TCP或UDP之类的协议,根据协议以及设备如何获得Internet访问,这可能会也可能不会。

例如,一个设备可以发送电子邮件,另一个设备可以检索该电子邮件。您可以将该模型概括为其他类型的通信。

+0

我需要数据实时发送。因此,我认为tcp/udp会很好(我再也不是专家了!)你能解释一下互联网访问类型如何影响tcp/udp吗? – SatheeshJM 2012-02-24 00:39:44

+0

“互联网接入”可能意味着在NAT后面。 – 2012-02-24 00:56:31