使用Tcp/Udp发送数据

Sat*_*hJM 2 android udp tcp ip-address

这是我的情景.

我有我的设备(Android手机).我知道另一台设备的IP地址(这是互联网上的一些远程设备)

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

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

Jas*_*son 5

您要做的是一个常见问题(但也有一个常见的解决方案).您想要将数据从一台设备(计算机/电话等)发送到另一台设备.以下是它在幕后的工作原理:

世界上有很多电脑.每台计算机都有一个标识 - 如果你愿意的话,这个名字叫做计算机的IP地址.IP地址有许多版本/标准,当前标准将IP地址命名为:"111.222.333.444".只有12位数字的排列很多 - 并且保留了整个IP地址范围.换句话说,没有足够的IP地址可供计算机使用.

现在,除了其他原因之外,还发明了路由器来解决这个问题.路由器为其局域网(LAN)内的所有计算机提供一个公共(WAN)IP地址.平均每个家庭使用一个路由器,这可以节省许多IP地址.不幸的是,它也打破了计算机之间的直接通信,因为如何使用相同的名称与三台计算机进行通信?当计算机A共享相同的WAN IP地址时,如何从计算机C识别计算机A?

首先,让我们澄清一下 - 就像有一些版本和IP地址标准一样,所以有几种类型的路由器.顺便说一句,路由器不是计算机之间直接通信问题的责任 - 它实际上是路由器的网络地址转换(NAT)的基础技术.无论如何,有几种类型的NAT,虽然互联网上的信息在这些类型上相对稀少,你仍然可以维基百科,并阅读一些大学研究论文.类型包括Full Cone NAT,受限NAT,端口受限NAT和对称NAT.

因此,LAN中的计算机共享相同的WAN IP.这是个问题.什么是解决方案?如果我们指示路由器将指向某个端口的所有传入流量路由到我们局域网中的某台计算机,该怎么办?例如,如果三台LAN计算机共享WAN IP 1.1.1.1,我们可以设置一个称为端口转发的过程,以指示路由器将到达端口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 Networking Library(内置NAT遍历,这是一个C#库):http://code.google.com/p/lidgren-network-gen3/w/list