【问题标题】:Send data using Tcp/Udp使用 Tcp/Udp 发送数据
【发布时间】:2012-03-14 11:38:50
【问题描述】:

这是我的场景。

我有我的设备(安卓手机)。 而且我知道另一台设备的 IP 地址(这是互联网上的某个远程设备)

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

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

【问题讨论】:

    标签: android tcp udp ip-address


    【解决方案1】:

    您想要做的是一个有共同问题的共同任务(但也有一个共同的解决方案)。您想将数据从一台设备(计算机/电话/等)发送到另一台设备。以下是它在幕后的运作方式:

    世界上有很多计算机。每台计算机都被赋予了一个身份——一个名字,如果你愿意的话,它被称为计算机的 IP 地址。 IP 地址有许多版本/标准,当前标准将 IP 地址命名为:“111.222.333.444”。 12 位数字的排列只有这么多 - 并且整个 IP 地址范围都被保留。换句话说,没有足够的 IP 地址供计算机使用。

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

    首先,让我们澄清一下 - 就像 IP 地址有几个版本和标准一样,路由器也有几种类型。顺便说一句,计算机之间的直接通信问题并不是路由器的问题——实际上是路由器的网络地址转换(NAT)的底层技术。无论如何,NAT 有几种类型,虽然互联网上关于这些类型的信息相对稀缺,但您仍然可以在 Wikipedia 上查阅它并阅读一些大学研究论文。类型有 Full Cone NAT、Restricted NAT、Port Restricted NAT 和 Symmetric NAT。

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

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

    如果我们不能使用 uPnP 进行端口转发,因为并非所有设备都启用了它,那么必须有另一种解决方案——那就是:打孔。

    打孔有两种形式:UDP 和 TCP,尽管 TCP 打孔有点复杂,因为 TCP 本质上首先是一个面向连接的协议。 UDP打洞更容易,因为你可以在没有连接的情况下发送数据包(事实上,真的有连接这种东西吗?)

    您可以在 Wikipedia 和其他网站上阅读有关 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

    【讨论】:

    • 谢谢杰森!回复晚了非常抱歉。我真的让它工作了。使用打孔技术。
    • @SatheeshJM:嗨,我正在寻找同样的东西,你能提供一些参考或代码吗?提前致谢。
    【解决方案2】:

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

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

    【讨论】:

    • 我需要实时发送数据。因此,我认为 tcp/udp 会很好(我又不是专家,呵呵!)你能解释一下互联网访问类型如何影响 tcp/udp 吗?
    • “互联网访问”可能意味着在 NAT 之后。
    猜你喜欢
    • 2019-08-31
    • 2019-05-08
    • 2021-07-06
    • 2012-10-20
    • 2017-09-14
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多