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