目录
一、MAC帧
(一)IP地址和MAC地址
(二)MAC帧格式
(三)MTU对IP协议的影响、
(四)MTU对UDP协议的影响
(五)MTU对TCP协议的影响
二、以太网协议
(一)以太网MAC帧如何进行解包和分用
(二)局域网中转发原理
三、ARP协议
(一)ARP协议的作用
(二)ARP数据报的格式
(三)ARP协议的工作流程
(四)RARP协议
四、相关的技术与协议
(一)DNS协议
(二)ICMP协议
(三)代理服务器
一、MAC帧
(一)IP地址和MAC地址
通过上节我们了解一台入网的主机的IP地址是有可能发生变化的,例如该主机处于不同的网络或重新入网时路由器分配了新的IP地址,因此仅靠IP地址是无法完成网络中数据通信的,因此引入了MAC地址。
MAC地址用来区别数据链路层中相连的节点,MAC地址是网络接口卡的硬件标识符,全球唯一,主要作用于数据链路层,描述的是数据传输中每个区间的起点和终点。
MAC地址一共48位,全球任意一张网卡都有唯一的MAC地址。使用 ifconfig 命令可查看本机的MAC地址:
(二)MAC帧格式
目的地址:目的主机的MAC地址;
源地址:发送主机的MAC地址;
类型:MAC帧类型;
CRC:MAC帧校验码。
数据链路层的MAC数据帧协议规定了单帧有效载荷最大为1500字节,有效载荷的最大值称MTU最大传送单元。
在网络通信中,真正决定数据发送的是传输层,因此数据包的大小实际由传输层决定。若传输层向下交付的数据包过大,则需要IP层将数据进行分片以及重组,而数据链路层对此并不关心只负责数据包的发送。
在网络传输中,不仅仅只有主机采用MTU最大传输单元,对于中间节点的路由器同样也存在MTU最大传输单元,若报文大小超过了路由器的MTU最大传输单元且该数据报中的df = 0,那么路由器的IP层会再次对报文进行IP分片后发送报文,若df = 1 也就是禁止分片的话,路由器会将报文丢弃并通知发送端(ICMP报文)。
(三)MTU对IP协议的影响、
由于数据链路层MTU的限制,对于较大的IP数据包要进行分片:
当传输层交付的数据过大需要进行分片时,IP层首先将数据进行分割并填写相应的报头信息,其中被原始的数据报分配唯一的标识位,所有分片继承该标识,除了最后一个分片外,其他分片的标志位中的MF = 1,最后的标识位置0。置1表示后续还有分片,而置0表示后续没有分片即该数据报为最后一个分片。在分片的同时也需要填写片偏移大小,该字段用于表示该数据报的数据原处分配前数据的起始位置,其中除了最后一个分片以外,其他的分片的偏移量必须是8的整数倍。
当收到一个报文时,查看标志位的MF是否为1,若为1则说明该报文进行过分片操作并不是完整报文,若为0则需要查看该报文的偏移量,若偏移量不为0则说明该报文是被分片后的最后一个IP报文,若为0则说明该报文本身是个完整的报文;通过以上步骤即可验证该报文是否被分片,若没有进行分片该报文本身就是一个完整报文,若该报文进行过分片,需等到最后一个报文的到达。偏移量为数据处原始数据的起始地址。因此当收到最后一个报文后,只需要将各个报文按偏移量大小进行排序,验证各个相邻报文之间的是否连续即可判断收到的所有分片报文是否完整。若完整则重新组装后交付给上层。
在传输过程中,数据包进行分片后的小数据包中任意一个小包丢失,接受端的重组就会失败,若需要重新发送数据包,是需要将整个数据包重新进行分片后再此全部发给发送端的,IP层不服职责重新传输数据,由上层决定。因此在实际传输中,传输层会避免向下交付的数据包过大而导致IP分片的,IP分片不仅仅增加了网络层的负担,也增加了整个数据包重传的风险。
(四)MTU对UDP协议的影响
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。
(五)MTU对TCP协议的影响
- TCP的数据不能过大,IP协议受制于MTU,同样的TCP协议也受制于MTU,TCP协议蛋哥数据报的最大消息长度称为MSS(Max Segment Size)
- TCP在建立连接时,通信双方会协商MSS大小:双方在发送SYN时会把自己能支持的最大MSS值写入TCP首部,一般取双方较小的作为最终MSS;
- 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度;
- MSS的值就在TCP首部的40字节变长选项中。
二、以太网协议
(一)以太网MAC帧如何进行解包和分用
MAC帧采用定长的策略,对于一个MAC帧而言,首部为 6+6+2 = 14字节以及有效载荷后的4字节CRC校验位,解包时去掉以上部分即为有效载荷。
在MAC帧首部由类型字段,根据该类型字段即可了解将有效载荷交付给上层的哪种协议,例如0800代表是IP数据报,0806为ARP协议。
(二)局域网中转发原理
当局域网内的一台主机发送了一个MAC帧后,局域网内的所有主机都可以收到该MAC帧,而只有其目的地址为本主机的MAC地址时,该主机数据链路层才会把该数据向上交付,而其他主机会直接将该MAC帧丢弃。在局域网中,网卡有一种“混杂模式”,该模式下不会放弃任何数据帧,物理MAC帧内的目的地址是否为主机的MAC地址,都会将MAC帧解包后向上交付,这也是局域网内抓包工具的原理。
因此在一个局域网内如果多个主机同时发送数据,那么总线上的信号会相互干扰产生碰撞冲突。所以在同一时刻只有一台主机能够发送数据。因此需要约定一些协议保证数据的正常发送:
令牌环:令牌环网络中有一个令牌(Token)在环路上循环传递。只有持有令牌的节点才能发送数据,其他节点则监听该链路以接收数据。当节点需要发送数据时,它会将数据附加到令牌上,并将令牌继续传递下去。每个节点在接收到令牌时检查是否有附加的数据,如果有,节点就将数据提取出来并处理。
以太网:以太网使用一种称为CSMA/CD(带冲突检测的载波侦听多路访问)的协议来管理和调度数据传输。在CSMA/CD中,每个节点都监听网络上的信道来检测是否有其他节点正在发送数据;如果检测到信道空闲,则节点可以开始发送数据;否则,节点会等待一段随机时间后再次尝试发送;当多个主机同时发送该数据导致冲突时,所有主机停止发送并发送阻塞清号,随后二进制指数退避算法重新尝试发送。
当局域网上的主机越多时,越容易发生数据碰撞冲突,因此可以在局域网中使用交换机。
交换机可以隔绝冲突域。正常情况下,交换机并不影响局域网内的通信,例如当主机A向主机E发送数据时,交换机会正常将数据进行转发;当主机A和主机B同时向主机D发送数据时发生冲突,当交换机左侧(如图)发生冲突时并不会将发生冲突的数据转发给右侧,而右侧也就是主机C和主机E之间仍然可以继续进行正常的通信不受左侧冲突的影响。
对于每条MAC的数据长度,数据越长,越有可能发生碰撞,这也是MAC帧协议限制有效载荷最大是1500字节的原因。
三、ARP协议
ARP协议是介于数据链路层和网络层之间的协议,用于使用IP地址来获取MAC地址。
在网络传输过程总,IP地址就相当于最终目的地,而MAC地址相当于中间途径的地址。数据报封装为MAC帧时需要目的MAC地址。当主机向服务器发送数据时,主机如何知道所处网段的公网路由器的MAC地址是多少?当报文到达目的网络时,路由器又怎么知道该数据包的目的地址的MAC地址是多少?这些实际都需要MAC地址。
(一)ARP协议的作用
ARP协议建立了主机IP地址和MAC地址的映射关系
- 在网络通信中,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是呗网络接收到再去交给上层协议的,如果收到的数据包的目的硬件地址与本主机不符,则会直接丢弃数据包;
- 因此在通信前必须获得目的主机的硬件地址
(二)ARP数据报的格式
- 注意源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层为其他类型的网络则是有必要的;
- 硬件类型指的是链路层网络类型,以太网为1;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于IP地址为4字节;
- op字段为1表示ARP请求,op表示为2表示ARP应答;
(三)ARP协议的工作流程
当主机A需要向主机E发送数据时,由于主机A只知道主机E的IP地址,因此需要通过ARP协议获取主机E的MAC地址。
首先主机A发送ARP请求报文,其中ARP报文中的以太网目的地址为全F,也就是为广播地址。局域网内的所有主机都会收到该请求报文,由于报文中的以太网目的地址为广播地址,对MAC帧首部进行解包后查看帧类型字段并将其交给ARP协议处理。首先读取ARP请求报文的op字段,若op字段为1即确认该报文为ARP请求报文,再查看目的IP地址是否为本主机的IP地址(目的以太网地址为全F),若不为本主机的IP地址则将该报文丢弃。
当主机E收到该ARP请求报文后,经过处理后向主机A回送ARP响应报文,其中MAC帧首部的目的地址为主机A的MAC地址,也就是单播地址。当其他主机收到该报文后查看MAC目的地址并不是本机的MAC地址后会将该报文进行丢弃。当主机A收到该ARP响应报文后对其进行解包,查看op字段,若op字段为2即该报文为ARP响应报文,再查看发送端以太网地址字段获取主机E的MAC地址。
除此之外,局域网内的设备实际还会维护一张ARP缓存表,用于映射IP地址和MAC地址的关系,每次封装MAC帧时首先会进行查表,若表中不存在目标条目的话才会进行ARP协议请求。
(四)RARP协议
RARP协议与ARP协议过程类似,不过其作用为MAC地址映射IP地址,也就是知道目的主机的MAC地址,但不知道其IP地址,因此需要通过RARP协议来获取目的主机的IP地址。
四、相关的技术与协议
(一)DNS协议
当我们通过网络访问服务器时,我们输入的往往是域名,例如我们访问百度时只需要搜索百度的域名而不是其IP地址,这是因为IP对人的记忆及使用不友好,域名网址就比较直观了,而由域名到IP地址的映射实际是由DNS来完成的。
DNS域名系统是互联网的核心基础设施之一,承担着将人类可读的域名转换为机器可识别的IP地址的关键任务。
百度的域名:www.baidu.com
com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等。
baidu: 二级域名, 公司名。
www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议。在浏览器输入域名时可以省略。
域名服务器一共有三类,根服务器、权威服务器和递归服务器。
根服务器:全球共13组。存储顶级域服务器地址;
权威服务器:管理特定域名的解析记录;
递归服务器:接收用户查询并完成全链路解析。
下面简单介绍下DNS解析的一般流程:
- 当用户访问www.baidu.com时,先检查本地缓存(浏览器/操作系统缓存),命中则直接返回IP;
- 未命中则向递归服务器发送请求,递归服务器依次查询根服务器、.com服务器、baidu.com权威服务器,最终获取IP并返回;
- 递归服务器缓存结果,其生存时间决定缓存有效期。
目前计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。
(二)ICMP协议
IP协议并不是可靠的协议,如果在传输过程中丢包了,IP协议是无法得知是否出现了丢包。因此引入了ICMP协议。
ICMP互联网控制报文协议,TCP/IP协议族中的核心网络层协议,主要用于在IP主机和路由器之间传递控制消息,辅助网络通信的可靠性和诊断。
ICMP协议提供了以下功能:
差错报文:
- 目标不可达;
- 超时报文:TTL耗尽或分片重组超时;
- 重定向:通知发送端更有路由路径。
查询报文:
- Echo请求/应答:用于Ping等工具;
- 时间戳请求或应答:同步网络设备时间。
ICMP协议是基于IP协议的,但是它并不是传输层的功能,因此将其归于网络层协议,ICMP协议只能搭配IPv4协议使用,若是IPv6则需要ICMPv6.
PING命令实际就是基ICMP协议实现的。
Ping命令通过发送ICMP Echo请求并等待Echo应答,测试两台主机的连通性。
1、此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址;
2、ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期);
3、ping命令会先发送一个 ICMP Echo Request给对端;
4、对端接收到之后, 会返回一个ICMP Echo Reply;
ping命令是不关注端口的,因为ping命令是基于ICMP, 是在网络层;而端口号, 是传输层的内容。在ICMP中根本就不关注端口号这样的信息。
(三)代理服务器
正向代理:正向代理是客户端与目标服务器之间的中介,代理对象是客户端。客户端通过代理服务器间接访问目标服务器,隐藏自身真实信息。
反向代理:客反向代理是服务器端的中介,代理对象是服务器。客户端直接访问反向代理,由代理将请求分发到后端服务器。
采用反向代理可以实现负载均衡策略:客户端可能会发送大量的数据,反向代理服务器需要合理的将数据分配给服务器集群。
作为反向代理的服务器,需要配置较高,充当软件服务的可以是Nginx(Web服务器,不做业务处理,只做转发处理),当反向代理服务器中的服务器集群将请求处理完,可以通过代理服务器将结果发回给客户端,也可以直接发回给客户端。
NAT和代理服务器的区别:
1、从应用层面上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题。代理服务器则是更贴近具体应用, 比 如通过代理服务器进行翻墙;
2、从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换,代理服务器往往工作在应用层;
3、从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网。
4、从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上。