目录
数据链路层解决的是直接相连的主机之间进行数据交付的问题;用于两个设备(同一种数据链路节点)之间进行传递。
1、以太网帧协议
以太网帧格式如下:

源地址和目的地址:是指网卡的硬件地址(也就是MAC地址);MAC地址用来识别数据链路层中相连的节点,也就是6个字节,一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19),MAC地址在网卡出厂时就确定了,不能修改;MAC地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突,也有些网卡支持用户配置mac地址)。
类型:有三种值0800、0806、8035,分别对应IP、ARP、RARP。ARP协议是通过IP地址获取对应的MAC地址;RARP协议是ARP协议的逆过程,也就是由MAC地址获取对应的IP地址。
CRC校验码:用来检测数据是否出问题。
PAD:填充位,就是0。
注:IP地址描述的是路途总体的起点和终点,MAC地址描述的是路途上的每一个区间的起点和终点,两者是不同的。MAC地址仅仅在当前局域网中有效,跨网是会进行重新封装的。
2、局域网通信
在同一个局域网中,如下:

比如主机1向主机8发送信息,此时局域网中的每一台主机都会收到主机1向主机8发送的信息,如果目的MAC地址是当前主机的MAC地址,则会进行向上交付;如果不是,则会丢弃报文。
在局域网中,如果一台主机发送消息时,另一台主机也发送消息,就会出现数据碰撞的问题;局域网中主机数越多,发生碰撞的概率就越大(交换机可以划分碰撞域,从而减少局域网碰撞的概率)。数据碰撞的解决办法:碰撞避免算法。
3、MTU
MTU相当于发快递时对包裹尺寸的限制,以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位,最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
对IP协议的影响:由于数据链路层MTU的限制,对于较大的IP数据包要进行分片;
注:分片不好,分片会导致更高的丢包概率,IP报文的任何一个分片丢失都要进行重新发送,因此要尽量减少分片。
对UDP协议的影响:一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部),若包含选项字段,该值会更小),那么就会在网络层分成多个IP数据报,这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败,那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
对TCP协议的影响 :TCP的一个数据报也不能无限大,还是会受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(MSS的大小就是1500减去IP协议的报头和TCP协议的报头),TCP在建立连接的过程中,通信双方会进行MSS协商,然后双方得知对方的MSS值之后,选择较小的作为最终MSS,MSS的值就是在TCP首部的40字节变长选项中。最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度。
使用ifconfig命令,即可查看ip地址,mac地址,和MTU,如下:

其中mtu后面的1500指的就是1500字节。
4、ARP
4.1、ARP协议作用
例如在局域网中,路由器向目的主机发送信息时,路由器是知道目的主机的IP地址和端口号的,如果路由器不知道目的主机的MAC地址,那么在发送信息前就必须获得目的主机的硬件地址,ARP协议就是用来在局域网中通过IP地址获取目的主机MAC地址的。

主机A发出ARP请求,询问"IP地址是172.20.1.2的主机的硬件地址是多少",并将这个请求广播到本地网段(以太网帧首部的目的地址填 FF:FF:FF:FF:FF:FF 表示广播);目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个ARP缓存表,可arp -a命令进行查看,如下:

缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
注:ARP协议建立了主机IP地址和MAC地址的映射关系。
4.2、ARP协议格式
ARP协议格式如下图所示:

硬件类型指链路层网络类型,1为以太网。
协议类型指要转换的地址类型,0x0800为IP地址。
硬件大小指MAC地址的长度也就是6字节。
协议大小指IP地址的大小为4字节。
op字段为1表示ARP请求,op字段为2表示ARP应答。
源硬件地址指的就是发送方主机的MAC地址;源IP地址指发送方的IP地址。
目的硬件地址指接收方的MAC地址(请求时填0,应答时填目标MAC地址);目的IP地址指接收方的IP地址。
注:ARP只有在ARP缓存失效的时候才会进行,不必每次都做。
4.3、ARP欺骗
可以通过自己主机的IP和子网掩码得到网络号,然后依次ping当前网段中的所有的主机,得到所有的主机的IP,然后根据ARP缓存表通过IP地址找到对应的MAC地址。如果收到多次同样的ARP应答,会以最新的为准(只要新 ARP 应答包中的源 IP和缓存表中已有的 IP 一致,无论源 MAC 是否变化,都会直接更新该 IP 对应的 MAC 地址,且以接收时间最晚的包为准),这也是为什么 ARP 欺骗只需要持续发送伪造的 ARP 应答包,就能不断覆盖目标主机的正常 ARP 缓存,让目标把数据发往攻击者的 MAC 地址。例如:如下图所示

这样就导致主机A向路由器发送的信息会推送给主机B,这就是ARP欺骗。
如果主机B将主机A发送的信息,再推送给路由器,然后接收到路由器发来的对应的应答后再转发给主机A,这样主机B也就成为了中间人(基于ARP成为中间人的方式),如下图所示:

既然可以欺骗主机A,那么也是可以欺骗路由器的,如下图所示:

这样路由器想发给主机A的信息就会发到主机B这里,这样就做到了双向欺骗。
5、其他协议和技术
5.1、DNS
DNS是域名解析服务,简单来说就是可以将域名转换成IP地址。
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆,于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系。例如:

早期,是通过互连网信息中心来管理这个hosts文件的,如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件,其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。
这样就太麻烦了,于是产生了DNS系统,该系统会维护主机名和IP地址的映射关系,如果新的域名要进行注册,会将这个映射信息注册到数据库中,当有用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。例如:如下图所示

注:计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。
域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,域名使用.连接,例如:
www.baidu.com
com:是一级域名,表示这是一个商业公司域名,同级的还有 "net"(网络提供商),"org"(非盈利组织),"edu"(教育)等。
baidu:是二级域名,表示公司名。
www:只是一种习惯用法,没有也是可以的。
注:域名解析服务是一个很重要的服务,如果这个服务出问题,网络就会出现很多问题。
5.2、ICMP协议
ICMP协议是一个网络层协议。它和IP协议的关系如下图所示:

一个新搭建好的网络,往往需要先进行简单的测试,来验证网络是否畅通,但是IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因,ICMP正是提供这种功能的协议。
ICMP主要功能包括:确认IP包是否成功到达目标地址,通知在发送过程中IP包被丢弃的原因,该协议也是基于IP协议工作的,ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要是ICMPv6。
常用的ping命令就是基于ICMP协议实现的,如下:

ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP协议中的8位生存时间);ping命令会先发送一个 ICMP Echo Request给对端;对端接收到之后,会返回一个ICMP Echo Reply。
还有一个traceroute命令,也是基于ICMP协议实现,能够打印出可执行程序主机一直到目标主机之前经历多少路由器,如下图所示:

注:ping命令是在网络层,端口号是传输层的内容,在ICMP中根本就不关注端口号这样的信息;系统中存在一种套接字叫原始套接字,这种套接字可以在应用层绕过传输层直接操作网络层,ping和traceroute命令就是使用原始套接字实现的。
6、总结
1、数据链路层:两个设备之间进行传递数据。
2、网络层:在复杂的网络环境中确定一个路径。
3、传输层:负责数据能够可靠的进行传输。
4、应用层:满足需求的网络程序,都是在应用层。
一个很不错的问题:当浏览器中输入url后,接下来发生的事情?
这是一个经典的题目,对于这个问题的回答基本就可以看出一个人的网络水平,这个题目没有固定的答案越详细越好。