数据链路层

数据链路层和网络层的对比

        如果说网络层实现的是路由的功能,那么数据链路层就是实打实的实现具体的传输

        就像导航,网络层告诉我们下一步该去哪个主机,而数据链路层则是实现去下一个主机的方法。

        网络层的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主要功能包括

  1. 确认IP包是否成功发送给对方
  2. 通知发送过程中,IP包被丢弃的原因
  3. ICMP基于IP协议工作,但是它是网络层的协议
  4. 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两个小玩意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/77695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL-UDF用户自定义函数-扩展插件

PostgreSQL-UDF用户自定义函数-扩展插件 零、前置条件 ggcpostgresql 一、创建 .c 和 .sql 文件 创建.c文件 进入PG源码的contib/目录下面,这个目录下面都是用于PG进行功能扩展的插件。创建我们的插件(UDF同义词:插件;扩展&a…

gitee(码云)如何生成并添加公钥,以及配置用户信息

一,简介 在使用Gitee的时候,公钥是必须的,无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器,然后配置自己的用户信息,方便日后拉取与上传代码。 二,步骤介绍 2.1 本地生成公钥 打开git ba…

【SpringBoot】| 接口架构风格—RESTful

目录 一:接口架构风格—RESTful 1. 认识RESTful 2. RESTful 的注解 一:接口架构风格—RESTful 1. 认识RESTful (1)接口 ①接口: API(Application Programming Interface,应用程序接口&…

Django的简介安装与配置及两大设计模式

一.Djang的介绍 1.Django是什么 Django 是使用 Python 语言开发的一款免费而且开源的 Web 应用框架。 由于 Python 语言的跨平台性,所以 Django 同样支持 Windows、Linux 和 Mac 系统。 在 Python 语言炽手可热的当下,Django 也迅速的崛起,在…

文件的导入与导出

文章目录 一、需求二、分析1. Excel 表格数据导出2. Excel 表格数据导入一、需求 在我们日常开发中,会有文件的导入导出的需求,如何在 vue 项目中写导入导出功能呢 二、分析 以 Excel 表格数据导出为例 1. Excel 表格数据导出 调用接口将返回的数据进行 Blob 转换,附: 接…

【LangChain】P1 LangChain 应用程序的核心构建模块 LLMChain 以及其三大部分

LangChain 的核心构建模块 LLMChain LangChain 应用程序的核心构建模块语言模型 - LLMs提示模板 - Prompt templates输出解析器 - Output Parsers LLMChain 组合 LangChain 应用程序的核心构建模块 LangChain 应用程序的核心构建模块 LLMChain 由三部分组成: 语言…

前端原生写自定义旋转变换轮播图

html部分&#xff1a; <div class"banner_box"><div class"swiperWrapper" v-show"bannerList.length>0"><div class"swiper-item" :id"swiperSlide${index}" :class"{active:index0,next:index1,pr…

深度学习实战基础案例——卷积神经网络(CNN)基于SqueezeNet的眼疾识别|第1例

文章目录 前言一、数据准备1.1 数据集介绍1.2 数据集文件结构 二、项目实战2.1 数据标签划分2.2 数据预处理2.3 构建模型2.4 开始训练2.5 结果可视化 三、数据集个体预测 前言 SqueezeNet是一种轻量且高效的CNN模型&#xff0c;它参数比AlexNet少50倍&#xff0c;但模型性能&a…

Springboot写单元测试

导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintag…

Python学习笔记_基础篇(七)_常用模块

模块&#xff0c;用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程&#xff0c;函数式编程则完成一个功能&#xff0c;其他代码用来调用即可&#xff0c;提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来&#xff0c;可能需要多个函数才能完成…

机器人CPP编程基础-03变量类型Variables Types

机器人CPP编程基础-02变量Variables 全文AI生成。 C #include<iostream>using namespace std;main() {int a10,b35; // 4 bytescout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;cout<<"Val…

详细记录Pycharm配置已安装好的Conda虚拟环境

当安装好conda环境之后&#xff0c;想要在Pycharm中使用&#xff0c;那么就要在Pycharm中导入&#xff0c;我这里使用的pycharm-professional-2023.2这个版本&#xff0c;下面是详细步骤&#xff1a; 1.打开File->Settings&#xff1a; 2.找到Project——>Python Inter…

网络层协议

网络层协议 IP协议基本概念协议头格式网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由IP协议头格式后续 在复杂的网络环境中确定一个合适的路径 IP协议 承接上文&#xff0c;TCP协议并不会直接将数据传递给对方&#xff0c;而是交付给下一层协议&#xff0c;…

LeetCode Top100 Liked 题单(序号34~51)

​34. Find First and Last Position of Element in Sorted Array ​ 题意&#xff1a;找到非递减序列中目标的开头和结尾 我的思路 用二分法把每一个数字都找到&#xff0c;最后返回首尾两个数 代码 Runtime12 ms Beats 33.23% Memory14 MB Beats 5.16% class Solution {…

ssh远程连接服务器

一、远程连接服务器简介 二、连接加密技术简介 三、ssh服务配置 四、用户登录ssh服务 Enforcing会强制限制&#xff0c;如端口为22&#xff0c;可以访问&#xff0c;如果是2000端口&#xff0c;不能使用 Permissive是宽容的模式&#xff0c;不限制使用端口 Enforcing会重启失败…

Redis系列(一):深入了解Redis数据类型和底层数据结构

Redis有以下几种常用的数据类型&#xff1a; redis数据是如何组织的 为了实现从键到值的快速访问&#xff0c;Redis 使用了一个哈希表来保存所有键值对。 Redis全局哈希表&#xff08;Global Hash Table&#xff09;是指在Redis数据库内部用于存储所有键值对的主要数据结构。…

(三)行为模式:2、命令模式(Command Pattern)(C++示例)

目录 1、命令模式&#xff08;Command Pattern&#xff09;含义 2、命令模式的UML图学习 3、命令模式的应用场景 4、命令模式的优缺点 5、C实现命令模式的实例 1、命令模式&#xff08;Command Pattern&#xff09;含义 命令模式&#xff08;Command&#xff09;&#xff…

亚马逊、ebay、虾皮电商卖家如何做测评,提高店铺排名?

测评是什么呢&#xff1f; 不管是在亚马逊&#xff0c;速卖通&#xff0c;阿里国际&#xff0c;虾皮&#xff0c;Lazada&#xff0c;沃尔玛&#xff0c;美客多&#xff0c;ebay等跨境电商平台&#xff0c;测评都是成本最低且最有效的一种推广方式。 通俗来说&#xff0c;测评…

leetcode292. Nim 游戏(博弈论 - java)

Nim 游戏 Nim 游戏题目描述博弈论 上期经典算法 Nim 游戏 难度 - 简单 原题链接 - Nim游戏 题目描述 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xff0c;轮到的人拿掉 1 -…

MySQL 中 不等于 会过滤掉 Null 的问题

null值与任意值比较时都为fasle not in 、"!"、"not like"条件过滤都会过滤掉null值的数据 SELECT * from temp; SELECT * from temp where score not in (70); 返回null解决方法: SELECT * from temp where score not in (70) or score is null;SELECT…