计算机网络(十一) —— 数据链路层

目录

一,关于数据链路层

二,以太网协议

[2.1 局域网](#2.1 局域网)

[2.2 Mac地址](#2.2 Mac地址)

[2.3 Mac帧报头](#2.3 Mac帧报头)

[2.4 MTU](#2.4 MTU)

三,ARP协议

[3.1 ARP是什么](#3.1 ARP是什么)

[3.2 ARP原理](#3.2 ARP原理)

[3.3 ARP报头](#3.3 ARP报头)

[3.4 模拟ARP过程](#3.4 模拟ARP过程)

[3.5 ARP周边问题](#3.5 ARP周边问题)

四,NAT技术

[4.1 NAT技术背景](#4.1 NAT技术背景)

[4.2 NAT转换过程](#4.2 NAT转换过程)

[4.3 NAPT](#4.3 NAPT)

[4.4 NAT技术缺陷](#4.4 NAT技术缺陷)

五,代理服务器

[5.1 正向代理](#5.1 正向代理)

[5.2 反向代理](#5.2 反向代理)

[5.3 正反向代理的区别](#5.3 正反向代理的区别)

[5.4 NAT和代理服务器的区别](#5.4 NAT和代理服务器的区别)

一,关于数据链路层

  • 做任何事情都是先有决策,后有执行,所以肯定是在网络层中先决策,是应该把报文转发到和我处于同一网段的其它主机还是交给下一跳,决策之后再把报文往下交付给路由器
  • IP协议解决的是:将数据跨网络从A主机送到B主机,但是在此之前,要解决的是把数据先发送到路由器中
  • 数据链路层解决的是:直接相连的主机之间,进行数据交付的问题,这个直接相连的主机不仅仅是电脑手机等,也包括路由器,路由器也是一个主机,它收到其它路由器发来的报文,可以继续转给其它路由器,也可以直接转给我构建的子网当中的某个主机,数据链路层就是解决路由器把报文发给它内网某个主机的问题
  1. 网络层IP协议解决数据跨网络发送
  2. 传输层Tcp/Udp协议保证数据发送的可靠性
  3. 数据链路层层解决数据在同一局域网中两台主机的通信问题

二,以太网协议

2.1 局域网

目前常用的局域网有三种:

  • 以太网:一种计算机局域网通信技术,是目前应用最广泛的局域网技术
  • 令牌环网:常用于IBM系统中,这种网络中有一种专门的帧被称为"令牌",在环路上持续地传输来确定一个节点何时可以发送包,有点类似于锁
  • 无线LAN/WAN:是无线局域网地补充和扩展,现在已经是计算机网络地重要组成部分,一般用于大型的网络布局

在网络基础博客中,提到了以太网通信:计算机网络(一) ------ 网络基础入门_计算机网络基础教程-CSDN博客

其实这就是以太网通信的原理, 并且"以太网"不是一种具体的网络,是一种技术标准,包含数据链路层内容,也有一些物理层的内容,比如以太网规定了网络拓扑结构,访问控制方式,传输速率调整等

数据碰撞:

  • 我在发消息的时候,别人也在发消息,双方都发消息,接收方可能就无法分清哪个是哪个了,同时h1和h2也都能收到双方的消息,这就是数据碰撞
  • 所以局域网中,主机越多,发生碰撞的概率越大
  • 所以当主机识别到数据碰撞发生,都会进行"碰撞避免算法",双方要等一等,在不同时间进行数据包重发,可以尽可能的让局域网当中的数据消散
  • 最后的结果就是,保证整个局域网中只有一个报文在传输

2.2 Mac地址

每台主即都有一张或多张网卡,每个网卡代表一个IP地址,同时网卡也有自己的Mac地址:

Mac地址的作用:在同一个局域网中区分主机,就和在广域网中用IP标识每个主机唯一性一样

Mac地址 VS IP地址:

我们曾经讲过旅游的例子:计算机网络(一) ------ 网络基础入门_计算机网络基础教程-CSDN博客

因此在路由过程中,源IP和目的IP是不会变化的, 但是数据每进行一次跳转后,源Mac地址和目的Mac地址都会被路由器替换掉

2.3 Mac帧报头

Mac帧也可以称为以太网帧,它的格式如下:

  • 源地址和目的地址就是网卡的Mac地址,48位长度,在网卡出厂时就确定好了
  • 帧协议类型有三种:IP协议,ARP协议和RARP协议,就是上面图中下面三个短的
  • 帧末尾是CRC校验码,负责以太网协议的差错处理

接下来还是两个老问题:

1,如何将报头和有效载荷分离

  • Mac采用的是定长报头,所以只要根据定长数字提取固定长度的帧头和帧尾,就可以完成报头和有效载荷的分离

2,如何将有效载荷交给上层的哪一个协议?

  • 报头字段中有一个"类型"字段,为0800时,就是IP报文;为0806时,就是ARP报文;为8035时,就是RARP报文,如上图
    如何看待局域网:

  • 系统角度:被所有主机共享,由于有碰撞检查和碰撞避免,可以把局域网看成多台主机共享的临界资源,而多台主机相当于多线程,碰撞避免算法相当于锁。

  • 路由器也是主机,也有网络协议栈,由网络层决策好之后把报文发给数据链路层面然后再做最后的Mac帧封装,然后发到下一个路由器

  • 下一个路由器的数据链路层最先收到报文,然后进行分离Mac报头,发现是IP数据,就交给网络层,然后发现不是我这个路由器,于是直接再次决策,再次往下交付给数据链路层,然后封装新的Mac再发给其它的路由器,这样一直这样搞,直到找到目录路由器

  • 结论:Mac只在局域网中有效,因为报文在各个主机跳转时,会重新解包封装Mac帧,上层接触不到

2.4 MTU

MTU(Maximum Transmission Unit),最大传输单元,标识底层的一个数据帧一次最多可以发送的数据量,使用ifconfig可以查看mtu:

  • 以太网对应的MTU一般是1500字节,不同的网络类型MTU不同,如果一次发送的数据超过了MTU,IP层就要进行 分片,这个我们上篇文章已经讲过了
  • 此外以太网规定Mac帧中数据的最小长度是46字节(帧的最小长度是64字节,帧包括帧头帧尾和数据三部分哦),如果发送的数据量小于46字节,则需要在数据后面填补充位,比如ARP数据包的长度就是不够46字节的
  • 前面查到的mtu为1500不是Mac帧的最大大小,而是Mac有效载荷的最大大小,倒逼网络层进行分片;但是一般情况下不建议分片,因为会增加丢包率,所以要减少分片也就倒逼Tcp不要传长数据:
  • 网络层一个报文最多只能给数据链路层1500字节,1500减去IP协议报头的20个字节=1480,所以网络层要求Tcp只能给我最大1480字节的报文
  • 而Tcp是有自己的发送缓冲区的,在缓冲区中拿出特定数据,添加Tcp报头(20个字节),之后1480 - 20 = 1460,这个1460就是Tcp报头的有效载荷最大量,而这个1460的最大数据量叫做:"MSS",在数据链路层叫做MTU,在传输层叫做MSS
  • 通信双方三次握手时也会协商MSS,选取双方MSS小的那个作为双方通信的MSS(MSS最大是1460,不是一定是1460)

三,ARP协议

3.1 ARP是什么

  • 所谓的数据发送,就是通过无数个连续的子网实现的
  • 到了目标子网之后,进入内网转发,路由器收到了报文,交给网络层拿着报文的目的IP查自己的IP表,之后就再次向下重新封装路由器自己的Mac帧
  • 但是路由器只知道主机B的IP地址,那么路由器重新封装Mac帧时,就要封装主机B的Mac地址,但是路由器咋知道主机B的Mac地址的呢?

所以在局域网中还要有一种协议:ARP协议,它的作用就是要在局域网中获取目标IP主机的Mac地址

在TCP/IP四层协议中,数据链路层最典型的就是Mac帧协议,但是数据链路层还有两种协议叫做ARP和RARP协议:

  • ARP,RARP和Mac帧协议虽然都属于数据链路层协议,但是ARP和RARP协议属于Mac的上层协议
  • 也就是说,Mac帧的上层协议不一定就直接是网络层的协议,Mac帧的上层协议有可能属于数据链路层的协议,如上图
  • 与之类似的,网络层中的ICMP协议和IGMP协议虽然和IP协议都属于网络层,但是也属于IP的上层协议

3.2 ARP原理

假设在用一个局域网中,主机1要给主机2发数据:

  • 首先主机1只知道主机2的IP,不知道主机2的Mac,那么首先会以广播(目的地址全1,16进制全F)的形式在以太网中发送一个ARP请求包,内容是"我是主机1,我的IP是IP1,我的Mac是Mac1,我要找一台主机IP2,我不知道主机2的Mac2,你们谁是主机2,发Mac2发我"
  • 然后每个主机收到了IP,但是大多数都在底层丢弃了,只有主机2识别到了,然后把自己的Mac2再发送回去

3.3 ARP报头

ARP报文的数据格式如下:

其中前面的以太网目的地址和源地址再加上帧类型就是Mac帧,中间的有效载荷就是ARP协议,简单来说就是ARP请求报文进行了再封装成了Mac帧

  • 硬件类型指链路层的网络类型,如果为1,表示以太网
  • 协议类型就是要转换的地址类型,固定写法为0x0800,表示要把IP地址转化为Mac地址
  • 硬件地址长度就是对应的以太网地址长度,6字节,因为Mac地址是48位的
  • 协议地址长度对于IP地址为4字节,因为IP地址是32位的
  • op字段表示ARP请求类型,为1时表示这是一个ARP请求,为2时表示这是一个ARP应答

从ARP数据格式也可以看出,ARP是Mac帧的上层协议,ARP数据格式中的前三个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,所以ARP报文被再次封装成Mac帧的时候还需要填上18自己的填充字段

3.4 模拟ARP过程

  • 先构建ARP请求,然后往下交付,填充Mac帧报头,以太网地址目的地址和源地址和帧类型,但是我们不知道对方的Mac地址,于是全部用F填充,最后就形成了广播Mac帧,然后发到局域网里
  • 然后每台主机都能收到广播Mac帧,都要进行处理,先做Mac帧级别的报头和有效载荷分离,发现目的Mac全是F,然后每台主机都要受理,识别到帧类型是0806(ARP请求/应答类型),于是把有效载荷也就是ARP报文发给自己的ARP软件层
  • ①任何一台主机都可以发起ARP请求,然后收到ARP应答 ②同时,每台主机也会收到来自其它主机的ARP请求,然后给对方发送ARP应答。所以ARP软件层会收到ARP报文,但是它咋知道这是ARP请求还是应答呢?所以要先看一个字段:"op"
  • 首先ARP软件层读取op的值,op为1表示请求,为2表示应答
  • 当op为1时,将报文的目的IP与自己的IP进行对比,发现不一样,于是直接丢弃;当目标主机收到后,不丢弃,填充我自己的Mac地址,然后给对方ARP应答
  • 应答时,再次构建ARP报文,op填为2,其它的固定填法,其它的目的Mac和目的IP填上和ARP请求的源IP和源Mac,然后构建好ARP应答报文,然后继续向下交付,构建Mac帧
  • 构建Mac帧时,将目的Mac填上主机1的,但是源Mac就填充我的了,然后再次发到局域网中,主机1收到了,然后就可以读取Mac帧的源Mac获取到主机2的Mac地址了。这时候每台主机也会收到主机2的ARP应答,但是其它主机直接在Mac帧的时候就直接丢弃了,因为这时候的目的Mac和源Mac都已经确定了

结论:所以每台主机最开始收到ARP报文时不管是应答还是请求,最先看的是op,然后再做后续操作

ARP请求完毕之后,主机1会把主机2的Mac地址和IP地址临时缓存起来:

上面所有的步骤目的就一个,就是让主机1得到主机2的Mac2地址,然后才是把我们收到的Mac地址封装,把主机1的数据封装成Mac帧,发给主机2

3.5 ARP周边问题

  • ARP不必每次都做,只在缓存失效的时候才做
  • 一个主机可以通过他自己的IP和子网掩码,得到它的网络号,由于局域网中前面3个字段是一样的,于是该主机就自己可以拼接IP地址,ping所有的主机,得到所有主机的IP和Mac(因为ARP请求和应答不仅仅是路由器和主机可以做,按道理来说,任意两个主机之间都可以做)
  • ARP还有一个特点:如果一个主机收到多次同样的ARP应答,会以最新的为准
  • 假设三个主机,首先主机1收到了主机2的IP2和Mac2并刷新到缓冲区里,但是此时主机3直接往主机1发送大量ARP应答,那么主机1会以最新的ARP报文为准,然后就将缓冲区的Mac2冲刷成了Mac3了(主机1以为Mac2发生变化了),在这之后主机1发送的以太网报文会直接推送给主机3了,但是主机3选择丢弃,这样就完成了一次"让主机1断网"的操作,这种网络攻击方式叫做"ARP欺骗",当然主机3也可以转发给主机2,使主机3变为"中间人"

补充:关于ICMP协议

ICMP是一个网络层协议, 一个搭建好的网络,往往需要先进行简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠性传输,如果丢包,IP协议不能通知传输层是否丢包以及丢包原因

所以ICMP的功能是:

  • 确认IP包是否成功到达目标地址
  • 通知在发送过程中IP包被丢弃的原因
  • ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议
  • ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6

面试题避坑:面试官可能会问你:telnet是23端口,ssh是22端口,那么ping是什么端口?这个是一个圈套,因为ICMP工作在网络层,而端口是传输层的内容,所以ping命令没有端口号一说

traceroute命令也是基于ICMP实现的,作用是遍历数据包传送到目标主机所经过的所有路由器:

四,NAT技术

4.1 NAT技术背景

NAT(Network Address Translation)网络地址转换技术,主要是用来环节IP地址不足的手段之一:

  • NAT能够将私有IP对外通信时转为全局IP,也就是就是一种将私有IP和全局IP相互转化的技术方法
  • 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP
  • 全局IP要求唯一,但是私有IP不需要,在不同的局域网中出现相同的私有IP是完全不影响的

4.2 NAT转换过程

假设一个局域网中有A,B,C三台主机,公网中有一台服务器,以这三台主机访问这台服务器为例,下面是数据包在传输过程中,IP地址转换的简易图:

数据从主机A到服务器:

  • 刚开始,该数据包当中的源IP地址就是主机A的私有IP地址,目的IP地址就是服务器的公网IP地址
  • 当数据包经过NAT服务器时,路由器会将该数据包的源IP地址替换成自己的WAN口IP地址,此时该数据包的源IP和目的IP就都是目的IP了,而这个时候,就可以看成是"路由器在申请访问服务器"
  • 该数据包在互联网中经过各种路由转发,最终到达服务器主机,服务器处理完后,对主机A进行响应

数据从服务器到主机A:

  • 刚开始,数据报文中,源IP地址就是服务器的公网IP,目的IP就是路由器的WAN口IP
  • 当数据到达主机A所在局域网的NAT路由器时,路由器会将该数据包的目的IP地址替换成主机A的私有IP地址
  • 然后通过ARP协议得到主机A的Mac地址,最终,响应报文就成功交到了主机A手里

4.3 NAPT

问题:以上面的转换过程为例,NAT服务器是如何直到要把响应数据交给局域网的哪一个主机的呢?

解答:

  • 在NAT路由器内部,有一张自动生成的,用于地址转换的表
  • 该转换表维护的就是局域网中主机的私有IP,与其对应访问的外网中某个公网IP之间的映射关系
  • 局域网中的主句第一次向外网发起数据请求时,就会在表中生成对应的映射关系,就是KV
  • 这个转换表的名字就叫做NAPT(Network Address Port Translation)网络地址端口转换

这个转换表会存储维护局域网主句私有IP与其对应访问的公网IP的映射关系,此外NAT路由器还会加上一个端口号,与主机A的端口做区分,这样,路由器就能通过IP + Port 的方式,来区分发给局域网中不同主机的数据包

如上图,通过IP+Port的方式,就能保证左到右的随机性,也能保证从右到左的随机性

4.4 NAT技术缺陷

NAT技术进行私有IP和公网IP之间的转换,主要就是依赖于NAT路由器中维护的NAPT表,但是这张表也体现出了NAT技术的一些缺陷:

  • 无法从外部向NAT内部的服务器建立通信,因为外部无法知道内部的私有IP,无法主动与内部主机连接
  • 转换表的生成,销毁和添加删除都需要额外开销
  • 通信过程中一旦NAT设备有异常,及时存在热备,所有的TCP连接都会断开(过度依赖NAT路由器)

五,代理服务器

5.1 正向代理

  • 我们在学校想要上网,肯定是要先登录校园网的,我们所有的请求要先认证,才能允许我上网
  • 那么认证是在干嘛呢?认证的时候就是在申请局域网私有IP,然后学校的服务器替我们去连接外网,相当于路由器,目的是收费,并且组建校园网和管理局域网
  • 学校的这个服务器(也是Linux)就是代理服务器,而且像这种"替客户端申请"的,称为"正向代理"

正向代理是一个位于客户端和目标服务器之间的服务器,客户端不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端

正向代理好处

  • 加速资源访问,因为一般代理服务器的配置是比较高的
  • 虽然国内不允许直接访问外网,但是有些代理服务器是允许访问外网的一些资源的,能够满足一些特殊群体的需要

5.2 反向代理

  • 假设一个公司有4台服务器,全部开放IP让用户访问,但是可能主机1有100个连接,但是其它三个只有个位数,就导致了类似资源分配不平衡的问题
  • 所有就来了一个算力更高的服务器,这个服务器不处理业务,只负责任务的派发 ,让每一台服务器都能充分使用,这个服务器也是代理服务器,这种方式称为"反向代理",替服务器代理的,有点类似于线程池,在后端中负责负载均衡

反向代理也是位于客户端和目标服务器之间的服务器,对于客户端来说,反向代理服务器相当于目标服务器,用户只要访问反向代理服务器就可以获得目标服务器提供的服务

反向代理好处

  • 对后端起负载均衡的作用,比如百度的官网,面对国内如此庞大的用户量,一台服务器肯定是不够用的,所以需要很多台服务器,构建成分布式系统,但是我们仍然可以快速通过www.baidu.com网址访问,这就是反向代理服务器的功劳
  • 能够对其内部的服务器起到安全防护作用,因为可以避免直接将内部服务器的对应的信息暴露出去,而当非法连接过来时,反向代理服务器相当于一层屏障,让非法请求直接过滤掉,保护了内部服务器安全

5.3 正反向代理的区别

相同点:

  • 两者都是位于客户端和服务器之间
  • 两者的主要功能,都是进行请求和响应的转发,并不直接提供服务

不同点:

二者代理的目的不一样

  • 正向代理是客户端的代理,目的是帮助客户端访问其无法访问的其它服务器资源
  • 反向代理是服务器的带俩,目的是帮助服务器做负载均衡,安全防护等工作

二者的架设方不一样

  • 正向代理一般是客户端架设的,比如校园网的正向代理服务器是学校作为客户端架设的
  • 而反向代理一般是服务端架设的。比如百度的反向代理服务器是百度这个大厂作为服务端架设的

正向代理中,服务器不知道真正的客户端的具体信息;在反向代理中,客户端不知道真正的服务器是谁

5.4 NAT和代理服务器的区别

NAT和代理服务器都是代替我们向服务器发起数据请求的,也代替我们接收来自服务器的响应,但是它们由几个区别:

  • 从应用上:NAT主要缓解IP地址不足的问题,而代理服务器更注重具体应用,比如游戏加速器,或者翻墙服务器,但是国内翻墙是weifa的哦
  • 从底层实现上:NAT工作在网络层,直接对IP地址进行替换,而代理服务器往往工作在应用层,所谓的代理服务器,其实也是在操作系统上运行的一个特殊进程
  • 从 使用范围上:NAT一般部署在局域网出口路由器的位置,而代理服务器可以在局域网代理,也可以在广域网代理,也可以跨网络代理
  • 从部署位置上:NAT一般集成在防火墙,路由器等硬件设备上,而代理服务器是一个运行在操作系统之上的一个软件程序,比如Nginx和Apache,需要部署在操作系统上

补充:http隧道技术

我们可以在http请求报文中再内嵌一个加密后的http,把外面的http交给运营商,然后运营商看不到我的请求,然后交给了另一个服务器,这样就骗过了运营商;然后解密,就可以访问外网了,收到一个http响应,然后通过相同的步骤就可以把响应发给我了

但是在常规情况下,http默认携带的是非http的其它数据,上面这种http嵌套的叫做:"http隧道技术",而且会有一些专业的服务器来专门搞这个隧道技术的,(socks5服务器,专业的隧道服务器)

为什么要这样搞,直接访问目标地址不行吗?因为我们每次发请求,必须先到运营商的)

相关推荐
Koi慢热33 分钟前
路由基础(全)
linux·网络·网络协议·安全
hzyyyyyyyu2 小时前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全
刽子手发艺3 小时前
WebSocket详解、WebSocket入门案例
网络·websocket·网络协议
速盾cdn7 小时前
速盾:CDN是否支持屏蔽IP?
网络·网络协议·tcp/ip
yaoxin5211237 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip
内核程序员kevin7 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
PersistJiao8 小时前
Spark 分布式计算中网络传输和序列化的关系(一)
大数据·网络·spark
黑客Ash11 小时前
【D01】网络安全概论
网络·安全·web安全·php
->yjy11 小时前
计算机网络(第一章)
网络·计算机网络·php