目录
一,关于数据链路层
二,以太网协议
2.1 局域网
2.2 Mac地址
2.3 Mac帧报头
2.4 MTU
三,ARP协议
3.1 ARP是什么
3.2 ARP原理
3.3 ARP报头
3.4 模拟ARP过程
3.5 ARP周边问题
四,NAT技术
4.1 NAT技术背景
4.2 NAT转换过程
4.3 NAPT
4.4 NAT技术缺陷
五,代理服务器
5.1 正向代理
5.2 反向代理
5.3 正反向代理的区别
5.4 NAT和代理服务器的区别
一,关于数据链路层
- 做任何事情都是先有决策,后有执行,所以肯定是在网络层中先决策,是应该把报文转发到和我处于同一网段的其它主机还是交给下一跳,决策之后再把报文往下交付给路由器
- IP协议解决的是:将数据跨网络从A主机送到B主机,但是在此之前,要解决的是把数据先发送到路由器中
- 数据链路层解决的是:直接相连的主机之间,进行数据交付的问题,这个直接相连的主机不仅仅是电脑手机等,也包括路由器,路由器也是一个主机,它收到其它路由器发来的报文,可以继续转给其它路由器,也可以直接转给我构建的子网当中的某个主机,数据链路层就是解决路由器把报文发给它内网某个主机的问题
- 网络层IP协议解决数据跨网络发送
- 传输层Tcp/Udp协议保证数据发送的可靠性
- 数据链路层层解决数据在同一局域网中两台主机的通信问题
二,以太网协议
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服务器,专业的隧道服务器)
为什么要这样搞,直接访问目标地址不行吗?因为我们每次发请求,必须先到运营商的)