关于钉钉在外网故障情况下仍然能发送消息的思考

简介

前段时间公司外网发生故障,外网无法访问,但是钉钉发送消息却不受影响,却仍然可以收发,当时感觉不可思议,结合最近学习的网络知识,这里做一下分析和总结

必要知识
公有地址和私有地址

如果我们运行ipconfig查看本机的ip地址我们会发现ip地址大多数都是已192.168.x.x开头的,但是如果我们去百度查找我们的ip地址却和我们ipconfig查找的ip地址不一样,这时因为公网使用的公有地址,而内网使用的是私有地址,为什么地址分为公有地址和私有地址?原因是ip的资源是有限的,但是通讯的时候每个主机都必须存在全球唯一的ip地址,不然就无法将消息发送到指定的主机,但是现在计算机那么多,如果全部都分配一个公有地址明显ip资源是不够用的,所以ip协议中将ip分为4种类型分别为A,B,C三种类型,每一种类型对应着不同的网段,且规划中这四种类型的IP中哪些段是公有地址,哪些段是私有地址,在局域网中私有地址使用NAT技术公用一个公有ip地址从而实现对外通信(这就是为什么我们使用ipconfig查看到的地址多是以192.168.X.X开头的原因,其使用C类型的ip类型),而各种类型的ip又用子网掩码来来告诉计算机ip的网络分段,且如果我们向路由器发出私有段的ip地址,则路由器不会进行转发,以下是知乎搜索的关于公有地址和私有地址的信息

IPv4地址分为A、B、C、D、E五类,出去特殊作用的D、E两类,剩下的A、B、C三类地址是我们常见的IP地址段。A类地址的容量最大,可以容纳16777214个主机,B类地址可以容纳65534个主机,C类地址可以容纳254个主机。在这三类地址中,绝大多数的IP地址都是公有地址,需要向国际互联网信息中心申请注册。但是在IPv4地址协议中预留了3个IP地址段,作为私有地址,供组织机构内部使用。这三个地址段分别位于A、B、C三类地址内:A类地址:10.0.0.0--10.255.255.255B类地址:172.16.0.0--172.31.255.255 C类地址:192.168.0.0--192.168.255.255所以局域网在选取使用私有地址时,一般会按照实际需要容纳的主机数来选择私有地址段。常见的局域网由于容量小,一般选择C类的192.168.0.0作为地址段使用,一些大型企业就需要使用B类甚至A类地址段作为内部网络的地址段。最后需要补充说明的是,由于NAT和子网掩码的存在,实际在使用中,一个C类大小的局域网也可以选择A类的10.0.0.0网段作为自己的IP地址段。大多数局域网之所以仍然选择192.168.0.0/24或者192.168.1.0/24作为自己的IP地址段,更多的是因为约定成俗或者说网管个人习惯的关系。
IP和MAC地址

IP是位于七层结构中的网络层,而MAC位于七层中的第二层数据链路层,其都是为了解决计算机通讯问题而设计的,其都是计算机通讯中的唯一标识(如果不唯一就无法通讯,实际情况下IP有可能会重复如使用了NAT技术),通常在局域网中公司使用的是交换机,由于一般的交换机是两层交换机(数据链路层),所以在内网中计算机通讯实际只使用到了MAC地址就可完成通讯,但是数据在不同链路中或者不同网段中通讯(如互联网和局域网)则需要使用到路由器进行通讯,而路由器位于七层中的第三层网络层,路由器将第二层传入的信息封装成以IP协议的包分发给互联网,由IP地址进行寻址来找到通讯的主机,那么为什么MAC和IP都能进行通讯,为什么还要划分出这两个概念呢?因为IP是有层级关系的如(192.168.1.1),在路由表中可以向查看192.X.X.X的主机在哪个路由中从而走对应的接口发送数据,这样更方便数据在网络中找到对应的主机,而MAC地址没有这种层级关系,因此在互联网中不适用MAC进行寻址.

网络通信中的三张表

这三张表分别为

  • 路由表

  • MAC地址表

  • ARP缓存表

  • 路由表存在于路由器中,路由器中存在一张表,里面存在每个IP端的路由关系,数据到达路由器时根据IP协议中头部的IP信息来对照路由表中信息进行路由寻址

  • MAC地址表存在于交换器中,交换机中每一个端口都会记录着端口和所连接的MAC地址的映射关系表,数据经由交换机进行发送时,会将上一层的数据(网络层,如果存在的话),转成数据链路层,解析出发送数据和接受数据的MAC地址信息,再参照MAC地址表发送给对应的端口,这里还设计到交换机自学的过程,有兴趣的可以自行百度

  • ARP缓存表 其存在于主机,我们知道了对方的ip地址但是我们如何拿到对方的MAC地址?(这里也许大家会有疑问为什么我知道了IP地址还要获取MAC地址,因为在网络七层模型中数据传输是由逐下往上的,举个例子,我们使用netty构建一个IM服务器,在消息的传输中我们首先会定义消息传输的协议,这个协议作用在应用层,比如我规定发送的数据以逗号分隔,那么我在服务端netty中就需要定义一个handler,这个handler的作用就是获取网络中传输的消息,然后获取逗号,如果数据中有逗号则读取数据,并将数据发送给下一个handler,如果没有则等待数据发送完全,这里的逗号分隔就可以认为是我们自己在应用层定义的协议,接下来我们要将数据进行传输就要对数据进行序列化,我们可能采用json的方式对数据进行序列化传输,那么我们在发送消息时就要将上一部我们定义的逗号分隔的数据进行json序列化后进行传输,而这一部位于表示层,同理数据下一步再交给底层去处理,直到数据变成可在传输层传输的信号将数据发送出去),那么同理在数据接收端我们也要逐层往上转化,将传输的0,1信号转化成我们应用层定义的逗号分隔的数据格式进行展示。,那么同理MAC是在数据链路层,IP是在网络层,数据要进行传输必须逐级往上或者往下传输 ,所以我们需要将IP转成MAC地址或者将MAC转成IP地址才能进行网络传输)答案是ARP协议,其实简单来说就是往IP主机发送一个消息,对应IP地址的返回MAC地址信息即可,

  • 有关这三张表的解释
    https://blog.51cto.com/dengqi/1223132

钉钉在无外面下仍然可以使用的原因

有了以上的基础知识,我这边做一个猜想,钉钉首先在聊天时会获取会话人的IP地址,后续直接使用这个ip地址发送消息,如果发送IP地址不成功或者接收端账号信息不匹配会去服务器拉取接收端的最新登录IP,那么在无外网的情况下由于之前会话就已经获得了接受端的IP,那么发送的消息直接会经由此IP发送出去,而消息经过路由器时,发现此IP已经存在于路由表中(因为公司使用的是内网,接收端和发送端都是同一个IP,就不会把消息发送到外网进行路由),从而使用NAT技术将数据分发给对应的交换机端口,来接受数据,以上是本人猜想,如有错误欢迎拍砖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值