目录
数据链路层是在网络层的下面,而我们回顾一下其他层分别解决的问题: 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是循环冗余校验,主要是用来校验数据传输后或者保存后可能出现的错误。
对于数据而言,要看是什么类型,如果是0800,那么就表示IP协议,而IP协议是给另一台主机发送数据的,那么这个数据是不能超过1500字节的,而最小也不能西小于46,这就是为什么在IP层的时候是需要分片的。
数据类型还有ARP和RARP,所以如果类型不同的话,那么数据也是不同的。
上面就是数据链路层的帧格式,下面我们在学习数据链路层协议的时候,我们还是需要回答两个问题:
首先是如何封装和解包,我们看到以太网的帧格式是固定长度的,前面是目的地址和源地址,还有类型,其中地址是6字节类型是2字节,后面还有CRC校验是4字节,这一共是12字节,只需要去掉就可以解包。
在TCP层向上交付因为TCP层的报头俩民有端口号,所以是可以向上交付的,而IP的报头里面也是有8位协议的,所以也是知道应该交付给哪一个协议的,那么数据链路层知道交付给上层哪一个协议吗?知道的! 以太网的帧格式里面有一个类型,类型里面就是需要交付给上层哪一个协议!
上面我们谈到了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是用来去下一个节点的。
在我们学习IP协议的时候,我们就谈到了IP是可能会分片的,如果IP报文太大的话,那么这个大是由什么限定的呢?MTU( Maximum Transmission Unit )也就是最大传输单元。 而以太网的最大传输单元就是1500,如果小于46也是需要添加补充位的。
还有就是不同的数据链路层的MTU是不同的!
既然MAC是工作在局域网中的,我们掀桌子理解一下局域网里面转发数据包是怎么转发的。
现在有一个问题,同一个局域网中的两台主机可以直接通信吗?可以的! 因为在同一个局域网里面,他们的网络号都是相同的,而且在同一个局域网里面,数据转发是需要到网络里面的,类似与在同一个班级里面上课一样,现在老师在讲课,所有同学都是可以听到的,而在局域网中发送数据报也是相同的道理。
所以说现在在局域网中,只要由一台主机发送数据,那么所有主机是可以知道的,那么为什么其他主机不响应呢? 举个例子:现在老师在上课,来时让一个叫张三的同学回答问题,那么其他同学会起来吗?并不会,因为其他同学对比了一下自己的名字,自己不叫张三,所有其他的同学不起来,但是其他同学可以听到吗?是可以的!
现在有问题了,既然在同一个局域网中,一台主机发送数据其他主机也是可以接收到的,那么现在你在发送数据的时候,刚好有另一台主机也在发送数据呢? 那么这样会发生什么呢?这样就会发生局域网的数据碰撞,如果在局域网中数据发生了碰撞,那么这两个数据就都失效了,也就是数据都不能用了。 那么碰撞了要怎么办呢?如果在局域网中发生了数据碰撞,那么此时就需要启动数据碰撞避免算法,这个算法是让主机休息随机的时间,那么就大概率可以避免再一次碰撞,既然是碰撞了,那么也就是碰撞的主机是需要采用碰撞避免算法的,那么既然是碰撞了,那么加入我发送了数据,然后我的数据发生了碰撞,那么我知道自己的数据发生了碰撞吗?其实是知道的!前面说了,当一台主机在局域网中发送数据的时候,是每一台主机都可以收到这条信息的,那么我自己也是可以收到的,就像我在说话,我也是可以听到我说的话的。 所以当数据发生了碰撞,那么我自己也是知道的,所以碰撞了采用碰撞避免算法即可。
现在有问题了,那么在一个局域网中,主机越多越好,还是越少越好?每一次发送数据的大小越长越好,还是越短越好?
主机越多越好还是越少越好: 因为局域网中,同一时间内,只能有一台主机发送数据,那么如果现在有一台主机,那么这台主机就可以每时每刻都发送数据在这个局域网中,但是如果现在有一千台主机,那么此时就不能一直发送数据,否则就是一定会碰撞的。
发送的数据越长越好,还是越短越好: 因为发送的数据大小的原因,所以在局域网中逗留的时间也是不同的,如果一个很短的数据,发送只需要0.1秒,一个很长的数据发送需要0.3秒,那么一定是短的数据更不容易发生碰撞,所以发送数据越短越好!
那么我们既然知道在同一个局域网里面是可以转发数据的,那么我们可以将一个数据从这一个路由器转发到下一个路由器吗?也是可以的,所以我们就可以将一个数据包从一台主机转到另一台主机,这中间会经过很多的路由器。
那么当这个数据报到达了对端主机的网段的路由器里面,那么此时当这个数据包要转发给这个主机的时候,是需要先交给这个网段的路由器的,然后这个路由器对这个数据进行解包,然后看IP是谁,然后决定转发给谁,但是在转发前,还是需要封装的,也就是添加MAC帧格式报头,但是MAC帧格式的报头里面有一个字段是目标地址(目的的MAC地址),但是此时我们知道对方的MAC地址吗?我们只知道对方的IP,我们怎么知道对方的MAC呢?如果我们不知道的话,那么我们怎么将数据转发给对应的主机呢?这个就需要 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请求:
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
那么现在响应已经构建好了,现在有一个问题,这个数据包在这个局域网中的其他主机会处理吗?(处理:将数据链路层的报头解包,然后...) 其他主机会处理,为什么?因为这个是发送到局域网中的,所以首先局域网中的其他主机是可以看到的,其次这个是广播,也就是全F,所以局域网中的主机并不知道是发送给谁的,所以局域网中的其他主机需要解包,然后根据解包后的发现这个类型是0806,也就是ARP请求,所以解包后,就将数据交给ARP协议,到了ARp协议里面后,ARP协议首先看OP字段是什么,发现是请求,然后判断目的IP与自己的IP对照,发现是或者不是,如果是的话,那么就构建ARP想要给指定的MAC的主机,如果不是,那么就丢弃。
因为路由器知道自己网段的网络号,所以如果路由器发起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广播后,一直取的是新的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主机成了中间人,但是数据是不能修改的,因为有数据签名,修改了也会被发现的。
我们在访问一个网站的时候,加入现在在访问百度 www.baidu.com 那么我们是不是这样访问呢?
但是我们从技术的角度而言,我们想要访问一台主机必须知道他的IP地址,那么上面的这一串字符是怎么知道IP地址的呢?其实这就是域名解析,也就是将字符与IP地址的一个映射。
实际上我们使用的还是IP地址,知识域名使用起来比较方便一些!
而域名也是有规律的:
www: 是一种习惯用法,即使我们不加也是可以的
baidu: 就是公司名称
.com:表示的是以营利为目的的商业公司,还有.org .edu等....
ICMP协议是一个网络层的协议!
ICMP的功能:
测试IP包是否到达对方主机
如果IP报文丢包,丢包的原因
因为ICMP并不是传输层的协议,所以有人将ICMP归为网络层协议
ICMP是IPv4的。
那么ICMP实际用处是什么呢?
ping命令!实际上我们使用的ping命令就是基于ICMP的,ping命令ping的是域名,并不是url。
之前我们说了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技术虽然看起来比较像,但是他们使用的场景是不同的。