文章目录网络层IP地址划分两台主机通信前提如何获取目的主机的Mac地址ARP获取过程不在同一网络内疑问AWS VPC 中 ARP 问题导致连接失败解决办法IP数据报格式IP子网子网掩码计算规则路由器路由器是【网络层】的中间件NAT如何理解IP和以太网(MAC)的关系推荐书籍网络层IP地址划分IP地址是32位的IP地址组成 网络号:主机号网络划分A,B,C-单播地址D-多播地址E-保留使用根据上图可以计算出全部IP地址数2 32 2^{32}232A类地址全部IP数2 7 × 2 24 2 31 2^7 \times 2^{24} 2^{31}27×224231最后一个可指派的网络号 127,由于127.x.x.x是被保留的地址所以最大是能够被使用的最大网络号是126.怎么计算出来的127呢网络号的范围为0 0000000 到 0 1111111这样算出来的就是1270是上图中固定的网络号占用的字段下面的几类地址计算一样B类地址全部IP数2 14 × 2 16 2 30 2^{14} \times 2^{16} 2^{30}214×216230最后一个可指派的网络191.255C类地址全部IP数2 21 × 2 8 2 29 2^{21} \times 2^8 2^{29}221×28229最后一个可指派的网络是233.255.255IP表示法点分十进制法每个主机都会有一个IP地址路由器会存在两个或两个以上不同IP地址。因为路由器可能链接着多个不同的网络-即网络号是不同的则它会有多个IP地址。不同网络之间的通信必须依靠路由器进行转发两台主机通信前提很简单的一个场景客户端要和服务端进行网络通信。两端的主机都会有个IP实际场景中大多数都是客户端知道自己的IP客户端获取服务端的IP一般通过服务端的域名的DNS解析。两端的IP都来源于ISP-Internet Service Provider-互联网服务提供商(移动、联通、电信)。所谓的用户要连接到互联网上就需要IP用户需要从ISP申请IPISP会分配给用户一个IP。这个过程就是平时所说的家里接网客户端拿到服务端IP地址后会在某个应用内(应用层)发送信息,经过运输层到达网络层会把目的地IP和自己的IP放到IP数据报的头部。接着向下传递。到了数据链路层需要将IP数据报封装成Mac帧。而数据链路层通信首部重要的信息中有一个目的主机Mac地址。这个地址从哪来如何获取目的主机的Mac地址ARPARP-Address Resolution Protocol-地址解析协议IP数据报最终会传递到数据链路层加上帧头、帧尾后组装成Mac帧。继续传递。Mac帧头有个重要的目的主机Mac地址从哪里来当网络层向数据链路层传递时通过ARP协议解析获得目的IP的Mac地址以便放到Mac帧头部中每台主机都会有一个ARP Cache里面有着一张映射表IP-MAC地址映射表。获取过程主机A向主机B发送IP数据报时先在主机A自身的ARP Cache中的映射表查找看看有没有目的IP的Mac地址有的话则直接获得如果没有出现这种的情况一般是主机A刚刚加电-刚开机或者主机B刚刚入网-刚加入到局域网内。则主机A在该局域网内发送一个广播请求该局域网内所有主机都会收到该ARP请求。×× 这个 IP 地址是谁的请把你的 MAC 地址告诉我。”然后就会有人回答“这个 IP 地址是我的我的 MAC 地址是××××。引用自 网络是怎样连接的 2.5.5 章节如果不一致则不理睬。如果一致则进行回复回复自己的Mac地址、IP同时会把主机A的IP地址、Mac地址写到自己的ARP Cache中。请求肯定是以Mac帧的形式进行的。主机A收到回复同样将主机B的IP地址、Mac地址写入到ARP Cache中ARP Cache本身会有一个过期时间。会定期删除。所以即使主机B更换了网卡-网络适配器导致Mac地址改变的话那么过了ARP Cache的存储时间主机A如果还想要同主机B通信根据上面的步骤会重新获得新的主机B的Mac地址不在同一网络内ARP解决的是同一个局域网上IP-Mac地址的映射问题。如果不在同一个同一个网络则依靠路由器转发主机A发现要通信的IP主机B的IP和自己不在同一网段A中,则发送广播请求路由器的Mac地址路由器回复后。主机A将Mac帧的目的地地址设置为路由器的Mac地址。但是IP数据报中的IP地址还是主机B的IP切记。路由器在数据链路层接收到发送给自己的帧去除帧头、帧尾上交给数据链路层的上一层网络层。发现目的IP不是自己则路由器会在和上面一样判断是否在同一网段在的话则本本局域网内ARP请求。如果不在根据自身的路由表进行转发接着转发给其他路由器。循环往复直到最终找到主机B。循环过程要多次利用ARP协议。在不同的局域网内确定是转发还是寻找目的主机。路由器转发在转发路由器时数据链路层会把这个的Mac帧的目的Mac地址换成下一个路由器的MAC地址。循环疑问现实情况是主机A和主机B之间隔了很多复杂的网络每个网络中都有N个路由器。那么这些网络中的路由器是如何确定由哪个具体的路由器进行转发呢因为每个路由器都连着不同的网络而目的网络可能是隔了好几十层的路由转发才能找到的。了解 路由算法AWS VPC 中 ARP 问题导致连接失败我们生产环境原来一直有这种情况重新创建的服务器(IP不变)在第一次部署代码并启动JVM后连接Redis或Elasitcsearch时总是失败但是重启几次就好了。在重建之前销毁老的EC2实例默认会把其网卡也销毁。再重建新的EC2实例时会重建新的网卡但是新的网卡的IP还是指定为原来的IP问题就出在这里由于网卡重新创建了其MAC地址也改变了但是IP没变。由于IP-MAC 对应关系在AWS的Mapping Service 中还未刷新所以此时发往这些机器的包被判定为不合法/未知这些包直接被丢弃了所以在EC2应用服务器这一侧的体现为迟迟超时只有当IP-新的MAC地址关系刷新之后连接才会成功。Mapping Service负责对数据包的鉴权具体细节见AWS re:Invent 2015 | (NET403) Another Day, Another Billion Packets 这个视频里面说的Mapping Service是如何鉴权的Reddit 上 How does ARP works in AWS network的问答解决办法在销毁EC2实例时保留其网卡在重建EC2实例时根据IP找到老的网卡把这个老的网卡再设置到全新的EC2上面就可以了。因为网卡没变所以MAC地址不变所以请求到其他服务器的网络包可以正常到达。另外说明有的同学可能想到在新建的EC2实例中发起一次ARP广播即Gratuitous ARP让VPC内的其他所有服务器都更新一下本机ARP缓存表这个路子在AWS中行不通。AWS内部依赖于Mapping ServiceIP数据报格式IP数据报 头部 数据部分和Mac帧不同的是没有尾部。IP数据报头部(固定长度20字节) 版本(4位)-IPv4还是IPv6 首部长度(4位) 总长度(16位) 其他64位指的是下图中标识、生存时间这些 源地址(32位)目的地址(32位)源地址源主机IP目的地址 目的主机IPIP子网IP地址 网络号 子网号主机号当主机A通过路由器转发至网络141.14.72.24时这是24这个网络中可能存在多个子网因为IP数据报中只包含了目的地IP地址-141.14.72.24但是此时还不知道对于N个子网路由器到底应该交给哪个子网。可以通过子网掩码计算可得。子网掩码计算规则子网掩码4个字节前两个字节全是1第四个字节全是0.如下面这种格式…代表具体的子网地址将子网掩码的第三个字节和IP地址的第三个字节做 与 运算即可得出11111111 11111111 … 00000000不同的子网掩码是可以得出相同的网络地址的有了子网掩码之后路由器中路由表存储的结构则是目的网络地址子网掩码 下一跳路由器路由器是【网络层】的中间件路由器工作原理、以及路由表是如何构造的 可 Google路由器也是计算机的一种NATNAT-Network Address Translation-网络地址转换正常的路由转发路由器是不会修改IP数据报的源地址、目的地址。但是NAT会有关NAT更多可Google如何理解IP和以太网(MAC)的关系以太网在判断网络包目的地时和TCP/IP的方式不同因此必须采用相匹配的方式才能在以太网中将包发往目的地而MAC头部就是干这个用的以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术这种网络的本质其实就是一根网线IP 就像是信封上的地址以太网就像是送信的邮递员和路网线光纤。可以看出来以太网是实际干活的也就是上面的网线推荐阅读 网络是怎样连接的一书中 2.5.6 以太网的基本知识。一看这章开头的图就明白了推荐书籍网络是怎样连接的- 作者 户根勤 强烈推荐这本书这本书说的非常细致把网络连接中的各个组件讲的很细致了。