Linux知识点 -- 网络基础 -- 数据链路层
Linux知识点 – 网络基础 – 数据链路层
文章目录
- Linux知识点 -- 网络基础 -- 数据链路层
- 一、数据链路层
- 1.以太网
- 2.以太网帧格式
- 3.重谈局域网原理
- 4.MAC地址
- 5.MTU
- 6.查看硬件地址和MTU的命令
- 7.ARP协议
- 二、其他重要协议或技术
- 1.DNS(Domain Name System)
- 2.NAT
- 2.1.NAT技术背景
- 2.2.NAPT
- 2.3.代理服务器
- 2.4.NAT和代理服务器
一、数据链路层
1.以太网
“以太网”不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容,例如:规定了网络拓扑结构,访问控制方式,传输速率等;
例如以太网中的网线必须使用双绞线,传输速率有10M, 100M, 1000M等;
以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等;
2.以太网帧格式
数据链路层标识主机唯一性的方案:MAC地址(网卡地址)

- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的;
- 帧协议类型字段有三种值,分别对应IP、ARP、
RARP; - 帧末尾是CRC校验码;
数据链路层如何解包和封装?
- 报头都是固定大小的格式,解包时只需要裁掉固定大小的报头就可以了,封装时也一样;
数据链路层如何向上交付?
- 按类型字段的划分,表明向上交付的数据类型;
3.重谈局域网原理
- 当一台主机在局域网中发送消息,局域网中所有的主机都会收到消息;
- 所有的主机都会对比目的地址,如果不是自己,就直接丢弃消息,只有目的主机会保留消息;
- 局域网本质是一个临界资源,多个主机通信时,任何时刻只能保证只有一个主机在发送;
- 发送的时候发生了碰撞,就会等一段时间再发送;
如果局域网中,同时有多台主机在发送数据,数据之间就发生了碰撞问题;
避免碰撞的算法:发送主机会休息随机时间,然后重新发送;
局域网中还存在交换机,能够减少碰撞的发生:
- 交换机:划分碰撞域,如果识别到碰撞,就不向另一端转发,减少交换机两侧碰撞域的压力

4.MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位及6个字节;一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19);
- 在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址);
对比理解MAC地址和IP地址
- IP地址描述的是路途总体的起点和终点;
- MAC地址描述的是路途.上的每一个区间的起点和终点;
5.MTU
局域网中的主机越少越好,能够减少碰撞的发生;
局域网数据帧发送的时候,数据帧不能太长,也不能太短,数据帧太长容易造成碰撞,太短携带的有效数据太少;
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充;
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
- 如果一个数据包从以太网路由到拨号链路上数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
- 不同的数据链路层标准的MTU是不同的;
MTU对于TCP协议的影响:
- TCP的一个数据报也不能无限大,还是受制于MTU,TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size);
- TCP在建立连接的过程中,通信双方会进行MSS协商,最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU);
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值;
- 然后双方得知对方的MSS值之后,选择较小的作为最终MSS;
- MSS的值就是在TCP首部的40字节变长选项中(kind=2);

MTU = 1500
IP有效载荷 = 1500 - 20 = TCP + 数据 = 1480
数据 = 1480 - TCP报头的长度(20) = 1460
因此MSS不能大于1460字节;
6.查看硬件地址和MTU的命令
使用ifconfig命令,即可查看ip地址,mac地址和MTU;

7.ARP协议
同一个网段中,两台主机之间进行网络通信,发送主机必须知道接收主机的MAC地址,然而,如果我们只知道目标主机的IP地址,而不知道对方的MAC地址,就需要通过目标IP地址,得知对方的MAC地址,这就是ARP协议(地址解析协议),这是一种局域网协议;

ARP数据报格式:

- 源MAC地址、目的MAC地址在以太网首部(MAC地址)和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
- op字段为1表示ARP请求,op字段为2表示ARP应答;
- 发送端IP地址填本主机的IP地址;目的以太网地址就是目标主机的MAC地址,如果不知道,一般填FFFF…(表示广播);目的IP地址填目标主机的IP地址;
ARP协议获取目标MAC地址的过程:
- 当主机A在局域网中向获取主机D的MAC地址时,主机A的ARP数据报如下图所示:

主机A不知道主机D的MAC地址,在目的以太网地址中填的是全F,这样会对局域网中所有的主机进行广播,其他每一台主机都要对数据帧进行处理,解包并向上交付,MAC帧解包后,每一台主机都会拿到该ARP请求,拿到后先看的是op类型,判断是应答还是请求,如果是请求,再看目的IP地址并对比,如果不是自己的IP地址,就丢弃,如果是自己的IP地址,就应答;(ARP层丢弃) - 主机D对A的广播进行应答时,主机D发出的ARP数据报如下图所示:

对于主机D的应答,由于其目的MAC地址不是全F,因此其他主机不会处理该应答,在发现该报文的目的MAC地址是主机A后,直接将该报文丢弃 (MAC层丢弃);主机A收到该应答后,首先应该确认OP类型,再看发送端的IP地址和MAC地址,就拿到了主机D的MAC地址;
结论:
- 任何主机可能之前向目标主机发起过ARP请求,注定了未来会收到对应的ARP应答;
- 任何一台主机,也可能被别人发起ARP请求;
因此,局域网中,任何一台主机收到ARP请求的时候,可能是一个应答,也可能是一个请求; - ARP请求成功之后,请求方会暂时将IP地址和MAC地址的映射关系暂时保存下来,因此不用每次发送数据都要进行ARP协议;
- 不光是在目标最终子网中才会进行ARP,ARP的过程会在网络路径中随时发生,只要两台主机处于一个网段中,就有可能发生ARP;ARP在路由器到路由器之间也可能发生;
- arp -a命令可以获取主机所处局域网中所有主机的IP地址和MAC地址:

- ARP欺骗:伪装成为中间人;

二、其他重要协议或技术
1.DNS(Domain Name System)
DNS是一整套从域名映射到IP的系统;
- TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序,但是IP地址不方便记忆;
- 于是人们发明了一种叫主机名的东西,是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系

最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件的:
- 如果一个新计算机要接入网络,或者某个计算机UP变更,都需要到信息中心申请变更hosts文件;
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网;
这样就太麻烦了,于是产生了DNS系统:
- 一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系;
- 如果新计算机接入网络,将这个信息注册到数据库中;
- 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址;
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称;

域名使用 . 连接:
- com:一级域名,表示这是一个企业域名,同级的还有"net"(网络提供商), “org”(非盈利组织)等;
- baidu:二级域名,公司名;
- www:只是一 种习惯用法,之前人们在使用域名时,往往命名成类,似于.xx.xxxww.xx.xxx这样的格式,来表示主机支持的协议;
有时候,我们的QQ,微信和游戏能够正常运行,但是网页却打不开,这是因为浏览器内置的DNS IP地址对应的服务挂掉了;
2.NAT
2.1.NAT技术背景
NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能;
- NAT能够将私有IP对外通信时转为全局IP,也就是就是一 种将私有IP和全局IP相互转化的技术方法;
- 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的;
NAT IP转换过程

- NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
- NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37替换回10.0.0.10;
- 在NAT路由器内部,有一张自动生成的,用于地址转换的表;
- 当10.0.0.10第一次向 163.221.120.9发送数据时就会生成表中的映射关系;
2.2.NAPT
那么问题来了,如果局域网内有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的,那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了,使用IP+port来建立这个关联关系;

- 其实在进行源地址转换的过程中,可能不一定只替换原IP,必要的时候,源端口也要被替换;
- 路由器在NAT转换的过程中,除了单纯的替换,还会为我们根据报文请求的四元组,为我们构建一个映射关系;
- 源IP表示唯一的一台主机,源端口表示该主机上唯一的一个进程;
源IP + 源端口表示唯一的一个进程,自己在自己的内网中的唯一性; - 无论从内向外,还是从外向内,都能在各自的网络中表示唯一性,所以,这个映射关系是互为KEY值的;
- 这种关联关系也是由NAT路由器自动维护的,例如在TCP的情况下,建立连接时。就会生成这个表项;在断开连接后,就会删除这个表项;
- 如果我从来没有访问过外网,外网能够直接访问内网吗? 理论上不能;
- 但是有很多基于NAT原理的软件,能够帮助我们进行从外网访问内网:内网穿透;
2.3.代理服务器
正向代理服务器:
- 用户所有的请求都要经过代理服务器,再由代理服务器发送给公网接收端服务器,服务器端的响应也需要经过代理发到客户端;
- 其中正向代理服务器会完成身份认证、数据缓存、内容审核、保证内网安全等功能(替用户做事情);
反向代理服务器:
- 在公司的大型机房中,所有用户的请求都会经过一台反向代理服务器,代理服务器将用户请求均衡的分配给每一台服务端主机,保证整个集群的负载均衡;
- 反向代理服务器不会做任何的业务处理,只负责将请求推送到后端的指定主机;
2.4.NAT和代理服务器
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程;
代理服务器看起来和NAT设备有一点像,客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端;
那么NAT和代理服务器的区别有哪些呢?
- 从应用上讲,NAT设备是网络基础设备之一 ,解决的是IP不足的问题;代理服务器则是更贴近具体应用,比如通过代理服务器进行f q,另外像迅游这样的加速器,也是使用代理服务器;
- 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换;代理服务器往往工作在应用层;
- 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网;
fq是正向代理;
相关文章:
Linux知识点 -- 网络基础 -- 数据链路层
Linux知识点 – 网络基础 – 数据链路层 文章目录 Linux知识点 -- 网络基础 -- 数据链路层一、数据链路层1.以太网2.以太网帧格式3.重谈局域网原理4.MAC地址5.MTU6.查看硬件地址和MTU的命令7.ARP协议 二、其他重要协议或技术1.DNS(Domain Name System)2.…...
git服务器宕机后,怎么用本地仓库重新建立gitlab服务器(包括所有历史版本)
一、重新建立 当您的 GitLab 服务器因为某种原因宕机后,您可以使用本地仓库中的备份数据来恢复 GitLab 服务器。以下是一般的步骤,用于重新建立 GitLab 服务器: 注意: 这些步骤假定您已经定期备份了 GitLab 数据,包括…...
华为云云耀云服务器L实例评测 | 实例使用教学之综合导览
华为云云耀云服务器L实例评测 | 实例使用教学之综合导览 实例使用教学实例场景体验实例性能评测实例评测使用介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀云…...
Elasticsearch 高级查询用法
ES(Elasticsearch)查询语法是用于搜索和检索文档的强大工具,它支持多种查询类型和选项。以下是一些常见的查询语法示例: 1. **Match查询**:使用match查询可以执行全文本搜索。 { "query": { …...
网络架构介绍
1 网络 7 层架构 7 层模型主要包括: 1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为1、0…...
第53节——Redux Toolkit初识
一、什么是Redux Toolkit 1、概念 Redux Toolkit是一个官方支持的、用于简化Redux开发的工具集。它提供了一些简单易用的API和工具,可以帮助开发者更快速、更高效地编写Redux应用。 2、主要功能 简化Redux的配置 Redux Toolkit提供了一个createSlice函数&#…...
AndroidStudio报错:Plugin with id ‘kotlin-android‘ not found.
第一步 要在自己的项目的build.gradle的buildscript中添加ext.kotlin_version 1.3.72 第二步 然后在dependencies里添加classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 大体如下: buildscript {ext.kotlin_version 1.3.72r…...
【ADB】借助ADB模拟滑动屏幕,并进行循环
使用adb shell input 的swipe函数(应该是个函数) swipe x1 y1 x2 y2 time(以毫秒为单位) adb shell input swipe 1070 2200 1070 200 10000 进行循环 adb shell "for i in $(seq 1 10); do input swipe 1070 2200 1070 2…...
BN体系理解——类封装复现
from pathlib import Path from typing import Optionalimport torch import torch.nn as nn from torch import Tensorclass BN(nn.Module):def __init__(self,num_features,momentum0.1,eps1e-8):##num_features是通道数"""初始化方法:param num_features:特征…...
请求和响应的概述
请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。 响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。 针对Servlet的每次请求&…...
(深度学习快速入门)A Gentle Introduction to Graph Neural Networks 笔记
博客链接沐神讲解视频文章目录 一:什么是图二:常见数据如何表示为图(1)图像(2)文本(3)Real WorldA:分子B:社交网络C:论文引用D:其他三:图涉及的任务(1)图级别任务(2)节点级别任务(3)边级别任务四:使用图数据的挑战...
VIM指令
vim的工作模式 vim一般有6种工作模式。 普通模式:使用vim打开一个文件时默认模式,也叫命令模式,允许用户通过各种命令浏览代码、滚屏等操作。 插入模式:也可以叫做编辑模式,在普通模式下敲击 i 、a 或 o 就进入插入模…...
Android 10.0 framework层实现app默认全屏显示
1.前言 在10.0的系统开发中,在对于第三方app全屏显示的功能需求开发中,需要默认app全屏显示,针对这一个要求,就需要在系统启动app 的过程中,在绘制app阶段就设置全屏属性,接下来就实现这个功能 效果图如下: 2.framework层实现app默认全屏显示的核心类 frameworks\base\…...
【计算机网络黑皮书】传输层
【事先声明】 这是对于中科大的计算机网络的网课的学习笔记,感谢郑烇老师的无偿分享 书籍是《计算机网络(自顶向下方法 第6版)》 需要的可以私信我,无偿分享,课程简介下也有 课程链接 目录 传输服务与协议网络层与传输…...
轻量限制流量?阿里云轻量应用服务器月流量包收费说明
阿里云轻量应用服务器部分套餐限制月流量,轻量应用服务器按照套餐售卖,有的套餐限制月流量,有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月,这两款是不限制月流量的。阿里云百科…...
Linux手记
常用的配置文件 文件作用/etc/profile系统级别的shell配置文件,它包含了系统中所有用户的默认环境变量和系统级别的全局配置信息/etc/apt/apt.conf配置APT(Advanced Package Tool)软件包管理器的行为,包括代理等/etc/apt/sources…...
springboot配置
一、配置文件的加载顺序 SpringApplication从以下位置的application.properties文件加载属性,并将它们添加到Spring Environment中去,优先级如下: 当前目录的/config子目录(src\config)当前目录(跟src目录…...
大数据中的一些词汇解释
OLTP(online Transaction Prrocessing) OLTP是一个处理面向事务的数据的软件系统。术语“在线交易”是指实时完成活动,而不是批处理。此数据是结构化数据的常见来源,可作为许多分析过程的输入。OLTP交易讲究实时性,就…...
10月11-12日上课内容 Ansible
Ansible Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机。比…...
android studio 我遇到的Task :app:compileDebugJavaWithJavac FAILED问题及解决过程
前几天一个网友在学习我的一个小项目的时候,发现无法达到目的,在帮他解决问题的过程中发现他用的是最近的giraffe版本的as,我用的是老版本,没办法打开他的项目,没办法只能卸载我的as,安装了最近版的diraffe…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
