内网穿透原理

一、前言

    由于工作与网络通信有关,最近研究了一下内网穿透,下面是自己的一些理解。

二、问题来源

    首先来说一下常见的网络通信,内外网通信。

     假如目前有内网客户端A,外网客户端B,网关nat,因为网络不在同一个网段内,所以内外网是无法直接连接的,但是网关nat充当着中间人的角色,就实现了内外网通信的功能。

 A要连接B,消息发到 nat 时 nat发现是要连接到外网, 就自己建立一个socket去连接 B, 从此以后 A发过去的数据都会被修改包头中的本地地址为 nat的地址, 然后发出去 。 所以 B 实际上一直以为 是nat在给自己发东西。

 B要给A发数据, nat收到以后就会把包头中的目标地址改成内网地址,然后发给A,而A则实际上一直是在跟nat发数据。

      这是内网和外网进行通信,那么问题来了,如果两个不同的内网之间可以直接通信吗?两个不同内网间建立连接(即内网穿透)。

 答案是肯定不能的,因为两个内网程序都不知道对方外网的外网地址,所以无法连接。那怎么办呢?这时我们就找来一个新角色,一个外网客户端N。

  内网 LA、LB 网关 natA,natB 外网 N,LA 要连 LB。LA先通过网关ntaA连接N,LB通过网关ntaB也连接到N。然后 LA在N那里得到了LB的地址(实际上就是natB的地址)。但是直接给natB发东西不行的。

因为一个socket只能给一个socket发东西,而这时natB是在跟N发东西的。于是这时候LA就给N说,你让LB来连接我吧!

然后N对LB说,你再开一个连接出来,于是N就有了LB的另一个地址LBADDR,然后告诉LA。LA这下就可以连接LB了,因为LBADDR是一个外网地址,也就是natB的地址。而natB是知道这个地址是要转发给LB的。

这样就OK了.....

posted @ 2017-03-23 17:31  子非魚!  阅读(2965)  评论(0编辑  收藏  举报