目录
数据链路层
介绍
以太网帧格式
目的地址
源地址
类型
CRC
数据
如何封装和解包
如何向上交付
MAC地址与IP地址
MTU
局域网数据转发
局域网数据碰撞
数据包转发
ARP协议
构建ARP请求
ARP请求的处理
ARP响应的构建
ARP欺骗
DNS域名解析
域名解析是什么
ICMP协议
NAT技术
代理服务器
正向代理
负载均衡 反向代理
数据链路层
介绍
数据链路层是在网络层的下面,而我们回顾一下其他层分别解决的问题: 1.应用层,解决应用问题 2.传输层,解决传输问题,保证可靠性等... 3.网络层,解决路径定位问题
我们已经把数据传输的可靠性解决了,还有就是可以找到目标主机了,但是在实际的路由中,我们并不是由IP层将数据发送出去的,而是IP还需要交付给数据链路层,为什么呢? 因为IP解决的是主机的定位我呢提,也就是路径选则的问题,那么在网络中,数据包实际上是从一跳到下一跳路由器走的,那么IP解决如何从这个路由器到下一个路由器了吗?并没有!
那么对于现在的网络而言,网络的种类可不是单单只有一种,目前使用最多的还是以太网,而令牌环和无线line也很多,所以对于底层数据传输而言,当IP交给数据链路层的时候,数据链路层因为底层的硬件不同,所以是需要不同的,而每一种网络的细节又是不同的,所以是需要一种协议来解决这个问题,而IP只解决了如何定位的问题,所以还有一种协议(数据连接层)来解决这个问题。
而实际上以太网就是涉及数据链路层和物理层的一种技术标准。
以太网帧格式
下面我们先看一下以太网的格式:
因为以太网用的很广泛,所以就使用以太网的帧格式来看。
目的地址
对于数据链路层而言,因为它需要从一跳主机到下一跳主机,那么我们怎么直到到哪一跳呢?我们前面只有目的IP的地址,但是中间的节点我们是一概不知的,那么我们怎么直到到下一跳路由器的地址呢?所以这里引入了一个MAC地址。 MAC地址是6字节,也就是48位,MAC地址是每一张网卡都自带的,而想要到下一跳主机就需要这个主机的MAC地址,那么IP地址可以吗?其实是可以的,但是这里并没有使用IP地址来充当数据链路层的地址,为什么? 首先是因为解耦的问题,如果使用IP的化,那么当网络层出现了问题是不是会将数据链路层牵扯进去,而且网络层是数据操作系统的,但是数据链路层是属于驱动的,所以更不好耦合在一起。
而目的地址就是目的主机的MAC地址。
源地址
源地址就是自己主机的MAC地址。
类型
类型的大小就是2位,其中里面代表了上层协议使用的是哪一个。 0800:表示IP协议 0806:表示ARP请求/响应 0835:表示RARP请求/响应
CRC
CRC是循环冗余校验,主要是用来校验数据传输后或者保存后可能出现的错误。
数据
对于数据而言,要看是什么类型,如果是0800,那么就表示IP协议,而IP协议是给另一台主机发送数据的,那么这个数据是不能超过1500字节的,而最小也不能西小于46,这就是为什么在IP层的时候是需要分片的。
数据类型还有ARP和RARP,所以如果类型不同的话,那么数据也是不同的。
上面就是数据链路层的帧格式,下面我们在学习数据链路层协议的时候,我们还是需要回答两个问题:
如何封装和解包
首先是如何封装和解包,我们看到以太网的帧格式是固定长度的,前面是目的地址和源地址,还有类型,其中地址是6字节类型是2字节,后面还有CRC校验是4字节,这一共是12字节,只需要去掉就可以解包。
如何向上交付
在TCP层向上交付因为TCP层的报头俩民有端口号,所以是可以向上交付的,而IP的报头里面也是有8位协议的,所以也是知道应该交付给哪一个协议的,那么数据链路层知道交付给上层哪一个协议吗?知道的! 以太网的帧格式里面有一个类型,类型里面就是需要交付给上层哪一个协议!
MAC地址与IP地址
上面我们谈到了MAC地址,那么MAC地址和我们之前的IP地址有什么区别吗?他们在网络通信的过程中分别工作在哪里?
首先看一下MAC地址:
MAC地址的长度是48比特,也就是6字节 MAC地址是用来识别数据链路层相连的节点的 MAC地址通常是唯一的,在网卡出场的时候就设置好了
MAC地址和IP的区别: MAC地址是48位,IPv4是32位 MAC地址一般是在数据链路层的,用来识别同一个网段中主机的不同,也就是从一跳到下一跳使用的就是MAC地址 而在实际的路由中,MAC地址是一直到变化的,因为每经过一个网段那么MAC地址就都会变化,所以源MAC和目的MAC地址都是一直到变化的,也就是我上一次从哪里来,下一次去哪里,但是IP地址的目的地址是不会变化的。
MAC和IP在网络中工作在哪里: 在网络通信中,MAC地址主要是用于从该网段到下一个网段的,也就是路由器到下一个网段的路由器,但是IP地址是一直指向目的主机的,IP地址是用来定位的,但是因为去目的主机需要经过很多节点,而MAC是用来去下一个节点的。
MTU
在我们学习IP协议的时候,我们就谈到了IP是可能会分片的,如果IP报文太大的话,那么这个大是由什么限定的呢?MTU( Maximum Transmission Unit )也就是最大传输单元。 而以太网的最大传输单元就是1500,如果小于46也是需要添加补充位的。
还有就是不同的数据链路层的MTU是不同的!
局域网数据转发
既然MAC是工作在局域网中的,我们掀桌子理解一下局域网里面转发数据包是怎么转发的。
现在有一个问题,同一个局域网中的两台主机可以直接通信吗?可以的! 因为在同一个局域网里面,他们的网络号都是相同的,而且在同一个局域网里面,数据转发是需要到网络里面的,类似与在同一个班级里面上课一样,现在老师在讲课,所有同学都是可以听到的,而在局域网中发送数据报也是相同的道理。
所以说现在在局域网中,只要由一台主机发送数据,那么所有主机是可以知道的,那么为什么其他主机不响应呢? 举个例子:现在老师在上课,来时让一个叫张三的同学回答问题,那么其他同学会起来吗?并不会,因为其他同学对比了一下自己的名字,自己不叫张三,所有其他的同学不起来,但是其他同学可以听到吗?是可以的!
局域网数据碰撞
现在有问题了,既然在同一个局域网中,一台主机发送数据其他主机也是可以接收到的,那么现在你在发送数据的时候,刚好有另一台主机也在发送数据呢? 那么这样会发生什么呢?这样就会发生局域网的数据碰撞,如果在局域网中数据发生了碰撞,那么这两个数据就都失效了,也就是数据都不能用了。 那么碰撞了要怎么办呢?如果在局域网中发生了数据碰撞,那么此时就需要启动数据碰撞避免算法,这个算法是让主机休息随机的时间,那么就大概率可以避免再一次碰撞,既然是碰撞了,那么也就是碰撞的主机是需要采用碰撞避免算法的,那么既然是碰撞了,那么加入我发送了数据,然后我的数据发生了碰撞,那么我知道自己的数据发生了碰撞吗?其实是知道的!前面说了,当一台主机在局域网中发送数据的时候,是每一台主机都可以收到这条信息的,那么我自己也是可以收到的,就像我在说话,我也是可以听到我说的话的。 所以当数据发生了碰撞,那么我自己也是知道的,所以碰撞了采用碰撞避免算法即可。
现在有问题了,那么在一个局域网中,主机越多越好,还是越少越好?每一次发送数据的大小越长越好,还是越短越好?
主机越多越好还是越少越好: 因为局域网中,同一时间内,只能有一台主机发送数据,那么如果现在有一台主机,那么这台主机就可以每时每刻都发送数据在这个局域网中,但是如果现在有一千台主机,那么此时就不能一直发送数据,否则就是一定会碰撞的。
发送的数据越长越好,还是越短越好: 因为发送的数据大小的原因,所以在局域网中逗留的时间也是不同的,如果一个很短的数据,发送只需要0.1秒,一个很长的数据发送需要0.3秒,那么一定是短的数据更不容易发生碰撞,所以发送数据越短越好!
数据包转发
那么我们既然知道在同一个局域网里面是可以转发数据的,那么我们可以将一个数据从这一个路由器转发到下一个路由器吗?也是可以的,所以我们就可以将一个数据包从一台主机转到另一台主机,这中间会经过很多的路由器。
那么当这个数据报到达了对端主机的网段的路由器里面,那么此时当这个数据包要转发给这个主机的时候,是需要先交给这个网段的路由器的,然后这个路由器对这个数据进行解包,然后看IP是谁,然后决定转发给谁,但是在转发前,还是需要封装的,也就是添加MAC帧格式报头,但是MAC帧格式的报头里面有一个字段是目标地址(目的的MAC地址),但是此时我们知道对方的MAC地址吗?我们只知道对方的IP,我们怎么知道对方的MAC呢?如果我们不知道的话,那么我们怎么将数据转发给对应的主机呢?这个就需要 arp 协议!
ARP协议
上面在数据转发的过程中,是需要下一跳的MAC地址的,但是我们只知道对方的IP地址,那么我们怎么将数据转发给对方的主机呢?
ARP协议就是处理这个问题的,ARP协议就是获取指定IP的MAC地址!
那么我们先看一下ARP协议的报头
-
硬件类型:硬件类型指的就是网络的类型,以太网为
-
协议类型:要转化的地址类型,0x0800就是IP
-
硬件地址长度:对于以太网来说就是6字节
-
协议地址长度:对于和IP地址就是4字节
-
OP:就是表示的是想要的操作,1表示请求,2表示响应
那么具体路由器是怎么获取到指定主机的MAC地址的呢?
现在主机A想要发送数据给主机B,此时数据已经到了路由器C,这时候,但是路由器不知道主机B的MAC地址,所以路由器想要获取主机B的MAC地址,那么怎么获取呢?我们下面演示一下!
构建ARP请求
首先路由器会构建一个ARP请求:
这样就构建了一个ARP请求,但是还需要对ARP请求进行向下交付,添加以太网报头。
这里先解释一下,首先是构建ARP请求:
1.第一个是硬件类型,硬件类型1就表示的是以太网,而我们使用的就是以太网,所以就是固定为1 2.第二个是协议类型,协议类型0800表示的就是IP协议,所以也是固定0800 3.第三个是硬件地址长度,硬件地址长度,表示的就是以太网,而以太网就是MAC地址,而MAC地址就是48位,6字节 4.第四个协议地址长度,协议就是IP协议IP长度就是32位4字节,所以也是固定的 5.OP表示的是什么操作,如果是ARP请求的话,那么就是1,如果是响应的话,那么就是2,而这里是请求,所以是1 6.源MAC地址,就是发送端的MAC地址,我们是知道的也就是路由器C 7.源IP地址,源IP地址我们也是知道的也就是路由器C也就是IPC 8.这个是目的MAC地址,因为我们不知道,所以我们填全F即可 9.最后一个是目的IP,我是一直知道目的IP的,因为目的IP是一直不变的。
那么当ARP请求构建好后,我们不能直接发送,我们还需要添加MAC报头:
以太网报头是比较简单的,也就是目的MAC,源MAC还有类型。 1.因为不知道目的MAC,所以就是全F,而全F在数据链路层发送,就表示的是广播! 2.源MAC就是我们自己,所以我们知道的 3.类型,我们前面说了,如果是IP那么就是0800,ARP就是0806,RARP就是0835,而这个是ARP所以就是0806
ARP请求的处理
那么现在响应已经构建好了,现在有一个问题,这个数据包在这个局域网中的其他主机会处理吗?(处理:将数据链路层的报头解包,然后...) 其他主机会处理,为什么?因为这个是发送到局域网中的,所以首先局域网中的其他主机是可以看到的,其次这个是广播,也就是全F,所以局域网中的主机并不知道是发送给谁的,所以局域网中的其他主机需要解包,然后根据解包后的发现这个类型是0806,也就是ARP请求,所以解包后,就将数据交给ARP协议,到了ARp协议里面后,ARP协议首先看OP字段是什么,发现是请求,然后判断目的IP与自己的IP对照,发现是或者不是,如果是的话,那么就构建ARP想要给指定的MAC的主机,如果不是,那么就丢弃。
ARP响应的构建
因为路由器知道自己网段的网络号,所以如果路由器发起ARP请求,目的主机一定是该网段的,而且路由器知道该主机的MAC地址,除非该主机把网线拔了....
否则该主机会构建一个ARP响应,那么下面看一下响应的构建:
ARP响应构建好后,还需要添加以太网的协议(数据链路层协议),所以下添加以太网协议:
构建好后,我们就可以将数据发送到对应的主机了,那么现在有问题了:
该子网中的其他主机会处理这个请求吗?不会!为什么? 因为这个数据链路层的协议是包含了目的主机的MAC地址的,所以我们不需要,当局域网中的主机收到这条数据的时候,对比了一下MAC地址,发现不是自己所以就直接丢弃了。
那么ARP请求的丢弃和ARP响应的丢弃一样吗?
不一样!ARP请求的丢失时发生在ARP层的,而ARP响应的丢弃时直接发生在数据链路层的!
那么这个响应发送给对应的主机后,对应的主机怎么处理呢? 当对应的主机收到后,先看MAC地址是不是自己,是自己,然后解包,发现是ARP协议,交付给ARP协议,然后看OP字段,发现是2,也就是响应,然后看IP地址,是否是自己,发现是自己,然后就可以将对应的数据添加数据链层协议,然后发送到对应的主机了!
那么ARP协议是每时每刻都在进行吗?路由器每次发送数据都需要进行ARP广播吗? 其实是不需要的,因为ARP响应后,主机会临时保存IP和对应的MAC地址,并且都是取新的IP和MAC地址的映射,因为IP在局域网中使用的是私有IP,所以当主机重新连接后,说不准IP就变化了,所以每次都采用新的IP和MAC的映射!
那么ARP广播只发生在最后一个路由器吗? 并不是ARP广播和响应可能随时随地进行,因为中间也会有路由器,所以也可能随时进行ARP广播!
ARP欺骗
下面我们说一下ARP欺骗,成为中间人!
因为ARP广播后,一直取的是新的IP和MAC的映射,所以,我们看下图:
这就是ARP欺骗,首先有两台主机在通信,主机A给主机B通信,此时两台主机是可以通信的,但是现在有一台主机C给A和B发送ARP,该B发送我是IPA,我们的MAC是MC,也就是自己的MAC地址,给A也发我是IPB我的MAC地址是MC也是自己的MAC地址,由于ARP是按照最新的MAC和IP的映射来,所以此时就发送数据都给HC主机发送,所以此时HC主机就成了中间人。
虽然HC主机成了中间人,但是数据是不能修改的,因为有数据签名,修改了也会被发现的。
DNS域名解析
域名解析是什么
我们在访问一个网站的时候,加入现在在访问百度 www.baidu.com 那么我们是不是这样访问呢?
但是我们从技术的角度而言,我们想要访问一台主机必须知道他的IP地址,那么上面的这一串字符是怎么知道IP地址的呢?其实这就是域名解析,也就是将字符与IP地址的一个映射。
实际上我们使用的还是IP地址,知识域名使用起来比较方便一些!
而域名也是有规律的:
-
www: 是一种习惯用法,即使我们不加也是可以的
-
baidu: 就是公司名称
-
.com:表示的是以营利为目的的商业公司,还有.org .edu等....
ICMP协议
ICMP协议是一个网络层的协议!
ICMP的功能:
-
测试IP包是否到达对方主机
-
如果IP报文丢包,丢包的原因
-
因为ICMP并不是传输层的协议,所以有人将ICMP归为网络层协议
-
ICMP是IPv4的。
那么ICMP实际用处是什么呢?
ping命令!实际上我们使用的ping命令就是基于ICMP的,ping命令ping的是域名,并不是url。
NAT技术
之前我们说了NAT技术后面会说,上次简单的说了一下NAT技术,下面我们详细说一下NAT技术!
现在当A主机想要访问服务器,假设现在A主机有一个请求,这个请求是一个短视频,那么此时如何做呢?
因为A主机的目标服务器是一个公有IP,所以是可以直接找到的,首先A主机的报文会转发给家用的路由器,然后家用路由器又会转发给运营商的路由器,最后转到公网里面,然后到了服务器手里。
此时服务器已经收到了对应的请求,那么现在服务器需要构建响应给客户端返回了,那么此时怎么返回呢? 由于客户端使用的是私有IP,而私有IP不仅仅只有一个,所以私有IP是由重复的,那么服务器可以知道转发给哪一台主机吗?如果仅仅是之前的做法,那么服务器并不知道应该转发给那一台主机,所以就需要NAT技术!
那么NAT技术是怎么做的呢? 首先当A发出请求的时候,会将这个请求转发给家用路由器(路由器是级联两个网络的),所以这个时候家用路由器就会帮你转发这个数据给运营商路由器,但是在转的时候,就将源IP替换为自己的IP,然后当运营商路由器帮忙转发这个请求的时候,又将这个请求的源IP替换为自己的IP,然后转发到公网,此时被服务器收到,而服务器收到后,服务器看起来就是这个请求时运营商服务器发起的请求,所以当服务器构建好响应后,服务器知道应该给谁响应吗?服务器是知道的,但是当这个数据转发到运营上服务器的时候,这个时候,就不知道给谁转了。
所以实际的数据包转发是这样的。首先A发起请求,然后转发给家用路由器,家用路由器转发给运营商路由器,在转的时候,不仅需要替换源IP们还需要将目的IP和客户端IP的放一起,然后将替换后的IP和目的IP放一起形成一个映射,因为这样才可以当数据回来的时候,知道应该转发给那一台主机。
所以这个时候,运营商服务器就知道应该转发给哪一个节点了,在后的节点也是同样做着这样的工作。
现在就是A和B主机同时向服务器发起请求,这里先说A: A将数据包准发给家用路由器,然后家用路由器形成映射,然后替换原IP加端口,替换为自己的WAN口IP加端口,然后转发给运营商,运营商路由器也做的是相同的事情,将家用路由器的请求先用自己的WAN口IP和端口号替换,然后和请求方的IP和端口形成映射,然后转发到公网,此时服务器就拿到了数据。
而B主机也是请求服务器,将自己的数据转发到家用路由器,然后家用路由器将源IP替换为自己的WAN口IP加自己的端口,然后形成映射,最后将数据转发出去,到了运营商服务器,但是如果此时运营商服务器将B主机发过来的请求最后也替换为自己的WAN口IP加端口,那么不是和A主机的请求重复了吗? 那么此时的映射也就重复了呀?那么现在怎能办呢?所以在必要的时候是会连端口号也替换的,这样就可以形成不同的映射,最后发送到公网中被服务器拿到。
当服务器拿到数据后,将响应返回,此时到了运营商路由器,此时运营商路由器进行映射表的查询,然后找到对应的路由器发送出去,这样就可以完成数据包的回去了,所以现在我们就解决了数据包如何回去的问题了。
所以在路由器形成映射的映射表,其实是四元组互为key值!
代理服务器
代理服务器就是帮我们请求转发的一个服务器!
代理服务器分为正向代理和反向代理下面我们画图理解一下!
正向代理
左边的是客户端,右边的是公司的机房(提供服务的机器),此时客户端访问的话,那么就是直接访问的。
但是如果此时你在学校,你使用的是你们学校的校园网,所以此时你就可能是需要将数据转发给你们学校的一台服务器商,然后这台服务器帮你们进行访问!
也就是这样,而你们学校的服务器帮你们访问的时候,然后此时服务器将数据又返回给你们学校的这个服务器上,然后你们学校的这个服务器又将数据返回给你们,此时这种就叫做代理服务器!
负载均衡 反向代理
因为访问的人比较多,而且服务的机器也是比较多,但是我们并不知道哪一台服务器会被多少个客户端访问,又没有可能一台服务器同时被很多人访问?其他的机器访问的人却比较少?是有的!
那么此时被一直访问的这台服务器是不是压力就比较大,随时可能挂掉,而且其他的服务器没有被访问,此时不就是浪费资源吗?是的!那么要怎么班呢?此时就需要负载均衡!
那么负载均衡是什么呢?
前面访问主机是很多客户端随机访问,所以可能会让主机的服务不均衡,所以此时就需要来一个主机,专门管理这个,让访问变的均衡。
此时可以让请求访问一台负载均衡的机器上,而这一台主机并不处理业务,知识负责数据的转发,而这些转发里面有轮询,或者随机,也有一些其他的算法,只是为了可以让服务被打散的到多台主机上。
这个也就是代理服务器,而这个就是反向代理!
那么代理服务器和NAT技术有什么区别呢? 关于NAT技术的话,它是工作在数据链路层的,而代理服务器是工作在应用层的没所以代理服务器和NAT技术虽然看起来比较像,但是他们使用的场景是不同的。