一 前言
最近有用户手机用流量无法登陆app,最终发现原因是ip被防火墙拉黑了,本来想去了解ip的分配机制,随着一个个知识点的了解,发现还是系统记录下来更能加深理解,特此记录。
二 知识点
1. 计算机网络协议: TCP/IP
以太网络上面的传输使用网络卡卡号为基准的 MAC 讯框,配合 CSMA/CD 的标准来传送讯框,这就是硬件部分。在软件部分,我们知道 Internet 其实就是 TCP/IP 这个通讯协议的通称,Internet 是由 InterNIC所统一管理的, 但其实他仅是负责分配 Internet 上面的 IP 以及提供相关的 TCP/IP 技术文件而已。
1.1 TCP
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),该过程如图所示。
不论是服务器端还是客户端,都必须要透过一次 SYN 与 ACK 来建立联机,所以总共会进行三次的交谈
封包发起时,在 TCP 的表头当中,必须要带有 SYN 的主动联机(SYN=1),并且记下发送出联机封包给服务器端的序号 (Sequence number = 10001) 。
当服务器接到这个封包,并且确定要接收这个封包后,就会开始制作一个同时带有 SYN=1, ACK=1 的封包, 其中那个 acknowledge 的号码是要给 client 端确认用的,所以该数字会比(A 步骤)里面的 Sequence 号码多一号 (ack = 10001+1 = 10002), 那我们服务器也必须要确认客户端确实可以接收我们的封包才行,所以也会发送出一个 Sequence (seq=20001) 给客户端,并且开始等待客户端给我们服务器端的回应喔
1.2 IP
目前IP有两个版本。 IPv4 (Internet Protocol version 4, 因特网协定第四版)和IPV6,目前运用最广泛的还是IPV4,所以下面讲的是IPV4。
我们知道 IP (Internet Protocol) 其实是一种网络封包,而这个封包的表头最重要的就是那个 32 位的来源与目标地址! 为了方便记忆,所以我们也称这个 32 bits 的数值为 IP 网络地址就是了。
IP 最小可以由 0.0.0.0 一直到 255.255.255.255 ,主要分为 Net_ID (网域号码)与 Host_ID (主机号码) 两部份。
11000000.10101000.00000000.11111111 192.168.0.255
|----------Net_ID---------|-host--|
第一组表示IP的等级,第四组为主机号码
在同一个网段内,Net_ID 是不变的,而 Host_ID 则是不可重复;Host_ID 在二进制的表示法当中,不可同时为 0 也不可同时为 1 ,因为全为 0 表示整个网段的地址 (Network IP),而全为 1 则表示为广播的地址 (Broadcast IP)。
在同一网域内,这些主机都可以透过 CSMA/CD 的功能直接在区网内用广播进行网络的联机。透过路由器 (router) 来进行沟通才能将两个网域连结在一起。
IP 的分级
以二进制说明 Network 第一个数字的定义:
Class A : 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> NetI_D 的开头是 0
|--net--|---------host------------|
Class B : 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> NetI_D 的开头是 10
|------net-------|------host------|
Class C : 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> NetI_D 的开头是 110
|-----------net-----------|-host--|
Class D : 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> NetI_D 的开头是 1110
Class E : 1111xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx ==> NetI_D 的开头是 1111
五种分级在十进制的表示:
Class A : 0.xx.xx.xx ~ 127.xx.xx.xx
Class B : 128.xx.xx.xx ~ 191.xx.xx.xx
Class C : 192.xx.xx.xx ~ 223.xx.xx.xx
Class D : 224.xx.xx.xx ~ 239.xx.xx.xx
Class E : 240.xx.xx.xx ~ 255.xx.xx.xx
在 IPv4 里面就只有两种 IP 的类别,分别是:
- Public IP : 公共 IP ,经由 INTERNIC 所统一规划的 IP,有这种 IP 才可以连上 Internet ;
- Private IP : 私有 IP 或保留 IP,不能直接连上 Internet 的 IP , 主要用于局域网络内的主机联机规划。
私有 IP 也分别在 A, B, C 三个 Class 当中各保留一段作为私有 IP 网段,那就是:
- Class A:10.0.0.0 - 10.255.255.255
- Class B:172.16.0.0 - 172.31.255.255
- Class C:192.168.0.0 - 192.168.255.255
Netmask (子网掩码)
用来达成子网的切分
如果我们以 192.168.0.0 ~ 192.168.0.255 这个网段来说,要是给予 Net_ID 是 26 位时,总共分为几段呢? 因为 26-24=2 ,所以总共用掉两个位,因此有 2 的 2 次方,得到 4 个网段。再将 256 个 IP 平均分配到 4 个网段去, 那我们就可以知道这四个网段分别是:
192.168.0.0~192.168.0.63
192.168.0.64~192.168.0.127
192.168.0.128~192.168.0.191
192.168.0.192~192.168.0.255
1.3 以太网络的传输协议:CSMA/CD
局域网络使用的设备-以太网络。
整个以太网络的重心就是以太网络卡。所以说,以太网络的传输主要就是网络卡对网络卡之间的数据传递而已。 每张以太网络卡出厂时,就会赋予一个独一无二的卡号,那就是所谓的 MAC (Media Access Control) 。
CSMA/CD 传送出去的MAC帧数据,其实就是 MAC !我们又简称网卡卡号为 MAC。
在发送端,数据链路层把网络层传下来得数据封装成帧,然后发送到链路上去;在接收端,数据链路层把收到的帧中的数据取出并交给网络层。不同的数据链路层协议对应着不同的帧,所以,帧有多种,比如PPP帧、MAC帧等,其具体格式也不尽相同。
上图中的目的地址与来源地址指的就是网卡卡号 (hardware address, 硬件地址).
硬件地址最小由 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF (16 进位法), 这 6 bytes 当中,前 3bytes 为厂商的代码,后 3bytes 则是该厂商自行设定的装置码了
2. ARP
地址解析协议(Address Resolution Protocol),其基本功能为透过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代
在发送数据包时,首先要通过目的IP(主机或路由器)获取局域网内要发送对象的MAC地址,再将MAC地址封装到数据包内发送。而ARP的作用就在通过IP获取MAC地址,通过广播来发送ARP请求报文。
假设主机A和B在同一个网段,主机A要向主机B发送信息,具体的地址解析过程如下:
(1) 主机A首先查看自己的ARP表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
(2) 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
(3) 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
(4) 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
3. NAT
NAT名字很准确,网络地址转换,就是替换IP报文头部的地址信息。NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。
一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由Internet发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有IP地址了。
- 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关
- 除静态NAT,网络访问只能先由私网侧发起,公网无法主动访问私网主机;
- NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
- NAT网关的存在对通信双方是保持透明的;
- NAT网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
- 静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
- 动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
- 端口多路复用(Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
- ALG(Application Level Gateway),即应用程序级网关技术:传统的NAT技术只对IP层和传输层头部进行转换处理,但是一些应用层协议,在协议数据报文中包含了地址信息。为了使得这些应用也能透明地完成NAT转换,NAT使用一种称作ALG的技术,它能对这些应用程序在通信时所包含的地址信息也进行相应的NAT转换。
4. 路由器
路由器根据收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址,并且重写链路层数据包头实现转发数据包。路由器通过动态维护路由表来反映当前的网络拓扑,并通过网络上其他路由器交换路由和链路信息来维护路由表。
路由器的主要工作就是为经过路由器的每个数据帧寻找一条最佳传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据――路由表(RoutingTable),供路由选择时使用。
路由工作包含两个基本的动作:
1. 确定最佳路径
为了帮助选路,路由算法初始化并维护包含路径信息的路由表,路径信息根据使用的路由算法不同而不同。路由算法根据许多信息来填充路由表。
分级路由广泛应用于互联网路由中,并且使用了多种路由协议。使用DV(距离向量)算法来查找节点间的最佳路由,在分级路由中,路由器被分成很多组,称为区域。每个路由器都只有自己所在区域路由器的信息,而没有其他区域路由器的信息。所以在其路由表中,路由器只需要存储其他每个区域的一条记录。再使用路由表转发最长匹配原则进行数据分发。
当路由器收到一个IP数据包时,会将数据包的目的IP地址与自己本地路由表中的表项进行bit by bit的逐位查找,直到找到匹配度最长的条目,这叫最长匹配原则。
关于路由查找的几个重点内容:
- 不同的前缀(网络号+掩码,缺一不可),在路由表中属于不同的路由
- 相同的前缀,通过不同的协议获取,先比AD,后比metric
- 这是一般情况,当然有二般情况,这就要看特定的环境和特定的路由协议了
- 默认采用最长匹配原则,匹配,则转发;无匹配,则找默认路由,默认路由都没有,则丢弃
- 路由器的行为是逐跳的,到目标网络的沿路径每个路由器都必须有关于目的地的路由
- 数据是双向的,考虑流量的时候,要关注流量的往返
2. 通过网络传输信息
多数情况下,某主机决定向另一个主机发送数据,通过某些方法(如ARP)获得路由器的地址后,源主机发送指向该路由器的物理(MAC)地址的数据包,其协议地址是指向目的主机的。
路由器查看了数据包的目的协议地址后,确定是否知道如何转发该包,如果路由器不知道如何转发,通常就将之丢弃。如果路由器知道如何转发,就把目的物理地址变成下一跳的物理地址并向之发送。下一跳可能就是最终的目的主机,如果不是,通常为另一个路由器,它将执行同样的步骤。当分组在网络中流动时,它的物理地址在改变,但其协议地址始终不变。
工作原理
路由器是第三层网络设备,这样说大家可能都不理解,就先说一下集线器和交换机吧。集线器工作在第一层(即物理层),它没有智能处理能力,对它来说,数据只是电流而已,当一个端口的电流传到集线器中时,它只是简单地将电流传送到其他端口,至于其他端口连接的计算机接收不接收这些数据,它就不管了。交换机工作在第二层(即数据链路层),它要比集线器智能一些,对它来说,网络上的数据就是MAC地址的集合,它能分辨出帧中的源MAC地址和目的MAC地址,因此可以在任意两个端口间建立联系,但是交换机并不懂得IP地址,它只知道MAC地址。路由器工作在第三层(即网络层),它比交换机还要“聪明”一些,它能理解数据中的IP地址,如果它接收到一个数据包,就检查其中的IP地址,如果目标地址是本地网络的就不理会,如果是其他网络的,就将数据包转发出本地网络。
NAT与路由器
上面介绍路由的转发,是说只替换MAC地址来进行转发,但IP却不会改变,这种转发在Internet内传播是没有问题的,因为IP都是公共IP。
但如果路由器是连接这局域网和外部网络,这是IP就不能通用了,必须经过NAT转换成外部网络IP。我们日常家用的路由器都是NAT模式,先进行NAT(如地址转换、端口转换等),再根据路由表进行转发。
三 一条信息的网络请求过程
如果看完联网上面介绍的知识点,对于这个标题其实就已经有了大概的答案了。重点还是在路由器上,由它执行数据发送。
- 源主机在发起通信之前,将自己的IP与目标主机的IP进行比较,如果两者位于同一网段(用子网掩码计算后具有相同的网络号),那么源主机直接向目的主机发送ARP请求,在接收到目的主机的ARP应答后获取对方MAC地址,然后用对方的MAC地址作为目标MAC地址进行报文发送,位于同一VLAN(网段)的主机互访时属于这种情况,这是互联的交换机做二层转发。
- 当源主机判断目的主机与自己位于不同网段时,它会通过网关来提交报文,即发送ARP请求来获取网关IP地址对应的MAC,在得到网关的ARP应答后,用网关MAC作为报文目的MAC进行报文发送……也就是路由器的某个端口。注意,报文的源IP是源主机IP,目的IP依然是目的主机IP。
- 当网关路由器接收到以太网数据帧时,发现数据帧中的目标MAC地址是自己的某一个端口的物理地址,这时路由器会把以太网数据帧的封装去掉。路由器认为这个IP数据包是要通过自己进行转发,如果路由器转发IP在同一个网络,接着它就在匹配路由表(包含目标地址和指向目标地址的指针)。匹配到路由项后,它就将包发往下一条地址。路由器转发数据包也是这样,它始终是不会改IP地址的,只会改源/目标MAC。
- 如果目的地址经路由表对比,发现转发IP不是在本网中,有nat就将改变源地址的IP(原源地址的Ip地址改为了路由器的IP地址),路由器将数据包转发到相应的端口,进行通信。
- 万一路由遇到目的MAC是广播地址怎么办?IP的广播有三种:
255.255.255.255叫本地广播,也叫直播,direct broadcast,不跨路由器。
172.16.33.255叫子网广播,广播给172.16.33.0这个子网,可以跨路由器。
172.16.255.255叫全子网广播,广播给172.16.0.0这个主网,可以跨路由器。
路由器是三层设备,可以隔离广播,但并不是所有广播都隔离。事实上只有本地广播路由器才不转发,对于子网广播和全子网广播,路由器是转发的。为什么呢?我们来看255.255.255.255的广播,在MAC的封装中,对应的目的MAC是广播,而子网广播和全子网广播,对应的目的MAC是单播,所以路由器会转发。所以路由器隔离的广播是目的MAC为全1的广播,对于目的MAC是单播的上层广播,路由器是不能隔离的。 - IP数据包经由路由转发的时候 源/目的IP,源/目的MAC是否发生改变,如何改变?
A—–(B1-B2)—–(C1-C2)——E
如上拓扑图为例,B1和B2是路由器B上的两个接口,C1和C2是路由器C上的两个接口,A和E是PC,由主机A向主机E发送数据包,那么在主机A形成的数据包的目的IP就是E的IP,源IP就是主机A的IP地址,目标MAC地址就是B1的MAC地址,源MAC地址就是A的MAC地址。
由A发给路由器B,B经过重封装后,源IP和目标IP是不变的,源MAC地址变成B2的MAC地址,目标MAC地址变成C1的MAC地址,封装完成发送给路由器C,路由器C接收到数据包后和B做的操作是一样的,源IP和目标IP的不变的,源MAC地址变成C2的MAC地址,目标MAC地址变成主机E的MAC地址,然后发送给主机E,这样E就收到了这个数据包,当恢复数据包的时候就是把收到的数据包的源IP地址(主机A的IP地址)和源MAC地址(接口C2的MAC地址)作为他的目标IP和目标MAC地址。