armstrong 发表于 2014-8-27 23:15:04

普及一下互联网的NAT和P2P常识!

互联网架构基本如下图所示:

图中,内网设备A和内网设备B处于不同的局域网,因此它们之间不能直接通信,它们通过各自的路由器连接到广域网;路由器A和路由器B通常都有临时可用的公网IP,它们的通信界面直接与服务器接触。由于通过NAT实现内外网的穿透,因此服务器只能接触到路由器A和路由器B;在服务器看来,所有来自设备A和设备B的报文,都是由路由器发出的,因此服务器也只是应答报文给路由器而已(进而报文被路由器通过NAT机制转发给内网设备)。
P2P就是要使设备A和设备B之间直接通信,不用通过服务器传递报文。那如何实现呢?
首先,由于路由器A和路由器B都具备公网IP,它们之间是可以直接通信的。那么能否借助这个通道来实现设备A和设备B的数据传输呢?答案当然是肯定的,而且这正式目前的P2P唯一的传输通道!但受限于安全需求,路由器A直接发送数据包给路由器B,这个报文是会被路由器B丢弃的,反之亦然。这个过程就如同外网无法主动访问内网一样:只有设备先发出报文给服务器,这时路由器记录了设备到服务器的通路信息,之后才允许从服务器返回的数据报文转发给设备。
         于是,我们就要求服务器作为中介,给设备A介绍路由器B的IP;给设备B介绍路由器A的IP。此后设备A发出报文给路由器B,同时设备B发出报文给路由器A。那么,在路由器A这头,就记录了设备A到路由器B的通路;而路由器B就记录了设备B到路由器A的通路。经过这样几次尝试之后,路由器A和路由器B就会接受对方传来的报文了!从而设备A和设备B就打通了一个传输通路,而不再需要服务器转发了。
         现实中,路由器有很多中NAT类型,有:完全圆锥型、IP约束圆锥型、IP与Port共同约束圆锥型、对称点对点型。
完全圆锥型
这种路由器最容易搞定了,但是也最不安全。如果设备A向服务器发送过报文,那么服务器就知道路由器A的IP和源端口了,这记作一个tuple;从此之后,任何主机以任何源端口都可以向这个tuple发送报文了,当然包括路由器B!这些报文理所当然被转发给设备A。
IP约束圆锥型
这种路由器在完全圆锥型的基础上作了主机IP的限制。也就是,上面的情况下,只有服务器(以任何源端口)才可以向这个tuple发送报文。路由器B没屁。
IP与Port共同约束圆锥型
这种路由器在IP约束圆锥型的基础上又作了进一步限制,也就是主机IP和源端口都限制了。此时,服务器只有用之前设备发出报文时用作目标端口的值来作为源端口,才能向tuple发送报文。
对称点对点型
这中路由器是最最安全的,也是最难搞定的。上面的三种都是属于圆锥型的,而这个是对称型的。对称和圆锥的字面区别就能说明问题!我来详细说明一下吧。我们都知道,报文需要指定源IP和端口,目标IP和目标端口;我们把一对IP和Port叫做终结点(EndPoint);那么报文就有源终结点和目标终结点。如果设备以终结点A发送报文到外网的不同的终结点,路由器为它分配同一个tuple,这中路由器就是圆锥型;如果设备以终结点A发送到n个外部不同的终结点,路由器就为它分配n个不同的tuple,这就是对称型!说到这里,对称点对点型路由器不言自明了。

那么,如何设计一个能应用于任何类型路由器的P2P架构呢?
且待我梦醒后分解!

armstrong 发表于 2014-8-27 23:24:19

沙发自己抢!NAT和P2P是物联网时代技术员必须面对的知识,得知道。

shenrongze 发表于 2014-8-27 23:28:46

求楼主头像视频名称

hongfadg 发表于 2014-8-27 23:40:24

我刚好是这种  IP与Port共同约束圆锥型  怎么办啊,,服务器能记住 A 和B 的IP和端点,,,,但是用这个IP和端点只能和服务器通信,,,,A 和 B 用对方的IP和端点,,都没有搞头,,,
请教

祥子 发表于 2014-8-28 00:02:10

对网路传输不是很了解的,有一点点晕

cwei 发表于 2014-8-28 08:09:14

没看懂,不了解

sddp001 发表于 2014-8-28 13:45:58

打洞技术

linyu0395 发表于 2014-8-28 14:01:11

继续等待裸体女转圈圈

armstrong 发表于 2014-8-28 21:54:13

天哪!看我都说了些什么梦话{:funk:}

armstrong 发表于 2014-8-28 21:59:20

本帖最后由 armstrong 于 2014-8-28 22:03 编辑

hongfadg 发表于 2014-8-27 23:40
我刚好是这种  IP与Port共同约束圆锥型  怎么办啊,,服务器能记住 A 和B 的IP和端点,,,,但 ...

IP和Port共同约束圆锥型还是挺容易解决的。就是让路由器A和路由器B相互对打几次洞就行了!比如,路由器A给B发送,这时B不接受;接着路由器B又给A发送,这时路由器A是接受的,因为先前刚向B发送过;反复对打几次,这洞就打通了。{:lol:}

要特别注意的是:设备A和设备B的源终结点不能变动,必须与发送给服务器时所用的一致。目的是让这种路由器为其重用同一个tuple。

hongfadg 发表于 2014-8-28 23:38:00

armstrong 发表于 2014-8-28 21:59
IP和Port共同约束圆锥型还是挺容易解决的。就是让路由器A和路由器B相互对打几次洞就行了!比如,路由器A ...

我试过也打不通不知道为什么,
路由器每次对外通信的端口都是变化的啊,,比如和服务器通信 用的是50001,,,,就算B知道A和IP 和端口,, B发给A时用的端口和发给服务器用的端口不一样,,端口是变化的,,,,由于第一次A是不会接收B发来的信息
所以就不知道B用的是什么端口,,,所以也不可能把信息返回给A

请问怎么解决这个问题呢,,谢谢。

armstrong 发表于 2014-8-30 18:19:20

你这个就是对称点对点型的,不是IP与Port共同约束圆锥型。

半导体 发表于 2015-11-27 16:26:03

ipv6才是未来王道。。。

imliyucai 发表于 2022-5-14 12:13:45

楼主位的讲解很好,我能明白。
我现在想做一个视频通话器,放在远地监视老家房内的情况。老家有装了上网路由器,也有WiFi。但没有电脑,家人也不会弄电脑。
我要在远地通过电脑或手机能看到老家的图像,听到对方的声音。最好对方也能听到我的声音。

我如何能发出网络连接到这个视频通话器呢? 还是只能由视频通话器发起?又如何发起?

另外,我怎样能知道我的路由器是哪种 NAT 方式?

yplin27 发表于 2022-5-14 15:38:10

imliyucai 发表于 2022-5-14 12:13
楼主位的讲解很好,我能明白。
我现在想做一个视频通话器,放在远地监视老家房内的情况。老家有装了上网路 ...
(引用自14楼)

可以了解一下webrtc相关的技术,比较通用且成熟

qinxg 发表于 2022-5-16 10:56:43

打洞应该只有用UDP吧? 我的理解是TCP会建立链路, 路由器NAT会阻挡TCP的非链接数据包.

有个问题想问下: 如果服务在北京, 2个客户分别在广州,深圳. 如果两个客户打洞成功, 其链路会在北京那边绕圈吗? 还是会广州,深圳直连??

yyts 发表于 2022-5-17 08:46:27

qinxg 发表于 2022-5-16 10:56
打洞应该只有用UDP吧? 我的理解是TCP会建立链路, 路由器NAT会阻挡TCP的非链接数据包.

有个问题想问下: 如 ...
(引用自16楼)

绕圈就不算打洞了,打洞就是直连。

yplin27 发表于 2022-5-17 09:01:44

qinxg 发表于 2022-5-16 10:56
打洞应该只有用UDP吧? 我的理解是TCP会建立链路, 路由器NAT会阻挡TCP的非链接数据包.

有个问题想问下: 如 ...
(引用自16楼)

一般是基于udp,应用层可以套dtls

打洞实际上就是从各种可能性中优先选择最好的方式,打洞不成功的话还是需要依赖服务器relay转发

iamseer 发表于 2022-5-17 09:22:56

imliyucai 发表于 2022-5-14 12:13
楼主位的讲解很好,我能明白。
我现在想做一个视频通话器,放在远地监视老家房内的情况。老家有装了上网路 ...
(引用自14楼)

听起来你是要自用,不是要做产品。
那直接买个像小蚁智能摄像机这种产品即可。网络服务全部都带,只要配个wifi就行。我猜你也可以在自己家搞一个ssid和密码一样的热点先配置好再发回老家。除了云录制要钱,看视频和双向通话都不要钱。

imliyucai 发表于 2022-5-17 20:26:06

iamseer 发表于 2022-5-17 09:22
听起来你是要自用,不是要做产品。
那直接买个像小蚁智能摄像机这种产品即可。网络服务全部都带,只要配 ...
(引用自19楼)

谢谢。粗看了下,这个小蚁好像能满足我的需求。

下一页 发表于 2022-5-18 11:50:38

imliyucai 发表于 2022-5-14 12:13
楼主位的讲解很好,我能明白。
我现在想做一个视频通话器,放在远地监视老家房内的情况。老家有装了上网路 ...
(引用自14楼)

给家里的路由器申请一个动态域名,可以通过域名服务器找到你家的路由,然后把你视频通话用到的端口映射给这个设备,就可以通过域名加端口的方式直接找到你家的摄像头。
页: [1]
查看完整版本: 普及一下互联网的NAT和P2P常识!