数据链路层和网络层的对比
如果说网络层实现的是路由的功能,那么数据链路层就是实打实的实现具体的传输。
就像导航,网络层告诉我们下一步该去哪个主机,而数据链路层则是实现去下一个主机的方法。
网络层的IP地址告诉我们目的地在哪里,而数据链路层则告诉我们下一步去哪里。
而想了解数据链路层是如何做到的,就必须了解数据链路的以太网协议。
以太网
以太网是一种技术标准,涵盖了数据链路层的内容,也包括物理层的内容。
但是数据链路层并非只有以太网,还有令牌环网和无线LAN等,不过这里就了解以太网。
以太网协议格式
- 以太网中的目的地址实际上是指目的主机的MAC地址
- MAC地址:用来识别数据链路层中相连的节点,长度为 48 位,及6个字节,一般用 16 进制数字加冒号的形式,一般在网卡出厂的时候就确定了,具有唯一性
- 类型分为 IP,ARP,RARP三种
- 帧末尾是CRC校验码
碰撞
一般来说,一个局域网内在同一时间只能有一个主机在局域网内部发数据,不能同时出现多台主机发消息,因为数据之间会发生碰撞。
我们可以将局域网看成是一个临界资源,同一时间只能有一台主机访问。
正是因为有碰撞的风险,因此局域网不可太大,同时主机也不能过多,会增加碰撞概率。
局域网同时有多个节点相连,其中这些节点的集合就是碰撞域和广播域。
一个局域网之间的节点发消息会有碰撞的风险,而为了避免碰撞,大佬们提出了各种各样的方法,比如交换机,在一个局域网内控制碰撞的数据不传播给局域网内的其他节点。
碰撞域:连接在同一导线上的所有工作站的集合,或者说是同一物理网段上所有节点的集合或以太网上竞争同一带宽的节点集合。
广播域:接收同样广播消息的节点的集合。
而为了防止碰撞的发送,以太网协议也有自己的办法,那就是MTU。
认识MTU
MTU是针对不同数据链路层对应的物理层而提出的限制。
- 以太网中的数据长度规定最小46字节,最大1500字节,不够46字节的要填充,超过1500字节的则分片
- 最大值为1500称为以太网的最大传输单元,不同网络类型有不同的MTU
- 一个数据包从以太网到拨号链路上,长度大于拨号链路的MTU则需要分片
- 不同的数据链路层的标准MTU不同
至于分片和组装的过程则由网络层自己分片组装。
MSS
MSS是TCP协议的概念,标识TCP能够承载的最大的应用数据段长度,一般为 MTU-20字节TCP报头-20字节IP报头,以太网下为1460字节。
MTU对UDP的影响
UDP报头时间8字节,IP报头是20字节,那么由于MTU的原因,UDP能携带的数据不能超过1472字节,否则就需要分片。
而UDP又是不可靠的协议,若是一个数据报分片了,那么它在网络中丢包的概率就更大了。
MTU对TCP的影响
一个TCP的数据报的长度也不是无限大的,限制于MTU,其中TCP协议单个数据报的最大长度称为MTU。
TCP是面向连接的,在连接过程中,双方会进行MSS协商。
最好情况下,MSS的值是正好在IP协议都不会被分片的大小,不过任然受制于数据链路层的MTU。
当双方进行连接确认时,会在发送SYN的同时发送自己的MSS值,然后取小值作为最终的MSS值。
这个MSS值就藏在TCP首部的40字节变长选项中(kind = 2)。
这个MTU我们可以通过ifconfig命令来查看,IP地址和MAC地址也可以通过这个命令查看。
ARP协议
在数据链路层通过以太网协议发送数据之前,有一个问题需要解决。
那就是一般我们通过IP地址找到了对应的局域网,但是我们却不知道该主机的硬件地址,也就是MAC地址。
因为IP地址和MAC地址并非一对一的,IP地址是能够改变的,因此我们想要两台主机进行通信,仅知道一个IP地址是无法成功通信的,还必须知道对应的MAC地址。
而ARP协议就是用来解决这个问题的。
- 当一个局域网内有一台主机需要跟局域网内的另一台主机通信时,它会先发送一个ARP请求包,并广播到局域网内的所有主机上。
- 当对应主机收到后检查IP地址,发现这个请求是给自己的,它就通过请求上的地址返回一个ARP响应包,并告诉对方自己的MAC地址。
- 发送端收到响应后,就会将对方的IP地址和MAC地址维护在一个ARP缓存表中,形成一对一的映射关系,这个表的生命周期是20分钟,若20分钟内没使用某一项,该项目就会失效,需要重新请求。
- 正是由于主机的IP地址是会变化的,所以这个ARP缓存表有生命周期,而非永久存在。
- ARP缓存表可以通过 arp -a 命令查看。
ARP协议格式
- 这里的目的地址和源地址在首尾各出现了一次,在以太网协议里来说是多余的,但是其他协议需要
- 硬件类型是固定的字段,硬件类型为1
- 协议类型一般也是固定字段,表明需要通过IP协议来获得MAC地址,此处填 0x0800。
- 硬件地址长度填6字节。
- 协议地址长度对于IP为4字节
- op为 1 表示请求, 2 表示应答。
ARP广播过程
当一个ARP请求广播在局域网内时,它会将目的地址全部填 0x FFFFFF 的字段,并且op填1,其它选项正常填写。
当局域网内其它主机接收到广播后,先看以太网首部报头,发现目的地址是 0xFFFFFF,就知道这是一个广播,然后根据ARP请求的op,发现是请求后,再看目的 IP 地址,若是自己,则自己返回应答,否则丢弃。
当对应主机收到请求后,就返回一个ARP应答,填好 目的地址和其他选项,然后再 填 op 为2 ,表示是响应。
之后广播到局域网内,其他主机收到广播后会发现目的地址不是自己,就会丢弃报文,而对应的主机则会收到报文,并且发现这是一个ARP应答,就会将 IP 地址 和 MAC 地址维护在自己的ARP缓存表。
DNS
DNS 是一整套从域名映射到IP的系统。
虽然IP对于机器来说,很好用,但是对应人来说,复杂而难记,因此出现了DNS系统。
最开始的时候,人们通过hosts文件来描述主机名和IP地址的关系,由互联网信息中心来管理这个hosts文件,但是这个十分麻烦。
每次计算机要接入网络或者计算机IP变更,都需要去信息中心申请变更hosts文件,而其他主机也要定期下载更新新版本的hosts文件才能正确上网。
于是就产生了DNS系统。
- DNS系统是一个组织的系统管理机构,维护系统内每一个主机的IP和主机名的对应关系
- 若新的计算机接入网络,会将这个信息接入到数据库中
- 用户输入域名时会自动查询DNS服务器,来检索对应域名,找到对应的IP地址
我们可以通过 cat /etc/hosts 命令来查看hosts文件,域名解析的时候会优先查找hosts的内容。
域名的格式
我们以百度的域名来理解域名格式。
www.baidu.com
- com:一级域名,表示这是一个企业域名,同级的还有 "net"(网络提供商),"org"(非盈利组织),"edu"(教育机构)等。
- baidu:二级域名,公司的名称
- www:一种习惯用法。
我们可以下载 dig 工具,来查看域名解析过程。
先使用 "yum install bind-utils"命令来安装工具。
就能够查看了。
- 开头是dig指令的版本号
- 第二部分表示服务器返回的详情,status:NOERROR 表示查询成功
- QUESTION SECTION 表明查询的是什么域名
- ANSWER SECTION 表示查询的结果,这里先将 www.baidu.com 表示成 www.a.shifen.com,然后再查询了两个ip地址
- 最下面是一个结果统计,包含查询时间和DNS服务器的地址等
ICMP协议
这是一个网络层的协议,用来测试网络是否通畅,若丢包了还会通知传输层丢包原因。
ICMP主要功能包括
- 确认IP包是否成功发送给对方
- 通知发送过程中,IP包被丢弃的原因
- ICMP基于IP协议工作,但是它是网络层的协议
- ICMP搭配 IPv4 工作,ICMPv6 搭配 IPv6工作
ICMP报文
- ICMP报文分为通知出错原因和用于诊断查询两类
其中,ICMP类型分为这么几类。
ping命令
可以用来验证网络的连通性,还会统计响应时间和IP包的 TTL(生存周期)。
ping命令就是通过发送 ICMP Echo Request 给对端,然后接收对方的 ICMP Echo Reply来工作的。
不过有一点需要注意的是,ping的是域名而非url。
而且ping命令是基于ICMP,是在网络层的,没有端口。
traceroute命令
该命令基于ICMP协议实现,可以打印出去到目标主机之前要经历的路由器。
总结
本篇博客讲述了以太网如何实现同一个局域网内的主机互相通信的原理,并且了解了为什么IP层需要进行分片。
然后还知道主机之间通信必须要先通过ARP协议来保存IP地址对应MAC地址的映射关系。
还了解了DNS和ICMP两个小玩意。