在ip层的知识中,有几个遗留问题没有解答,这些问题有助于我们理解整个网络体系。问题1.1 如何理解子网内主机可以直接通信,1.2数据链路层如何解决子网通信的问题。2.1 分片的好处,2.2为什么要分片。问题3 私有ip如何通信 - nat技术。
一 数据链路层
数据链路层就是由两个协议构成,分别是arp和mac。为什么要有数据链路层,因为ip只是划分出子网,但是不提供子网内转发的能力。
但是数据链路层属于底层驱动,不属于os,因为底层网络是有差异的,有些是以太网,有些是令牌环网,这些都是由不同设备支持的,导致底层驱动不一样,数据链路层也不一样,不能做在os中,总不能让操作系统都实现对各个设备的驱动程序,太冗余了。
1 主机标识符
数据链路层会将ip报文进行封装,报头保存了主机标识符,这个标识符就是mac地址。一张网卡配有一个mac地址,各个主机都有了私有ip,基站直接广播ip报文,各个主机不是也能区分这个报文是不是自己的吗,为什么要多封装一层,用mac地址呢? 哪怕我们学了tcp,ip也无法解释,这是历史原因,是先有的mac地址。
那个时候大家都是各自搭建局域网,各自设计mac地址来标识主机,导致各个局域网的mac地址重复,局域网之间无法直接通信。有了ip后,先对全世界进行划分子网,提高路由查找效率,而且公网ip具有唯一性,也能标识唯一一台主机,这个是在ip层博客中提及过的。
不是每个主机都是用公网ip(ip地址不足),而是划分到一定层级就开始用私网ip,比如市往下的主机都用私有ip,这个城市内也会划分成各个小子网,也就是说此时的私网ip还可以用来划分子网,方便路由,最后到了某个子网内,此时基站一个无线广播,该子网内的主机都能收到,广播的时候会表明是给哪个主机的,也就是报文携带了mac地址,主机识别到发现不是自己的就丢弃,此时就复用了mac地址来标识主机用于子网通信,如果直接抛弃了,网络厂商要做出的改动较大。mac地址也做了统一,使得mac地址是几乎不重复的,这样就使得在小子网内mac地址重复概率大大降低了。
还有个问题,为什么划分到某个区域就不再往下划分子网了? 碰撞域会提及。
2 mac协议
mac协议是局域网通信协议,具体有以太网,令牌环网,本次讲的是以太网。
解包封装则简单多了,报头就几个字节,这两个就是目的mac和源mac地址,类型字段,为什么还有这么多类型,上一层不就是ip吗,不是的,上层还有arp协议,后面提及,mac帧报文收到后不一定是给ip协议的。1 目的mac地址哪来的,2 是目标主机的吗,3 为什么要有源mac地址呢,
源mac地址用于应答,数据链路层也有应答,当路由器a将报文发给下一跳路由器b后,b会根据这个mac报文填写目的mac和源mac,然后发个应答回来,路由器a一对比发现这个是b发给自己的应答,就知道报文收到了,否则会重传,这个重传不是tcp重传,tcp重传是从源头重新发,这个是中间某个地方丢了,中间节点进行重传,不会立刻进行tcp重传,节省资源。
1,2问题后面会再提及,至少在arp协议会解释。接下来先说说对网络的理解,进一步理解mac地址/mac协议在子网通信的作用。
3 网络的本质
先从家庭这个很小的子网开始,每个子网都有路由器管理,然后我们转发的报文就由路由器帮忙转发,路由器一般都有一根网线,都把网线链接到基站,就都可以发数据给基站,基站通过无线电广播,会让该范围内所有主机都收到,但一般只有目标主机会向上交付,这个基站覆盖范围就可以看成一个子网,这个子网内的主机已经能互相通信了。
此时再来几个基站,基站都在互相的无线电波覆盖范围,甚至还拿网线链接,此时基站之间又构建了一个子网,我们只是将基站相连,却等同于把每个基站链接的主机联系到了一起,相当于各个主机又处于一个大子网了。此时这个大子网内实现通信理解: 基站之间是相连的,假如主机ab分别被基站ab管理,这两主机要通信,主机a可以把报文给基站a,基站a再给基站b,再给主机b。
假如这个大子网是广东省子网,如何链接其它省的子网,给这个大子网安排一个入口路由器,广东省的入口路由器和其它省级别入口路由器链接又形成一个子网,此时一个国家级别的网络就搭建好了。
为什么是两个子网间链接都是用路由器/基站来链接,而不是主机之间链接,因为成本,一个子网内有n个主机,要和另一个子网的n个主机链接,此时链接资源可是以n^2来计算的,因为每台主机都要链接另一个子网的所有主机,而有了路由器,由路由器连接子网内的主机,链接资源为n,两个路由器连接,表示两个子网建立了链接,总资源不过也就是2*n。网络的本质就是子网链接形成的,而子网链接依靠路由器连接。
在构建网络的过程中,我们发现我们本质是路由器之间建立链接,让它们形成一个个子网,不同级别的路由器构建的子网大小不一样,小子网,路由器离得近,大子网,各路由器离得远,离得近一个基站就能覆盖,离得远,那就中途建立一个个的基站(设置好路由表),不断广播又或者用网线直接送达。一个主机发消息,子网内所有主机都能收到,因为已经有人建立了彼此的链接,这就是我对问题1的理解。
上图就是网络构建从下到上的理解基础,路由器连接主机,路由器还和其它路由器连接。
4 数据碰撞
从先前网络本质中所说得出,每个主机发的报文子网内的其它主机都收到了,只有目标主机识别出这是给自己的,向上交付,其它的主机一般都是直接丢弃。当然也可以对主机做设置,将网卡设为混杂模式,不对目的mac做识别,对报文来者不拒。
既然是子网内主机都会收到,那两台主机都发消息,这个数据之间会互相干扰碰撞吗,如果大家都是共用一根网线的,那数据本质就是光电信号,肯定会被干扰的,如果是无线,大家频率相同,也会干扰。这就叫数据碰撞,为了避免数据碰撞,主机会去看看子网内有没有报文,又像是监听,检测后发现子网内有人发数据,主机随机休眠一定时间后发送,这样碰撞的主机大概率醒来时间会不一样,而且其它主机也可以乘机发送。
所以如果我们想让局域网瘫痪,就一直发数据碰撞,这样其它主机就会一直休眠,发不了数据,那我们的主机不会休眠吗,不会,我们让os绕过碰撞检测,不进行休眠。这个混杂模式是不是不应该被设置和这个绕过碰撞检测让自己不休眠,这些都是预留的测试接口,测试网卡是否能收数据和发数据。
子网内一台主机发数据,其它主机都收到,这一点放在小子网倒还好理解,一个基站发个无线电广播,一定范围内的主机都收到了,如果有其它的基站也在发会有数据碰撞的问题,可是更上层的子网呢,假如国家和国家之间的根路由器构成的子网,此时难道也是广播吗? 显然越到大子网,主机数越少,距离越远,那我们可以用网线建立主机间的链接啊,此时就不一定是广播了,可能是点对点直接通过网线发送了,但是如果大家共有一个网线,那还是会碰撞的。
5 碰撞域
一个子网内主机越来越多,碰撞概率就会增加,如何解决? 我们此时要对一个子网再做划分,这个划分就叫划分碰撞域。
那如何划分碰撞域?对于有线连接就是多开几条通信路,减少碰撞,可是如果是无线通信呢,通过调整频率。接下来通过一些问题加深对mac地址的理解。
问题1 如何知道目标主机的mac帧地址。诶,这个问题是怎么来的呢,
如果报文是从主机a到主机b的,中间经历多个路由器转发,mac帧中的源和目标ip地址多次变更,我们的ip报文是如何知道下一个路由器的mac地址的?
这个就和在ip层提及的路由相关了,路由就是根据ip,和子网掩码按位与获取网络号,再看自己链接的路由器有没有管理这个子网的,有就把目标mac地址换成它,它继续路由找目标mac地址,此时mac协议中的源mac字段也变成这个路由器了,所以mac报文在转发的时候报头字段会变的 !
此时我们对网络转发有了更深刻的理解,我们拿到对方的ip后,封装好报文后,此时要填目标mac地址,发现不是自己链接的子网,不是就会默认转发给上一级的路由器,那此时目标mac地址就是上一级路由器,如果是自己链接的子网,那就填管理那个子网路由器的mac地址。
但是有一点是,报文如果到了路由器d,路由表中没有保存目标主机的mac地址,此时我们还是只有目标主机的ip地址,我们没有mac地址,这个时候怎么填mac地址呢,这个时候就和arp协议相关了,arp协议会告诉我们如何将ip转为mac地址。由于路由器也会维护自己管理的子网内主机的mac地址,当一个子网内主机增多,不仅仅是划分碰撞域,还要划分子网,虽然此时查找已经不是问题了,一个基站广播一下就能找到主机了,但是路由器能维护的主机mac地址是有限的,也要划分子网,让更多的路由器来维护主机的mac地址。
6 arp协议
核心作用,将ip地址转mac地址。协议关系如下,arp和mac协议都是属于数据链路层的协议,不过一般ip层是直接给mac层的,不用先给arp协议。
如果到了路由器d,路由器d可能没管理到主机a的mac地址,也就无法通过路由获得mac地址,此时我们在要封装mac报文就会暂停,先封装arp报文给mac协议,获取到mac地址后才用ip报文封装。注:数据链路层会保存目标ip和目标mac的映射关系,也就是路由表,用ip报文中的目标主机ip就知道自己是否保存了对应的mac地址,这就是路由。
首先我们目前是只知道目标主机的ip,却不知道它的mac地址,此时已经在一个子网内,我们主机直接往网络中发送数据,说我想和ip为某某的主机通信,这叫arp请求,对应ip的主机收到处理后把自己的mac帧地址传过来,这就叫arp响应。由于是先有的mac协议,然后有的ip,最后才有的arp,所以当arp诞生时,数据链路层主要是处理mac帧,所以arp报文要封装mac帧,不然所有的网络驱动都要大改,使得能识别出arp报文,同理,ip报文也要封装mac报文,不能直接发个ip报文给目标主机。
问题1 可是我们怎么知道对方ip呢,这就来自先前的ip报文。
arp报头字段学习
arp请求时目标以太网选fff,表示不是给特定主机的,这样子网内的主机收到后都会处理。帧类型: 表明有效载荷是ip还是arp报文,用于收mac报文后判断移交给arp还是ip协议。这两个字段是mac协议字段。下面是arp字段介绍。
硬件类型: 表示子网类型,1表示以太网,为什么要区分子网类型,因为不同的子网,它的mac地址格式,长度是不同的,诶,为什么ip层没有考虑这个子网类型呢? 因为ip层就不需要解析mac地址,(当前的mac协议说的是以太网通信协议,局域网通信协议统称mac协议),但是arp需要,它需要能解析所有子网类型的mac地址。
协议类型: 明确网络层协议类型,方便解析和填写ip地址字段。
为什么还要写长度? 为了增加拓展性,如果协议地址变更,对arp解析是没有影响的,arp只根据长度来读取并解析ip地址,所以报文中协议地址长度要填写正确。
为什么要有op选项
因为子网的不同,所以还要来对硬件地址长度做记录,由于arp同时还要解析ip地址,所以同样要知道ip地址长度和类型。最后就是op字段,1表示arp请求,2表示arp应答。如果是请求mac地址,就发个响应arp,不是就获取源mac地址和源ip地址,保存对应的映射关系,构建mac - ip缓存。
arp报文中为何要再次填写四个地址?
目的ip用于目标主机a查看是否是给自己的,a发送响应的时候,就要用发送mac地址字段来填写自己的目的mac,路由器d收到响应后从发送端mac地址获取目标mac地址,发送方主机a的ip也一起发送过来,用于路由器d建立路由缓存。目的mac地址是用于发送响应时增加准确性,双重保证报文是给路由器d。
7 总结
1 先前解释了子网如何形成网络,那为什么要分割成子网,为了提高查找效率,所以要分成一个个子网,这些子网都有自己的标识符,网络号。
2 如何提高效率,路由器管理整个子网内的主机,就是说能给整个子网内的主机发消息,路由器不仅可以给自己的子网发消息,还能发给其它子网,因为和其它子网的路由器相连了。所以有一天路由器要转发一个ip报文,用ip路由推出网络号,发现这个网络号代表的网络是和自己相连的某个路由器管理的,然后也保存了这个路由器的mac地址,所以直接封装mac报文,然后通过网络链接就转发给他了。
3 什么时候就要划分子网,我们在arp协议中曾提及,路由器是要管理子网内的主机,要维护一些主机的mac地址,所以当主机维护不过来的时候,就要划分子网。
4 数据链路层如何解决的子网通信问题,因为所有的主机都是在某个子网被路由器管理,就像每个人都在每个村里被管理,路由器拿着目的ip一直路由查下一跳路由器的mac地址,封装mac报文广播给下一跳路由器,找到对应主机所在的子网,arp获得目标主机mac地址,再次广播,该主机就收到了。有时候不在路由器管理的子网内,那就会默认转发到上一级,就像是在自己这个村找不到目标主机,那就去填镇政府的mac地址,去镇上的户籍表查,再去市里,省里,一定能找到管理目标主机的省,然后再具体到市里,最后找到目标主机。
5 为什么要分片
数据帧报文是越长发送时间越长,这样和其它主机碰撞概率越大,一旦发数据的时候我们发生碰撞要整个报文重新补发,因为此时对方收到了碰撞数据,这个碰撞数据是有误的,无法和先前收的数据做切割,只能重新补发,所以数据链路层不能发太大的数据。这就是mtu的由来,所以影响了上层的分片,还有mss。不过有了mtu,mss也就确定了,mtu在每个子网是不一样的,和网络设备有关系。
二 nat和代理服务器
1 nat简介
这个部分要解释最后一个问题,什么是nat技术。在ip层中曾说过,在某一层子网往下的主机全是私有ip,这就导致,两个主机的ip都有可能是重复的私有ip,如何通信。
既然我们的报文是在一个个路由器中传出去的,最后传给了目标主机,这点在网络的本质中是显而易见的,首先知道是路由器帮我们替换的。
如下图,有三个客户端,ip地址分别是10.0.0.10,10.0.0.11,10.0.0.12,我们先假设它们拿到的目的ip是一个公网ip,当这三个客户端主机发的报文交给路由器后,ip报文中的源ip字段就被路由器用wan口ip替换了。问题是报文中这个wan口地址如何转回来,路由器显然肯定会记录相应的映射表。
路由器的wan口ip又是什么呢,和路由器自己的ip有什么关系呢,首先路由器肯定身处多个子网,此时路由器和局域网内主机通信用的ip叫lan口ip,还要和其它子网的路由器集连成子网,此时又有一个ip,这个ip叫wan口ip。定义上来看lan口ip叫本地局域网ip,wan口ip叫广域网,我简单理解就是,属于路由器附近主机构建的子网的ip叫lan口ip,如果是要和外部网络(外部网络的代表者不就是路由器吗)相连的子网,就叫wan口。
源主机如果拿到目标主机的私网ip是无法进行通信的,当我们在云服务器上开发一个服务端,我们可以用访问云服务器的ip访问到这个服务端,我的云服务器ip是43开头的,显然是公网ip,源主机拿着公网ip可以访问到云服务器,而上图中目标主机ip也是公网ip,因为路由器不断路由,总有一级路由器能识别公网ip。但是到了目标主机,此时的源ip就不再是源主机的ip了,而是早就被替换成路由器的wan口ip,而且这个替换还不止发生了一次。
替换时机:在局域网边界路由器就要发生替换,边界是局域网和广域网的边界,我们把同级路由器看成局域网,和更高级的路由器相连看成广域网,那其实也就是要转发到上一级路由器时发生替换。所以最后目标主机拿到的源ip就是某一级路由器的wan口ip。
如果是拿着目标主机的私有ip,我们能不能和他通信呢,不能,实际上我们都是借助第三方实现的通信,例如qq微信,我们下载这些软件就拿到了他们的服务器ip,这个ip肯定是公网ip,然后我们将报文给了服务器,服务器帮我们转发。
2 napt转换表
我们先不管右边表填什么,反正知道是通过查左表,拿右表对应行来替换,那在一个子网内会有多个主机,一个主机会有多个进程来发ip报文,区分它们的ip报文就只能是用ip+端口。
当我们报文要回来,此时ip要替换成原来的,此时就要在右边查表,拿左边行替换,右边也是ip+端口,但是右边大家的ip都是路由器的wan口ip,端口是原来的吗?不是,万一不同主机发的ip报文端口号重复,那在右边不就重复了,所以端口号必须是重新替换(这说明这个路由器至少要工作到传输层),且作为标识符和左边一一对应。这样报文回来就根据端口号来找到左表中原来的ip和端口号。
目的ip和端口也要维护? 不是已经可以转换了吗。原因: 保护内网环境,不让别人随便转发进内网。只有响应报文的源ip和端口是先前的目的主机,才能穿透到内网,如果没有这个源ip和端口,任意主机获取到映射关系都能发送过来,这就使得我们的内网环境容易被外界干扰。
nat技术缺陷: 表的生成和销毁需要额外开销; nat外部无法向内部主动建立链接。
3 代理服务器
正向代理
有时候我们链接校园网或者公司的网络,我们都要先进行认证,认证通过后才能上网,那我们的报文是如何到外网的? 就是手机发出无线电波,被学校网络设备捕捉,发现这个报文是自己学生发的,就转交给服务器,然后做解析转发。
服务器作用: 客户端1如果访问了某个视频资源,代理服务器可以对该资源做缓存,客户端2请求时可以不访问外网,由代理服务器转发,可以提高响应速度和用户体验。甚至还可以过滤请求,防止学生访问不健康的网站。
反向代理
服务端也需要搞一个代理服务器,因为有时候请求过多,流量过大,一台服务器处理不过来,我们就需要多台,多台合起来称为集群。域名解析返回的就是这个代理服务器的ip,这样我们的请求就都到了代理服务器,这个代理服务器就会将所有请求打散到集群的各个机器上,这策略就是负载均衡。
这个代理服务器会不会扛不住呢? 我们可以再做一套负载均衡,在域名解析的时候,让一个域名映射多个ip,随机返回ip,至于域名解析的服务器会不会扛不住,这个倒不用企业担心,因为我们只要拿到服务端的ip后,之后就是和服务端的通信了,和域名服务器就一次。
翻墙原理
1 先有一台可以访问外网的服务器,我们的手机正常无法访问外网的,有些企业要向运营商申请才能使得服务器能访问外网。手机要安装一些劫持软件,这个软件会先将我们对外网的网络请求加密,然后重新封装,包装成对合法服务器的请求。此时运营商没有对数据进行解密,就将我们的请求放过去了。服务器收到后就去访问外网,重新将响应重新加密封装。这就是一种正向代理。运营商如果发现这个ip的加密数据过多,就会将其封禁。