我们前面学习到的传输层、网络层。传输层是保证数据可靠传输。而网络层是实现在复杂的网络环境中确定一个合适的路径。我们接下来所说的数据链路层其实就是用于两个设备(同一种数据链路节点)之间进行传递。其实也就是如数次的局域网中设备之间的转发过程。
认识以太网
"以太网" 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等;
认识以太网帧格式
以太网帧(也称为Mac帧)是数据链路层的一种协议数据单元,它包含了帧头、数据部分和帧尾。在以太网帧的帧头中,有两个关键的地址字段:目的地址和源地址,这两个字段都是48位的MAC地址。此外,帧头还包含了一个类型字段,用于指示数据部分所使用的协议类型(如IP、ARP等)。
认识Mac地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
对比Mac地址和IP地址
ip地址是网络层的一个报头字段数据,而Mac地址是数据链路层的报头数据。通过开篇我们知道网络层是确定网络数据的传输路径的也就是起始点和终止点以及途径的各个点。而数据链路层是实现各个局域网间的设备数据传递的,也就是从当前到下一跳的的位置。
所以说明数据在网络传输的过程中源、目标Mac地址是始终发生改变的,而源IP地址可能会随着NAT技术而发生改变,但是目标IP地址是不变的。也就是根据IP进行路径选择,根据Mac进行吓一跳发送。
局域网如何进行通信
当我们局域网下的一个主机如果想要发送数据给另一个主机时。
首先会进行判断,用当前主机IP按位与子网掩码得到网络号,然后用目标IP按位与子网掩码得到网络号。然后将两个网络号进行对比。如果网络号相同的话则表明两主机是在同一局域网下;如果不相等的话就会将报文数据转发到路由器当中。
而且还有一点,主机在局域网间的通信时会将数据发送给同局域网下的所以主机(包括自己这台主机器),只不过所有收到Mac帧的主机会将报文进行解包,查看报头的目的Mac地址是否等于当前自己主机的Mac地址,如果相等则会接收数据,否则就会直接在数据链路层丢弃。而接下来会根据报头类型字段来判断是IP报文还是其他报文,从而将有效载荷交给上一层网络层。
局域网数据碰撞
局域网中,任何时刻都只允许一台主机向局域网中发送数据,如果同时发送就会发生局域网数据碰撞的问题。而我们的局域网可以看作是碰撞域。
碰撞检测与处理:因为我们局域网中的主句发送数据时,自己同样也会收到,所以如果当前主机收到的数据和发送的数据对比以后不一致的话就证明发生了数据碰撞。所以接下来发生碰撞的主机会进行休眠一段时间(不影响其他主机的正常数据发送),然后过一定时间再次发送数据(重传)。
认识交换机
交换机是运用在局域网当中的,而且交换机主要是有效的降低了局域网中的数据碰撞概率,功能就是划分局域网的碰撞域。
也就是起初局域网中的主机在发送数据时,交换机同样也会收到,各个发送数据的主机,从而得到并保存各个主句的Mac地址。所以也就相当于可以知道局域网中哪些主机是在交换机的左侧,哪些主机是在交换机的右侧。那么交换机左侧的主机在进行数据通信时,也就不会传到交换机的右侧;同理交换机的右侧主机进行数据通信时也不会传到交换机的左侧中。所以此时交换机的左右两侧的主机们各自就可以同时进行通信且不造成数据碰撞。
ARP协议(地址解析协议)
我们在进行局域网通信时有一个问题:发送端是如何得到接收端的Mac地址的????
我们知道发送端是知道接收端的IP地址和端口号的,而当发送端的数据封装到数据链路层时,是需要封装Mac帧的,也就需要知道局域网中接收端主机的Mac地址。
ARP协议的作用
ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。可以说ARP是在Mac协议之上的数据链路层协议。ARP协议是一个在局域网(LAN)中用于将网络层地址(如IPv4地址)解析为链路层地址(如以太网MAC地址)的网络协议。其主要作用在于实现IP地址到物理地址(MAC地址)的映射,从而确保数据能够在局域网内正确地从一台设备传输到另一台设备。
ARP协议工作流程
局域网中主机通信时,发送数据的主机会重新构建一个新的封装ARP协议的Mac帧(属于广播信息,目标Mac地址是全F)发送的数据含义是:询问该局域网下的所有主机,谁的IP是我要发送的目标IP,请返回你的Mac地址给我。一旦得到目标主机的Mac地址以后就会将结果缓存一定时间。
ARP数据报的格式
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型如的网络则有可能是必要的。(这里的以太网首部的帧类型应该填的就是0806,以太网首部的目的地址同样也是全F)
ARP协议字段认识:
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
- op字段为1表示ARP请求,op字段为2表示ARP应答;
- 如果是ARP请求,则目的以太网地址就是全F
ARP请求与应答
- ARP的请求会先在数据链路层封装ARP协议字段,也就是上面的内容,然后接着封装Mac帧,所以如果两台主机没建立联系之前(未知mac地址),发送端会先发送ARP协议请求(属于广播信息),因此该局域网中的所有主机都会收到想同的ARP请求,会先进行解包Mac帧协议(因为Mac帧协议的目的Mac地址是全F),然后将解包之后的报文交给上一层ARP层,在ARP层继续解包,首先观察op字段,判断是请求还是应答,再看目的IP地址,当前局域网下的主机将解包的目的IP与自己的IP地址进行比对,比对成功则响应,比对失败则丢弃。
- ARP应答同样是先在相同在ARP层将目的以太网地址填充进去,然后将其他字段一个个填充并且op字段改成2,交给下一层的Mac帧,然后填充字段并发送出去(依旧是局域网下的每个主机都能收到,但是在Mac帧这一层就能够判断是否要进行丢弃)。
- 最后收到应答以后虽然可以在Mac层拿到Mac地址,但是依旧要向上传递到ARP层,其目的就是为了得到是op字段,判断是请求还是应答。
所以说对于非目标主机收到ARP的请求是在ARP层丢弃,收到ARP应答是在Mac层丢弃的。
如果同时收到很多的ARP应答时,会将最新收到的ARP记录缓存下了。
RARP协议
RARP协议,全称Reverse Address Resolution Protocol(反向地址解析协议),是一种在局域网内将物理地址(如MAC地址)转换为IP地址的协议。
DNS协议
DNS(Domain Name System,域名系统)协议是互联网上的一个分布式数据库系统,用于将人们易于记忆的主机名(如www.example.com)转换成机器可以直接识别的IP地址(如192.0.2.1)。DNS协议使得互联网上的通信变得简单而高效,因为它允许用户通过简单的域名来访问网站,而不是需要记住复杂的IP地址。
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,如:www.baidu.com
- com: 一级域名. 表示这是一个企业域名. 同级的还有 "net"(网络提供商), "org"(非盈利组织) 等.
- baidu: 二级域名, 公司名.
- www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议.
域名解析过程
客户端向当地的的DNS域名服务器发送UDP报文的查询请求,并等待服务器返回最终的IP地址。如果DNS服务器不知道答案,它会自己向其他DNS服务器或者上一级的DNS服务器查询,直到找到答案或确定无法找到。
ICMP协议
ICMP协议是一个网络层协议。一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因。
而且用户在检测网络健康状态时,会直接通过特定的套接字接口绕过传输层直接访问网络层提供的ICMP,然后由ICMP调用IP,向对方发送的报文称为ICMP报文,也就说明IP报文的有效载荷不是tcp/udp报文,而是ICMP报文(与ARP报文类似,是绕过网络层,Mac帧的有效载荷是ARP报文)
ICMP工作过程
ICMP功能
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包被丢弃的原因(通过报文类型字段标识)
- ICMP也是基于IP协议工作的。但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议;
- ICMP只能搭配IPv4使用。如果是IPv6的情况下,需要是用ICMPv6;
ICMP报文格式认识
认识ping命令
- ping 的是域名,而不是url!一个域名可以通过DNS解析成IP地址。
- ping命令不光能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期)
- ping命令会先发送一个 ICMP Echo Request给对端;
- 对端接收到之后, 会返回一个ICMP Echo Reply;
ping命令其实就是应用层的一个程序,是应用层的套接字绕过传输层tcp调用ICMP协议构建的命令。所以说明ping命令是没有端口号的(绕过传输层)。