IP地址=网络号+主机号
Internet管理委员会定义了A、B、C、D、E五类地址,在每类地址中,还规定了网络编号和主机编号。在TCP/IP协议中,IP地址是以二进制数字形式出现的,共32bit,1bit就是二进制中的1位,但这种形式非常不适用于人阅读和记忆。因此Internet管理委员会决定采用一种点分十进制表示法表示IP地址:面向用户的文档中,由四段构成的32比特的IP地址被直观地表示为四个以圆点隔开的十进制整数。
TCP/IP规定,主机号全为1的网络地址用于广播之用,叫做广播地址。所谓广播,指同时向同一子网所有主机发送报文。各位全为0的网络号被解释成本网络
A类地址:A类地址的网络标识由第一组8位二进制数表示,A类地址的特点是网络标识的第一位二进制数取值必须为0。不难算出,A类地址第一个地址为00000001,最后一个地址是01111111,换算成十进制就是127,其中127留作保留地址,A类地址的第一段范围是:1~126,A类地址允许有2^7- 2 =126个网段(减2是因为0不用,127留作它用),网络中的主机标识占3组8位二进制数,每个网络允许有2^24-2=1677,7216台主机(减2是因为全0地址为网络地址,全1为广播地址,这两个地址一般不分配给主机)。通常分配给拥有大量主机的网络。(A类网络地址127是一个保留地址,用于网络软件测试以及本地机进程间通信,叫做回送地址(loopback addres s))
B类地址:B类地址的网络标识由前两组8位二进制数表示,网络中的主机标识占两组8位二进制数,B类地址的特点是网络标识的前两位二进制数取值必须为10。B类地址第一个地址为10000000,最后一个地址是10111111,换算成十进制B类地址第一段范围就是128~191,B类地址允许有2^14 =16384个网段,网络中的主机标识占2组8位二进制数,每个网络允许有2^16-2=65533台主机,适用于结点比较多的网络。
C类地址:C类地址的网络标识由前3组8位二进制数表示,网络中主机标识占1组8位二进制数C类地址的特点是网络标识的前3位二进制数取值必须为110。C类地址第一个地址为11000000,最后一个地址是11011111,换算成十进制C类地址第一段范围就是192~223,C类地址允许有2^21 =2097152个网段,网络中的主机标识占1组8位二进制数,每个网络允许有2^8-2= 254台主机,适用于结点比较少的网络。
子网掩码:子网掩码的作用就是和IP地址与运算后得出网络地址,子网掩码也是32bit,并且是一串1后跟随一串0组成,其中1表示在IP地址中的网络号对应的位数,而0表示在IP地址中主机对应的位数
A类-----------------255.0.0.0 也可以表示为 /8 表示有8个1
B类-----------------255.255.0.0 也可以表示为 /16 表示有16个1
C类-----------------255.255.255.0 可以表示为 /24 表示有24个1
标准子网掩码出现的都是255和0的组合,在实际的应用中还有类似255·255·255·252不全是255和0的组合的子网掩码 这些子网掩码又是为了把一类网络划分成多个子网络
使用子网划分时的地址格式
A类------------网络(8位)+子网(X位)+主机(24-X位)
B类------------网络(16位)+子网(X位)+主机(16-X位)
C类------------网络(24位)+子网(X位)+主机(8-X位)
在TCP/IP协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下:
10.0.0.0/8:10.0.0.0~10.255.255.255
172.16.0.0/12:172.16.0.0~172.31.255.255
192.168.0.0/16:192.168.0.0~192.168.255.255
使用保留地址的网络只能在内部进行通信,而不能与其它网络互连。因为本网络中的地址同样也可能被其它网络使用,如果进行网络互连,那么寻找路由时就会因为地址的不唯一而出现问题。但是这些使用保留地址的网络可以通过NAT通信设备将本网络内的保留地址翻译转换成公共地址的方式实现与外部网络的互连。
NAT要求整个服务的连接是从内网向外网主动发起的,而外网用户则无法直接(主动)向内网内网的服务发起连接请求,除非在NAT的(所有)网关上针对服务的端口作了端口映射。
a 克隆NAT(CloneNAT)
当在(私有IP,私有端口)与(公开IP.公开端口)已经建立了一个端口映射表后,克隆NAT将为随后从相同的私有地址和端口号发起的呼叫重复使用该映射,条件是只要使用映射(有时业叫绑定)的会话至少有一个继续保持激活状态。
根据克隆时受到的限制大小,又可以把克隆NAT分为以下三种:
(1)全克隆(Full Cone)
dynamic session (outer IP, outer Port)<----->(inner IP, inner Port)------>dynamic(rtu IP, rtu Port)
首先,把所有来自相同内部IP地址和端口的请求映射到相同的外部1P地址和端口。其次,任何一个外部主机通过把一个IP包发送给已得到映射的外部IP地址的方式,都能够把该包发送给该内部主机。
(2)限制性克隆(Restricted Cone)
dynamic session (outer IP, outer Port)<----->(inner IP, inner Port)------>dynamic(rtu IP, rtu Port)+ inner sended a packet to a RTU have rtu IP
把所有来自相同内部IP地址和端口号的请求映射到相同的外部IP地址和端口。与全克隆NAT方式不同,只有当内部主机以前曾经给IP地址为x的外部主机发送过一个包时,IP地址为x的该外部主机才能够把一个IP包发送给该内部主机。
(3)端口限制性克隆(Port Restricted Cone)
dynamic session (outer IP, outer Port)<----->(inner IP, inner Port)------>daynamic(rtu IP, rtu Port)+ inner sended to a RTU have rtu IP and rtu Port
端口限制性克隆与限制性克隆类似,只是限制中多了端口号。特别是,一个外部主机可以发送一个源IP地址和源端口号分别为(x,P)的IP包给内部主机,只有当内部主机以前曾经给IP地址为x,端口号为P的外部主机发送过一个包时,IP地址为X的该外部主机才能够把一个源端口号为P的IP包发送给该内部主机。
b对称式NAT(symmetric NAT)
dynamic session (outer IP, dynamic outer Port)<----->(inner IP, inner Port)------>daynamic(rtu IP, rtu Port) +inner sended a packet to a RTU have rtu IP
是指把所有来自相同内部IP地址和端口号,到特定目的1P地址和端口号的请求映射到相同的外部IP地址和端口。只有收到了一个IP包的外部主机才能够向该内部主机发送回一个UDP包。对称式的NAT不保证所有会话中的(私有地址,私有端口)和(公开IP,公开端口)之间绑定的一致性。相反,它为每个新的会话分配一个新的端口号。
( A1, P1) V +--------+ | Test | | I | +--------+ | | A:(outer IP, outer Port)==(inner IP, inner Port)? V V /\ /\ N / \ Y /A \ Y +--------+ UDP <-------/Resp\--------->/ IP \------------->| Test | Blocked \ ? / \Same/ | II | \ / \? / +--------+ \/ \/ | | N | | V V /\ +--------+ / \ N | Test | /Resp\---->symmetric UDP firewall | II | \ ? / +--------+ \ / | \/ (A2, P2) V |Y /\ V /\ | Symmetric N / \ +--------+ N / \ V NAT <--- / IP \<-----| Test |<--- /Resp\ Open \Same/ | I | \ ? / Internet \? / +--------+ \ / \/ \/ | |Y | | | V | Full | Cone V /\ +--------+ / \ Y | Test |------>/Resp\---->Restricted | III | \ ? / +--------+ \ / \/ |N | Port +------>Restricted
address/port combinations - (A1, P1), (A2, P1), (A1, P2), and (A2,
P2). (A1, P1) represent the primary address and port, and these are
the ones obtained through the client discovery procedures below.
Typically, P1 will be port 3478, the default STUN port. A2 and P2
are arbitrary. A2 and P2 are advertised by the server through the
CHANGED-ADDRESS attribute, as described below.
In test II, the client sends a
Binding Request with both the "change IP" and "change port" flags
from the CHANGE-REQUEST attribute set.that means rtu will response use different rtu ip and rtu port(A2,P2) from the (A1, P1) parse from received packet , at the same response packe will have
CHANGED-ADDRESS set, and this attribute's data will be (A2,P2)
In test III, the client sends
a Binding Request with only the "change port" flag set
In test I, the client sends a
STUN Binding Request to a server, without any flags set in the
CHANGE-REQUEST attribute, and without the RESPONSE-ADDRESS attribute.
This causes the server to send the response back to the address and
port that the request came from.
NAT类型检测
前提条件:有一个公网的Server并且绑定了两个公网IP(IP-1,IP-2)。这个Server做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。
第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就 不能P2P了(检测停止)。
当客户端能够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的 (LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检 测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)。
第二步:检测客户端NAT是否是Full Cone NAT?
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回 发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)。
第三步:检测客户端NAT是否是Symmetric NAT?
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
比 较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,需要进行端口预测打洞。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。
第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。