diff --git a/README.md b/README.md index 98760047..f5705a72 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ > 用来记录各个科目的markdown笔记,并逐渐从有道云笔记将内容移植过来。 +> 关于笔记记录的说明:我觉得笔记记录的内容过于细节。所有的知识应该以书上为准。整理笔记的目的应该是作为一种快速参考或者索引,而不是详细的记录所有的细节。说实话,我觉得你的笔记废话太多,自己都不一定会看。 +> 我觉得是时间放弃你愚蠢的笔记策略了。 + ## 1 分类标题(用来描述主题的各个方面或者分类) diff --git a/Reference/Human-agent.md b/Reference/Human-agent.md new file mode 100644 index 00000000..ac9a67e7 --- /dev/null +++ b/Reference/Human-agent.md @@ -0,0 +1,68 @@ +# Human-agent +## Human Conmputer Interaction + +Internal Locus of Control +人具有绝对的主导作用。 +=> Human-AI interaction +人没有绝对的主导权 + +## Human-Agent Collective + +对人工智能的支持与反对,引发对人工智能能利弊的思考。 + +人与AI组成的共生态。 +### 生态特点 +* flexible autonomy 要有灵活的自主性。 +autonomously whitout reference to their owner +human in/over/out of the loop + +* agile teaming +dynamically合作方式动态变化 + +* incentive enginnering + +* accountable informationg infrastructure +可以去解释原因,人能理解的结果。可解释AI,能够满足人的逻辑的结果的解释。能够对AI最优解提供具有说服力的解释。这也作为与人类狗同的一部分。 + +### Ethical AI vs. Human-Agent Collective对比 +人工智能伦理学与智能体生态 +伦理学衡量一件事的维度:数量、规则、价值。 + +面对道德问题时,如何设计系统。 + +DP 差分隐私保护。一种隐藏数据但能保重同态分布的方案。 + +## Collective Ethical Decision-making + +多agent网络信任传递 + +分工(不同构)agent + +联邦学习-把最好的数据以最快的速度拿出来。 + +多智能体-对抗->优化最后的解释。 + + + +## 案例1-劝说别人 + +生成短视频在淘宝上买东西。 + +wundt curve刺激节奏曲线。包括情绪、 + +利用9张图生成短视频。 + +## 案例2-医学系统 + +channel 诊断。初步分析病因,将病人分配给具体领域的专家。 + + +## 案例3-超时招聘 + +分布式训练模型,用于选择合适的临时工。 + + + +value senesitive design +用来发现潜在的价值。 + diff --git a/概率论与数理统计/第10节 Minimax估计和Bayes估计.md b/概率论与数理统计/第10节 Minimax估计和Bayes估计.md new file mode 100644 index 00000000..292eb9fe --- /dev/null +++ b/概率论与数理统计/第10节 Minimax估计和Bayes估计.md @@ -0,0 +1,58 @@ +# Minimax估计和Bayes估计 + +## 1 一致占优 +### 损失定义 +损失,是一种距离。 +$$ +L(\theta,T(x))=(T(x)-\theta)^2 +$$ + +> 损失函数,这只是鬼畜了风险函数的一种 +### 风险函数 +风险,平均损失 +$$ +R(\theta,T)=E_XL(\theta,T(x))=E_X(T(x)-\theta)^2 +$$ + +> 均方误差是损失函数的期望,也是一种风险 + +### 一致占优 + +$$ +R(\theta,T_1)\leq R(\theta,T_2),\forall \theta +$$ + +## 2 Minimax估计 +### Minimax +$$ +\sup_\theta R(\theta,T_1)\leq \sup_\theta(\theta,T_2) +$$ +先找到最大风险,再找到最大风险最小的策略 + +## 3 Bayes估计 +> 把参数\theta当成随机变量处理 +### + +$$ +E_\theta(R(\theta,T_1))\leq E_\theta(R(\theta,T_2)) +$$ + +$E_theta$与$E_X$不同,在bayes理论中,条件期望 +$$ + +E_X(L(\theta,T(X)))=\sum L(theta,T(X))p(x|\theta)dx +$$ + +### 先验概率 后验概率 +h(\theta|x)=p(x|\theta)\pi(\theta) + +* 假设 +$$ +L(\theta,T(X))=(T(X)-q(\theta)) +$$ +* 结论 + + +$$ + +$$ \ No newline at end of file diff --git a/概率论与数理统计/第5节 参数估计.md b/概率论与数理统计/第5节 参数估计.md deleted file mode 100644 index c009c5e2..00000000 --- a/概率论与数理统计/第5节 参数估计.md +++ /dev/null @@ -1,41 +0,0 @@ -# 参数的点估计 - -## 1 参数及其估计 - -假设存在$p(x,\theta)$总体分布簇。将与总体有关的待估计的量看成参数,包括$\theta$和与$\theta$的函数$q(\theta)$。例如总体的数学期望$E(X)$与方差$Var(X)$。 -> 可以将总体的期望和方差看做总体的本身的一种属性。 - -### 定义 -用于估计参数$\theta or q(\theta)$ -样本的统计量$T(X_1,X_2,\dotsm,X_n)$ -称为估计量或估计值。构造统计量$T(x_1,x_2,\dotsm,x_n)$作为参数$q(\theta)$的估计。 -$$ -\hat{q}(x_1,x_2,\dotsm,x_n)=T(x_1,x_2,\dotsm,x_n) -$$ - - -## 2 频率替换原理 - -n次重复独立实验,每次实验中有m个可能的结果$v_1,v_2,\dotsm,v_i$。每个结果的概率为$p_i$。用$n_i$表示n次独立重复实验中$D_i$发生的次数,则分布律为: -$$ -p(n_1,n_2,\dotsm,n_m)=\frac{n!}{n_1!n_2!\dotsm n_m!}p_1^{n_1}p_2^{n_2}\dotsm p_m^{n_m} -$$ -概率=频率。前者是形式计算、估计量;后者是统计计算、统计量。 -$\hat{p}=\frac{n_i}{n}$是$p_i$的频率估计 - -形式计算:可以计算均值方差,包含未知数。统计量:基于样本能够计算均值、方差。二者可以建立方程。 - -可以基于联合概率进行计算 -$P(x_1,x_2,\dotsm,x_n,\theta)=f(\theta)$ - -## 替换原理 - -n次重复独立实验,每次实验中有k个可能的结果$v_1,v_2,\dotsm,v_i$。每个结果的概率为$p_i$ - -### 频率估计 - -## 3 矩估计 - -### 通过概率分布函数或者联合概率。 -联立方程组解未知数。 -## 4 极大似然估计 diff --git a/概率论与数理统计/第5节 参数点估计.md b/概率论与数理统计/第5节 参数点估计.md new file mode 100644 index 00000000..ed7b21ac --- /dev/null +++ b/概率论与数理统计/第5节 参数点估计.md @@ -0,0 +1,116 @@ +# 参数的点估计 + +## 1 参数及其估计 + +假设存在$p(x,\theta)$总体分布簇。将与总体有关的待估计的量看成参数,包括$\theta$和与$\theta$的函数$q(\theta)$。例如总体的数学期望$E(X)$与方差$Var(X)$。 + +> 可以将总体的期望和方差看做总体的本身的一种属性。 + +### 定义 +用于估计参数$\theta$ 或 $q(\theta)$ +样本的统计量$T(X_1,X_2,\dotsm,X_n)$ +称为估计量或估计值。构造统计量$T(x_1,x_2,\dotsm,x_n)$作为参数$q(\theta)$的估计。 +$$ +\hat{q}(x_1,x_2,\dotsm,x_n)=T(x_1,x_2,\dotsm,x_n) +$$ + + +## 2 频率替换原理 + +### 定义 +n次重复独立实验,每次实验中有m个可能的结果$v_1,v_2,\dotsm,v_i$。每个结果的概率为$p_i$。用$n_i$表示n次独立重复实验中$D_i$发生的次数,则联合分布概率为: +$$ +p(n_1,n_2,\dotsm,n_m)=\frac{n!}{n_1!n_2!\dotsm n_m!}p_1^{n_1}p_2^{n_2}\dotsm p_m^{n_m} +$$ +概率=频率。前者是形式计算、估计量;后者是统计计算、统计量。$\hat{p}=\frac{n_i}{n}$是$p_i$的频率估计。 + +> 形式计算:可以计算均值方差,包含未知数。统计量:基于样本能够计算均值、方差。二者可以建立方程。 + +### 含义理解 + +每一个$p_i$可以用多个参数$\theta_i$表征。每一个$p_i$又可以通过频率替换的方法来表示。可以建立方程,使用频率替换的方法计算位置参数$\theta_i$。这个过程称为频率替换的参数估计。 + +### 频率替换估计过程 + +$$ +\begin{cases} + p_1 = h_1(\theta_1,\dotsm,\theta_s)\\ + \dotsm \\ + p_m = h_m(\theta_1,\dotsm,\theta_s) +\end{cases} +$$ +反解方程组得: +$$ +q(\theta)=g(p_1,\dotsm,p_m) + +$$ +频率替换原理得: +$$ +q(\theta)=g(\frac{n_1}{n},\dotsm,\frac{n_m}{n}) +$$ + + +## 3 矩估计 + +### 定义 + +总体分布族$\{p(x;\theta):\theta\in\Theta\}$ + +参数$\theta=(\theta_1,\dotsm,\theta_s)$ + +样本的k阶原点矩$A_k=\frac{1}{n}\sum_{i=1}^nx_i^k,k=1,2,\dotsm$ + +总体的r阶原点矩$\mu_r=E_\theta(|X|^r)$ + +由大数定律克制,若总体距存在,则样本矩依概率收敛于响应的总体矩。 + +### 含义理解 +每一个r阶原点矩$u_r$可以用多个参数$\theta_i$表征。每一个$u_r$又可以通过样本原点矩替换的方法来表示。可以建立方程,使用样本原点矩计算参数$\theta_i$。这个过程称为矩估计。 + +### 矩估计过程 + + +$$ +\begin{cases} + u_1 = g_1(\theta_1,\dotsm,\theta_s)\\ + \dotsm \\ + u_r = g_r(\theta_1,\dotsm,\theta_s) +\end{cases} +$$ +反解方程组得: +$$ +q(\theta)=h(u_1,\dotsm,u_r) +$$ +频率替换原理得: +$$ +q(\theta)=g(A_1,\dotsm,A_r) +$$ +## 4 极大似然估计 + +### 定义 +参数空间$\Theta$,**似然函数**: + +$$ +L(\theta,x_1,\dotsm,x_n)=L(\theta,x)=L(\theta)= {\Pi_{i=1}^n} p(x_i;\theta) +$$ + +$\theta=\hat{\theta}$时取最大值,**极大似然函数MLE**: + +$$ +L(\hat{\theta})=sup\{L(\theta)\} +$$ + +我们不关注最大值是多少,我们只关心似然函数取最大值的时候,自变量、参数$\theta$的取值是多少。$\ln L(\theta)$是**对数似然函数**,最大值具有相同的$\hat{\theta}$。对于多个$\theta_i$可以得到**似然方程组**: + +$$ +\frac{\partial\ln L(\theta)}{\partial\theta_i}=0 +$$ + + + +### 理解 +在给定样本观察值的条件下,用使这组样本观察值出现概率最大的$\hat{\theta}$作为$\theta$的的估计。 + +在样本的实验中出现了一种情况。这总情况可以用带参数的联合概率计算公式表示。在参数范围取参数的一个值使得本次实验的情况达到最大值。 + +### 例题 diff --git a/概率论与数理统计/第6节 估计量的评优准则.md b/概率论与数理统计/第6节 估计量的评优准则.md index d79f217e..bb5feeb7 100644 --- a/概率论与数理统计/第6节 估计量的评优准则.md +++ b/概率论与数理统计/第6节 估计量的评优准则.md @@ -1,8 +1,176 @@ # 估计量的评优准则 +> 数学在某些方面具有通用规律。比如导数与指数,本来两个毫不相关的东西,却存在着很默契的联系。 +> * n阶求导可以降低幂函数的n阶指数。 +> * 在泰勒展开式中,就通过n阶导数与n阶指数来从不同阶次逼近一个函数。 +> +> 而在概率统计这一部分,n阶矩与n阶指数n阶导数也有着关系。似乎一个统计量可以展开成n阶矩的表示方法,一阶中心距逼近,二阶中心距逼近,三阶中心距逼近等。 + +> UMVUE 计算必考 + + ## 1 均方误差准则 +### 均方误差定义 + +$$ +MSE_\theta(T(x))=E_\theta[T(X)-q(\theta)]^2 \\ +$$ +若$MSE<+\infin$ +$$ +MSE_\theta(T(x))=Var_\theta(T(x))+E^2_\theta[T(X)- q(\theta)] +$$ +上式成立,因为方差加减一个常数,不影响方差的大小。 + +### 评优准则 + +$$ +MSE_\theta(T(x))\leq MSE_\theta(S(x)) +$$ +则成T(x)比S(x)好。 + ## 2 无偏估计 +### 定义 +$$ +E(T(x))=q(\theta) \\ +MSE_\theta(T(x))=Var_\theta(T(x)) +$$ +则成为无偏估计。 + +> 关于估计:统计量对参数的估计。 +> +> 一阶中心距为零的时候,为无偏估计。此时只有二阶中心距与更高阶中心距存在。 + +### 说明 +* 无偏估计对参数空间中所有的取值都成立。 +* 无偏估计可能不存在 +* 若无偏估计存在,则一般是不唯一的。 +* 均方误差准则下,无偏估计不一定是好的估计。 +* 函数变换下,无偏性可能会小时。 + +### 定义-可估的 + +若参数$q(\theta)$的无偏估计存在,则称$q(\theta)$是可估的。表示为 +$$ +U_q=\{T(x):E_\theta(T(x))=q(\theta),Var_\theta(T(x))<\infin,\forall\theta\in\Theta\} +$$ + + +## 3 一致最小方差无偏估计UMVUE + +### 定义 +若存在无偏估计,对参数空间中的任意一个估计量: +$$ +Var_\theta(T^*(x))\leq Var(T(x)) +$$ +则称$T^*(x)$为参数$q(\theta)$的一致最小方差无偏估计。 + +### 存在性定理 +T(x)是一致最小方差无偏估计的等价条件: +$$ +T(x)\in U_q,\forall T_0(x)\in U_0,\forall\theta\in\Theta \\ +E_\theta[T_0(x)T(x)]=0 +$$ + +### 线性可加性 +(→表示一致最小方差无偏估计) +若 +$$ +T_1(x)\rightarrow q_1(\theta) \\ +T_2(x)\rightarrow q_2(\theta) +$$ +则 +$$ +aT_1(x)+bT_2(x)\rightarrow aq_1(\theta)+bq_2(\theta) +$$ + +### 唯一性定理 + +一致最小方差无偏估计是唯一的。 + +## 4 充分统计量 +> 基于充分统计量的无偏估计 + +> 对充分统计量的理解,充分统计量能够完整的反映未知参数$\theta$的变换关系。当充分统计量确定后,未知参数也确定了,则整个等式会减少一维的未知关系。 +> +> 说实话我觉得这里的总结理解更像是一种哲学关系。不是面对具体问题的数学方法,而是针对大多数数学方法的抽象统一。 +### 充分无偏统计量定理 +假设 +$$ +S(x)是充分统计量,\varphi(x)\in U_q是\theta的无偏估计\\ +给定S(x)下的条件数学期望:\\ +T(x)=E_\theta(\varphi(x)|S(x)) +$$ +结论 +$$ +T(x)是q(\theta)的无偏估计。\\ +Var_\theta(T(x))\leq Var_\theta(\varphi(x))\\ +当且仅当T(x)=\varphi(x)时等号成立。 +$$ + +### 充分无偏估计 + + +充分统计量$S(x)$的函数$h(S(x))$作为参数$q(\theta)$的无偏估计。则成$h(S(x))$是$q(\theta)$的充分无偏估计量。 + +若$h(S(x))$是$q(\theta)$的无偏估计,则称估计量$h(S(x))$为参数$q(\theta)$的充分无偏估计。 + +$$ +U_q^S=\{T(x)=E_\theta(\varphi(x)|S(x)): \\ E_\theta(T(x))=q(\theta),Var_\theta(T(x))<\infin,\forall\theta\in\Theta\} +$$ + +T(x)是S(x)的函数,是充分估计量。T(x)是无偏估计。所以T(x)是充分无偏估计量。 + +## 5 充分完全统计量 + +> 基于完全统计量的一致最小方差无偏估计。 + +### 定义 + +$g(X)是任一随机变量。对于所有的\theta\in\Theta,E_\theta(g(X))=0 则称分布族\{P_\theta:\theta\in\Theta\}$是完全的。完全分布族总体的样本的统计量,是完全统计量。 + +### 定理2.2.4 + +条件 +$$ +x_1,\dotsm,x_n是总体{P_\theta:\theta\in\Theta}的简单样本。\\ +总体密度函数p(x,\theta)\\ +联合密度函数p(x_1,\dotsm,x_n;\theta)= \\ c(\theta)h(x_1,\dotsm,x_n)exp\{\sum_{k=1}^mw_k(\theta)T_k(x_1,\dotsm,x_n)\} \\ +h(x_1,\dotsm,x_n)仅仅是x的函数。c(\theta)仅是\theta的函数 \\ +w(\theta)是m维实值函数。 +$$ +假设 +$$ +m维度w_m(\theta)值域包含内点。 +$$ +结论 +$$ +m维统计量T_m(x_1,\dotsm,x_n)是完全充分统计量。 +$$ + +### 定理2.2.5 + +假设 +$$ +S(x)是完全统计量\\ +\varphi(x)是q(\theta)的方差有限的无偏估计,\varphi(x)\in U_q\\ +$$ +结论 +$$ +T(x)=E_\theta(\varphi(x)|S(x))是q(\theta)唯一的一致最小方差无偏估计。 +$$ + +## 6 求解无偏估计 + +当UqS是完全充分的时候,其内只有一个元素。因为完全统计量的 + + +完全统计量+充分统计量S(x)+无偏估计=一致最小无偏估计UMVUE + +1. hh +证明统计量的充分性--】-证明统计量完全性---构造无偏估计。 +2. jj + +求一个无偏估计---对完全充分统计量取条件期望=一致最小方差无偏估计UMVUE -## 3 一致最小方差无偏估计 \ No newline at end of file diff --git a/概率论与数理统计/第7节 信息不等式.md b/概率论与数理统计/第7节 信息不等式.md new file mode 100644 index 00000000..58c2ce54 --- /dev/null +++ b/概率论与数理统计/第7节 信息不等式.md @@ -0,0 +1,50 @@ +# 信息不等式 + +> 计算无偏估计的下界。 +> 知道UMVUE与无偏估计下界的关系。 + +## 相关定义 + +### Cramer-Rao正则族 + +* 声明 +$$ +\{p(x;\theta):\theta\in\Theta\} +$$ + +* 假设 +$$ +A_\theta={x:p(x;\theta)>0}与参数\theta 无关\\ +\frac{\partial\ln p(x;\theta)}{\partial\theta}存在,\forall x\in A_\theta,\forall\theta\in\Theta\\ +\frac{\partial}{\partial\theta}\int_{-\infin}^{+\infin} T(x_1,\dotsm,x_n)p(x_1,\dotsm,x_n;\theta)dx_1\dotsm dx_n=\\ \int_{-\infin}^{+\infin}T(x_1,\dotsm,x_n)p(x_1,\dotsm,x_n;\theta)dx_1\dotsm dx_n +$$ +* 结论 +$$ +\{p(x;\theta:\theta\in\Theta)\}是Cramer-Rao正则族 +$$ +* 说明 + + 三个条件可以描述为:x与$\theta$无关,偏导存在,统计量与$\theta$无关。 + +### Fisher信息量 +* 假设 +$$ +Cramer-Rao正则族 +$$ +* 结论 + +$$ + +Fisher信息量:I(\theta)=E_\theta[\frac{\partial}{\partial\theta}\ln p(x;\theta)]^2 \\ +0\leq I(\theta)\leq +\infin +$$ + +* 假设 +$$ +\frac{d^2}{d\theta^2}\int_{-\infin}^{+\infin}p(x;\theta)dx=\int_{-\infin}^{+\infin}\frac{\partial^2p(x;\Theta)}{\partial\theta^2}dx +$$ +* 结论 + +$$ +I(\theta)=-E_\theta[\frac{\partial^2}{\partial\theta^2}\ln p(x;\theta)] +$$ \ No newline at end of file diff --git a/概率论与数理统计/第7节 其他估计内容.md b/概率论与数理统计/第7节 其他估计内容.md deleted file mode 100644 index 4afb73f1..00000000 --- a/概率论与数理统计/第7节 其他估计内容.md +++ /dev/null @@ -1,5 +0,0 @@ -# 其他估计方法 - -> 这节课没怎么听,需要问一下别人数学课讲了啥。 - -## \ No newline at end of file diff --git a/概率论与数理统计/第8节 相合估计.md b/概率论与数理统计/第8节 相合估计.md new file mode 100644 index 00000000..4a1c57e5 --- /dev/null +++ b/概率论与数理统计/第8节 相合估计.md @@ -0,0 +1,42 @@ +# 相合估计 + +## 1 相合估计 +### 定义:相合估计 +* 声明 +$$ +\hat{q_n}=\hat{q}_n(x_1,\dotsm,x_n)是参数q(\theta)的任意估计序列。 +$$ +* 假设 + +$$ +\{\hat{q}_n\}依概率收敛于参数q(\theta) +$$ +* 结论 +$$ +对任意的\varepsilon>0\\ +\lim\limits_{n\rightarrow\infin}P_\Theta\{|\hat{q}_n-q(\theta)|\geq\varepsilon\}=0,\theta\in\Theta\\ +\hat{q}_n是q(\theta)的相合估计。 +$$ +> 简单来说就是满足大数定律的趋近。需要补充大数定律相关的不等式。 + +### 定理2.4.1:函数 + +* 假设 + +$$ +\hat{q_n}是q(\theta)的相合估计\\ +g(y)在y=q(\theta)处连续\\ +$$ +* 结论 + +$$ +g(\hat{q_n})是g(q(\theta))的相合估计 +$$ + +> 频率估计、矩估计、极大似然估计都是相合估计。 +> 统计量的计算过于复杂,可以使用特征函数来简化计算。所以特征函数到底是一个什么东西。 + +### 定义:渐进正太统计量估计量 + + +> 均值、频率估计、矩估计、极大似然估计都是渐进正太统计量估计量。 \ No newline at end of file diff --git a/概率论与数理统计/第9节 区间估计.md b/概率论与数理统计/第9节 区间估计.md new file mode 100644 index 00000000..a3dd480a --- /dev/null +++ b/概率论与数理统计/第9节 区间估计.md @@ -0,0 +1,23 @@ +# 区间估计 + +## 1 概述 + +### 定义 + +* 声明 +$$ +总体分布族\{P_\theta:\theta\in\Theta\}\\ +存在统计量T_1(x),T_2(x),给定的\alpha(0<\alpha<1) +$$ +* 假设 +$$ +P_\theta\{T_1(x_1,\dotsm,x_n)\leq\theta\leq T_2(x_1,\dotsm,x_n)\}\geq1-\alpha +$$ +* 结论 +$$ +随机区间[T_1,T_2]为参数\theta的置信水平为1-\alpha的置信区间\\ +T_1为置信下限,T_2为置信上限,1-\alpha为置信水平置信度 +$$ + +## 2 枢轴变量法 +> t分布当自由度超过45之后可以看做N正太分布。 \ No newline at end of file diff --git a/程序设计语言原理/image/发展历史.png b/程序设计语言原理/image/发展历史.png new file mode 100644 index 00000000..80628aca Binary files /dev/null and b/程序设计语言原理/image/发展历史.png differ diff --git a/程序设计语言原理/image/词法分析.png b/程序设计语言原理/image/词法分析.png new file mode 100644 index 00000000..d3a21c26 Binary files /dev/null and b/程序设计语言原理/image/词法分析.png differ diff --git a/程序设计语言原理/第1节 绪论.md b/程序设计语言原理/第1节 绪论.md new file mode 100644 index 00000000..3681bb67 --- /dev/null +++ b/程序设计语言原理/第1节 绪论.md @@ -0,0 +1,35 @@ +# 绪论 + +## 1 语言 + +### 语言的一般特性 +* 媒体性 +* 规范性 +* 演进性 +* 抽象性 +* 冗余多义性 + +### 程序设计语言的特性 + +* 人工语言 +* 对象是机器 +* 用于表达软件 + +### 程序设计语言的作用 + +* +## 2 程序设计语言的定义与处理器 + +### 解释器 +解释器读入一段相对完整源代码(多数情况下是一句)翻译为目标代码后,立即解释执行。 + +### 编译器 + +编译器读入一个独立的编译单元(程序的逻辑单元,如主程序 、函数,子程序。或若干个逻辑单元组成的编译单元,如文件、模块、包) 翻译为可执行的目标代码单元,经过连接必要的库支持例程成为可执行内存映象,加载到内存中运行,由于是按单元翻译,可以经过上下文分析作若干次优化,目标代码质量高。 + +### 元语言(metalanguage) + +表达每一个语法特征 +* 字符集、词条表由它们提供标识符、运算符、关键字、空格、限制符、各种数字量、字符串常量等语法概念。 +* 注释 注释符号之内(或以后)的符号串是为人们阅读,处理器要略去的。 +* 语法结构定义,定义以上符号组合的合法结构。它给出语句、表达式、程序单元、块(如FORTRAN的循环域)、作用域、嵌套与结合等语法概念。 diff --git a/程序设计语言原理/第2节 发展与分类.md b/程序设计语言原理/第2节 发展与分类.md new file mode 100644 index 00000000..8a4f53fe --- /dev/null +++ b/程序设计语言原理/第2节 发展与分类.md @@ -0,0 +1,66 @@ +# 发展与分类 + +## 1 历史 + + +![](\image/发展历史.png) + +## 2 分类 + +### 对机器依赖程度 + +* 低级语言 +* 中级语言 +* 高级语言 + +### 应用领域 + +### 实现计算方式 +* 编译型语言 +* 解释型语言 + +### 使用方式 +* 交互式语言 +* 非交互式语言 + +### 程序设计范型 +> 单范型语言、多范型语言 + + +* 命令式语言 +* 面向对象语言 +* 数据流语言 +* 函数式语言 +* 逻辑式语言 +* 并发程序设计语言 + + +### 断代 + +* 第一代:机器语言 +* 第二代:汇编语言 +* 第三代:高级语言 +* 第四代:非过程语言 +* 第五代:自然语言(人工智能) + +## 3 形式语言与图灵机 + +### 形式语言特点 + +* 符号集 +* 转换规则 + +### 图灵机五元组 +$$(q_i,S_j,S_k,(R,L,N),q_j)$$ +机器当前状态读入$S_j$后写入$S_k$,进行操作$R/L/N$,转换为装填$q_j$。 + +### 指令系统 + +* CISC(reduced instruction set computer)。指令复杂,执行较慢。不利于大规模集成电路设计。 +* RISC(complex instruction set computer)。简化了指令系统,适合大规模集成电路设计。执行速度快。提供高级程序设计语言支持,简化了编程设计过程。 + +## 4 发展过程 + +* 汇编语言。与机器指令一一对应。 +* 虚拟机,在计算机机器语言之上,虚拟各种不同语言的计算机环境。 +* 语言要求:Go、Python、Scala。 diff --git a/程序设计语言原理/第3节 设计概述.md b/程序设计语言原理/第3节 设计概述.md new file mode 100644 index 00000000..7f62ab77 --- /dev/null +++ b/程序设计语言原理/第3节 设计概述.md @@ -0,0 +1,51 @@ +# 设计概述 + +## 1 表示与抽象 + +自然语言描述、高级语言表示、汇编语言表示、机器语言表示,是同一个程序在不同抽象层次上的表示。 +### 不同抽象层次 +* 客观世界自然语言描述 +* 数学模型数学语言描述 +* 程序设计程序语言描述 +* 机器指令机器语言描述 + +## 2 设计目标 + +### 具体目标 +定义一组能表示某种范型的特征集,每个特征有严格定义并可在机器上高效实现,程序员可灵活运用这些特征表达它所希望的任何计算。 + +### 评价标准 +* 模型有力 Model Power +* 语义清晰 Semantic Clarity +* 移植性好 Portability +* 可读性好 Readability +* 程序质量 Quality +* 安全性 +* 并发 +* 方便 Convenience +* 简单 Simplicity +* 高效 Efficiency +* 灵活性 Flexibility +* 可扩充性 Extensible +* 可重用性 Reusable + + +## 3 设计准则 + +### 具体准则 +* 频度准则:越常用越简单 +* 结构一致:程序结构和计算的逻辑结构一致,可读、方便 +* 局部性 Locality: + - 只有全局变量 Basic + - 不鼓励全局变量 Pascal, C + - 无全局变量函数式 Java +* 词法内聚 Lexical Coherence : 变量在使用处就近声明(Pascal 声明和语句严格分开) +* 语法一致性 +* 安全性Security +* 正交性和正规性 +* 数据隐藏。封装,以名字封装内部数据设计者可见使用者不可见 +* 抽象表达 + + +## 4 规格说明 + diff --git a/程序设计语言原理/第1节 语言原理概述.md b/程序设计语言原理/补充:Fortran补充.md similarity index 100% rename from 程序设计语言原理/第1节 语言原理概述.md rename to 程序设计语言原理/补充:Fortran补充.md diff --git a/程序设计语言原理/补充:编译原理.md b/程序设计语言原理/补充:编译原理.md new file mode 100644 index 00000000..f154ffde --- /dev/null +++ b/程序设计语言原理/补充:编译原理.md @@ -0,0 +1,87 @@ +# 程序设计语言规格说明 + +## 1 语言字符集 + +允许出现在语言的程序里出现的字符的全体 + +## 2 词法 +### 词法定义 + +构成程序的基本词法元素包括标识符、运算符、字面量、注释等。复杂的词需要明确定义的构词法,即词法 + + +### 词法元素 + +* 标识符:文字形式的词法对象,用于表示语言里的关键字、程序对象的名字 +* 关键字:语言规定了特殊意义的标识符 +* 保留字:语言中规定了特殊意义,而且不允许程序员用于其他用途的标识符,C语言中的关键字都是保留字。 +* 运算符:有预定义意义的特殊字符或特殊字符序列。语言定义的运算、算术运算、逻辑运算 +* 分隔符:用于分隔程序里的不同词法元素的特殊符号或标识符。空格,换行和制表符 + +### 词法分析 + +* 由程序的字符序列得到词法元素序列的过程就是词法分析。 +* 编译器处理表示源程序的字符序列,根据词法规则做词法分析,将 源程序切分为符合词法的段,识别出源程序的有意义单词 +* 词法分析得到一个(表达被分析的源程序的)单词流,流中各单词 标明了词法类别。 +* 词法分析中抛弃所有无保留价值的分隔符(如空白符)和噪声词 +* 词法分析通常采用最长可能原则,确定可能成为单词的最长字符串。 + +### 词法分析语法分析总过程 +![](\image/词法分析.png) + +## 3 语法 + +### 语法定义 +语法用于确定一个输入序列是否合法的程序。程序存在多个不同层次的合法性问题:局部结构、上下文关系(静态语法结构)、深层问题(动态语法结构)。静态语法结构可以在编译过程中进行检查,动态语法结构只能在程序执行过程中检查合法性。 + +### 文法定义 + +文法产生符合语法的语言规则。 + +### 文法描述 +$$ +G=(S,N,T,P) S∈N,T∩N=Φ^* +$$ + +* T是终结符号串的有限集。 +* N是非终结符号串的有限集。T∩N = Φ,即它们是不相交的。 +* S是起始符号串, S∈N。 +* P是产生式 + +$$ +α→β \\α,β∈(T∪N)^* +$$ +* “→”表示左端可推导出右端,如α→β, α→Υ, α→δ则可写为:α→β|Υ|δ +* 如果产生式将语言的非终结符中的每一个标记都推得为终结符号, 则这一组产生式集即为该语言的全部文法。 + +## 4 Chomsky的四种文法 + +产生式左符号集→右符号集,由左符号集推导出右符号集。 + +### 0型文法 +$$ +α→β α∈(N∪T)+,β∈(N∪T)* +$$ +递归可枚举语言 图灵机可以识别 + + +### 1型文法 +$$ +αAβ→αBβ α,β∈(N∪T)*,A∈N, B∈(N∪T)+ +$$ +上下文相关文法上下文敏感语言 线性有界自动机可识别 + +### 2型文法 +$$ +A→α α∈(NUT)*,A∈N +$$ +上下文无关文法语言 非确定下推自动机可识别 + +### 3型文法 +$$ +A→αB|Bα α∈T*, A, B∈N +$$ +正则文法、正则语言、有限自动机可以识别,可消除右端非终法符,P可以成为终结符表达式。 + + + diff --git a/计算机网络/0 目录说明.md b/计算机网络/0 目录说明.md new file mode 100644 index 00000000..355d1503 --- /dev/null +++ b/计算机网络/0 目录说明.md @@ -0,0 +1,76 @@ +知识目录 + +> 可以利用树形图或者思维导图的形式,制定自己的知识目录。 + +协议与技术目录 + +----- + +# 计算机网络 + +## 五层模型 +## 数据单元及长度 +## 网络协议 + +## 因特网 +## 网络构成 +## 网络性能 +## 网络功能 + +----- + +# 应用层协议 +## 1 协议原理 +## 2 HTTP协议 +## 3 FTP协议 +## 4 邮件协议 +### SMTP协议 +### POP3协议 +### IMAP协议 +## 5 DNS +## 6 P2P + +----- + +# 传输层协议 +## 1 基本原理 +## 2 UDP协议 +## 3 可靠数据传输原理 +## 4 TCP协议 +## 5 TCP可靠数据传输 +## 6 TCP拥塞控制 + +----- + +# 网络层协议 +## 1 基本原理 +## 2 网际协议 +### IPV4协议 +### CIDR编址 +### NAT地址转换 +### ICMP协议 +### IPV6协议 + +## 3 路由算法 +## 4 路由协议 +### RIP路由信息协议 +### OSPF开放最短路优先 +### BGP协议 + +----- + +# 链路层协议 +## 1 基本原理 +## 2 多路访问MAC协议 +### 信道划分协议 +### 随机接入协议 +### 轮流协议 +## 3 交换局域网 +### 以太网协议 +### ARP地址解析协议 +### VLAN +## 4 数据中心 + +----- + +# 无线网络和移动网络 diff --git a/计算机网络/0.1 横向总结.md b/计算机网络/0.1 横向总结.md new file mode 100644 index 00000000..a3cd092c --- /dev/null +++ b/计算机网络/0.1 横向总结.md @@ -0,0 +1,61 @@ + +## 常见地址说明 + +### MAC地址 + +### IPV4地址 + +### IPV6地址 + +### 广播地址与广播域 + +主机位都为1,是广播地址。 + +本质上广播地址是全为1的mac地址,广播是链路层的概念,对于广播帧,二层交换机会向每一个接口复制转发。 + +广播域用来区分是否属于同一个网络地址(与主机地址对应)也就是同一个网段。用VLAN来划分不同的网段,区分不同的广播域。而不需要路由器进行转发,就实现了局域网的组建。 + + +广播域-相同的网络地址-同一个局域网 +二层交换机VLAN-区分广播域-不同的网络地址-不同局域网的转发 + + +### 网络地址(网络号)、主机地址(主机号)、子网掩码 + + +将IP地址分为网络地址与主机地址。通过子网掩码,就可以判断两个IP在不在一个局域网内部。子网掩码可以看出有多少位是网络号,有多少位是主机号。 + + +### 网关接口 + +网间连接器、协议转换器。实现局域网与广域网的互联。 + +## 常见表格说明 + +### 路由表 + +### 交换机表 + +### ARP表 + +### NAT表 + + +## 常见网络设备说明 + +### 集线器 +* 概述:集线器工作在局域网(LAN)环境,像网卡一样,应用于OSI参考模型第一层,因此又被称为物理层设备。共享带宽的设备,可以实现多台电脑同时使用一个进线接口来上网或组成局域网 。所有的端口属于同一个冲突域和广播域。对端口接收到的电信号进行复制、整型、放大,以扩大网络传输的距离,同时把所有节点的连线集中在以他为中心的端口上。它的每个端口具有接收和发送数据的功能,将比特信号复制转发。 + +### 交换机 +* 概述:属于OSI的第二层数据链路层设备。独享带宽的设备,可以实现多台电脑同时使用一个进线接口来上网或组成局域网。交换机最大的好处是快速,由于交换机只须识别帧中MAC地址,直接根据MAC地址产生选择转发端口算法简单,转发速度极高。 + +* 工作原理:交换机内部采用背板总线交换结构,为每个端口提供独立的共享介质,每个冲突域只有一个端口。 + +### 路由器 +路由器属于OSI第三层即网络层设备,它根据IP地址选择转发路径,转发数据包到响应的网络。 + +路由器一半工作在广域网,分别连接不同的网络,是一种中继系统。 + +路由器的数据转发功能是基于路由表实现的,每个路由器都会维护一张路由表,根据路由表决定数据包的转发路径。路由表时通过路由算法计算得到的。 + +![](image/路由器结构.png) diff --git a/计算机网络/1 自顶向下的计算机网络概述.md b/计算机网络/1 自顶向下的计算机网络概述.md index 565f0a7b..b25cf9bf 100644 --- a/计算机网络/1 自顶向下的计算机网络概述.md +++ b/计算机网络/1 自顶向下的计算机网络概述.md @@ -29,6 +29,10 @@ * 通过线路传送比特(bit)流,只完成一个节点到另一个节点的传送(单跳) * 数据单位:比特流bit +### 协议栈示意图 + +![](image/协议栈.gif) + ## 2 数据单元长度 ### 链路层-Frame最大长度 @@ -65,20 +69,21 @@ IP协议数据内容长度1480字节存放TCP报文段或UDP报文段。最大 ### 网络协议 定义了在两个或多个通信实体之间交换信息的格式、次序,以及在信息发送、接受以及发生其它事件时采取的动作。网络协议使得网络中各种不同的参与者可以相互通信。 -网络协议通常被分为不同的层次。每个协议属于一层,每个层次负责不同的功能,并向上一层提供服务。一个协议层能够利用软件、硬件或者两者结合的方式实现。 -协议分层有概念化和结构化的优点,分层提供了一种结构化的方式来讨论系统组件,模块化使得更新组件更为容易。分层的一个潜在缺点是某层可能重复其较低层次的功能。 -各层所有的协议综合起来就构成了协议栈。通常的网络分为五个层次(非ISO OSI模型)。 -应用层:网络应用程序及其应用层协议存在的地方。 -运输层:提供了在主机之间传送应用层报文的服务。最重要的两个协议时UDP和TCP -网络层:负责将数据报从一台主机移动到另一台主机。 -链路层:也称为数据链路层或者网络接口层。链路层沿着路径将数据报传送给下一个节点。链路层传输的单元称为帧。 -物理层:负责将帧的每一个比特从一个节点移动到下一个节点。 +网络协议通常被分为不同的层次。每个协议属于一层,每个层次负责不同的功能,并向上一层提供服务。一个协议层能够利用软件、硬件或者两者结合的方式实现。协议分层有概念化和结构化的优点,分层提供了一种结构化的方式来讨论系统组件,模块化使得更新组件更为容易。分层的一个潜在缺点是某层可能重复其较低层次的功能。各层所有的协议综合起来就构成了协议栈。通常的网络分为五个层次(非ISO OSI模型)。 + +* 应用层:网络应用程序及其应用层协议存在的地方。 +* 运输层:提供了在主机之间传送应用层报文的服务。最重要的两个协议时UDP和TCP +* 网络层:负责将数据报从一台主机移动到另一台主机。 +* 链路层:也称为数据链路层或者网络接口层。链路层沿着路径将数据报传送给下一个节点。链路层传输的单元称为帧。 +* 物理层:负责将帧的每一个比特从一个节点移动到下一个节点。 + + 由于网络中有很多不同的参与者,参与者的物理位置是不确定的,信息可能会通过存在恶意用户的网络,通信链路可能坏掉,因而无论对于哪个层次的协议来说,都涉及到如下问题: -如何标识一个参与者,即如何起名字,名字的格式,每个层次都定义了自己的“地址(名字)”格式,最终这些信息都会进入报文中 -参与者如何获取自己的标识,即谁给起名字,可能是协议获取,可能是管理员分配,可能是软件自己选择,可能是统一的机构分配并固化到硬件 -如何将数据送到目的地,通常是通过下一层提供的服务 -如何确保数据的正确性,即收到的数据就是发出去的时候的样子,一般通过校验和来实现 -是否要保证数据的安全性,如果要,如何保证,通常通过各种加密协议 +* 如何标识一个参与者,即如何起名字,名字的格式,每个层次都定义了自己的“地址(名字)”格式,最终这些信息都会进入报文中 +* 参与者如何获取自己的标识,即谁给起名字,可能是协议获取,可能是管理员分配,可能是软件自己选择,可能是统一的机构分配并固化到硬件 +* 如何将数据送到目的地,通常是通过下一层提供的服务 +* 如何确保数据的正确性,即收到的数据就是发出去的时候的样子,一般通过校验和来实现 +* 是否要保证数据的安全性,如果要,如何保证,通常通过各种加密协议 ## 5 网络构成 ### 网络边缘 diff --git a/计算机网络/2.1 应用层-协议原理.md b/计算机网络/2.1 应用层-协议原理.md new file mode 100644 index 00000000..2e8983c2 --- /dev/null +++ b/计算机网络/2.1 应用层-协议原理.md @@ -0,0 +1,105 @@ +# 应用层协议原理 + + +## 1 网络应用程序体系结构 +### 客户-服务器体系结构(client-server architecture) +C/S结构和B/S结构。 +有一个总是打开的主机成为服务器,他服务于来自许多其它成为客户的主机的请求。客户之间不直接通信。另外,服务器具有一个固定的,周知的地址,IP地址。应用:Web,FTP,Telnet和电子邮件。 + +### P2P体系结构(P2P architecture) +(person to person) +对位于数据中心的专用服务器有最小的(或者没有)依赖,应用程序在间断连接的主机对之间使用直接通信,这些主机对称为对等方。应用:文件共享(BitTorrent),对等方协助下载加速器(迅雷),网络电话(Skype)和IPTV(迅雷看看和 PPStream) + +### 混合的体系结构(C/S + P2P) +即时讯息应用,服务器跟踪用户IP地址,用户之间P2P直接发送报文 + +## 2 进程通信 + +进行通讯实际是进程,不是程序。不同端系统的进程间交换报文相互通信。发送进程生成并向网络发送报文;接收进程接收这些报文并可能通过将保温发送回去进行响应。 + +### 客户与服务器进程 + +网络应用程序由成对的进程组成,这些进程通过网络相互发送报文,一个客户浏览器进程与一台 Web 服务器进程交换报文。发起通信的进程被标识为客户,会话开始时等待联系的进程是服务器。 + +### P2P进程 + +文件从一个对等方中的进程传输到另一个对等方中的进程,下载文件的对等方标识为客户,上载文件的对等方标识为服务器。 + +进程与计算机网络之间的接口:进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。套接字是同一台主机内应用层与网络层之间的接口,应用程序和网络之间的API。 + +应用程序开发者对于运输层的控制仅限于: +1. 选择运输层协议 +2. 设定几个运输层参数,如最大缓存和最大报文段等 + +### 进程寻址 + +标识进程 +* 主机的地址。IP地址。 +* 主机中接收进程的标识符。端口号。 + + +## 3 可供应用程序使用传输服务 + +### 可靠数据传输 + +* 由应用程序的一端发送的数据正确,完全地交付给该应用程序地另一端。 +* 有些运输层协议不提供可靠数据传输,由发送进程发送地某些数据可能不能够到达接收进程。 + +### 吞吐量 + +* 运输层协议可以以某种特定地速率提供确保地可用吞吐量。 +* 带宽敏感地应用和弹性应用。 + +### 定时 + +### 安全性 + + +## 4 因特网提供的运输服务 +> 可靠数据传输、吞吐量、定时、安全性 + + +### TCP服务 + +* 面向连接的服务,全双工 +* 可靠的数据传送服务:无差错,按适当顺序交付所有发送的数据 +* 拥塞控制机制:当发送方和接收方之间的网络出现拥塞时,TCP会抑制发送进程 +* 安全套接字层 SSL 提供安全性服务 + +### UDP服务 + +* 提供最小服务 +* 无连接 +* 不可靠数据传送服务 +* 因特网运输协议不提供的服务:吞吐量和定时 + +## 5 应用层协议 + +### 定义: +应用层协议定义了运行在不同端系统上应用程序进程如何相互传递报文: + +* 交换的报文类型,例如请求报文和响应报文 +* 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的 +* 字段的语义,即这些字段中包含的信息的含义 +* 一个进程何时以及如何发送报文,对报文进行响应的规则 + +### 常见应用层协议 + +* DNS域名服务。用于将名称解析为IP地址,反之亦然DNS是一个倒置的树形结构。最顶部是根域,用英文句点(.)表示。全球有13个根域服务器,一台主服务器在美国,9台辅助服务器在美国,2台在欧州,一台在日本。根域服务器以下是一级域(顶级域)、二级域、三级域……最多127级 +* FTP(File Translation Protocol)文件传输协议。FTP默认有两个端口21和20。21用于控制连接,20用于数据传输。 +* DHCP(Dynamic Host Configuration Protocol)动态主机分配协议,使用 UDP 协议工作,给主机自动分配IP地址,作为网络管理员的主要管理手段。实现即插即用即联网功能。 +* HTTP(HyperText Transfer Protocol)超文本传输协议,它是Web的核心。 +* SMTP(Simple Mail Transfer Protocol )简单邮件传输协议 <端口号25> 用于发送邮件。 +* POP3(Post Office Protocol-Version 3)第三版的邮局协议: 接收方的用户代理不能使用SMTP取回邮件,因为取邮件是一个拉操作,而SMTP协议是一个推协议。通过引入一个特殊的邮件访问协议来解决这个难题,该协议将接收方邮件服务器上的邮件传送给他的本地PC。目前有多个流行的邮件访问协议, +* TELNET 远程登录协议 <端口号23> + +### 不常用应用层协议 +* RPC (Remote Procedure Call Protocol )(RFC- 1831)远程过程调用协 议 +* RTCP (RTP Control Protocol )RTP 控制协议 +* RTSP (Real Time Streaming Protocol )实时流传输协议 +* TLS (Transport Layer Security Protocol )安全传输层协议 +* SDP( Session Description Protocol )会话描述协议 +* SOAP (Simple Object Access Protocol )简单对象访问协议 +* GTP 通用数据传输平台 +* STUN (Simple Traversal of UDP over NATs ,NAT 的UDP 简单穿越) 是一种网络协议 +* NTP (Network Time Protocol )网络校时协议。 \ No newline at end of file diff --git a/计算机网络/2.2 应用层-HTTP.md b/计算机网络/2.2 应用层-HTTP.md new file mode 100644 index 00000000..f55011f0 --- /dev/null +++ b/计算机网络/2.2 应用层-HTTP.md @@ -0,0 +1,155 @@ +# WEB和HTTP +## 1 HTTP概况 + +### 概述 + +* Web的应用层协议是超文本传输协议(HTTP),它是 Web 的核心。 +* HTTP 由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换 HTTP 报文进行会话。 +* URL地址由两部分组成:存放对象的服务器主机名和对象的路径名 +* HTTP使用TCP作为它的支撑运输协议。客户首先发起一个与服务器的 TCP 连接。一旦该连接建立,该浏览器和服务器进程就可以通过套接字接口访问 TCP。 +* HTTP是一个无状态协议(stateless protocol)。服务器向客户发送被请求的文件,而不存储 任何该客户的状态信息。 +* Web使用了客户-服务器应用程序体系结构。 + +### 主要特点 + +* 支持C/S(客户/服务器)模式 +* 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 +* 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 +* 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户应答后,即断开连接。采用这种方式可以节省传输时间。 +* 无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大;而另一方面,在服务器不需要先前信息时它的应答速度比较快。 + +## 2 持续连接和非持续连接 + +### 采用非持续连接的HTTP + +* 应用程序在采用非持续连接的情况下,客户的每个请求都要建立一个单独的TCP 连接 +* 从客户请求HTML文件到客户收到文件为止所花费的时间为两个 RTT 加上服务器传输 HTML文件的时间 + +### 采用持续连接的 HTTP + +* 服务器发送响应后保持该TCP 连接打开,经过一定时间间隔(超时)未被使用,HTTP服务器关闭该连接 +* 为每一个请求的对象建立和维护一个全新的连接,需要分配TCP 缓冲区和保持 TCP 变量 +* 每一个对象经受两倍 RTT 的交付时延,一个RTT用来创建TCP,另一个RTT用于请求和接受一个对象 + +## 3 HTTP报文格式 +### 请求报文 +``` +POST /index.html HTTP/1.1 +HOST: www.XXX.com +Connection:close +User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0 +Username=admin&password=admin +``` + +### 请求报文格式 + +![](\image/HTTP报文.png) + +### 请求实例 +![](image/HTTP请求实例.png) + +### 响应报文 +``` +HTTP/1.1 200 OK +Connection: close +Date: Tue, 09 Aug 2011 15:44:04 GMT +Server: Apache/2.2.3 (CentOS) +Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT +Content-Length: 6821 +Content-Type: text/html + +(data data data data data.....) +``` + +### 响应报文格式 + +![](image/HTTP响应报文.png) + +### 响应实例 + +![](image/HTTP响应实例.png) + +### 请求方法 + +|请求方式| 作用| +|-|-| +|GET |请求获取Request-URI所标识的资源| +|POST |在Request-URI所标识的资源后附加新的数据| +|HEAD |请求获取由Request-URI所标识的资源的响应消息报头| +|PUT |请求服务器存储一个资源,并用Request-URI作为其标识| +|DELETE |请求服务器删除Request-URI所标识的资源| +|TRACE |请求服务器会送收到的请求信息,主要用于测试和诊断| +|CONNECT |HTTP 1.1协议中预留给能够将连接改为管道方式的代|理服务器 +|OPTIONS |请求查询服务器的性能,或者查询与资源相关的选项和需求| + +### 状态码 + +|取值 |说明| +|-|-| +|100 ~ 199| 指示信息,收到请求,需要请求者继续执行操作| +|200 ~ 299| 请求成功,请求已被成功接收并处理| +|300 ~ 399| 重定向,要求完成请求必须进行更进一步的操作| +|400 ~ 499| 客户端错误,请求有语法错误或请求无法实现| +|500 ~ 599| 服务端错误,服务器不能实现合法的请求| + +常见状态码: + +* 200 OK:客户端请求成功。 +* 400 Bad Request:客户端请求有语法错误,服务器无法理解。 +* 401 Unauthorized:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用。 +* 403 Forbidden:服务器收到请求,但是拒绝提供服务。 +* 500 Internal Server Error:服务器内部错误,无法完成请求。 +* 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。 + +### content-type + +Content-Type 标头告诉客户端实际返回的内容的内容类型。 + +text格式 +* text/html : HTML格式 +* text/plain :纯文本格式 +* text/xml : XML格式 + +image +* image/gif :gif图片格式 +* image/jpeg :jpg图片格式 +* image/png:png图片格式 + +application +* application/xhtml+xml :XHTML格式 +* application/xml: XML数据格式 +* application/atom+xml :Atom XML聚合格式 +* application/json: JSON数据格式 +* application/pdf:pdf格式 +* application/msword : Word文档格式 +* application/octet-stream : 二进制流数据(如常见的文件下载) +## 4 cookie + +HTTP 是无状态的,但是 Web 站点通常希望能够识别用户,为此,HTTP 使用了 cookie,它允许站点对用户进行跟踪。 + +### cookie技术组件: + +* 在 HTTP 响应报文中的一个 cookie 首部行; +* 在 HTTP 请求报文中的一个 cookie 首部行; +* 在用户端系统中保留有一个 cookie 文件,并由用户的浏览器进行管理; +* 位于 Web 站点的一个后端数据库。 + +### cookie工作流程 + +![](image/cookie工作流程.png) + +## 5 web缓存Cache +### 原理 +* Web缓存器也叫代理服务器,是能够代表 Web 服务器来满足 HTTP请求的网络实体。 +* Web 服务器有自己的磁盘存储空间,并在存储空间中保存着最近存储过的对象的副本。 +* 可以配置用户的浏览器,使得用户所有的 HTTP 请求首先指向 Web 缓存器。 +* 客户与 Web 缓存器之间的速度通常比较快,所以可以提高访问的速度,降低时延。 +* 客户通过Web缓存器请求对象,Web缓存器能够大大减少一个机构接入链接到因特网的通信量 + +![](image/web缓存原理.png) + +### 条件get方法 + +条件get方法:解决缓存服务器和初始服务器中的数据一致性问题,即:缓存中有最新的数据,则不需要想初始服务器发送请求,否则在请求消息中声明自己所持有的旧版本的数据的日期。初始服务器对缓存服务器的数据进行判断,如果缓存中的数据是最新的,则响应消息中不包含对象。 + +![](image/条件get.png) diff --git a/计算机网络/2.3 应用层-FTP.md b/计算机网络/2.3 应用层-FTP.md new file mode 100644 index 00000000..a76c0dc3 --- /dev/null +++ b/计算机网络/2.3 应用层-FTP.md @@ -0,0 +1,140 @@ +# FTP文件传输协议 + +> * [FTP协议讲解](https://blog.csdn.net/zhubao124/article/details/81662775) +> * [FTP文件传输协议](https://blog.csdn.net/andrewniu/article/details/81181696) + + +## 1 概述 + +### 工作方式 +* 用户通过一个 FTP 客户进程建立一个到远程主机 FTP 服务器进程的 TCP 连接。 +* 用户接着提供用户标识和口令,作为 FTP 命令的一部分在该 TCP 连接上传送 +* FTP 使用了两个并行的 TCP 连接来传输文件,一个是控制连接,一个是数据连接。 +* FTP 使用 2 个端口,一个数据端口和一个命令端口(也叫做控制端口)。这两个端口一般是21 (命令端口)和 20 (数据端口)。控制 Socket 用来传送命令,数据 Socket 是用于传送数据。每一个 FTP 命令发送之后,FTP 服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。 +* 控制连接用于在两主机之间传输控制信息。数据连接用于实际发送一个文件。控制连接贯穿了整个用户会话期间,但是对会话的每一次文件传输都需要建立一个新的数据连接。 +* FTP 服务器必须对整个会话期间保留用户的状态(state) +* 使用Telnet协议进行控制连接。 + +### 主要特征 + +1. 控制连接是建立在客户协议解释器和服务器协议解释器之间用于交换命令与应答的通信链路。 + +2. 数据连接是传输数据的全双工连接。传输数据可以发生在服务器数据传输过程DTP和客户DTP之间,也可以发生在两个服务器的DTP之间。 + +### 文件类型: + +1. ASCII码文件类型(默认选择),以NVT ASCII码形式通过数据连接传输; + +2. EBCDIC文件类型。该文本文件传输方式要求两端都是EBCDIC系统; + +3. 图像文件类型(也成为二进制文件类型),数据发送形式呈现为一个连续的比特流。 + +### 数据结构 + +1. 文件结构(File Structure)字节流,无结构; + +2. 记录结构(Record Structure)文件被划分为记录,用于文本文件; + +3. 页结构(Page Structure)文件被划分为页,每页有页号和页头。可以进行随机存取或顺序存取。 + +### 传输方式 + +1. 流模式:数据以字节流的形式传送 + +2. 块模式:文件以块的形式传送,块带有自己的头部分。头字节包括16位计数域和8位描述子代码 + +3. 压缩模式:压缩模式中,因为数据是压缩过的,对于增加带宽有很多好处。 + + +## 2 原理 + +### 主动模式 (PORT) + +主动模式下,客户端随机打开一个大于 1024 的端口向服务器的命令端口 P,即 21 端口,发起连接,同时开放N +1 端口监听,并向服务器发出 “port N+1” 命令,由服务器从它自己的数据端口 (20) 主动连接到客户端指定的数据端口 (N+1)。 + +FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。 + +### 被动模式 (PASV) +为了解决服务器发起到客户的连接问题,有了另一种 FTP 连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。 + +被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。 + +第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口 (P > 1024 ),返回已经打开的端口,客户端收到命令后会请求连接数据端口,传输数据。 + +### 原理图 +![](image/FTP原理图.png) + +在开始的参考网站中给出了一个实现FTP的socket编程实例。非常详细地讲解了FTP的工作过程,日后如果需要可以学习。 + +## 3 FTP命令 + +FTP 每个命令都有 3 到 4 个字母组成,命令后面跟参数,用空格分开。每个命令都以 "\r\n"结束。 + +要下载或上传一个文件,首先要登入 FTP 服务器,然后发送命令,最后退出。这个过程中,主要用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。 + +* USER: 指定用户名。通常是控制连接后第一个发出的命令。“USER gaoleyi\r\n”: 用户名为gaoleyi 登录。 + +* PASS: 指定用户密码。该命令紧跟 USER 命令后。“PASS gaoleyi\r\n”:密码为 gaoleyi。 + +* SIZE: 从服务器上返回指定文件的大小。“SIZE file.txt\r\n”:如果 file.txt 文件存在,则返回该文件的大小。 + +* CWD: 改变工作目录。如:“CWD dirname\r\n”。 + +* PASV: 让服务器在数据端口监听,进入被动模式。如:“PASV\r\n”。 + +* PORT: 告诉 FTP 服务器客户端监听的端口号,让 FTP 服务器采用主动模式连接客户端。如:“PORT h1,h2,h3,h4,p1,p2”。 + +* RETR: 下载文件。“RETR file.txt \r\n”:下载文件 file.txt。 + +* STOR: 上传文件。“STOR file.txt\r\n”:上传文件 file.txt。 + +* REST: 该命令并不传送文件,而是略过指定点后的数据。此命令后应该跟其它要求文件传输的 FTP 命令。“REST 100\r\n”:重新指定文件传送的偏移量为 100 字节。 + +* QUIT: 关闭与服务器的连接。 + +![](image/FTP命令1.png) + +![](image/FTP命令2.png) + +## 4 FTP响应码 + +### 响应码说明 +客户端发送 FTP 命令后,服务器返回响应码。 + +响应码用三位数字编码表示: +* 第一个数字给出了命令状态的一般性指示,比如响应成功、失败或不完整。 + +* 第二个数字是响应类型的分类,如 2 代表跟连接有关的响应,3 代表用户认证。 + +* 第三个数字提供了更加详细的信息。 + +### 响应码举例 + +第一个数字的含义如下: + +1 表示服务器正确接收信息,还未处理。 + +2 表示服务器已经正确处理信息。 + +3 表示服务器正确接收信息,正在处理。 + +4 表示信息暂时错误。 + +5 表示信息永久错误。 + +第二个数字的含义如下: + +0 表示语法。 + +1 表示系统状态和信息。 + +2 表示连接状态。 + +3 表示与用户认证有关的信息。 + +4 表示未定义。 + +5 表示与文件系统有关的信息。 + +### 响应码图 +![](image/FTP响应码.png) \ No newline at end of file diff --git a/计算机网络/2.4 应用层-邮件协议.md b/计算机网络/2.4 应用层-邮件协议.md new file mode 100644 index 00000000..37b49732 --- /dev/null +++ b/计算机网络/2.4 应用层-邮件协议.md @@ -0,0 +1,150 @@ +# 邮件协议 + +> * [协议基础:SMTP](https://blog.csdn.net/liumiaocn/article/details/81131420) +> * [SMTP协议介绍](https://blog.csdn.net/qq_36136497/article/details/82689878) + +![](image/邮件协议工作原理.png) + +## 1 SMTP协议 + +### 概述 +Simple Mail Transfer Protocol 简单邮件传输协议 + + +SMTP 由两部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。每台邮件服务器上既运行 SMTP 的客户端也运行 SMTP 的服务器端程序 + +SMTP 一般不使用中间服务器发送邮件。如若接收方的邮件服务器没开,TCP 连接报文会保留在发送方的邮件服务器上,等待新的尝试,如若长时间都失败,那么发送方服务器就会删掉该报文并以邮件的形式通知发送方 + +SMTP 限制所有的邮件报文只能采用简单的 7 比特 ASCII 表示。 + +### 与HTTP的对比 + +相同点: +* 都从一台主机向另一台主机传送文件,持续的 HTTP 和 SMTP 都是用持续连接 + +不同点: +* HTTP 是一个 拉协议,TCP 连接是由想要接收文件的机器发起的。SMTP 是一个 推协议,TCP 连接是由想要发送文件的机器发起的。 +* SMTP 要求报文必须按照 7 比特 ASCII 码进行编码。HTTP 则没有这种限制。 +* 在处理包含多种不同类型的文档时。HTTP把每个对象封装到它自己的不同的HTTP响应报文中,SMTP则把所有报文对象放在一个报文中. + +### SMTP模型 + +![](image/SMTP原理图.png) + + +### SMTP交互过程 + +![](image/SMTP交互过程.png) + +连接建立 + +SMTP客户和SMTP服务器首先要建立TCP连接。 + +1. 从客户端使用熟知端口号25建立与服务器的TCP连接,SMTP服务器向该客户送回应答码220,并且还为客户端提供了服务器的域名 +2. 客户端收到应答码后,发送HELO命令,启动客户端和服务器之间的SMTP会话。该客户端发送的HELO用来向服务器提供客户端的标识信息 +3. 服务器端回应应答码250,通知客户端:请求建立邮件服务会话已经实现 + + +报文发送 + +在SMTP客户与SMTP服务器之间的连接建立之后,发信的用户就可以与一个或多个收信人交换邮件报文了。 + +1. 客户用“MAIL FROM”向服务器报告发信人的邮箱与域名 +2. 服务器向客户回应应答码“250”,代表请求命令完成 +3. 客户用“RCPT TO”命令向服务器报告收信人的邮箱与域名 +4. 服务器向客户回应应答码“250”,代表请求命令完成 +5. 客户用“DTAT”命令对报文的传送进行初始化 +6. 服务器回应“354”,表示可以进行邮件输入了 +7. 客户用连续的行向服务器传送报文的内容,每行以两字符的行结束标识(CR与LF)终止。报文以只有一个“.”的行结束 +8. 服务器向客户回应应答码“250”,代表请求命令完成 + + +连接终止 + +报文发送完毕后终止本次SMTP会话。 +1. 客户端发送“QUIT”命令 +2. 服务器收到命令后,回应应答码“221”,并结束会话 + + +### SMTP命令和应答 + +![](image/SMTP命令.png) + +### SMTP协议扩展MIME + +MIME不属于一个邮件传输协议,它只是对SMTP的一个扩展,不能替代SMTP协议,至于为啥要替换SMTP了。主要是因为SMTP协议在传输报文时,只能够传输7位的ASCII格式的报文,不支持那些不使用7位ASCII格式的语种,同时它也不支持语音和视频数据的传输,因此我们需要一个辅助性协议帮忙传输报文,它就是MIME。 + +MIME协议定义了5种头部,用来加在原始的STMP头部,以便定义参数的转换。他们分别是: + + +1. MIME-Version:MIME版本 +2. Content-Type:内容类型 +3. Content-Tansfer-Encoding:内容传输编码 +4. Content-ID:内容标识 +5. Content-Description:内容描述 + +## 2 POP3协议 + +Post Office Protocol Version 3 第三版邮件传输协议 + +### 概述 + +负责将邮件从接收方的邮件服务器发送到接收方的用户代理 + +* 特许阶段: 用户代理发送(以明文形式)用户名和口令以鉴别用户 +* 事务处理阶段:用户代理取回报文,同时可以删除报文标记,取消报文删除标记获取邮件的统计信息 +* 更新阶段,客户发出 quit 命令。结束该 POP3 会话,邮件服务器删除标记为删除的报文 + +### 原理 + +1. 用户运行用户代理(如Foxmail, Outlook Express)。 + +2. 用户代理(以下简称客户端)与邮件服务器(以下简称服务器端)的110端口建立TCP连 接。 + +3. 客户端向服务器端发出各种命令,来请求各种服务(如查询邮箱信息,下载某封邮件等)。 + +4. 服务端解析用户的命令,做出相应动作并返回给客户端一个响应。 + +5. 3)和4)交替进行,直到接收完所有邮件转到步骤6),或两者的连接被意外中断而直接退出。 + +6. 用户代理解析从服务器端获得的邮件,以适当地形式(如可读)的形式呈现给用户。 + + +### POP3命令 + + +|POP3命令格式 |说明| +|-|-| +|userusername | user 命令是POP3客户端程序与POP3邮件服务器建立连接后通常发送的第一条命令,参数 username 表示收件人的帐户名称。 +|passpassword | pass 命令是在user命令成功通过后,POP3客户端程序接着发送的命令,它用于传递帐户的密码,参数 password 表示帐户的密码。 +|apopname,digest | apop 命令用于替代user和pass命令,它以MD5 数字摘要的形式向POP3邮件服务器提交帐户密码。 +|stat | stat 命令用于查询邮箱中的统计信息,例如:邮箱中的邮件数量和邮件占用的字节大小等。 +|uidlmsg# | uidl 命令用于查询某封邮件的唯一标志符,参数msg#表示邮件的序号,是一个从1开始编号的数字。 +|list[MSG#] | list 命令用于列出邮箱中的邮件信息,参数 msg#是一个可选参数,表示邮件的序号。当不指定参数时,POP3服务器列出邮箱中所有的邮件信息;当指定参数msg#时,POP3服务器只返回序号对应的邮件信息。 +|retrmsg# | retr 命令用于获取某封邮件的内容,参数 msg#表示邮件的序号。 +|delemsg# | dele 命令用于在某封邮件上设置删除标记,参数msg#表示邮件的序号。POP3服务器执行dele命令时,只是为邮件设置了删除标记,并没有真正把邮件删除掉,只有POP3客户端发出quit命令后,POP3服务器才会真正删除所有设置了删除标记的邮件。 +|rest | rest 命令用于清除所有邮件的删除标记。 +|topmsg#n | top 命令用于获取某封邮件的邮件头和邮件体中的前n行内容,参数msg#表示邮件的序号,参数n表示要返回邮件的前几行内容。使用这条命令以提高 Web Mail系统(通过Web站点上收发邮件)中的邮件列表显示的处理效率,因为这种情况下不需要获取每封邮件的完整内容,而是仅仅需要获取每封邮件的邮件头信息。 +|noop | noop 命令用于检测POP3客户端与POP3服务器的连接情况。 +|quit | quit 命令表示要结束邮件接收过程,POP3服务器接收到此命令后,将删除所有设置了删除标记的邮件,并关闭与POP3客户端程序的网络连接。 +## 3 IMAP协议 + +### 概述 + + +* 把每个报文与一个文件夹联系起来 +* 允许用户代理获取报文组件的命令 +* IMAP 维护了 IMAP 会话的用户状态信息 + +### 主要功能 + +* IMAP具有摘要浏览功能,可以让用户在读完所有邮件的主题、发件人、大小等信息后,再由用户做出是否下载或直接在服务器上删除的决定。 +* IMAP可以让用户有选择性地下载邮件附件。例如一封邮件包含3个附件,如果用户确定其中只有2个附件对自已有用,就可只下载这2个附件,而不必下载整封邮件,从而节省了下载时间。 +* IMAP可以让用户在邮件服务器上创建自己的邮件夹,分类保存各个邮件。 + +### 工作原理 + +1. IMAP4协议适用于C/S构架中,IMAP4协议对于提供邮件访问服务且使用广泛的POP3协议的另一种选择,基本上两者都是规定个人计算机如何连 接到互联网上的邮件服务器进行收发邮件。IMAP4协议支持对服务器上的邮件进行扩展性操作,IMAP4也支持ASCII码明文传输密码。 +2. 与POP3不同的是,IMAP4能支持离线和在线两种模式来传输数据,①在离线方式中,客户端程序会不间断的连接服务器下载未阅读过的邮件到本地磁盘,当客户端需要接受或者发送邮件时才会于服务器建立连接,这就是离线访问模式。POP3典型地以离线方式工作。②在 线模式中,一直都是由客户端程序来操作服务器上的邮件,不需要像离线模式那样把邮件下载到本地才能阅读,(即使用户把邮件下载到本地,服务器上也会存一份 副本,而不会像POP协议那样把邮件删除)。用户可以通过客户端程序或者Wed在线浏览邮件(IMAP4提供的浏览功能可以让你在阅读完所有的邮件到达时 间、主题、发件人、大小等信息,同时还可以享受选择性下载附件的服务)。一些POP3服务器也提供了在线功能,但是,它们没有达到IMAP4的浏览功能的 级别。 +3. IMAP4是分布式存储邮件方式,本地磁盘上的邮件状态和服务器上的邮件状态,可能和以后再连接时不一样。此时,IMAP4的分布式存储机制解决了这 个问题。IMAP4邮件的客户端软件能够记录用户在本地的操作,当他们连上网络后会把这些操作传送给服务器。当用户离线的时候服务器端发生的事件,服务器 也会告诉客户端软件,比如有新邮件到达等,以保持服务器和客户端的同步。 +4. IMAP4协议处理线程都处于4种处理状态的其中一种。大部分的IMAP4命令都只会在某种处理状态下才有效。如果IMAP4客户端软件企图在不恰当的状态下发送命令,则服务器将返回协议错误的失败信息,如BAD或NO等等。 \ No newline at end of file diff --git a/计算机网络/2.5 应用层-DNS.md b/计算机网络/2.5 应用层-DNS.md new file mode 100644 index 00000000..b01cf622 --- /dev/null +++ b/计算机网络/2.5 应用层-DNS.md @@ -0,0 +1,87 @@ +# DNS 域名解析 + +## 1 概述 + +Domain Name System 域名系统 + +### DNS功能 +* DNS 提供从主机名到IP地址的目录服务。一个由分层的 DNS 服务器实现的分布式数据库。一个使得主机能够查询分布式数据库的应用层协议。 +* DNS协议运行在UDP上,使用 53 端口。 +* DNS通常是由其他应用层协议所使用的,包括 HTTP,SMTP 和 FTP,将用户的主机名解析为 IP 地址。 +* DNS其他服务:主机别名,邮件服务器别名,负载分配 + +### 域名解析方式 +主机名到IP地址的映射有两种方式: + +1. 静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用; +2. 动态映射,建立一套域名解析系统(DNS),只在专门的DNS服务器上配置主机到IP地址的映射,网络上需要使用主机名通信的设备,首先需要到DNS服务器查询主机所对应的IP地址。 + + +通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。 + +### DNS服务器 +![](image/域名分层.png) + +域名服务器从高到低分为四类 + +* 根域名服务器(root name server):最高层次,同时也是最重要的域名服务器。任何一个根域名服务器都知道所有的顶级域名服务器的域名和IP地址。 +本地域名服务器将 域名转换为IP地址 的过程中,只要自己无法转换,就要首先求助于根域名服务器。假定所有的根域名服务器都挂了,那么整个互联网中的DNS系统就都挂了。 +根域名服务器并不直接把待查询的域名直接转换成IP地址(根域名服务器也没有这种信息),而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。 + +* 顶级域名服务器(TLD服务器):负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答(可能是最后结果,也可能是下一步应当找的域名服务器的IP地址)。 +* 权限域名服务器:从理论上讲,可以让每一级的域名都有一个相对应的域名服务器,使所有的域名服务器构成和 图6-1 相对应的“域名服务器树”的结构,但这样做会使域名服务器数量太多,使其运行效率降低,因此DNS采用划分区的方法来解决这个问题。 +一个服务器所负责管辖的(或有权限的)范围叫做区。各单位根据自己情况来划分区的范围,每个区设置相应的 权限域名服务器,用来保存该区中所有主机的域名到IP地址的映射。 +* 本地域名服务器(local name server):当一个主机发出DNS查询请求时,这个查询请求报文就发给本地域名服务器。每个互联网提供商ISP,或一个大学,甚至一个大学里的系,都可以拥有本地域名服务器。本地域名服务器离用户较近,一般不超过几个路由器的距离。当所要查询的主机也属于同一个本地ISP时,该本地域名服务器立即就能将所查询的主机名转换为IP地址,而不需要再访问其他域名服务器。 + + +### DNS记录 + +DNS常用的资源记录类型 +* A:地址 此记录列出特定主机名的 IP 地址。这是名称解析的重要记录。 +* CNAME:标准名称 此记录指定标准主机名的别名。 +* MX:邮件交换器此记录列出了负责接收发到域中的电子邮件的主机。 +* NS:名称服务器此记录指定负责给定区域的名称服务器。 +* SOA record:Stores admin information about a domain. Learn more about the SOA record. +* SRV record:Specifies a port for specific services. Learn more about the SRV record. +* PTR record:Provides a domain name in reverse-lookups. Learn more about the PTR record. + +## 2 DNS解析过程 + +![](image/DNS查询.png) + +递归查询与迭代查询: + +* 主机向本地域名服务器的查询一般都是采用递归查询(recursive query)。如果主机所询问的本地域名服务器不知道被查询域名的IP地址时,本地域名服务器就以DNS客户的身份向其他根域名服务器继续发送查询请求报文(即替该主机继续查询),而不是让该主机自己进行下一步的查询。 +* 本地域名服务器向根域名服务器的查询通常是采用迭代查询(iterative query)。当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个域名服务器进行查询,然后让本地域名服务器进行后续的查询。逐步按照域树的路径向下走直到叶节点,得到了所要解析的域名的IP地址,然后把这个结果返回给发起查询的主机。当然本地域名服务器也可以采用递归查询,这取决于最初的查询请求报文的设置是要使用哪一种查询方式。 + + +![](image/DNS查询2.png) + +## 3 DNS缓存 + +### 缓存的作用 +为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。 +例如,在上面的查询过程中,如果在m.xyz.com的主机上不久前已经有用户查询过y.abc.com的IP地址,那么本地域名服务器就不必向根域名服务器重新查询y.abc.com的IP地址,而是直接把高速缓存中存放的上次查询结果返回(即y.abc.com的IP地址)给用户。 +假定本地域名服务器的缓存中并没有y.abc.com的IP地址,而是存放着顶级域名服务器dns.com的IP地址,那么本地域名服务器也可以不向根域名服务器进行查询,而是直接向com顶级域名服务器 发送查询请求报文。这样能大大减轻根域名服务器的负荷。 + +由于名字到地址的绑定并不经常改变,为保持告诉缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项(例如每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。 + +不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。 + +### 使用缓存的解析过程 + +如果还用上面的例子,且加上主机中的缓存,客户端在浏览器的URL中输入y.abc.com,即想要解析获取y.abc.com的IP地址。会发生一下动作: + +(1)浏览器 会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有y.abc.com 对应的条目,而且没有过期,如果有且没有过期则解析到此结束。 +(2)如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。 +(3)如果在操作系统(eg:Windows系统)的DNS缓存中也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。 +(4)如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向 本地域名服务器 发起域名解析请求 +(5)之后的操作就一样了,同上···· 即:上面 本地域名服务器 递归查询或迭代查询 的过程。 + + +## 4 DNS安全性 +* DDoS(分布式拒绝服务)带宽泛洪攻击:向处理如.com域的域名服务器发送大量DNS请求,使得大部分合法请求无法获得响应 + +* DNS毒害(污染):给你返回假的或不能用的IP地址。比如中国的『墙』。所以如果你能拿到google的当前IP地址(百度搜的到),手动在hosts里配置,是可以做到直接访问谷歌服务器的。说到翻墙,一般大家都是用某种方法配置一台海外服务器当做中转(国家一般不墙这种个人服务器),来访问墙外服务器的,比如shadowsocks,shadowrocket之类的软件可以用来配置中转服务器。 + +* DNS反射攻击:请求中冒充目标主机源地址,大量请求DNS服务器,DNS就大量向源地址主机发送回答,淹没目标主机。 \ No newline at end of file diff --git a/计算机网络/2.6 应用层-P2P.md b/计算机网络/2.6 应用层-P2P.md new file mode 100644 index 00000000..9a479bbc --- /dev/null +++ b/计算机网络/2.6 应用层-P2P.md @@ -0,0 +1,34 @@ +# P2P + +## 1 概述 +比于客户-服务器体系结构,P2P具有自扩展性,表现在对等方N越大,最小分发时间也趋于平缓。这种自扩展性的直接成因是:对等方除了是比特的消费者外还是它们的重新分发者。 + +### P2P 体系结构的扩展性 + +* 最小分发时间,对等方N越大,P2P的最小分发时间越小 +* 对等方除了是比特的消费者外还是他们的重新分发者 + +## 2 BitTorrent + +### 工作过程 +* P2P文件共享协议,参与一个特定文件分发的所有对等方结合被称为一个洪流(torrent),在一个洪流的对等方彼此下载等长度的文件块,可以随时离开洪流,也可继续向其他对等方上载 +* Alice加入某洪流时,会在追踪器里进行注册,周期性通知追踪器它仍在洪流中。 + +* 洪流随机从参与对等方的结合中选择一个子集,将他们的IP地址发给Alice,Alice维护这张对等方列表,视图与所有对等方建立并行的TCP连接。 +* Alice周期询问每个邻近对等方(连上的)他们有的文件块列表,她随时知道邻居有哪些文件块 +* Alice使用最稀缺优先技术,首先请求那些邻居们副本数量最少的块,使该文件块迅速分发,以均衡每个块在洪流中的副本数量 + +* BitTorrent使用一种算法,Alice优先从像她传时速度最快的邻居(4个,每10s修改一次)那里获取文件块。 +* 每过30s,Alice也要随机选择另外一个对等方Bob,向他发送块。若Alice是Bob最快的前四快,Bob也是Alice的前4快,则Bob和Alice互相发送数据。 +* 每过30s换一个新的对象,互相交换数据(一报还一报),为了使对等方能够找到彼此协调的速率上传 + +### BitTorrent其他机制和变种 + +片、流水线、随机优先选择、残局模型、反怠慢等机制 +变种:P2P直播流式应用,如PPLive和PPstream****PPstream + + +## 3 分布式散列表(DHT) +* 分布式、P2P版本的key-value数据库,在大量对等方上存储key-value值(键值对) +* 分布式数据库用来定位拥有某key-value的对等方,然后向查询方返回该键值对 +* 环形DHT、对等方扰动 \ No newline at end of file diff --git a/计算机网络/3 传输层.md b/计算机网络/3 传输层.md deleted file mode 100644 index e69de29b..00000000 diff --git a/计算机网络/3.1 传输层-基本原理.md b/计算机网络/3.1 传输层-基本原理.md new file mode 100644 index 00000000..d2c80730 --- /dev/null +++ b/计算机网络/3.1 传输层-基本原理.md @@ -0,0 +1,38 @@ +# 基本原理 + +## 概述 + +传输层位于网络层和应用层之间,它的目的是为运行在不同主机上的进程之间的通信提供支持。传输层将网络层提供的不同主机之间的通信服务扩展到了运行在不同主机上的进程之间。 + +### 主要功能 +传输层协议为运行在不同主机上的应用之间提供了逻辑通信功能,而网络层则是提供了主机之间的逻辑通信服务。。传输层运行在主机上即端系统上。其基本通信过程为 +* 发送方:传输层接收到来自应用进程的报文,并将其转换为传输层分组,因特网中称为传输层报文段,然后传输层将分组交给网络层,网络层将其交付到目的主机。 +* 接收方:网络层从数据中提取传输层报文段,并将其提交给传输层。 +### 与网络层的关系 +传输层建立在网路层之上,因而传输层所能提供的服务要受到网络层提供服务的限制,比如假如网络层不能提供带宽和时延保证,那么传输层也无法提供该服务。但是传输层仍能够提供网络层所不能提供的服务,比如IP层是不可靠地服务,但是传输层仍能提供可靠服务。 + +### 三种传输层协议 +* UDP:用户数据报协议,它为应用程序提供了一种不可靠的无连接的服务 +* TCP:传输控制协议,它为应用程序提供了可靠地面向连接的服务 +* SCTP:流控制传输协议,它为应用程序提供了可靠地面向连接的服务。它在两个端点之间提供稳定、有序的数据传递服务(非常类似于 TCP),并且可以保护数据消息边界(例如 UDP)。然而,与 TCP 和 UDP 不同,SCTP 支持多宿主(Multi-homing)和多流(Multi-streaming) 。 + +## 2 多路复用与多路分解 +运输层的基本任务是将网络层提供的不同主机之间的通信服务扩展到运行在不同主机上的进程之间。这种扩展称为运输层的多路复用和多路分解。运输层通过socket来提供这种多路复用和多路分解。 + +### 概念 + +* 多路复用:在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息,从而生成报文段,然后将报文段传递到网络层 + +* 多路分解:将运输层报文段中的数据交付到正确的套接字的工作 + +### 工作要求 + +* 主机接收 IP 数据报。每个数据报有一个源 IP 地址,目标 IP 地址。每个数据报携带一个运输层报文段。每个报文段含有源端口号和目的端口号。 +* 主机利用 IP 地址和端口号将报文段交付到适当的 socket + +### UDP的多路分解与多路复用 +UDP 套接字由一个二元组标识,含有目的 IP 地址和目的端口号 +如果两个 UDP 报文拥有不同的 IP 源地址或源端口号,只要拥有相同的目的 IP 地址和目的端口号,这两个报文段会通过相同的 socket 定向到相同的进程 +### TCP 的多路复用和多路分解 +TCP socket 由一个四元组标记:源端口号,源 IP 地址,目的端口号,目的 IP 地址 +两个具有不同的 IP 源地址或源端口号的到达 TCP 报文段会被定向到两个不同的 socket ,除非 TCP 报文段携带了初始创建连接的请求 \ No newline at end of file diff --git a/计算机网络/3.2 传输层-UDP.md b/计算机网络/3.2 传输层-UDP.md new file mode 100644 index 00000000..3242eec9 --- /dev/null +++ b/计算机网络/3.2 传输层-UDP.md @@ -0,0 +1,40 @@ +# UDP + +## 1 概述 +UDP是一个简单的面向数据报的传输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。因此如果应用程序使用UDP来实现,则应用程序几乎是直接与IP打交道,UDP只在网络层之上提供了非常有限的服务:进程间数据交付和差错检测。 + +## 2 UDP的多路复用和多路分解 + +### 原理 +传输层通过socket来提供多路分解和多路复用,并且: +* 每个socket都由唯一的一个标识符 +* 每个报文段由特殊的字段来指示该报文段所要交付的套接字,源端口号和目的端口号就是这种目的的特殊字段 + +端口号是16比特的数字,其大小在0到65536之间。0到1023之间的端口号是知名端口号,其使用是受限制的(指的是不能随意使用)。 + +### 过程 +1. 主机上的进程创建一个socket,并为之申请一个端口号,假设主机host1上进程A创建了一个socket并申请到端口号10000,主机host2上的进程B创建了一个socket并申请到端口号20000 +2. 主机host1上的进程A想和主机host2上的进程B通信,因而它从其与之关联的socket中发送一个数据报,并将源端口设置为10000,目的端口设置为20000,然后将数据报提交给网络层由网络层发送给主机B。 +3. 主机B的网络层收到报文后,将传输层数据提交给传输层,之后传输层根据报文信息查找对应的socket(最简单的查找是根据报文的目地地址和端口号进行查找),然后就通过找到的socket将数据体积高给了进程B。 + +具有相同的目的IP和目的端口,那么它们就将通过相同的socket被提交给相同的进程。 + + +## 3 UDP的数据报格式 + +### UDP数据报格式 +![](image/UDP数据报.png) + + + +* 端口号用于标识发送进程和接收进程。 +* UDP长度字段指的是UDP首部和UDP数据的字节长度。 +* UDP检验和覆盖UDP首部和UDP数据。 + +### UDP校验过程 +UDP设置伪首部,用来完成校验过程: + * 首先,UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个16bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(可能增加的填充字节不被传送)。 + * 其次,UDP数据报包含一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地。UDP数据报中的伪首部格式如图所示: + ![](image/UDP伪首部.png) + * UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。这就是UDP所提供的差错检测服务,也是UDP提供的两个服务之一。 + diff --git a/计算机网络/3.3 传输层-可靠传输.md b/计算机网络/3.3 传输层-可靠传输.md new file mode 100644 index 00000000..bb05cc20 --- /dev/null +++ b/计算机网络/3.3 传输层-可靠传输.md @@ -0,0 +1,117 @@ +# 可靠数据传输与拥塞控制 + +## 1 信道不可靠 +* 出现比特错误 +* 会丢包 + +## 2 普通可靠传输-停止等待协议 +> 关键词:校验和、ACK、重传、序号、超时重传 +### 出现比特错误的信道 + +* 接收方:需要确认信息是否就是发送方所发送的,并且需要反馈是否有错误给发送方 +* 发送方:需要在发送的信息中添加额外信息以使得接收方可以对接收到的信息是否有错误进行判断,并且需要接收接收方的反馈,如果有错误发生就要进行重传 + +因而在这种信道上进行传输需要三种功能: + +* 差错检测:发送方提供额外信息供接收方进行校验,接收方进行校验以判断是否有错误发生。网络协议一般采用校验和来完成该任务 +* 接收方反馈:接收方需要将是否有错误发生的信息反馈给发送方,这就是网络协议中最常见的ACK(确认)/NAK(否定的确认)机制 +* 发送方重传:在出现错误时,发送方需要重传出错的分组。重传也是网络协议中极常见的机制。 + +### 反馈出现错误 + +* 如果收到了受损的反馈,则都认为是出现了错误,就进行重传。但是这时就可能引入冗余的分组,因为被重传的分组可能已经正确的被接收了。 +* 冗余分组可以通过一种简单的机制来解决,这就是分组序列号。被发送的每个分组都有一个序列号,接收方只需要检测该序列号就可以知道分组是否是冗余的。 +* 在引入序列号后,该机制已经可以在这种信道上工作了。有些网络协议中并不会产生否定的确认(即报告发送方出现了错误),它采用的是继续为已经为之发送过ACK的最后一个正确接收的分组发送ACK。当发送方收到冗余的ACK时就知道跟在被冗余ACK确认的分组之后的分组没有被正确接收,这就达到了NAK所要的效果。 + +### 出现丢包错误的信道 + +* 这种信道是更常见的信道。比特错误的问题已经被校验和、序号、ACK和重传解决了。 + +* 丢包问题的解决很简单,对于发送方来说只要在一定时内没有收到分组的ACK就认为分组丢失了,就进行重传即可。当然这可能引入冗余的分组,但是序列号是可以解决冗余分组的问题,因而唯一需要确定的就是所谓的一定的时间内的时间长度。很显然时间长度至少要为“往返时延+分组处理时间”。 + +### 停止等待协议机制和性能 +* 停止等待协议机制:校验和、ACK、重传、序号、超时重传 +* 停止等待协议性能:停止等待协议,它的性能很差。任意时刻信道内只有一个分组(或者数据分组或者确认分组)。这就极大的浪费了带宽。 + + +## 3 流水线可靠数据传输协议 +> 关键词:流水线技术、回退N步、滑动窗口、累计确认、选择重传、超时重传 +### 流水线技术 + +对停止等待协议的可靠传输协议进行修改修改:不采用停止等待协议,而是允许发送方发送多个分组而无需等待确认。具体的修改包括: +* 增加分组序号范围,因为每个传输的分组需要有一个唯一的序号,而且同时存在多个未确认的分组 +* 协议的发送方和接收方需要缓存多个分组,发送方至少需要缓存已发送但未确认的分组 + +流水线的差错恢复有两种手段:回退N步(GBN)和选择重传。 + +## 4 GBN回退N步-滑动窗口协议 + +### 序号 +该协议中,流水线中未被确认的分组数目不能超过N。 GBN协议中发送方两个重要的序号为: +* 基序号(send_base):最早未被确认的序号 +* 下一个序号(nextseqnum):最小未使用的序号 + + +### 发送方看到的序号分段 + +* [0, send_base - 1]:已发送并且收到确认了的序列号 +* [send_base, nextseqnum - 1]:已发送但未收到确认了的序列号 +* [nextseqnum, send_base + N - 1]:可被用于发送新分组的序列号 +* 大于等于send_base + N:不能使用的序列号 + +### 滑动窗口 + +* 本协议中,已发送但未被确认的分组数目不能超过N。因此N可以看做是从第一个已发送但未被确认的序号开始的长为N的序号窗口,也称为发送窗口。 + +* 随着分组被确认,该窗口逐渐滑动,send_base增加,但是其大小不变,因此该协议也称为滑动窗口协议。 + +### 发送方事件 +* 上层调用进行发送:当发送数据时,首先判断发送窗口是否已满,只有不满时才会启动发送,如果满了则不能发送或者缓存或者通知调用者,这取决于实现, +* 收到ACK:如果收到了分组n的ACK,并且分组n的序号在[send_base, nextseqnum - 1]之间,则更新send_base。GBN协议采用累积确认,含义是如果发送方接收到了对分组n的确认,则表明分组n之前的所有分组都已经被接收。 +* 超时事件:GBN协议名字来自该协议对分组丢失或超时事件的处理。如果分组丢失或者指定的时间内仍未收到对已发送但是未收到确认的分组的确认,则发送方重传[send_base, nextseqnum-1]之间的所有分组。实现中可以只为序号为send_base的分组启动一个定时器,如果send_base被更新就重启send_base相关的定时器,如果没有已经被发送但未被确认的分组,则关闭定时器。 + + +### 接收方事件 + + +接收方接收到分组n时,如果n是按序接收的,即分组n之前的所有分组都已经到达,则发送一个对分组n的确认,并将分组提交给上层。所有其它情况,接收方都丢弃分组,并重传对最后一个按序接收的分组的确认。这种设计简化了接收方接收缓存的设计,同时被丢弃的分组早晚都会被重传,因而可靠性也是有保证的。 + +GBN协议的接收方只维护了一个期望收到的下一个序号的信息,并保存在expectedseqnum中,在expectedseqnum之前的所有分组都已经被正确接收并提交给了上层。接收方具体的行为如下: + +* 如果收到的分组的序号与expectedseqnum相同,则将分组提交给上层,并更新它的值为下一个期望收到的序号。 +* 如果收到的分组的序号大于expectedseqnum,就丢弃分组。 +* 如果收到的分组的序号小于expectedseqnum,就重传对最后一个按序接收的分组的确认。由于GBN是累积确认的,因此该确认可以确保发送窗口可以向前移动。 + + +## 5 选择重传 +GBN协议存在缺陷,在超时或者分组丢失时它会重传所有的在[send_base, nextseqnum-1]之间的分组,而接收方也会丢弃非按序到达的分组,这也浪费了带宽。 + +### 发送方序号 + +选择重传协议通过让发送方仅重传那些它怀疑在发送方出错的分组来避免不必要的重传。该协议中发送方看到的序号空间与GBN协议完全相同,唯一不同的在于序号空间[send_base,nextseqnum - 1]中的分组包含了一些已经被接收方确认了的分组。 + +### 发送方行为 +* 上层调用进行发送:当发送数据时,首先判断发送窗口是否已满,只有不满时才会启动发送,如果满了则不能发送或者缓存或者通知调用者,这取决于实现, +* 收到ACK:如果收到分组n的ACK,并且n的序号在[send_base, nextseqnum - 1]之间,则将分组n状态更新为已确认,如果n的序号等于send_base,则更新send_base到下一个已发送但未被确认的分组的序号处。 +* 超时事件:该协议使用选择重传,因此每个分组都有一个定时器,如果某个分组的定时器到期了就重传该分组。 + + +### 接收方序号 +该协议中,接收方也需要维护一个长度为N的接收缓存,并且需要维护一个变量rcv_base,它表示接收方期望收到的下一个分组的序号。接收方看到序号空间被划分为: +* [0, rcv_base - 1]:已经正确接收并且被确认了的序号空间 +* [rcv_base, rcv_base + N -1]:期望接收的序号空间 +* 大于rcv_base + N :不可用的序号空间 + + +### 接收方行为 +* 收到了序号在[rcv_base – N , rcv_base -1]之间的分组:产生一个ACK,这是必须的,因为发送方重传了该分组就说明它没有收到对它的ACK,如果不发送ACK,发送方的窗口将不会移动。假设N=5,考虑以下场景 + * 发送方发送了序号为5,6,7,8,9的分组,因此send_base=5 + * 接收方接收了这些分组并且为所有分组都发送了ACK,因此rcv_base=10 + * 所有ACK都丢失 + * 发送方重传分组5 + * 接收方必须发送ACK,否则发送方窗口将不会被更新 +* 收到了序号在[rcv_base, rcv_base + N -1]之间的分组:发送ACK给发送方。如果该分组以前未接收,则缓存它,如果该分组的序号等于rcv_base,则将从rcv_base开始的序号连续的被缓存的接收到的分组提交给上层,同时更新rcv_base为有序接收到的最后一个分组的序号的下一个序号。 +* 接收到其它分组:丢弃分组 + + +注意到接收方必须可以处理序号范围在[rcv_base, rcv_base + N -1]和[rcv_base – N , rcv_base -1]之间的分组,这两个区间的总长度为2N。因此这就意味着序号空间至少要有2N个可用序号值,即序号空间的大小至少要为2N,否则接收方就无法区分一个分组是新的分组还是一个重传。 diff --git a/计算机网络/3.4 传输层-TCP.md b/计算机网络/3.4 传输层-TCP.md new file mode 100644 index 00000000..2e0cb870 --- /dev/null +++ b/计算机网络/3.4 传输层-TCP.md @@ -0,0 +1,155 @@ +# TCP + +> 参考文献 +> * [TCP协议详解](https://www.cnblogs.com/buxiangxin/p/8336022.html) +- [TCP](#tcp) + - [1 概述](#1-%e6%a6%82%e8%bf%b0) + - [2 TCP报文](#2-tcp%e6%8a%a5%e6%96%87) + - [3 TCP的多路复用和解复用](#3-tcp%e7%9a%84%e5%a4%9a%e8%b7%af%e5%a4%8d%e7%94%a8%e5%92%8c%e8%a7%a3%e5%a4%8d%e7%94%a8) + - [4 TCP的状态迁移](#4-tcp%e7%9a%84%e7%8a%b6%e6%80%81%e8%bf%81%e7%a7%bb) + - [状态迁移图](#%e7%8a%b6%e6%80%81%e8%bf%81%e7%a7%bb%e5%9b%be) + - [状态迁移图说明](#%e7%8a%b6%e6%80%81%e8%bf%81%e7%a7%bb%e5%9b%be%e8%af%b4%e6%98%8e) + - [5 TCP的连接管理](#5-tcp%e7%9a%84%e8%bf%9e%e6%8e%a5%e7%ae%a1%e7%90%86) + - [建立连接](#%e5%bb%ba%e7%ab%8b%e8%bf%9e%e6%8e%a5) + - [终止连接](#%e7%bb%88%e6%ad%a2%e8%bf%9e%e6%8e%a5) + - [连接建立的超时](#%e8%bf%9e%e6%8e%a5%e5%bb%ba%e7%ab%8b%e7%9a%84%e8%b6%85%e6%97%b6) + - [同时打开](#%e5%90%8c%e6%97%b6%e6%89%93%e5%bc%80) + - [同时关闭](#%e5%90%8c%e6%97%b6%e5%85%b3%e9%97%ad) + - [复位连接](#%e5%a4%8d%e4%bd%8d%e8%bf%9e%e6%8e%a5) + + +## 1 概述 +TCP提供的是一种面向连接的、可靠的字节流服务。 +* 面向连接:使用TCP的两端在彼此交换数据之前必须先建立一个TCP连接。TCP连接是点对点的,在一个TCP连接中,仅有两方可以彼此通信,TCP不使用广播和多播。TCP的连接和电话网络的连接不同,它对中间的转发设备即路由器、交换机是透明的,连接的信息只存在于连接的两个端系统之上。 +* 可靠:TCP保证数据传输的可靠性。 +* 字节流:两个应用程序通过TCP连接交换8bit字节构成的字节流。字节流服务中,接收方无法了解发方每次发送了多少字节,可以确保的是一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。 +* TCP提供的是全双工的服务。 + + +## 2 TCP报文 + +TCP首部,它通常是20个字节。 +![](image/TCP报文段.png) + +* 源端和目的端的端口号:用于TCP的多路复用和多路分解,即标识发端和收端应用进程。 +* 序号:标识字节流。TCP用序号对字节流中的每个字节进行计数,一个报文段的序号被设置为该报文段中第一个数据字节的计数值。序号是32bit的无符号数,序号到达232-1后又从0开始。当建立一个新的连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN(InitialSequenceNumber)。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号。由于TCP提供的是全双工的服务即连接双方可以同时独立地发送数据,因此连接的每一端必须保持每个方向上的传输数据序号。 +* 确认序号:确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。只有ACK标志1时确认序号字段才有效。发送ACK无需任何代价,因为32bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。 +* 首部长度:首部中32bit字的数目。这个字段占4bit,因此TCP最多有60字节的首部。正常的长度是20字节。 +* 6个标志比特: + * URG紧急指针有效。 + * ACK确认序号有效。 + * PSH接收方应该尽快将这个报文段交给应用层。 + * RST重建连接。 + * SYN同步序号用来发起一个连接。 + * FIN发端完成发送任务。 +* 窗口大小:通告给对端的本段窗口大小。用于流量控制。 +* 检验和:整个TCP报文段的校验和,覆盖了TCP首部和TCP数据。必须给出,由发送端设置,接收端验证。类似于UDP的校验和,校验和计算是用了和UDP相同的一个伪首部。 +* 紧急指针:只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。 +* 选项:包括TCP所支持的一些选项。最常见的可选字段是最长报文大小,又称为MSS(MaximumSegmentSize)。每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。 + + +## 3 TCP的多路复用和解复用 +* 由于TCP是面向连接的,需要目地端口、目地IP、源IP、源端口提供连接两端的足够的信息。TCP使用源IP+源端口+目地IP+目地端口的四元组来标志一个socket。 +* 在TCP工作时,无论发送端还是接收端,都必须首先建立连接,在连接建立完成后,socket即拥有了它所需的四元组的信息,之后的收发都经过socket进行。 + + +## 4 TCP的状态迁移 + +### 状态迁移图 +![](image/TCP状态迁移图.png) + + +图中粗的实线箭头表示正常的客户端状态变迁,粗的虚线箭头表示正常的服务器状态变迁。 +* 两个导致进入ESTABLISHED状态的变迁对应打开一个连接。 +* 两个导致从ESTABLISHED状态离开的变迁对应关闭一个连接。ESTABLISHED状态是连接双方能够进行双向数据传递的状态。 +* 图中左下角放在一个虚线框内的4个状态标为“主动关闭”。 +* 状态CLOSE_WAIT和LAST_ACK也用虚线框住,并标为“被动关闭”。 +* CLOSED状态不是一个真正的状态,而是这个状态图的假想起点和终点。 +* 只有当SYN_RCVD状态是从LISTEN状态(正常情况)进入,而不是从SYN_SENT状态(同时打开)进入时,从SYN_RCVD回到LISTEN的状态变迁才是有效的。这意味着如果我们执行被动关闭(进入LISTEN),收到一个SYN,发送一个带ACK的SYN(进入SYN_RCVD),然后收到一个RST,而不是一个ACK,便又回到LISTEN状态并等待另一个连接请求的到来。 + +### 状态迁移图说明 +1. 2MSL等待状态 + + TCP中有一个报文段最大生存(MSL,Maximum Segment Lifetime)时间的概念。 + + TIME_WAIT状态也称为2MSL等待状态。它是指:当TCP连接的一方执行主动关闭时,在它方完最后一个ACK(即对对端FIN的ACK)后,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样的目的是可以让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。 + + 2MSL等待导致当一个TCP连接处于该状态时,该连接的socket使用的四元组不能被重新使用,即不可能在这个时间段内再重建具有相同四元组的socket。现实中这种限制甚至更为严重--该socket的所使用的本地端口将不能被重新使用。在连接处于2MSL等待时,任何迟到的报文段将被丢弃。 + + 只有主动关闭的一端会进入该状态,被动关闭的一端不会进入该状态。由于这个特性,所以应该尽量让客户端执行主动关闭,服务器执行被动关闭。因为客户端的端口是可以随意选取的,而服务器必须使用为客户端所知道的端口,因而该状态对客户端影响很小,但是如果是服务器进入了该状态就会影响较大。 + +2. 平静时间 + + 2MSL等待状态可以防止将来自一个连接(即四元组相同的连接)的迟到的报文段解释为新连接的一部分。 + + 但如果进入2MSL等待状态的主机由于故障重启了并且在MSL内完成重启,并使用相同的信息建立了一个应该处于2MLS等待状态的连接。这时在故障前从这个连接发出的迟到的报文段会被错误地当作属于重启后新连接的报文段。无论如何选择重启后新连接的初始序号,都会发生这种情况。 + + 为了防止这种情况,RFC793指出TCP在重启动后的MSL秒内不能建立任何连接。这就称为平静时间(quiettime)。只有极少的实现版遵守这一原则,因为大多数主机重启动的时间都比MSL秒要长。 + +3. FIN_WAIT_2状态 + + FINWAIT2状态中本端已经发出了FIN,并且另一端也已对它进行确认。如果是半关闭,则到这一步就可以结束了,但是如果不是半关闭,则会等待对端发送FIN来关闭另一个方向的数据传输,此时对端处于CLOSEWATI状态。但是如果对端不发送FIN,本端就一直处于FINWAIT2状态,而对端也将处于CLOSEWAIT状态,并一直保持直到对端决定进行关闭。 + + linux实现通过shutdown来支持半关闭,而close则用来执行一个全关闭(即期望对端也关闭其在另一个方向的发送)。而在在linux实现中,如果执行的是全关闭,则会设置一个超时间来防止连接在FIN_WAIT_2状态一直等待。 + + +## 5 TCP的连接管理 +### 建立连接 +TCP通过三次握手完成建立连接的工作: +1. 连接发起者发送一个SYN段指明自己期望连接的对端的端口,以及初始序号。这个SYN段为报文段1。 +2. 对端发回包含对端的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为连接发起者的ISN加1以对连接发起者的SYN报文段进行确认。一个SYN将占用一个序号。 +3. 连接发起者必须将确认序号设置为对端的ISN加1以对对端的SYN报文段进行确认(报文段3)。 + +![](image/TCP建立.png) + +### 终止连接 +TCP是全双工的,因而每个方向的传输都必须单独进行关闭。TCP允许一个方向的传输被关闭,而另一个方向的传输不关闭,这就是TCP的半关闭。由于TCP支持半关闭,因而关闭一个连接需要4次握手。 + +当连接的一端完成它的数据发送任务后它就可以发送一个FIN来终止这个方向的连接,这意味着本端将不会再向对端发送数据。当一端收到一个FIN后,它必须通知应用层另一端已经终止了那个方向的数据传送,但是这一端仍能发送数据。程序这样做。正常关闭过程: +1. Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。 + +2. Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。 + +3. Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。 + +4. Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。 + +![](image/TCP关闭.jpg) + +### 连接建立的超时 + +由于各种原因,连接可能会无法建立。在连接无法建立时,TCP不是立即返回失败,而是会尝试重新建立连接,因为连接无法建立的原因可能是建立连接的请求被丢弃了,所以重新尝试是很有必要的。 + +当建立连接失败时,在TCP放弃重试之前它会尝试多次。重试通过定时器实现,并且采用了指数后退的方式来确定重试的时间,但同时也定义了一个最大的时间限制,在这个时间点还没成功的话就会放弃。 + + +### 同时打开 + +极少数情况下会出现两个应用程序同时执行主动打开的情况。对于同时打开有一个要求,即双方都需要使用为对方所知的端口作为本地端口,否则就无法实现同时打开。TCP可以支持同时打开,并且对于同时打开其最终建立的是一条连接而不是两条,同时打开需要连接双方交换4个报文段,比正常的三次握手多一个。 + +1. 两端几乎在同时发送SYN,并进入SYNSENT状态 +2. 当每一端收到SYN时,状态变为SYNRCVD,同时它们都再发SYN并对收到的SYN进行确认 +3. 当双方都收到SYN及相应的ACK时,状态都变迁为ESTABLISHED + +![](image/TCP同时打开.png) + +### 同时关闭 +连接的双发也可能在同一时间发送第一个FIN来执行主动关闭。TCP支持同时关闭,同时关闭与正常关闭使用的段交换数目相同。 + +1. 应用层发出关闭命令,连接双发各发送一个FIN,并均从ESTABLISHED变为FIN_WAIT_1。 +2. 连接双方收到对端的FIN后,状态由FIN_WAIT_1变迁到CLOSING,并发送最后的ACK。 +3. 当收到最后的ACK时,状态变化为TIMEWAIT + +![](image/TCP同时关闭.png) + +### 复位连接 +RST标志表示复位,用来复位连接。 + +1. TCP会在自己认为的异常时刻发送RST报文段复位连接。一种常见情况是当连接请求到达时,目的端口没有进程正在听。另一种场景是尝试在半打开的连接上发送数据。 + + +2. 终止一个连接。终止一个连接的正常方式是一方发送FIN,这种方式被称为有序释放。在这种方式中,FIN在所有排队数据都发送后才会被发送,一般不会有任何数据丢失。但是连接的一方也可以选择通过RST来释放一个连接,这被称为异常释放。异常终止一个连接对应用程序来说有两个优点: + * 直接丢弃任何待发数据并立即发送复位报文段,无需ACK对RST报文段进行确认。 + * RST的接收方会区分另一端执行的是异常关闭还是正常关闭。并可以通知应用程序。 + + diff --git a/计算机网络/3.5 传输层-TCP可靠数据传输.md b/计算机网络/3.5 传输层-TCP可靠数据传输.md new file mode 100644 index 00000000..bda84845 --- /dev/null +++ b/计算机网络/3.5 传输层-TCP可靠数据传输.md @@ -0,0 +1,145 @@ +# TCP可靠数据传输 + +## 1 概述 +TCP提供了可靠的传输服务,这是通过下列方式提供的: + +* 应用数据被分割成TCP认为最适合发送的数据块。由TCP传递给IP的信息单位称为报文段或段(segment) +* 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。 +* 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 +* TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。 +* 由于IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 +* IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。 +* TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。 + + + +## 2 TCP主要任务 + +当TCP连接建立之后,应用程序即可使用该连接进行数据收发。应用程序将数据提交给TCP,TCP将数据放入自己的缓存,并且在其认为合适的时候将数据发送出去。在TCP中,数据会被当做字节流并按照MSS的大小进行分段,然后加上TCP头部并提交给网络层。之后数据就会被网络层提交给目地主机,目地主机的IP层会将分组提交给TCP,TCP根据报文段的头部信息找到相应的socket,并将报文段提交给该socket,socket是和应用关联的,也就提交给了应用。 + +## 3 TCP可靠传输 +IP提供的服务是尽力交付的服务,也是不可靠的服务。但是TCP在IP之上提供了可靠度传输服务。TCP采用了流水线下的可靠数据传输协议,但是在差错恢复时,并没有简单的采取GBN协议或者选择重传协议,而是将二者结合了起来。 + +TCP采用了累积确认的方式,这类似于GBN,即如果TCP发送了对某个序号N的确认,则表明在N之前的所有字节流都已经被正确接收。但是另一方面,TCP又不会像GBN协议那样简单丢弃失序到达的报文段,而是会将它们缓存起来,但是这些被缓存的报文段不会逐个被确认。当发生超时时,TCP只会重传发生超时的那一个报文段。 + +TCP还允许接收方选择性的确认失序到达的分组,而不是累积的对最后一个确认最后一个正确到达的分组,将它与TCP所采取的选择重传结合起来看就很想选择重传协议的工作机制。因此说TCP的差错恢复结合了GBN和选择重传。 + +选择重传中每个报文段都有自己的超时值,TCP采用了RFC2988建议的机制用一个单一定时器来完成该功能。RFC2988定义的原则: +* 发送TCP分段时,如果还没有重传定时器开启,那么开启它。 +* 发送TCP分段时,如果已经有重传定时器开启,不再开启它。 +* 收到一个非冗余ACK时,如果有数据在传输中,重新开启重传定时器。 +* 收到一个非冗余ACK时,如果没有数据在传输中,则关闭重传定时器。 + + +### 基本工作过程 + +1. 发送分组 + + TCP会为发送的每一个分组分配一个唯一的序号,该序号和ISN以及该报文段在字节流中的位置有关。序号被填入TCP头部的序号字段。如果重传定时器还没有运行,则会启动重传定时器。 + +2. 接收到ACK + + 由于是累积确认的,因此如果收到的ACK是合法的,即是对已发送但未被确认的报文段的确认,则更新send_base,并且如果还有未被确认的已发送的报文段,则重启重传定时器。 + +3. 超时 + + 重传引起超时的报文段,并重启定时器。TCP的重传不一定是重传引起超时的报文段本身,TCP可能重新进行分组然后重传,唯一被保证的是所有数据都会被传输。 + +4. 产生ACK + + 每个TCP报文段的TCP头部都固定包含了ACK域,如果在传输中,为了确认一个报文段而单独发送一个ACK,则该ACK就是一个数据部分长度为0的特殊TCP报文段,如果这样的分段太多,网络的利用率就会下降。为此,TCP采取了延迟确认的机制。其工作过程: + + 如果收到的报文段的序号等于rcv_base,并且所有在rvc_base之前的报文段的确认都已经被发送,则只更新rcv_base,但是延迟该报文段的ACK的发送,最多延迟500ms。延迟的ACK可能会在接收端有数据要发送给发送端时被发送或者在接收端有多个ACK需要被发送给发送端时被发送。 + + 如果收到的报文段的序号等于rcv_base,并且有延迟的ACK待发送,则更新rcv_base,并发送累积的ACK以确认这两个按序报文段 + + 如果收到的报文段的序号大于rcv_base,则发送冗余的ACK,即重传对已经确认过的最后一个按序到达的报文段的ACK +### 往返时延的估算与超时 +TCP协议定义了RTT来代表一个TCP分段的往返时间。然而由于IP网络是尽力而为的,并且路由是动态的,且路由器可能缓存或者丢弃IP数据报,因此一个TCP连接的RTT是动态变化的,因而也需要动态测量。样本RTT(SampleRTT)是报文段被发出到报文段的确认被收到的时间间隔。TCP不会为每一个发动的报文段测量一个SampleRTT,而是仅为已发送但是未被确认的分组测量SampleRTT。这样做是为了产生一个近似于RTT的SampleRTT。TCP不会为重传的报文段测量SampleRTT。 + +得到多个SampleRTT后,TCP会尝试使用这些信息来尽可能得到一个较为准确的RTT,为此TCP采用了经常被采用的收到即使用一个滤波器来对多个SampleRTT进行计算。TCP使用如下的滤波器来计算一个EstimateRTT: + +$$ +EstimateRTT= (1- α) * EstimateRTT +α * SampleRTT +$$ + +RFC2988给出的α参考值为1/8。EstimateRTT 是一个平滑后的RTT。 + +除此之外,TCP还将RTT的变化率也应该考虑在内,如果变化率过大,则通过以变化率为自变量的函数为主计算RTT(如果陡然增大,则取值为比较大的正数,如果陡然减小,则取值为比较小的负数,然后和平均值加权求和),反之如果变化率很小,则取测量平均值。TCP计算了一个DevRTT。它用于估量SampleRTT偏离EstimateRTT的程度。其公式为: +$$ +DevRTT= (1-β)* DevRTT + β* |SampleRTT - EstimateRTT | +$$ +β的参考值为1/4。 +之后重传定时器的值会被设置为EstimateRTT + 4 * DevRTT + + +### 倍数增加的重传间隔 + +在发生超时重传时,TCP不是以固定的时间间隔来重传的,而是会再每次重传时都将下一次重传的间隔设置为上次重传间隔的2倍,因此重传间隔是倍数增加的。直到收到确认或者彻底失败。由于正常发送报文段时,重传定时器的超时值为EstimateRTT + 4 * DevRTT,因此第一重传时会将下一次的超时时间设置为2倍的该值,依次类推。 + +### 快速重传 + +倍数增加的重传间隔会增大端到端的时延,使得发送端可能不得不等待很长时间才能重传报文段。冗余ACK使得TCP可以得到分组丢失的线索。TCP基于冗余ACK提供了一种快速重传机制。其原理是:如果收到了对相同数据的三个冗余的ACK,发送端就认为跟在这个被确认了三次的报文段之后的报文段丢失了,因此重传它,而不是等待它的超时定时器到期。这就是快速重传。 + +### 流量控制 + +在TCP中,连接双都为该连接设置了接收缓存,当报文段被连接的一端接收时,它会进入该接收缓存,被接收的数据并不一定立即被提交给应用程序。因为应用可能由于各种而没能及时读取缓存中的数据。如果发送方发送的数据太快,而应用没有及时读取被缓存的数据,缓存就会变满,此时为了防止缓存溢出,就要丢弃报文段,显然丢弃已经正确接收的报文段是对网络资源的浪费。为了解决该问题,TCP需要提供一种机制来防止接收缓存溢出。 + +TCP提供了流量控制功能,来防止发送方发送过快而导致接收方缓存溢出的情形出现。这是通过让接收方通告一个接收窗口大小来实现的。接收窗口的大小包含在TCP头部的窗口大小字段中。其工作原理为: + +接收方通过窗口大小通告本地可以接收的报文段的总大小。发送方将根据该信息来判断自己可以发送多少数据。发送方保证自己发送的未被确认的报文段的总大小不超过接收方通告的窗口大小。对应到我们所描述的GBN和选择重传协议中,就是发送方会用接收方通告的窗口大小更新本地的窗口大小N的值。一个可视化的描述如下图: + +![](image/TCP流量控制.png) + +但是TCP连接的一端可能通告一个大小为0的窗口,这时候接收到对端通告大小为0的窗口的一端并不会停止发送,而是会启动一个定时器来发送窗口探测报文段,该报文段只包含一个字节,该报文段会被接收方确认,该定时器会一直重启自身来发送窗口探测包直到对端通告了一个大小不为0的窗口为止。定时器的超时值会逐渐增大到一个最大值,然后固定以该值重发窗口探测包。 + + +## 4 SWS(糊涂窗口综合症) +糊涂窗口综合症是指在发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者都存在时,通过TCP连接传输的报文段会很小,这会导致有效载荷很小。极端情况下,有效载荷可能只有1个字节;而传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象就叫糊涂窗口综合症。 + +### 发送端引起的SWS + +如果TCP发送端的应用是产生数据很慢的应用程序(比如telnet),它可能一次只产生一个字节。这种应用程序一次只往TCP提交一个字节的数据,如果没有特殊的处理,这就会导致TCP每次都产生一个只有一个有效载荷的报文段。最终导致网络的有效利用率非常低。解决办法是防止TCP发送过小的报文段,如果应用提交的数据较短,就等待足够的数据来组成一个较大的报文段再发送,为了防止长时间等待导致时延过大,可以加入一个等待时间限制,如果时间到期还没等到足够的数据就直接发送不再等待。Nagle算法就是这样的一种算法。 + +### 接收端引起的SWS + +如果TCP接收端的应用处理数据的速度很慢,一次只从TCP缓存取走很小数量的数据,比如一个字节,而发送方发送的速度较快,这就会导致接收方的缓存被填满,然后接收方每次在应用取走一个字节的数据后都通告一个大小为1的窗口,这就限制发送方每次只能发送包含一个字节的有效载荷的报文段。 +对于这种糊涂窗口综合症,即应用程序消耗数据比到达的慢,有两种建议的解决方法: +Clark解决方法 Clark解决方法是只要有数据到达就发送确认,但通告的窗口大小为零,这个过程持续到缓存空间已能放入具有最大长度的报文段或者缓存空间的一半已经空了。 +延迟确认 第二个解决方法是延迟一段时间后再发送确认。这时接收方不立即确认收到的报文段。接收方在确认收到的报文段之前一直等待,直到入缓存有足够的空间为止。该方法阻止了发送端滑动其窗口,当发送端发送完其数据后,它就停下来了。这样就防止了这种症状。延迟的确认还减少了通信量。接收端不需要确认每一个报文段。但它有可能使发送端重传其未被确认的报文段。可以给延迟的确认加一个时间限制来降低该方法缺点的影响。 + +### Nagle算法 + +Nagle算法的核心思想是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块。Nagle算法的规则: +* 如果包长度达到MSS,则允许发送; +* 如果该包含有FIN,则允许发送; +* 设置了TCP_NODELAY选项,则允许发送; +* 未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送; +上述条件都未满足,但发生了超时(一般为200ms),则立即发送。 + +Nagle算法在任意时刻只允许存在一个未被确认的报文段,但他它并不关心报文段的大小,因此它事实上就是一个扩展的停止等待协议,只不过它是基于报文段的而不是基于字节的。Nagle算法完全由TCP协议的ACK机制决定,因此也有一些缺点,比如如果对端ACK回复很快的话,Nagle事实上不会拼接太多的数据包,虽然避免了网络拥塞,网络总体的利用率依然很低。 + +在某些时刻也可能会需要关闭该算法,尤其是交互式的TCP应用,因为这种应用期望及时收到响应。这可以通过打开TCP_NODELAY选项来实现。 + +### TCP_CORK 选项 + +设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据。 + +### Nagle算法与CORK算法区别 + +Nagle算法和CORK算法非常类似,但是它们也有区别: +它们的目地不同。Nagle算法主要避免网络因为有太多的小报文段而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。 + +用户通过TCP_NODELAY来启用或禁用Nagle算法而通过TCP_CORK来启用或禁用CORK算法。 + +Nagle算法关心的是网络拥塞问题,只要有ACK回来则发包,而CORK算法关心的是报文段大小,在前后数据发送间隔很短的前提下,即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。 + +## 5 紧急方式 + +TCP提供了“紧急方式(urgentmode)”,它使连接的一端可以告诉另连接的一端有些 “紧急数据”已经被放置在数据流中。紧急数据的处理方式由接收方决定。 + +要发送紧急数据需要设置TCP首部中的两个字段来。URG比特被置1,并且要将16bit的紧急指针设置为一个正的偏移量,该偏移量必须与TCP首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号。 + +TCP必须通知接收进程,何时已接收到一个紧急数据指针以及何时某个紧急数据指针还不在此连接上,或者紧急指针是否在数据流中向前移动。接着接收进程可以读取数据流,并必须能够被告知何时碰到了紧急数据指针。只要从接收方当前读取位置到紧急数据指针之间有数据存在,就认为应用程序处于“紧急方式”。在紧急指针通过之后,应用程序便转回到正常方式。 + +没有办法指明紧急数据从数据流的何处开始。TCP通过连接传送的唯一信息就是紧急方式已经开始(TCP首部中的URG比特)和指向紧急数据最后一个字节的指针。其他的事情留给应用程序去处理。 \ No newline at end of file diff --git a/计算机网络/3.6 传输层-TCP拥塞控制.md b/计算机网络/3.6 传输层-TCP拥塞控制.md new file mode 100644 index 00000000..957a0521 --- /dev/null +++ b/计算机网络/3.6 传输层-TCP拥塞控制.md @@ -0,0 +1,66 @@ + +# 拥塞控制 +> 参考文献 +> * [TCP协议](https://blog.csdn.net/qq_37044545/article/details/89325768) +## 1 概述 +当网络拥塞时数据报不能及时被转,在分组转发网络中,数据报就会被排队,甚至出现丢包因此说网络拥塞会带来网络开销: +* 引入大的排队时延 +* 当数据报被丢失时发送方必须重传,因此引入了重传开销 +* 当数据报被丢失时,丢失路由器的上游路由器做的工作都变成了无用功 + + +因此必须采取技术来尽可能避免拥塞。由于IP层不提供网络是否拥塞的信息,因而TCP必须自己来判断网络是否出现了拥塞。 + +TCP将丢包(可能是超时也可能是收到了三个冗余的ACK)看做是网络拥塞的线索,将RTT增加看做是网络拥塞程度加重的线索。 + +TCP让连接双方根据自己所判断的网络拥塞的程度来限制其发往网络的流量。TCP在连接的每一端都增加了一个变量cong_win,它表示拥塞窗口,用于限制一端可以向网络发送的数据。TCP连接的每一端都保证它所已经发送的未被确认的报文段的总大小不会超过拥塞窗口和对方通告的窗口大小中的较小的那一个。 + +TCP通过ACK到达的情况(即是否到达,到达的速率)来调整拥塞窗口的大小。 + +## 2 慢启动 +在建立TCP连接时,拥塞窗口被初始化为 min (4*SMSS, max (2*SMSS, 4380 bytes)) 。但是TCP不是以线性的方式增大拥塞窗口,而是以指数的方式增加的,即: +* 初始设置cwnd=1个 min (4*SMSS, max (2*SMSS, 4380 bytes)) ,发送一个报文,在RFC5861中有更新,但是总体就是一个较小的值(SMSS:SENDER MAXIMUM SEGMENT SIZE : The SMSS is the size of the largest segment that the sender can transmit)。(对于SCTP,cwnd初始值为min(4*MTU)。 +* 收到对该报文的ack,则cwnd被设置为2个MSS,可以发送两个报文 +* 收到对2个报文的确认后,cwnd更新为4个MSS,可以发送四个报文,一依次类推。 + + +该过程会一直持续直到遇到一个丢包事件为止(或者等于ssthresh时,ssthresh事实上是用于区分是进行的拥塞避免还是慢启动,初始化时它被设置为65536),事实上该算法相当于每收到对一个MSS的确认就将cwnd增大一个MSS(cwnd决定了当前可以发送cwnd/MSS个报文,当这个cwnd/MSS个报文段都被确认后,就将cwdn增大了cwnd/MSS × MSS即cwnd)。发送方取拥塞窗口与对端通告窗口中的最小值作为发送上限。由于初始的拥塞窗口很小的值,因为该启动方式被称为慢启动。 + +但是对于SCTP,它只有在满足三个条件时才增大cwnd,min(上次发送的所有数据的大小,MTU): +* cwnd已经被用完 +* 累积确认被更新了 +* 当前不处于快速恢复模式 + +## 3 拥塞避免(加性增,乘性减) + +![](image/TCP拥塞控制.png) + +当遇到一个丢包事件时,TCP会将其拥塞窗口降低为原来值的一半,同时将ssthresh设置为 max (FlightSize / 2, 2*SMSS) (FlightSize:The amount of data that has been sent but not yet acknowledged.)(对于SCTP为:max(cwnd/2, 4*MTU),总体而言,SCTP和TCP的拥塞控制、避免算法是一致的,用MTU替换掉MSS即可。另外SCTP只在有大于等于cwnd的数据正在被发送时(onflight)才更新cwnd) 。其目的是通过降低发送速率来缓解、避免拥塞。但是拥塞窗口大小至少为1个MMS。 + + +在非启动期间,当TCP探测到没有拥塞时,即当连接的一端收到了对它已经发送但未被确认的报文段的确认时,它就会增大拥塞窗口,增大的方式是每收到一个ACK将拥塞窗口大小增大MSS×MSS/cwnd,因此在该算法下,经过一个RTT,cwnd最多增大一个MSS。 + + +因此TCP的拥塞控制方式又称为加性增,乘性减。拥塞窗口的增加受惠的只是自己,而拥塞窗口减少受益的是大家,当出现拥塞时,通过乘性减虽然损害了自己,但是可以让更多的其它网络参与者受益,这也证实TCP拥塞控制中的公平性的核心所在。 + +## 4 对超时事件的处理 + +虽然超时和收到三个冗余ACK(SCTP中不存在三个冗余ACK,对应的事件是三个SACK都不包含都某个报文段的确认,则认为该报文段丢失需要重传)都被认为是丢包事件,但是TCP在二者的处理上并不全相同。当收到三个冗余ACK时,TCP的处理就是“加性增,乘性减”。但是如果是超时事件,则TCP会更新ssthresh的值为max (FlightSize / 2, 2*SMSS)(对于SCTP,max(cwnd/2, 4*MTU)),然后进入“慢启动”过程,即将拥塞窗口设置为一个MSS,然后指数增加拥塞窗口大小。此时“慢启动”会持续到遇到一个丢包事件或者拥塞窗口被增大到了ssthresh,如果是增大到了ssthresh则进入“拥塞避免”的模式,即开始加性增。 + +因此对于丢包事件来说,只要发生了丢包,则ssthresh都会更新max (FlightSize / 2, 2*SMSS)(对于SCTP,max(cwnd/2, 4*MTU))。如果是超时,cwnd被设置为一个MSS(对于SCTP,1个MTU );如果是冗余ACK,则cwnd被更新为更新后的ssthresh。随后cwnd的更新方式取决于它和ssthresh之间的大小关系,如果cwdn小于或等于ssthresh,则就是在执行慢启动,否则就是在执行拥塞避免。 + +对超时时间和三个冗余ACK处理方式上存在区别的原因在于,收到冗余ACK表明了网络时可以交付报文段的,是可用的,而超时则就是明确的丢包。而收到冗余ACK至少表明网络还是可用的,只是出现了丢包,事实上,在出现三个丢包的时候,采用的是快速恢复+快速重传+拥塞避免。 + +## 5 快速恢复 + +![](image/TCP拥塞控制-快速恢复.png) + +快速恢复一般和快速重传一起实现,其算法为: +* 当收到第3个重复的ACK时(对于SCTP,有三个SACK都不包含某个报文的确认时。具体规则:1.只有报文TSN小于当前SACK中新被确认的最大TSN的被丢失的报文的丢失计数才会增加,2.如果已经处于快速重传模式,并且当前的SACK会更新累积确认点,则所有丢失的报文的丢失计数都会增加(这一点将保证报文会被尽快快速重传,从而使得尽快退出快速重传模式)。),把ssthresh设置为max (FlightSize / 2, 2*SMSS)(对于SCTP,max(cwnd/2, 4*MTU)),把cwnd设置为ssthresh的值加3个SMSS(对于SCTP,不增加)。然后重传丢失的报文段。因为收到3个重复的ACK表明有三个报文已经离开网络到达了接收断,被且被接收端给接收了。(同时,对于SCTP,还会将当前已经发出的最大的报文序号(TSN)作为退出快速恢复的序列号) +* 收到另外的重复的ACK时,cwnd增加一个MSS。 +* 当收到确认新数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。此时就重新进入到了第一步丢包时本应进入的拥塞避免。(对于SCTP,如果收到的SACK的累积确认确认了步骤1中的退出快速恢复的序列号,则退出快速恢复) + + +快速恢复意在通过快速重传丢失的报文,使得接收端可以将累积确认的最后一个报文和乱序到达的报文之间的“间隙”填充起来,从而尽快进行新的确认。在这个过程中,每当接收断收到一个新的乱序的报文ACK时,发送端就将自己的cwnd增大一个MSS,使得发送端可以尽快填充接收端的“间隙”,直到累积确认的报文段之后有新的连续的报文段被接收端接收到了,这个时候接收端会更新一个新的ACK,发送端在收到该ACK后就退出快速恢复并进入拥塞避免。 + +需要注意的是无论是拥塞避免还是慢启动,SCTP规定,如果某个地址不用于发送数据,则每个RTO都要对cwnd做一次调整,调整后的值为max(cwnd/2, 4*MTU). \ No newline at end of file diff --git a/计算机网络/4.1 网络层-基本原理.md b/计算机网络/4.1 网络层-基本原理.md index 1152bc0a..1d0c6dd0 100644 --- a/计算机网络/4.1 网络层-基本原理.md +++ b/计算机网络/4.1 网络层-基本原理.md @@ -1,4 +1,4 @@ -# 网络成-基本原理 +# 网络层-基本原理 ## 1 基本功能 @@ -37,7 +37,7 @@ 当分组在网络中向目的地传输时,它会经过一系列路由器。每个路由器都使用该分组的目的地址来转发给分组。每台路由器都由一个将目的地址映射到链路接口的转发表,每当分组到达时,路由器就利用分组的目的地址在转发表中查找一个合适的输出链路接口,然后路由器将分组从该输出链路接口发送出去。 在因特网中,路由器的转发表可以由选路算法或者管理员更新。由于转发表的修改可能发生在任意时刻,因而两个主机之间的分组在不同的时刻走的可能是不同的网络路径,并可能无序到达。 -最长前缀匹配规则 +### 最长前缀匹配规则 网络前缀:是网络地址的前边某些连续比特。比如对于地址 11101111 11011110 1000000 00000001,其对应的8比特前缀为11101111 , 16比特前缀为11101111 11011110 在该规则下,路由器的转发表中记录的是网络前缀和输出链路接口之间的对应关系。当查转发表时,仍然利用目的地址来进行匹配,但是可能会有很多歌匹配,这个时候取匹配到的比特数目最多的表象作为命中表项,并根据它来转发分组。 @@ -45,59 +45,220 @@ ## 4 路由器构成(硬件) +![asd](\image/路由器组成.png) -路由器在网络层是一个极其重要的设备,每台路由器都由一张转发表。路由器检查到达分组首部中的一个字段的值,然后利用该值在路由器的转发表中进行查询,以决定该如何转发该分组。查询的结果是分组将被转发的路由器的链路接口。 +路由器在网络层是一个极其重要的设备,每台路由器都由一张**路由转发表**。 -网络层的最主要的功能是将分组从一台主机移动到另一台主机。该功能主要是由路由器完成的。典型的路由器结构如下: +路由器检查到达分组首部中的一个字段的值,然后利用该值在路由器的转发表中进行查询,以决定该如何转发该分组。 + +查询的结果是分组将被转发的路由器的链路接口。 ### 输入端口 + 它接入输入的物理链路,和链路远端的数据链路层交互,并完成查找和转发功能,以使得输入分组能够进入到合适输出链路接口。对于控制分组,它则会进入选路处理器。 +确定一个到达的分组经交换结构转发给哪个输出端口。输出端口的选择是取决于转发表中的信息,转发表是由选路处理器计算的,每个输入端口都会有一份转发表的影子拷贝,并且会被及时更新。被阻塞的分组需要在输入端口排队。 + + +需要对转发表的组织和查询进行优化,常见的方式有: +* 以树形结构存储转发表,树的每一级对应目的地址中的一个比特,如果地址比特位0则搜索其左子树,否则搜索右子树。采用这种结构,N比特的目的地址可以在N步之内找到相应的转发表项。 + +* 内容可寻址内存CAM,CAM允许将一个IP地址交给CAM,由CAM在常数时间内返回该地址对应的转发表项的内容。 + +* 将最近访问的转发表保存在高速缓存。 -输入端口的线路端接功能与数据链路处理实现了与通向路由器的各个输入链路相关的物理层和数据链路层。输入端口的查找/转发功能对路由器的转发功能是非常重要的。在很多路由器中,就是在这里来确定一个到达的分组经交换结构转发给哪个输出端口。输出端口的选择是取决于转发表中的信息,虽然转发表是由选路处理器计算的,但是通常每个输入端口都会有一份转发表的影子拷贝,并且会被及时更新。正因为输入端口拥有转发表的本地拷贝因而就可以在每个输入接口做出转发决策,而无需调用中央选路处理器,这种模式可以避免在路由器的某个节点产生转发处理瓶颈。 -在输入端口处理能力受限的路由器中,输入端口会将分组转发给中央绚丽处理器,然后由它执行转发表查找并将分组转发到恰当的输出端口。 -在有了转发表后,转发决策就很简单,就是查找转发表,但是由于主干路由器的转发表规模很大, 而且我们期望输入端口的处理速度能够达到线速或者说我们期望查表的速度越快越好,因而就需要对转发表的组织和查询进行优化,常见的方式有: -以树形结构存储转发表,树的每一级对应目的地址中的一个比特,如果地址比特位0则搜索其左子树,否则搜索右子树。采用这种结构,N比特的目的地址可以在N步之内找到相应的转发表项。 -内容可寻址内存CAM,采用树形结构对于主干路由器来说还是太慢了,CAM允许将一个IP地址交给CAM,然后由CAM在常数时间内返回该地址对应的转发表项的内容。 -将最近访问的转发表保存在高速缓存。 -找到分组输出端口后,分组就可以进入交换结构。这个时候分组可能会被阻塞,因而来自其它输入端口的分组可能正在使用交换结构。被阻塞的分组需要在输入端口排队。 ### 交换结构 +![](\image/路由器交换结构.png) 它将路由器的输入接口连接到它的输出接口。 - 在这种由纵横式交换机构成的互联网络中任意两个端口之间都有自己的专用总线,因而可以克服单一、共享式总线的带宽限制。使用这种网络时,往往把长度变化的IP分组分片成固定尺寸的信元,加上标签通过互联网络进行交换,这些信元在输出接口再被装配成初始分组。这种方式能够极大的简化并加快通过互联网络的分组交换。 ### 输出端口 -存储经过交换结构发送给它的分组,并将分组发送出去。同时它执行和输入端口相反的链路层功能和物理层功能。 -选路处理器:执行选路协议,维护选路信息和转发表。 - -输出端口取出存放在输出端口内存中的分组并将它传送到输出链路上。它在数据链路层和物理层上实现与输入接口相反的功能 - -### 排队 -在输入端口和输出端口都可能出现排队。随着这些队列的增长,路由器的缓存空间可能会耗尽,进而导致出现丢包。 -对于有N个输入接口和N个输出接口的路由器,定义交换结构速率为交换结构能够从输入端口移动分组到输出端口的速率。则如果交换结构的速率至少是输入线路速率的N倍,则在输入端口不会出现排队,这是因为即便所有的N个端口都在接收报文,交换结构也能够将其全部移动到输出接口。但是对于输出接口,假设交换结构速率为线路速率的N倍,则在最坏情况下,到达所有N个输入端口的分组都要被发送到同一个输出端口,在这个情况下,输出端口发送一个分组的同时它要接收N个分组,因而就会导致排队,这种情况持续下去就会导致输出端口的队列不断增长并耗尽内存出现丢包。 -由于会出现排队,因而缓存大小的设置就非常关键,缓存大小设置的经验方法是:缓存量=平均往返时延*链路的容量。 -1.分组调度 -输出端口出现排队,一个重要的问题就是输出端口如何发送这些排队的分组,可能的方式有: -先来先服务FCFS -加权公平队列,它在具有排队等待传输的分组的不同的端到端连接之间公平的共享输出链路。 -2.队列管理 -另外的一个问题是如果没有足够的缓存来缓存一个分组,是丢弃该分组,还是丢弃一个已排队的分组来为新的分组腾出空间。相关的策略通常为主动队列管理算法AQM。随机早期检测算法RED是一种常见的算法,其思想是为输出队列长度维护一个加权平均值: -当队列长度小于低的门限值Tmin时,不丢弃新到达的分组; -当队列长度介于Tmin和Tmax之间时,以一定的概率丢弃分组,且分组概率随着队列长度的增长线性增加, -当队列长度达到Tmax时,到达的分组全部被丢弃。 -这3个阶段分别被称作正常、拥塞避免和拥塞控制三个阶段。最坏情况的最大队列大小被限制为Tmax。 +存储经过交换结构发送给它的分组,并将分组发送出去。 -3.HOL -如果交换结构不能快得使所有分组都能无时延的通过它传送,则在输入端口也将出现分组排队。假设 -所有链路速率都相同 -一个分组能够以与一个输入链路接收一个分组相同的时间从任意一个输入端口移动分组到给定的输出端口 -输入队列按照FCFS工作 +### 选路处理器 -假设输入端口中的每个数字都表示一个分组,数字值标识其想要转发到的输出端口,并且输入端口和输出端口都从下标1开始从上到下编号。在图中的场景下,假设交换结构决定先移动输入端口1中的分组到其输出端口,则输入端口3中的分组必须等待,进一步的,由于输入端口的队列采用FCFS的工作模式,因而输入端口3中的目的端口为2的分组也必须等待,尽管此时并没有其他输入端口和它竞争输出端口2,这种现象就叫Head-Of-the-Line阻塞,即HOL阻塞。 -研究表明由于HOL阻塞,只要输入链路上的分组到达速率达到其容量的58%,在某些假设前提下,输入队列就将无限增大,从而导致丢包。 +执行选路协议,维护选路信息和转发表。 + + +## 5 排队 +在输入端口和输出端口都可能出现排队。缓存大小设置的经验方法是:缓存量=平均往返时延*链路的容量。 + +### 分组调度 + +输出端口出现排队,分组调度: +* 先来先服务FCFS +* 加权公平队列 + + +### 队列管理 + +主动队列管理算法AQM。 + +### HOL +如果交换结构不能快得使所有分组都能无时延的通过它传送,则在输入端口也将出现分组排队。输入队列按照FCFS工作 + + +## 6 路由器环回接口 + +### Loopback接口简介(环回接口) + +Loopback接口是虚拟接口,是一种纯软件性质的虚拟接口。任何送到该接口的网络数据报文都会被认为是送往设备自身的。大多数平台都支持使用这种接口来模拟真正的接口。这样做的好处是虚拟接口不会像物理接口那样因为各种因素的影响而导致接口被关闭。事实上,将Loopback接口和其他物理接口相比较,可以发现Loopback接口有以下几条优点: +1. Loopback接口状态永远是up的,即使没有配置地址。这是它的一个非常重要的特性。 +2. Loopback接口可以配置地址,而且可以配置全1的掩码,可以节省宝贵的地址空间。 +3. Loopback接口不能封装任何链路层协议。 + +对于目的地址不是loopback接口,下一跳接口是loopback口的报文,路由器会将其丢弃。对于CISCO路由器来说,可以配置[no] ip unreachable命令,来设置是[否]发送icmp不可达报文,对于VRP来说,没有这条命令,缺省不发送icmp不可达报文 。 + + +### Loopback接口的应用 +基于以上所述,决定了Loopback接口可以广泛应用在各个方面。其中最主要的应用就是:路由器使用loopback接口地址作为该路由器产生的所有IP包的源地址,这样使过滤通信量变得非常简单。 + +1. 在Router ID中的应用 + +如果loopback接口存在、有IP地址,在路由协议中就会将其用作Router ID,这样比较稳定--loopback接口一直都是up的。 +如果loopback接口不存在、或者没有IP地址,Router ID就是最高的IP地址,这样就比较危险--只要是物理地址就有可能down掉。 + +对于CISCO来说,Router ID是不能配置的,对于VRP来说,Router ID可以配置,那麽我们也可以将Loopback接口地址配成Router ID。 +配置BGP。在IBGP配置中使用loopback接口,可以使会话一直进行,即使通往外部的接口关闭了也不会停止。配置举例: +``` +interface loopback 0 +ip address 215.17.1.34 255.255.255.255 +router bgp 200 +neighbor 215.17.1.35 remote-as 200 +neighbor update-source loopback 0 +``` + +2. 在远程访问中的应用 + +使用telnet实现远程访问。配置telnet,使从该路由器始发的报文使用的源地址是loopback地址。配置命令如下: +``` +ip telnet source-interface Loopback0 +``` +使用RCMD实现远程访问。 +配置RCMD,使从该路由器始发的报文使用的源地址是loopback地址。配置命令如下: +``` +ip rcmd source-interface Loopback0 +``` + +3.在安全方面的应用 + +在TACACS+中的应用。配置TACACS+,使从该路由器始发的报文使用的源地址是loopback地址。配置命令如下: +``` +ip tacacs source-interface Loopback0 +tacacs-server host 215.17.1.1 +``` +可以通过过滤来保护TACACS+服务器--只允许从LOOPBACK地址访问TACACS+端口,从而使读/写日志变得简单,TACACS+日志纪录中只有loopback口的地址,而没有出接口的地址。 + + +4.在RADIUS用户验证中的应用 + +配置RADIUS, 使从该路由器始发的报文使用的源地址是loopback地址。配置命令如下: +``` +ip radius source-interface Loopback0 +radius-server host 215.17.1.1 +auth-port 1645 acct-port 1646 +``` +这样配置是从服务器的安全角度考虑的,可以通过过滤来保护 RADIUS服务器和代理--只允许从LOOPBACK地址访问RADIUS端口,从而使读/写日志变得简单,RADIUS日志纪录中只有loopback口的地址,而没有出接口的地址。 + + +5. 在纪录信息方面的应用,输出网络流量纪录。 + +配置网络流量输出,使从该路由器始发的报文使用的源地址是loopback地址。配置命令如下: +``` +ip flow-export source Loopback0 +Exporting NetFlow records Exporting NetFlow +``` + +这样配置是从服务器的安全角度考虑的,可以通过过滤来保护 网络流量收集--只允许从LOOPBACK地址访问指定的流量端口。 + + +6. 在日志信息方面的应用 + +发送日志信息到Unix或者Windows SYSLOG 服务器。路由器发出的日志报文源地址是loopback接口,配置命令如下: +``` +logging source-interface loopback0 +``` +这样配置是从服务器的安全角度考虑的,可以通过过滤来保护 SYSLOG服务器和代理--只允许从LOOPBACK地址访问syslog端口,从而使读/写日志变得简单,SYSLOG日志纪录中只有loopback口的地址作为源地址,而不是出接口的地址。 + + +7. 在NTP中的应用 + +用NTP(网络时间协议)使所有设备的时间取得同步,所有源于该路由器的NTP包都把Loopback地址作为源地址。配置如下: +``` +ntp source loopback0 +ntp server 169.223.1.1 source loopback 1 +``` +这样做是从NTP的安全角度着想,可以通过过滤来保护NTP系统--只允许从loopback地址来访问NTP端口。NTP将Loopback接口地址作为源地址,而不是出口地址。 + + +8. 在SNMP中的应用 + +如果使用SNMP(简单网络管理协议),发送traps时将loopback地址作为源地址。配置命令: +``` +snmp-server trap-source Loopback0 +snmp-server host 169.223.1.1 community +``` +这样做是为了保障服务器的安全,可以通过过滤来保护SNMP的管理系统--只允许从Loopback接口来访问SNMP端口。从而使得读/写trap信息变得简单。SNMPtraps将loopback接口地址作为源地址,而不是出口地址。 + + +9. 在Core Dumps中的应用 + +如果系统崩溃,有Core dump特性的路由器能够将内存的映像上传到指定的FTP服务器。配置Core dumps使用loopback地址作为源地址。配置命令如下: +``` +ip ftp source-interface loopback 0 +exception protocol ftp +exception dump 169.223.32.1 +``` +这样的做的好处是保证了Core Dump FTP 服务器的安全,通过过滤能够保护用于core dumps的FTP服务器--只允许从loopback地址访问FTP端口。 +这个FTP服务器必须是不可见的。 + + +10. 在TFTP中的应用 + +通过TFTP从TFTP服务器配置路由器,可以将路由器的配置保存在TFTP服务器,配置TFTP,将loopback地址作为源于该路由器的包的源地址。配置命令如下: +``` +ip tftp source-interface Loopback0 +``` +这样做对TFTP服务器的安全是很有好处的:通过过滤来保护存储配置和IOS映像的TFTP服务器--只允许从loopback地址来访问TFTP端口,TFTP服务器必须是不可见的。 + + +11. 在IP unnumbered中的应用 + +应用IP Unnumbered在点到点链路上就不需要再配置地址了。配置举例: +``` +interface loopback 0 +ip address 215.17.3.1 255.255.255.255 +interface Serial 5/0 +ip unnumbered loopback 0 +ip route 215.34.10.0 255.255.252.0 Serial 5/0 +``` + +### 主机环回接口原理 + +环回接口(Loopback Interface),允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的。根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现。 + +![](image/换回接口处理数据报.png) + +1. 当网络层的IP输出函数发现目的地址为环回地址,则交给环回驱动程序,环回驱动程序把该IP数据包放入IP输入队列中。否则则交给以太网驱动程序。 + +2. 在太网网驱动程序中,如果发现目的地址为广播或多播地址,如果必要,会复制一份数据给环回驱动程序,然后送到以太网。 + +3. 如果发现目的地址与接口地址相同,也会交给环回驱动程序。 + +需要指出图中的关键点是: + +1. 传给环回地址(一般是127.0.0.1 )的任何数据均作为IP输入。 + +2. 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为广播传送和多播传送的定义(第12章)包含主机本身。 + +3. 任何传给该主机IP地址的数据均送到环回接口。 + +看上去用传输层和IP层的方法来处理环回数据似乎效率不高,但它简化了设计,因为环回接口可以被看作是网络层下面的另一个链路层。网络层把一份数据报传送给环回接口,就像传给其他链路层一样,只不过环回接口把它返回到IP的输入队列中。 + +另一个隐含的意思是送给主机本身IP地址的IP数据报一般不出现在相应的网络上。例如,在一个以太网上,分组一般不被传出去然后读回来。某些BSD以太网的设备驱动程序的 \ No newline at end of file diff --git a/计算机网络/4.2 网络层-网际协议.md b/计算机网络/4.2 网络层-网际协议.md index 708306ef..8cdda106 100644 --- a/计算机网络/4.2 网络层-网际协议.md +++ b/计算机网络/4.2 网络层-网际协议.md @@ -1,214 +1,222 @@ -IP(internet protocol)协议是TCP/IP协议族的核心协议,是因特网的网络层。当前的版本号是4,也称为IPv4,下一代IP协议的版本号为6即IPv6。正如描述的网络层功能一样,IP层为因特网提供了选路和转发的功能。接入因特网的主机之间可以通过IP层而互相通信,在IP层,IP地址用于标识接入网络的接口,进而标识一台主机。当信息在TCP/IP协议栈中传递时,每层都会添加其自己的控制信息,即协议头,IP地址被添加在IP头中。IP头提供了IP协议以及数据报的信息。 -一、IPv4数据报格式 -当接入网络的两台设备通过IP层互相通讯时,交互的信息会被封装成网络层分组,网络层分组又被称为数据报。IPv4的数据报格式如下: +# 网络层-网际协议 + +IP(internet protocol)协议是TCP/IP协议族的核心协议,是因特网的网络层。IP层为因特网提供了选路和转发的功能。在IP层,IP地址用于标识接入网络的接口,进而标识一台主机。 + +## 1 IPv4协议 + +### IPv4数据报 +网络层分组被称为数据报。IPv4的数据报格式如下: +![](\image/ipv4.png) + +* 版本号:协议版本号,IPv4为4,IPv6则为6(当然IPv6的头部不完全是这样,但是4个比特含义一致) +* 首部长度:首部长度指的是首部占32 bit字的数目,包括任何选项。因此IPv4首部最长为60个字节 +* 服务类型:服务类型(TOS)字段包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TO S分别代表:最小时延、最大吞吐量、最高可靠性和最小费用 +* 数据报长度:以字节为单位的整个IP数据报的长度(包括首部)。 +* 标识、标志、片偏移:标识用来唯一确定主机发送的每一个IP数据报。标志和片偏移用来支持IP分片,当然它们必须和标识一起使用。 +* 生存时间:数据报可以经过的路由器数,这使得IP数据报早晚会在网络中消失,即要么被消失,要么由于生存时间达到而“死亡” +* 协议:标识IP层承载的上一层协议类型,比如UDP/TCP/SCTP。 +* 首部校验和:首部检验和字段是根据I P首部计算的检验和码。IPv6首部中不再包含首部校验和。 +* 源、目的地址:源的IP地址和目的的IP地址 +* 选项:最后一个字段是任选项,是数据报中的一个可变长的可选信息。主要包括:安全和处理限制、记录路径(让每个路由器都记下它的I P地址)、时间戳(让每个路由器都记下它的I P地址和时间)、宽松的源站选路(为数据报指定一系列必须经过的I P地址)、严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。 -其各个字段的含义如下: -版本号:协议版本号,IPv4为4,IPv6则为6(当然IPv6的头部不完全是这样,但是4个比特含义一致) -首部长度:首部长度指的是首部占32 bit字的数目,包括任何选项。因此IPv4首部最长为60个字节 -服务类型:服务类型(TOS)字段包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TO S分别代表:最小时延、最大吞吐量、最高可靠性和最小费用 -数据报长度:以字节为单位的整个IP数据报的长度(包括首部)。 -标识、标志、片偏移:标识用来唯一确定主机发送的每一个IP数据报。标志和片偏移用来支持IP分片,当然它们必须和标识一起使用。IPv6则不允许在路由器分片,在IPv6中,分片和重组必须在源和目的进行 -生存时间:数据报可以经过的路由器数,这使得IP数据报早晚会在网络中消失,即要么被消失,要么由于生存时间达到而“死亡” -协议:标识IP层承载的上一层协议类型,比如UDP/TCP/SCTP。 -首部校验和:首部检验和字段是根据I P首部计算的检验和码。IPv6首部中不再包含首部校验和。 -源、目的地址:源的IP地址和目的的IP地址 -选项:最后一个字段是任选项,是数据报中的一个可变长的可选信息。主要包括: -安全和处理限制 -记录路径(让每个路由器都记下它的I P地址) -时间戳(让每个路由器都记下它的I P地址和时间) -宽松的源站选路(为数据报指定一系列必须经过的I P地址) -严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。 -1.IP分片 -数据链路层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。但是分片报文只有到了最终目的地才会被重组。重新组装由目的地的IP层来完成,其目的是使分片和重新组装过程对运输层(比如TCP)是透明的。 -IP头部包含一个由数据报原始发送者设置的标识字段,它在由该发送者发送的IP数据报中是唯一的。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。 -标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片,在这种情况下,如果路由器判断需要分片就把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)给数据报的源主机。 -当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。 -但是IP分片存在一个严重的缺陷:即使只丢失一片数据也要重传整个数据报。 -在IPv6中,分片功能被限制在源主机进行,这是因为分片增加了网络核心(即路由器)的工作量,使得它不得不为所有报文进行分片处理的判断,网络核心应该更专注于它选路和转发的功能,而不是被额外的处理所打断。 -二、IPv4地址 -在因特网中,无论是主机还是路由器,都通过接口接入网络。接口是主机或路由器接入网络的装置,一般情况下,一个主机由一个接口,而路由器有多个接口。为了使得接口能够工作在网络层,每个接口都需要有IP地址。因此,IP实际上是和接口相关联的,而不是与主机或路由器相连的。 -1.IPv4地址格式 +### IP分片过程 + +1. 分片原理 +数据链路层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时,查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。 +分片可以发生在原始发送端主机上,也可以发生在中间路由器上。 +但是分片报文只有到了最终目的地才会被重组。重新组装由目的地的IP层来完成,其目的是使分片和重新组装过程对运输层是透明的。 + +2. 分片标志 +IP头部包含一个由数据报原始发送者设置的标识字段,它在由该发送者发送的IP数据报中是唯一的。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。 + +3. 不分片标志 +标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片,在这种情况下,如果路由器判断需要分片就把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)给数据报的源主机。 +当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。 + +3. 补充 +IP分片存在一个严重的缺陷:即使只丢失一片数据也要重传整个数据报。在IPv6中,分片功能被限制在源主机进行。 + + +## 2 IPv4地址 + + +在因特网中,通过接口接入网络。一般主机有一个接口,而路由器有多个接口。为了使得接口能够工作在网络层,每个接口都需要有IP地址。因此,IP实际上是和接口相关联的,而不是与主机或路由器相连的。 + + +### IPv4地址格式 IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。 + 因特网中,每台主机或路由器的接口都有一个IP地址。但是每个接口的IP地址不能随意选择,每个接口的IP地址的组成部分需要由其连接的子网来决定。 -1.分类编址 -最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A类~E类。其中A、B、C3类(如下表格)由InternetNIC在全球范围内统一分配,D、E类为特殊地址。 -网络类别 最大网络数 第一个可用的网络号 最后一个可用的网络号 每个网络中的最大主机数 -A 126(2^7-2) 1 126 16777214 -B 16384(2^14) 128.0 191.255 65534 -C 2097152(2^21) 192.0.0 223.255.255 254 + +### 分类编址 +便于寻址以及层次化构造网络,每个IP地址包括两个标识码,即网络ID和主机ID(网络号和主机号)。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机有一个主机ID与其对应。Internet委员会定义了5种IP地址类型以适合不同容量的网络, + +| 网络类别 | 最大网络数 | 第一个可用的网络号 | 最后一个可用的网络号 | 每个网络中的最大主机数 | +|-|-|-|-|-| +|A| 126(2^7-2) |1. |127. |16777214| +|B |16384(2^14) |128.0. |191.255. |65534| +|C| 2097152(2^21)| 192.0.0.| 223.255.255. |254| + + 其地址布局如下图: +![](\image/ip分段.jpeg) + +* A类IP地址 + 网络地址的最高位必须是“0”。网络号长度为8位,主机号长度为24位。A类IP地址 地址范围1.0.0.0到127.255.255.255(二进制表示为:00000001 00000000 00000000 00000001 - 01111111 11111111 11111111 11111111)。A类IP地址的子网掩码为255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777214台。 +* B类IP地址 + 网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位。B类IP地址地址范围128.0.0.0-191.255.255.255(二进制表示为:10000000 00000000 00000000 00000001 - 10111111 11111111 11111111 11111111)。B类IP地址的子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台 +* C类IP地址 + 网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位。C类IP地址范围192.0.0.0-223.255.255.255(二进制表示为: 11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110)。C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台 +* D类IP地址 + D类地址被IP用作多播。多播为IP提供了向过个目地转发数据的能力。D类地址的28bit均用作多播组号而不再表示其他。多播组地址包括为1110的最高4bit和多播组号。它们通常可表示为点分十进制数,范围从224.0.0.0到239.255.255.255。能够接收发往一个特定多播组地址数据的主机集合称为主机组(hostgroup)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。 +* E类IP地址 + IP地址中凡是以“llll0”开头的E类IP地址都保留用于将来和实验使用。 +* 特殊的网址 + 每一个主机号都为0的地址(“0.0.0.0”)对应于当前主机; + 每一个主机号都为1的IP地址(“184.289.255.255”)是当前子网的广播地址;网络ID的第一个6位组也不能全置为“0”,全“0”表示本地网络。127.X.X.X是保留地址,用做循环测试用的。 + +### CIDR编址 + +当前采用的地址分配策略为CIDR(Classless Inter-Domain Routing)无类别域间选路。CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。 + +在这种编址方案中IP地址被分为网络号和主机号两部分,并且具有形式a.b.c.d/x,其中x指示了第一部分中的比特数。前x比特被称为该地址的前缀。该组织内部的设备得IP都将具有该前缀,因而对于外部的路由器,它只需要一条指向该前缀的路由即可。当数据报进入该组织内部网络后,内部的路由器将根据32/x比特的信息转发数据报。 + + +### 地址分配管理 +1. 地址管理和获取 + +用户需要从ISP获取一个IP地址或地址块,而ISP则向它的上一级ISP获取地址块,最终所有的地址都来自于ICANN,因特网名字与号码分配机构。 + +2. 获取主机地址 + +将IP分配给接口有两种方式,手动配置或动态配置。动态配置是通过DHCP,即动态主机配置协议实现的。可以用于获取IP信息,获取子网掩码,第一跳路由器,DNS服务器地址等等信息。 + +3. 私有地址 -A类IP地址 -一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,可以用于主机数达1600多万台的大型网络。 -A类IP地址 地址范围1.0.0.0到126.255.255.255[2](二进制表示为:00000001 00000000 00000000 00000001 - 01111111 11111111 11111111 11111111)。最后一个是广播地址。 -A类IP地址的子网掩码为255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777214台。 -B类IP地址 -一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,每个网络所能容纳的计算机数为6万多台。 -B类IP地址地址范围128.0.0.0-191.255.255.255[1](二进制表示为:10000000 00000000 00000000 00000001----10111111 11111111 11111111 11111110)。 最后一个是广播地址。 -B类IP地址的子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台 -C类IP地址 -一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,适用于小规模的局域网络,每个网络最多只能包含254台计算机。 -C类IP地址范围192.0.0.0-223.255.255.255[1](二进制表示为: 11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110)。 -C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台 -D类IP地址 -D类地址被IP用作多播。多播为IP提供了向过个目地转发数据的能力。 -D类地址的28bit均用作多播组号而不再表示其他。多播组地址包括为1110的最高4bit和多播组号。它们通常可表示为点分十进制数,范围从224.0.0.0到239.255.255.255。 -能够接收发往一个特定多播组地址数据的主机集合称为主机组(hostgroup)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。 -一些多播组地址被IANA确定为知名地址。它们也被当作永久主机组。 -特殊的网址 -每一个字节都为0的地址(“0.0.0.0”)对应于当前主机; -IP地址中的每一个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址; -IP地址中凡是以“llll0”开头的E类IP地址都保留用于将来和实验使用。 -IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.255.255.255用于回路测试,如:127.0.0.1可以代表本机IP地址,用“http://127.0.0.1”就可以测试本机中配置的Web服务器。 -网络ID的第一个6位组也不能全置为“0”,全“0”表示本地网络。 -2.CIDR编址 -当前采用的地址分配策略为无类别域间选路(CIDR)。CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。在分类编址方案中,只有A,B,C三类地址可用,但是对于有的组织来说,它的大小可能位于B和C类之间,如果用C类地址,不够用,而用B类地址又会导致宝贵的地址资源的浪费。采用CIDR方案即可解决这个问题。 -在这种编址方案中IP地址被分为网络部分和主机部分两部分,并且具有形式a.b.c.d/x,其中x指示了第一部分中的比特数。前x比特被称为该地址的前缀。该组织内部的设备得IP都将具有该前缀,因而对于外部的路由器,它只需要一条指向该前缀的路由即可。当数据报进入该组织内部网络后,内部的路由器将根据32-x比特的信息转发数据报。 -CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。 -2.地址分配管理 -1.地址管理和获取 -虽然知道了IP的格式,但是用户不可能随意定义自己的IP。做个简单的比方,你不可能给你自家所在的地方随意起个名字,然后就让快递公司给你送件,快递公司是不知道你自定义的这个地址的信息的。为了获得一个可以工的IP地址,这个IP必须是被因特网中的路由器所承认的,为什么是路由器?因为路由器决定了数据报怎么选路,怎么转发,因而只有路由器能够将数据报转发给你的主机,你的主机才算是接入了网络,因而从这个意义说,路由器在因特网中扮演了核心角色。 -从因特网的结构上来说,用户需要从ISP获取一个IP地址或地址块,而ISP则向它的上一级ISP获取地址块,最终所有的地址都来自于ICANN,因特网名字与号码分配机构。 -2.获取主机地址 -上边描述的是地址的来源和管理方式。但是并没有真正将地址分配给接口。从技术上来说,将IP分配给接口有两种方式,手动配置或动态配置。更常用的是动态配置,因为这更加灵活方便,也可以降低 管理员的负担。动态配置是通过DHCP,即动态主机配置协议实现的。它不仅可以用于获取IP信息,它还可以获取子网掩码,第一条路由器,DNS服务器地址等等信息,因而也是很重要很常用的一个协议。 -3.私有地址 -ICANN只管理公共地址,还有部分地址私有地址。私有地址(Private address)属于非注册地址,专门为组织机构内部使用。 以下列出留用的内部私有地址 A类 10.0.0.0--10.255.255.255 B类 172.16.0.0--172.31.255.255 C类 192.168.0.0--192.168.255.255 -3.NAT和UPnP -1.NAT -网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。 -NAT将自动修改IP报文的源IP地址和目的IP地址,IP地址校验则在NAT处理过程中自动完成。有些应用程序将源IP地址嵌入到IP报文的数据部分中,所以还需要同时对报文的数据部分进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据部分嵌入IP地址的应用程序就不能正常工作。 + +## 3 NAT网络地址转换 + +### 作用 + +网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术。NAT解决了lP地址不足的问题,能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。 + +### 原理 + +NAT将自动修改IP报文的源IP地址和目的IP地址,IP地址校验则在NAT处理过程中自动完成。同时对报文的数据部分进行修改,以匹配IP头中已经修改过的源IP地址。在内部都使用了一张NAT转换表,它记录了地址转换的相关信息。 + NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。 -静态转换:是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。 -动态转换:是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。 -端口多路复用(Port address Translation,PAT):是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。 -无论采用哪种方式,在内部都使用了一张NAT转换表,它记录了地址转换的相关信息。 -NAT也有一些争议: -它使用了端口号,而端口号在设计中是为了区分网络程序的。 -它使得路由器必须处理网络层以上的信息,违反了分层原则 -它违反了端到端原则,即主机之间应相互直接通信 -2.UPnP -UPnP指的是通用即插即用,它可以用来支持NAT穿越。它要求主机和NAT是UPnP兼容的。使用它时,在一台主机上运行的应用程序能够为某些请求的公告端口号请求一个NAT映射,该映射位于(私有IP地址,私有端口号)和(公共IP地址,公共端口号)之间。如果NAT接受了这个请求,并且声称该映射,则来自外部的节点就能够发起到(公共IP地址,公共端口号)的TCP连接。 -三、ICMP -ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 -ICMP属于网络层协议,它提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。 -ICMP报文如下: + +* 静态转换:是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。 + +* 动态转换:是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。 +* 端口多路复用(Port address Translation,PAT):是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。 + + + +### UPnP通用即插即用 + + +UPnP(Universal Plug and Play)指的是通用即插即用,它可以用来支持NAT穿越。它要求主机和NAT是UPnP兼容的。使用它时,在一台主机上运行的应用程序能够请求一个NAT映射,该映射位于(私有IP地址,私有端口号)和(公共IP地址,公共端口号)之间。如果NAT接受了这个请求,并且声称该映射,则来自外部的节点就能够发起到(公共IP地址,公共端口号)的TCP连接。 + +## 4 ICMP协议 +ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。 + +控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。ICMP属于网络层协议,它提供一致易懂的出错报告信息,但在IP协议之上,也应该属于应用层协议,但是协议服务于网络层。 + +### ICMP报文 + +![](\image/ICMP报文.png) ICMP报文可以分为两大类:ICMP查询报文和ICMP差错报文。 -对于ICMP差错报文,ICMP报文总是会包含引起该ICMP报文首次产生的IP数据报的首部和前8字节的内容,而且以下情形不会产生ICMP差错报文: -ICMP差错报文。 -的地址是广播地址或多播地址的IP数据报。 -作为链路层广播的数据报。 -不是IP分片的第一片。 -源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。 + +对于ICMP差错报文,ICMP报文总是会包含引起该ICMP报文首次产生的IP数据报的首部和前8字节的内容 + + ICMP查询报文被用来查询网络相关的一些信息,比如回显应答和请求(ping),路由器请求和通告,时间戳等。 -四、IPv6 -现在广泛使用的IP技术是IPv4,它存在一些问题: -地址空间的局限性: I P地址空间的危机由来已久,并正是升级的主要动力。 -性能:尽管I P表现得不错,一些源自2 0年甚至更早以前的设计还能够进一步改进。 -安全性:安全性一直被认为是由网络层以上的层负责,但它现在已经成为IP的下一个版本可以发挥作用的地方。 -自动配置:对于I P v 4节点的配置一直比较复杂,而网络管理员与用户则更喜欢“即插即用”,即:将计算机插在网络上然后就可以开始使用。I P主机移动性的增强也要求当主机在不同网络间移动和使用不同的网络接入点时能提供更好的配置支持。 -这些问题是IP升级的动力,下一代的IP技术室IP版本6即IPv6。 -相对于IPv4,IPv6的变化主要包括: -扩展地址。地址扩展到了128比特,地址空间增大了2的96次方倍。 -简化头格式。字段只有8个,加快报文转发,提高了吞吐量。 -增强对于扩展和选项的支持。可以支持更多的服务,也简化了报文转发的处理。 -流标记。路由器需要对流进行跟踪并保持一定的信息,这些信息在流中的每个包中都是不变的。这种方法使路由器可以对流中的包进行高效处理。 -身份验证和保密。身份认证和隐私权是IPV6的关键特性。 -1.IPv6头部 + + +## 5 IPv6协议 + +### IPv4存在问题 + +* 地址空间的局限性: IP地址空间的危机由来已久,并正是升级的主要动力。 +* 性能:尽管IP表现得不错,一些源自20年甚至更早以前的设计还能够进一步改进。 +* 安全性:安全性一直被认为是由网络层以上的层负责,但它现在已经成为IP的下一个版本可以发挥作用的地方。 +* 自动配置:对于IPv4节点的配置一直比较复杂,而网络管理员与用户则更喜欢“即插即用”,即:将计算机插在网络上然后就可以开始使用。IP主机移动性的增强也要求当主机在不同网络间移动和使用不同的网络接入点时能提供更好的配置支持。 + +### IPv6的变化 +* 扩展地址。地址扩展到了128比特,地址空间增大了2的96次方倍。 +* 简化头格式。字段只有8个,加快报文转发,提高了吞吐量。 +* 增强对于扩展和选项的支持。可以支持更多的服务,也简化了报文转发的处理。 +* 流标记。路由器需要对流进行跟踪并保持一定的信息,这些信息在流中的每个包中都是不变的。这种方法使路由器可以对流中的包进行高效处理。 +* 身份验证和保密。身份认证和隐私权是IPV6的关键特性。 + + +### IPv6数据报 IPv6头部如下图所示: +![](\image/ipv6.png) + +* 版本。长度为4位,对于IPv6,该字段必须为6。 +* 类别。长度为8位,指明为该包提供了某种“区分服务”。该字段的定义独立于IPv6,目前尚未在任何RFC中定义。该字段的默认值是全0。 +* 流标签。长度为20位,用于标识属于同一业务流的包。一个节点可以同时作为多个业务流的发送源。流标签和源节点地址唯一标识了一个业务流。 +* 净荷长度。长度为16位,其中包括包净荷的字节长度,即IPv6头后的包中包含的字节数。这意味着在计算净荷长度时包含了IPv6扩展头的长度。 +* 下一个头。这个字段指出了IPv6头后所跟的头字段中的协议类型。与IPv4协议字段类似,下一个头字段可以用来指出高层是TCP还是UDP,但它也可以用来指明IPv6扩展头的存在。 +* 跳极限。长度为8位。每当一个节点对包进行一次转发之后,这个字段就会被减1。如果该字段达到0,这个包就将被丢弃。 +* 源IP地址。长度为128位,指出了IPv6包的发送方地址。 +* 目的IP地址。长度为128位,指出了IPv6包的接收方地址。这个地址可以是一个单播、多播或任意点播地址。如果使用了选路扩展头(其中定义了一个包必须经过的特殊路由),其目的地址可以是其中某一个中间节点的地址而不必是最终地址。 + + +### 与IPv4数据报相比的变化 +* 包头长度不存在了因为IPv6的头是固定长度。 +* 服务类型字段变成了流类别。 +* 数据报长度变成了净荷长度。IPv6的净荷长度中包含了扩展头,而IPv4数据报长度字段中则指明包含包头在内的整个数据报的长度。因而在IPv4中,路由器需要将数据报长度减去包头长度来计算包的净荷长度,而在IPv6中则无须这种计算。 +* 数据报ID,标识和标志三个字段被删除了,因为它们在IPv4中用于数据报分片,但是IPv6中分片通过分片扩展头来实现而且必须在源设备完成。 +* 生存字段变成了跳极限,使用方式类似 +* 协议字段变成了下一个头。v4中协议字段用来指示高层的协议类别,但是这里的下一个头可以用来指示扩展头或者高层协议头。 +* 头部校验和被删除,因为由于如TCP和UDP等高层协议均计算头的校验和,IPv4头校验显得有些多余,因此这个字段在IPv6中已消失。对于那些真的需要对内容进行身份验证的应用, IPv6中提供了身份验证头。 +* 源目地址被扩展到了128比特。 + + +## 6 ipv6地址 + +### 地址表达方式 + +IPv6地址的基本表达方式是X:X:X:X:X:X:X:X,其中X是一个4位十六进制整数(16位)。每一个数字包含4位,每个整数包含4个数字,每个地址包括8个整数,共计128位(4×4×8=128)。下面是一些合法的IPv6地址: +* CDCD:910A:2222:5498:8475:1111:3900:2020 +* 1030:0:0:0:C9B4:FF12:48AA:1A2B +* 2000:0:0:0:0:0:0:1 + + +在IPv4和IPv6的混合环境中。IPv6地址中的最低32位可以用于表示IPv4地址,该地址可以按照一种混合方式表达,即X:X:X:X:X:X:d.d.d.d,其中X表示一个16位整数,而d表示一个8位十进制整数。例如,地址 +* 0:0:0:0:0:0:10.0.0.1 -版本。长度为4位,对于IPv6,该字段必须为6。 -类别。长度为8位,指明为该包提供了某种“区分服务”。该字段的定义独立于IPv6,目前尚未在任何RFC中定义。该字段的默认值是全0。 -流标签。长度为20位,用于标识属于同一业务流的包。一个节点可以同时作为多个业务流的发送源。流标签和源节点地址唯一标识了一个业务流。 -净荷长度。长度为16位,其中包括包净荷的字节长度,即IPv6头后的包中包含的字节数。这意味着在计算净荷长度时包含了IPv6扩展头的长度。 -下一个头。这个字段指出了IPv6头后所跟的头字段中的协议类型。与IPv6协议字段类似,下一个头字段可以用来指出高层是TCP还是UDP,但它也可以用来指明IPv6扩展头的存在。 -跳极限。长度为8位。每当一个节点对包进行一次转发之后,这个字段就会被减1。如果该字段达到0,这个包就将被丢弃。 -源地址。长度为128位,指出了IPv6包的发送方地址。 -目的地址。长度为128位,指出了IPv6包的接收方地址。这个地址可以是一个单播、多播或任意点播地址。如果使用了选路扩展头(其中定义了一个包必须经过的特殊路由),其目的地址可以是其中某一个中间节点的地址而不必是最终地址。 -与IPv4相比的变化有: -包头长度不存在了因为IPv6的头是固定长度。 -服务类型字段变成了流类别。 -数据报长度变成了净荷长度。IPv6的净荷长度中包含了扩展头,而IPv4数据报长度字段中则指明包含包头在内的整个数据报的长度。因而在IPv4中,路由器需要将数据报长度减去包头长度来计算包的净荷长度,而在IPv6中则无须这种计算。 -数据报ID,标识和标志三个字段被删除了,因为它们在IPv4中用于数据报分片,但是IPv6中分片通过分片扩展头来实现而且必须在源设备完成。 -生存字段变成了跳极限,使用方式类似 -协议字段变成了下一个头。v4中协议字段用来指示高层的协议类别,但是这里的下一个头可以用来指示扩展头或者高层协议头。 -头部校验和被删除,因为由于如TCP和UDP等高层协议均计算头的校验和, IPv4头校验显得有些多余,因此这个字段在IPv6中已消失。对于那些真的需要对内容进行身份验证的应用, IPv6中提供了身份验证头。 -源目地址被扩展到了128比特。 -2.编址 -1.地址表达方式 -IPv6地址长度4倍于IPv4地址,表达起来的复杂程度也是IPv4地址的4倍。IPv6地址的基本表达方式是X:X:X:X:X:X:X:X,其中X是一个4位十六进制整数(16位)。每一个数字包含4位,每个整数包含4个数字,每个地址包括8个整数,共计128位(4×4×8=128)。例如,下面是一些合法的IPv6地址: -CDCD:910A:2222:5498:8475:1111:3900:2020 -1030:0:0:0:C9B4:FF12:48AA:1A2B -2000:0:0:0:0:0:0:1 -请注意这些整数是十六进制整数,其中A到F表示的是10到15。地址中的每个整数都必须表示出来,但起始的0可以不必表示。这是一种比较标准的IPv6地址表达方式,此外还有另外两种更加清楚和易于使用的方式。 -某些IPv6地址中可能包含一长串的0(就像上面的第二和第三个例子一样)。当出现这种情况时,标准中允许用“空隙”来表示这一长串的0。换句话说,地址 -2000:0:0:0:0:0:0:1 -可以被表示为: -2000::1 -这两个冒号表示该地址可以扩展到一个完整的128位地址。在这种方法中,只有当16位组全部为0时才会被两个冒号取代,且两个冒号在地址中只能出现一次。 -在IPv4和IPv6的混合环境中可能有第三种方法。IPv6地址中的最低32位可以用于表示IPv4地址,该地址可以按照一种混合方式表达,即X:X:X:X:X:X:d.d.d.d,其中X表示一个16位整数,而d表示一个8位十进制整数。例如,地址 -0:0:0:0:0:0:10.0.0.1 -就是一个合法的IPv4地址。把两种可能的表达方式组合在一起,该地址也可以表示为: -::10.0.0.1 由于IPv6地址被分成两个部分—子网前缀和接口标识符,因此人们期待一个IP节点地址可以按照类似CIDR地址的方式被表示为一个携带额外数值的地址,其中额外数值指出了地址中有多少位是掩码。即,IPv6节点地址中指出了前缀长度,该长度与IPv6地址间以斜杠区分,例如: -1030:0:0:0:C9B4:FF12:48AA:1A2B/60 +* 1030:0:0:0:C9B4:FF12:48AA:1A2B/60 这个地址中用于选路的前缀长度为60位。 + + IPv6128比特地址空间的划分如下图: +![](\image/ipv6地址.png) - -2.寻址模型 +### 寻址模型 IPv6寻址模型与IPv4很相似。每个单播地址标识一个单独的网络接口。IP地址被指定给网络接口而不是设备,因此一个拥有多个网络接口的设备可以具备多个IPv6地址,其中任何一个IPv6地址都可以代表该设备。尽管一个网络接口能与多个单播地址相关联,但一个单播地址只能与一个网络接口相关联。每个网络接口必须至少具备一个单播地址。 -这里有一个非常重要的声明和一个非常重要的例外。这个声明与点到点链路的使用有关。在IPv4中,所有的网络接口,其中包括连接一个设备与路由器的点到点链路(用许多拨号Internet连接中),都需要一个专用的IP地址。随着许多机构开始使用点到点链路来连接其分支机构,每条链路均需要其自己的子网,这样一来消耗了许多地址空间。在IPv6中,如果点到点链路的任何一个端点都不需要从非邻居设备接受和发送数据的话,它们就可以不需要特殊的地址。即,如果两个设备主要是传递业务流,则它们并不需要具备IPv6地址。 -为每个网络接口分配一个全球唯一的单播地址的要求阻碍了IPv4地址的扩展。一个提供通用服务的服务器在高需求量的情况下可能会崩溃。因此,IPv6地址模型中又提出了一个重要的例外:如果硬件有能力在多个网络接口上正确地共享其网络负载的话,那么多个网络接口可以共享一个IPv6地址。这使得从服务器扩展至负载分担的服务器群成为可能,而不再需要在服务器的需求量上升时必须进行硬件升级。 -3.地址类型 + + +### 地址类型 IPv6地址有三种类型:单播、多播和任意点播。广播地址已不再有效。RFC 2373中定义了三种IPv6地址类型: -单播:一个单接口的标识符。送往一个单播地址的包将被传送至该地址标识的接口上。 -泛播:一组接口(一般属于不同节点)的标识符。送往一个泛播地址的包将被传送至该地址标识的接口之一(根据选路协议对于距离的计算方法选择“最近”的一个)。 -多播:一组接口(一般属于不同节点)的标识符。送往一个多播地址的包将被传送至有该地址标识的所有接口上。 -1.单播 -单播地址标识了一个单独的IPv6接口。一个节点可以具有多个IPv6网络接口。每个接口必须具有一个与之相关的单播地址。单播地址可被认为包含了一段信息,这段信息被包含在128位字段中:该地址可以完整地定义一个特定的接口。此外,地址中数据可以被解释为多个小段的信息。但无论如何,当所有的信息被放在一起后,将构成标识一个节点接口的128位地址。 -IPv6地址本身可以为节点提供关于其结构的或多或少的信息,这主要根据是由谁来观察这个地址以及观察什么。例如,节点可能只需简单地了解整个128位地址是一个全球唯一的标识符,而无须了解节点在网络中是否存在。另一方面,路由器可以通过该地址来决定,地址中的一部分标识了一个特定网络或子网上的一个唯一节点。 -RFC 2373定义的IPv6单播地址格式如下: +1. 单播:一个单接口的标识符。送往一个单播地址的包将被传送至该地址标识的接口上。 +![](\image/ipv6单播.png) -IPv6单播地址包括下面几种类型: -可集聚全球地址。 -未指定地址或全0地址。 -回返地址。 -嵌有IPv4地址的IPv6地址。 -基于供应商和基于地理位置的供应商地址。 -OSI网络服务访问点(NSAP)地址。 -网络互联包交换(IPX)地址。 -2.多播 -多播用于标识一组节点,它的工作过程是:当设备预订多播地址时,它声明要成为多播的一个成员。于是任何本地路由器将以该节点的名义预订多播地址。同一网络上的其他设备要发送信息到该多播地址时,IP多播包将被封装到链路层多播数据传输单元中。并发送给设备。 -IPv6多播地址格式如下图: +1. 泛播:一组接口(一般属于不同节点)的标识符。送往一个泛播地址的包将被传送至该地址标识的接口之一(根据选路协议对于距离的计算方法选择“最近”的一个)。 +![](\image/ipv6多播.png) -多播地址只能用作目的地址,没有数据报把多播地址用作源地址。地址格式中的第1个字节为全“1”,标识其为多播地址。多播地址占了IPv6 -地址空间的整整1/256。多播地址格式中除第1字节外的其余部分,包括如下三个字段: -标志字段:由4个单个位标志组成。从左到右分别为: -最高位为保留位,必须为 0。 -R 位取0 表示非内嵌RP 的组播地址;取1 则表示内嵌RP 的组播地址,此时P、T 位也必须置1。 -P 位取0 表示非基于单播前缀的组播地址;取1 则表示基于单播前缀的组播地址,此时T 位也必须置1。 -T 位取0 表示永久分配组播地址;取1 则表示非永久分配的组播地址。 -范围字段:长4位,用来表示多播的范围。即,多播组是只包括同一本地网、同一站点、同一机构中的节点,还是包括IPv6全球地址空间中任何位置的节点。该4位的可能值为0~15, -组标识符字段:长112位,用于标识多播组。根据多播地址是临时的还是熟知的以及地址的范围,同一个多播标识符可以表示不同的组。永久多播地址用指定的赋予特殊含义的组标识符,组中的成员既依赖于组标识符,又依赖于范围。 -多播范围取值及其意义如图: - - -3.泛播 -多播地址在某种意义上可以由多个节点共享。多播地址成员的所有节点均期待着接收发给该地址的所有包。泛播地址与多播地址类似,同样是多个节点共享一个泛播地址,不同的是,只有一个节点期待接收给泛播地址的数据报。 -泛播对提供某些类型的服务特别有用,尤其是对于客户机和服务器之间不需要有特定关系的一些服务,例如域名服务器和时间服务器。名字服务器就是个名字服务器,不论远近都应该工作得一样好。同样,一个近的时间服务器,从准确性来说,更为可取。因此当一个主机为了获取信息,发出请求到泛播地址,响应的应该是与该泛播地址相关联的最近的服务器。 -1.泛播地址的分配及其格式 -泛播地址被分配在正常的IPv6单播地址空间以外。因为泛播地址在形式上与单播地址无法区分开,一个泛播地址的每个成员,必须显式地加以配置,以便识别泛播地址。 -2.泛播选路 -一个泛播地址必定带有一个选路项:该选路项包括一些指针,指向共享该泛播地址的所有节点的网络接口。这个信息将被用于路由器的选路。 -3.其它 -类似于IPv4,IPv6也使用了ICMP和DHCP,这两个协议都有对应于IPv6的版本。详细的信息可参考相关协议。 \ No newline at end of file +1. 多播:一组接口(一般属于不同节点)的标识符。送往一个多播地址的包将被传送至有该地址标识的所有接口上。 \ No newline at end of file diff --git a/计算机网络/4.3 网络层-路由算法.md b/计算机网络/4.3 网络层-路由算法.md index 8f0aaabc..744315d7 100644 --- a/计算机网络/4.3 网络层-路由算法.md +++ b/计算机网络/4.3 网络层-路由算法.md @@ -1,89 +1,116 @@ # 网络层-选路算法 -网络中的主机通常都直接与一台路由器相连接,该路由器即为该主机的默认路由器,它是该主机的第一跳路由器。每当主机发送一个分组时,它都首先将分组发送给起默认路由器,在接收端,目的主机的默认路由器把来自于网络上其它主机的分组转发给目的主机,因而网络中从源主机到目的主机的选路就是从源主机的默认路由器(也可以成为源路由器)到目的主机的默认路由器(也可以成为目的路由器)之间的选路问题。 -选路算法的目的很简单:给定一组路由器以及连接路由器的链路,选路算法要找到一条从源路由器到目的路由器之间的“好"路径。通常好路径指的是最低费用的路径。由于网络中的路由器组成的拓扑是典型的图结构,因而可以用图来研究选路问题。 + +## 1 路由概述 + +网络中的主机通常都直接与一台路由器相连接,该路由器即为该主机的默认路由器,它是该主机的第一跳路由器。 + +每当主机发送一个分组时,它都首先将分组发送给起默认路由器,在接收端,目的主机的默认路由器把来自于网络上其它主机的分组转发给目的主机,因而网络中从源主机到目的主机的选路就是从源主机的默认路由器(也可以成为源路由器)到目的主机的默认路由器(也可以成为目的路由器)之间的选路问题。 + +### 选路算法的目的 + +给定一组路由器以及连接路由器的链路,选路算法要找到一条从源路由器到目的路由器之间的“好"路径。通常好路径指的是最低费用的路径。由于网络中的路由器组成的拓扑是典型的图结构,因而可以用图来研究选路问题。 + 在网络图中,节点表示路由器,边表示路由器之间的链路。给边赋予一个表示费用的值(费用可以为链路速度,金钱,线路长度等等),然后选路算法的目的就变为在图中找到给定的两点之间的具有最低费用的路径。 -1.选路算法的分类 + +### 选路算法的分类 + 根据选路算法是全局的还是局部的,选路算法可以分为: -全局选路算法:用完整的,全局性的网络信息来计算从源到目的的最低费用路径。这种算法通常称为链路状态算法即LS算法,因为该算法必须知道网络中每条链路的费用。 -分布式选路算法:以迭代的、分布式的方式计算出最低费用路径。没有节点拥有关于所有网络链路费用的完整信息,而每个节点仅有与其直接相连链路的费用信息即可开始工作。然后通过迭代计算过程并与相邻节点交换信息,一个节点逐渐计算出到达目的节点或者一组目的节点的最低费用路径。 -还可以根据算法是静态的还是动态的来分类: -静态选路算法:随着时间的推移,路由的变化非常缓慢,同时是在人的干预下进行调整。 -动态选路算法:能够在网络流量负载或者拓扑发生变化时改变选路路径。动态选路算法可以周期性的运行或者在拓扑或链路费用发生变化时直接运行。 -还可以根据算法是负载敏感的还是负载迟钝的进行划分: -负载敏感算法:链路费用会动态的变化以反映底层链路的当前拥塞水平。当前的因特网选路算法都是负载迟钝的。 -2.链路状态选路算法 -链路状态算法需要网络拓扑和所有链路费用信息作为输入。实践中,这可以通过让所有节点都向网络中的而所有其它路由器广播链路状态分组来完成。每个链路状态分组包含了它所连接的链路的特征和费用。广播的结果是所有节点都具有了该网络的同一个完整的视图。于是每个节点都可以运行LS算法从而计算出相同的最低费用路径集合。 -根据图论的知识,可以使用Dijkstra算法来计算最短路径,它计算从某个节点到网络中所有其它节点的最低费用路径,它是一个迭代算法,在k次迭代后,就可以得到从源节点触发到k个节点的最短路径。(Prim算法也可以用于计算图中两个节点之间的最短路径,根据图论的知识,它适用于具有稀疏边的图。)算法的复杂度为O(n2)。 -LS算法可能会导致网络震荡,以下图为例: +* 全局选路算法:用完整的,全局性的网络信息来计算从源到目的的最低费用路径。这种算法通常称为链路状态算法即LS算法,因为该算法必须知道网络中每条链路的费用。 +* 分布式选路算法:以迭代的、分布式的方式计算出最低费用路径。没有节点拥有关于所有网络链路费用的完整信息,而每个节点仅有与其直接相连链路的费用信息即可开始工作。然后通过迭代计算过程并与相邻节点交换信息,一个节点逐渐计算出到达目的节点或者一组目的节点的最低费用路径。 -假设在该网络中链路费用等同于链路上的负载,初始状态为: -节点X和Z都发送到目的地W的一个单位的流量,且都选择它们与W直接相连的链路。 -Y有目的地为W的流量e,并走通过X到达W的链路。 -此时非0费用的链路有: -X,W之间的链路费用为1+e -Y,X之间的链路费用为e -Z,W之间的链路费用为1 -当LS运行时,则 -节点X发现,它与W直接相连的链路的费用是1+e,而Y->Z->W这条路径的总费用是1,因而它选择走该链路 -节点Y发现,它走X->W的费用是1+e,而走Z->W的费用是1,因而选择Z->W的路径。 -节点Z的选路不变 -此时非0费用的链路有: -X,Y之间的链路费用为1 -Y,Z之间的链路费用为1+e -Z,W之间的链路费用为2+e -当LS运行时,则 -节点X发现,它与W直接相连的链路的费用是0,而Y->Z->W这条路径的总费用是3+2e,因而它选择走与W直接相连的路径 -节点Y发现,它走X->W的费用是0,而走Z->W的费用是2+e,因而选择走X->W -节点Z发现,它走Y->X->W的费用为0,而走直接连接W的链路的费用是2+e,因而它选择Y->X->W的路径 -此时非0费用的链路有: -Z,Y之间的链路费用为1 -Y,X之间的链路费用为1+e -X,W之间的链路费用为2+e -LS算法继续运行,就会不断震荡,解决方案是确保并非所有的路由器都在同一时刻运行LS算法。做法是对于每台路由器,随机的选择发送链路通告的时间。 -3.距离向量选路算法 +根据算法是静态的还是动态的来分类: +* 静态选路算法:随着时间的推移,路由的变化非常缓慢,同时是在人的干预下进行调整。 +* 动态选路算法:能够在网络流量负载或者拓扑发生变化时改变选路路径。动态选路算法可以周期性的运行或者在拓扑或链路费用发生变化时直接运行。 + +根据算法是负载敏感的还是负载迟钝的进行划分: +* 负载敏感算法:链路费用会动态的变化以反映底层链路的当前拥塞水平。 +* 负载迟钝算法:当前的因特网选路算法(RIP、OSPF、BGP)都是负载迟钝的。 + + +## 2 链路状态选路算法(LS) + +### LS算法原理 +链路状态算法需要网络拓扑和所有链路费用信息作为输入。通过让所有节点都向网络中的所有其它路由器广播链路状态分组来完成。 + +每个链路状态分组包含了它所连接的链路的特征和费用。广播的结果是所有节点都具有了该网络的同一个完整的视图。于是每个节点都可以运行LS算法从而计算出相同的最低费用路径集合。 + +根据图论的知识,可以使用Dijkstra算法来计算最短路径。Prim算法也可以用于计算图中两个节点之间的最短路径,它适用于具有稀疏边的图。算法的复杂度为O(n2)。 + + +## 3 距离向量选路算法(DV) + +### DV算法概述 距离向量算法DV(Distance-vector)是一种迭代的、异步的和分布的算法: -分布式的:每个节点都要从一个活多个直接相连的邻居收集某些信息,执行计算,然后将结果发回个邻居。 -迭代的:该过程要一直持续到邻居之间没有更多的信息要交换为止。 -异步的:各个节点的操作不需要保持一致。 -DV算法,利用了Bellman-Ford方程: -dx(y)=minv{c(x,v)+dv(y)} -其中dx(y)表示从节点x到节点y的最低费用路径的费用。c(x,v)的含义是节点x到其邻居v的路径费用。方程式的含义是从节点x到节点y的最低费用路径的费用等于所有邻居v中c(x,v)+dv(y)最小的那个。 -在DV算法中,Bellman-Ford的一个重要的贡献就是,得到最小值的那个v节点就是当前节点向y转发时的下一跳节点,当需要向y转发时,只需要将分组送给节点v即可。算法思想:对于网络N中的素有节点,令Dx=[Dx(y):y属于N]是节点x的距离向量,该向量是从x到N中所有其它节点y的费用估计向量。每个节点x维护下列选路数据: -对于每个邻居v,从x到直接相连的邻居v的费用为c(x,v)。 -节点x的距离向量,它包含了x到N中所有目的地的费用的估计值 -它的每个邻居的距离向量,即对x的每个邻居v有Dv=[Dv(y):y属于N] -DV算法中,每个节点不时的向它的每个邻居发送它的距离向量的拷贝。当节点x收到他的邻居v的一个新的距离向量时,它保存v的距离向量,然后根据Bellman-Ford方程更新自己的距离向量。如果节点x的距离向量因这个更新而改变,则节点x将向它的每个邻居发送它的更新后的距离向量。 -从邻居接收更新距离向量,重新计算选路表项和通知邻居到目的地的最低费用路径的费用已经变化的过程会一直持续知道无更新报文发送为止。DV算法被用于因特网的RIP和BGP。 -1.距离向量算法:链路费用变化和链路故障 +* 分布式的:每个节点都要从一个或多个直接相连的邻居收集某些信息,执行计算,然后将结果发回个邻居。 +* 迭代的:该过程要一直持续到邻居之间没有更多的信息要交换为止。 +* 异步的:各个节点的操作不需要保持一致。 + +### DV算法原理 +1. DV算法,利用了Bellman-Ford方程。 + 其中dx(y)表示从节点x到节点y的最低费用路径的费用。c(x,v)的含义是节点x到其邻居v的路径费用。方程式的含义是从节点x到节点y的最低费用路径的费用等于所有邻居v中c(x,v)+dv(y)最小的那个。 +$$ +d_x(y)=min_v{c(x,v)+d_v(y)} +$$ + + +2. 在DV算法中,得到最小值的那个v节点就是当前节点向y转发时的下一跳节点,当需要向y转发时,只需要将分组送给节点v即可。算法思想:对于网络N中的素有节点,令Dx=[Dx(y):y属于N]是节点x的距离向量,该向量是从x到N中所有其它节点y的费用估计向量。每个节点x维护下列选路数据: + * 对于每个邻居v,从x到直接相连的邻居v的费用为c(x,v)。 + * 节点x的距离向量,它包含了x到N中所有目的地的费用的估计值 + * 它的每个邻居的距离向量,即对x的每个邻居v有Dv=[Dv(y):y属于N] + +3. DV算法中,每个节点不时的向它的每个邻居发送它的距离向量的拷贝。当节点x收到他的邻居v的一个新的距离向量时,它保存v的距离向量,然后根据Bellman-Ford方程更新自己的距离向量。如果节点x的距离向量因这个更新而改变,则节点x将向它的每个邻居发送它的更新后的距离向量。 从邻居接收更新距离向量,重新计算选路表项和通知邻居到目的地的最低费用路径的费用已经变化的过程会一直持续知道无更新报文发送为止。DV算法被用于因特网的RIP和BGP。 + +### DV算法过程 +1. 距离向量算法:链路费用变化和链路故障 运行DV算法的节点在检测到其到邻居的链路费用发生变化时就会更新器距离向量,并且如果最低费用路径发生了变化,它就向邻居通知其新的距离向量。当链路费用降低时,DV算法可以就得到变化后的最低费用。但是如果是链路费用增加,则会出现一点问题,如下图所示拓扑: +![](\\image/dv过程1.png) 链路费用变化前,网络拓扑如上图所示,则Dy(x)=4,Dy(z)=1, Dz(y)=1, Dz(x)=5,在t0时刻,y检测到链路费用变化(从4增加到40)。y会更新器最低费用路径,根据Bellman-Ford方程,其计算出来的值为6。但是观察这个时候的网络拓扑,显然这是不正确的。出现这个现象的原因是:y更新器距离向量时,利用了z通告给它的z的距离向量,Dz(x)=5,但是显然,Dz(x)是依赖于Dy(x)的,在Dy(x)变化后它显然是一个错误的值。更重要的是在这个时刻,会出现选路环路:为了到达x,y通过z选路,而z又选择通过y选路,这样的选路结果是分组无法到达目的地。 y计算出来了一个新的到x的最低费用,因而它在t1时刻将新的距离向量通告给z z收到y的新的距离向量后更新其距离向量,它计算出来的新的Dz(x)=7 该过程一直循环,直到计算出来一个正确的值Dy(x)=40,Dz(x)=41 从上述过程可以看到使用DV算法时,坏消息传递的比较慢。而且上述过程只是一个链路的费用变高了,如果有多个链路的费用变高,则会遇到所谓的计数到无穷的问题。 -2.距离向量算法:增加毒性逆转 + +2. 距离向量算法:增加毒性逆转 毒性逆转可以解决上述特定的网络拓扑中的环路状况。其思想是:如果z通过y选路,则z在通告y时会告诉y它(z)到x的距离是无穷大。毒性逆转只能解决这种特殊环路的问题,如果环路涉及到3个或更多的节点,则它也无能为力 -3.LS和DV算法比较 -DV算法中,每个节点仅与它的直接邻居交换信息,但它为它的邻居提供了通过它到达网络中(它所知道的)所有其它节点的最低费用估计。LS算法中,每个节点与所有节点交换信息,但它仅仅告其它节点与它直接相连的链路的费用。二者的比较 -报文复杂性:LS算法要求每个节点都要知道网络中每条链路的费用,因而它需要发送O(|N||E|)个报文,而且无论何时一条链路的费用发生变化,都必须向所有节点发送新的链路费用。DV算法要求在每次迭代时,在两个直接邻居之间交换报文。当链路费用发生变化时,仅当新的费用导致与该链路相连的节点的最低费用发生了变化时,才会传播已改变的链路费用。 -收敛速度:LS算法是一个O(n2)的算法,而DV算法收敛较慢,且在收敛时会遇到选路环路。 -健壮性:由于LS算法中每个节点都独立的计算自己的路由,因而这在一定程度上提供了健壮性。而DV算法中一个节点的不正确信息则会扩散到整个网络。 -4.层次选路 -采用层次选路的原因: -规模:因特网由上亿台主机组成,如果不采用层次选路,则路由器需要存储选路信息会需要极大的内存,而且如果采用LS算法,则可以预期网络将淹没在LS广播中无法工作;如果采用DV算法,可以预期它根本就不会收敛。 -管理自治:某些组织可能倾向于按自己的意愿管理自己的网络,对外隐藏自己的内部网络面貌。 + +### LS和DV算法比较 + +DV算法中,每个节点仅与它的直接邻居交换信息,但它为它的邻居提供了通过它到达网络中(它所知道的)所有其它节点的最低费用估计。LS算法中,每个节点与所有节点交换信息,但它仅仅告其它节点与它直接相连的链路的费用。 + +* 报文复杂性:LS算法要求每个节点都要知道网络中每条链路的费用,因而它需要发送O(|N||E|)个报文,而且无论何时一条链路的费用发生变化,都必须向所有节点发送新的链路费用。DV算法要求在每次迭代时,在两个直接邻居之间交换报文。当链路费用发生变化时,仅当新的费用导致与该链路相连的节点的最低费用发生了变化时,才会传播已改变的链路费用。 +* 收敛速度:LS算法是一个O(n2)的算法,而DV算法收敛较慢,且在收敛时会遇到选路环路。 +* 健壮性:由于LS算法中每个节点都独立的计算自己的路由,因而这在一定程度上提供了健壮性。而DV算法中一个节点的不正确信息则会扩散到整个网络。 + +## 4 层次选路 +### 采用层次选路的原因: +* 规模:因特网由上亿台主机组成,如果不采用层次选路,则路由器需要存储选路信息会需要极大的内存,而且如果采用LS算法,则可以预期网络将淹没在LS广播中无法工作;如果采用DV算法,可以预期它根本就不会收敛。 + +* 管理自治:某些组织可能倾向于按自己的意愿管理自己的网络,对外隐藏自己的内部网络面貌。 + +### 自治系统AS + 解决这两个问题采用的方法是将路由器组织到自制系统(AS)。 -每个AS由一组通常在相同管理控制下的路由器组成,相同的AS内部的路由器都运行同样的选路算法,且具有彼此之间的信息。在一个自制系统内运行的选路算法叫自制系统内部选路协议。AS内的一台或多台路由器将有另外的任务,即负责向本AS之外的目的地转发分组,这些路由器被称为网关路由器。 +每个AS由一组通常在相同管理控制下的路由器组成,相同的AS内部的路由器都运行同样的选路算法,且具有彼此之间的信息。在一个自制系统内运行的选路算法叫**自制系统内部选路协议**。AS内的一台或多台路由器将有另外的任务,即负责向本AS之外的目的地转发分组,这些路由器被称为**网关路由器**。 + 当AS只有一个网关路由器时,AS内的路由器很容易将目的地不属于本AS的分组转发到网关路由器(因为AS内的路由器都知道自己到达网关路由器的最短路径),然后由网关路由器转发到AS外部。 但是当AS有多个网关路由器时,AS就需要 -知道经过与自己的网关路由器相连的其它AS可以到达哪些目的地 -在本AS内部传播这些可达信息 + +* 知道经过与自己的网关路由器相连的其它AS可以到达哪些目的地 +* 在本AS内部传播这些可达信息 + + 这两项任务是由自治系统间选路协议完成的。因特网的所有AS都运行相同的自治系统间选路协议。每台路由器都接收来自一个AS内部的内部选路协议和一个AS间选路协议的信息,并使用这些信息配置自己的转发表。 + + 当一个AS通过自治系统间选路协议知道它可以通过自己的多个网关路由器到达某个目的地时,AS内部的路由器如何添加自己到该目的的路由?通常采用的策略是热土豆选路(hot potato routing),其思想是让AS尽快摆脱分组,即尽快将分组转发给其它AS,路由器将选择具有下列特性的网关路由器,然后根据本路由器到该网关路由器的路径添加路由: -该网关路由器可以到达该目的地 -该网关路由器到本路由器具有最低费用路径 +* 该网关路由器可以到达该目的地 +* 该网关路由器到本路由器具有最低费用路径 + + 当一个AS从一个相邻AS知道了一个目的地时,它可以向它的某些其它邻居AS通告该路由信息,但是是否通告,通告哪些内容是一个AS的管理策略问题。取决于AS的配置管理策略。 + + 因此总结起来,在一个AS内部,所有路由器都运行相同的内部选路协议。在各AS之间,AS运行相同的自治系统间选路协议。AS内部的路由器仅需要知道本AS内部的路由器,AS的管理组织可以运行它选择的任何内部选路协议。 \ No newline at end of file diff --git a/计算机网络/4.4 网络层-路由协议.md b/计算机网络/4.4 网络层-路由协议.md index fa26eb08..6c568969 100644 --- a/计算机网络/4.4 网络层-路由协议.md +++ b/计算机网络/4.4 网络层-路由协议.md @@ -1,92 +1,77 @@ -一、RIP -在因特网中,AS即自制系统内部使用的两个选路协议是RIP(路由信息协议,Routing information Protocol)和OSPF(Open Shortcut Path First)。 -RIP是一种距离向量协议,运行方式和理想化的DV算法相似。在RIP中,DV算法中的费用采用的是跳数,即从源路由器到目的路由器的最短路径上的路由器数。RIP中一条路径的最大跳数被限制为15,因此RIP被限制用在网络直径不超过15的自制系统内。DV算法需要在路由器之间发送每个路由器的距离向量信息,RIP通过RIP通告(也称为RIP响应报文)来完成这个功能,RIP通告大约30秒相互交换一次。RIP通告包含了选路更新信息。 -每台路由器都维护有一张选路表,它包含了路由器的距离向量个该路由器的转发表。 +# 网络层-路由协议 + +> 在因特网中,AS即自制系统内部使用的两个选路协议是RIP(路由信息协议,Routing information Protocol)和OSPF(Open Shortcut Path First)。 + +## 1 因特网自制系统内部的路由选择:RIP + +### RIP协议原理 + +RIP是一种距离向量协议,运行方式和理想化的DV算法相似。在RIP中,DV算法中的费用采用的是跳数,即从源路由器到目的路由器的最短路径上的路由器数。RIP中一条路径的最大跳数被限制为15,因此RIP被限制用在网络直径不超过15的自制系统内。 + +DV算法需要在路由器之间发送每个路由器的距离向量信息,RIP通过RIP通告(也称为RIP响应报文)来完成这个功能,RIP通告大约30秒相互交换一次。RIP通告包含了选路更新信息。每台路由器都维护有一张路由表,它包含了路由器的距离向量的该路由器的转发表。 + 运行RIP协议的路由器每隔30秒就会发送RIP通告,如果一台路由器超过180秒还没收到邻居的RIP通告,它就认为邻居不再可达。此时它会更新自己的距离向量,并向相邻路由器通告该信息。 + RIP也允许路由器主动发送请求报文请求某个邻居更新其路由信息,这是通过发送RIP请求报文实现的。RIP协议使用了DUP协议并使用端口520。 -二、OSPF -OSPF也用于自制系统内部,但是它通常被应用于较顶层的ISP中,而RIP一般用于较底层的ISP和企业网内。 -OSPF的核心是使用洪泛链路状态信息的链路状态协议和一个Dijkstra最低费用路径算法。使用OSPF时,每台路由器都有一副关于整个自制系统的链路状态的完整拓扑图。每台路由器在本地运行Dijkstra算法,以确定一颗以自己为根节点的到所有子网的最短路径。 -在OSPF中各条链路的费用是由管理员设置的,这样管理员就可以影响最短路径的选择,比如管理员可以采用将链路权重值按与链路容量成反比的方式来设置,这样在选路时,有限被选择的就是高带宽链路。OSPF没有强制的链路权值设置策略,它只提供了为给定链路权值确定最低费用路径的机制。 + + +## 2 因特网自治系统内部的路由选择:OSPF + +### OSPF协议原理 + +OSPF也用于自制系统内部,但是它通常被应用于较顶层的ISP中,而RIP一般用于较底层的ISP和企业网内。OSPF的核心是使用洪泛链路状态信息的链路状态协议和一个Dijkstra最低费用路径算法。 + +使用OSPF时,每台路由器都有一副关于整个自制系统的链路状态的完整拓扑图。每台路由器在本地运行Dijkstra算法,以确定一颗以自己为根节点的到所有子网的最短路径。 + +在OSPF中各条链路的费用是由管理员设置的,这样管理员就可以影响最短路径的选择,比如管理员可以采用将链路权重值按与链路容量成反比的方式来设置。OSPF没有强制的链路权值设置策略,它只提供了,为给定权值的链路,确定最低费用路径的机制。 + 在OSPF中,路由器向自治系统内部的所有其它路由器广播选路信息。每当一条链路状态变化时,路由器就会广播链路状态信息。即使链路状态没有变化,OSPF也要周期性地广播链路状态(至少每隔30分钟)。 + OSPF通告包括在OSPF报文中,OSPF报文直接运行在IP之上,它的协议号是89。 -OSPF的优点: -安全:OSPF对路由器之间的OSPF报文进行了保护。 -多路径:OSPF允许到达某个目的地有多条费用相同的路径。(这可以通过为不同的IP服务类型创建不同的路由来实现。) -支持单播和多播:MOSPF是对OSPF的扩展,它提供了多播选路。 -支持在单个选路域内的层次结构:OSPF具有按层次结构构造一个自制系统的能力。 +### OSPF的优点 +* 安全:OSPF对路由器之间的OSPF报文进行了保护。 +* 多路径:OSPF允许到达某个目的地有多条费用相同的路径。(这可以通过为不同的IP服务类型创建不同的路由来实现。) +* 支持单播和多播:MOSPF是对OSPF的扩展,它提供了多播选路。 +* 支持在单个选路域内的层次结构:OSPF具有按层次结构构造一个自制系统的能力。 + + 一个OSPF自制系统可以配置成多个区域,每个区域都运行自己的OSPF算法,一个区域内的每台路由器都向该区域内的所有其它路由器广播其链路状态。在一个区域内,一台或多台区域边界路由器负责为发送到该区域以外的分组选路。 在OSPF层次结构中,一个区域被配置成主干区域,它包含了AS内所有区域的区域边界路由器以及一些不在任何其它区域内的路由器,该区域的目的是为AS内其它区域之间的流量选路。 -三、BGP + +## 3 因特网自治系统间的路由选择:BGP BGP是因特网中使用的自制系统间的选路协议,它极其复杂。 -四、广播和多播选路 -广播选路指的是网络层提供的从一个源节点到网络中所有其它节点的分组选路服务。 -多播选路指的是网络层提供的从一个源节点到网络中一组节点的分组选路服务。 -1.广播选路 + + +> 广播选路指的是网络层提供的从一个源节点到网络中所有其它节点的分组选路服务。多播选路指的是网络层提供的从一个源节点到网络中一组节点的分组选路服务。 + + +## 4 广播选路 最直接的实现广播选路的方法是由发送节点向所有目的地发送分组的拷贝,这种方法看起来很简单,但是它有一些缺点使得它实用: 效率低下,一个分组变成了N个分组,极大的浪费了带宽 无法知道所有潜在目的地的地址,除非设计新的协议用于该目的,但是这无疑加大了其难度 链路状态协议使用了广播来更新链路状态信息,在这种情况下,广播的目的是产生和更新单播路由,因而如果再反过来用单播来实现广播就变得不明智了 因而必须采用其它方式来实现广播选路。 -1.无控制泛洪 +1. 无控制泛洪 实现广播最显而易见的方式是使用泛洪,即所有节点都向除了它接收分组的那个邻居之外的所有邻居转发分组。只要网络是连通的,分组必然可以到达所有节点,但是根据最简单的图论知识也可以知道,分组将在整个网络内不受限制的被复制,直到它们的生存时间到期。这将形成广播风暴,导致网络变得不可用。 -2.受控泛洪 +2. 受控泛洪 避免广播风暴的关键在于:每个节点可以选择泛洪分组的时机。有两种方案可以解决广播风暴的问题: 序号控制泛洪:源节点将其地址以及广播序号放入广播分组,再向网络泛洪分组。每个节点维护它收到的、复制的和转发的每个广播分组的序号列表,每当它收到一个广播分组时,都检查该表,如果已经存在就不泛洪,否则泛洪,并将新的信息更新到该表中。 反向路径转发(RPF):当一台路由器接收到具有给定源地址的广播分组时,仅当该分组到达的链路正好是位于它自己到其源的最短单播路径上时,它才泛洪分组。否则它丢弃分组。 -3.生成树广播 +3. 生成树广播 受控泛洪解决了广播风暴的问题,但是网络中还是会存在冗余的广播分组。生成树方案可以解决该问题。 生成树:包含网络中的所有节点的,并使用网络中的链路所连接起来的连通图。 最小生成树:每段链路的费用之和在所有生成树中最小的生成树。 生成树广播指的是首先先对网络节点狗仔一棵生成树,当一个节点要发送一个广播分组时,它向所有属于该生成树的特定链路发送分组。该方案的复杂性在于生成树的生成和维护。 实际中,OSPF使用了序号控制方法。 -2.多播选路 + +## 5 多播选路 多播用于将分组交付给网络节点的一个子集。 多播通信中,有两个问题,一是怎样标识多播分组的接收方,怎么为多播分组的接收方编址。解决方案是使用简介地址编址,即用一个标识来标识一组接收方,寻址到该组的分组会被交付给与该分组相关的多播接收方。IPv4使用D类地址用于该目的,IPv6也有自己的多播地址格式。与一个多播地址关联的接收方组称为多播组。 -1.IGMP +### IGMP 在有了多播地址后,如果一个主机想要接收多播分组,就必须在多播地址和它自己之间建立关联关系,这是通过IGMP协议来实现的,主机通过该协议来通知主机的默认路由器“我要加入到某个多播组或者退出某个多播组”,路由器根据该信息来决定是否转发多播分组到主机。 -2.多播选路 +### 多播选路 多播选路的目的是发现一颗链路树,该树连接了所有属于该多播组的主机相连的路由器。之后多播分组就可以沿着该树从发送方路由到所有属于该多播组的主机。选路树的构建有两种方法: 使用一颗组共享树进行多播选路:该方法基于一棵构建的树,该树包括了所有具有该多播组相连主机的路由器。该多播组的分组基于该树转发 基于一棵基于源的树进行多播 选路:该方法为多播组中的每个源构建一颗多播选路数。实际中采用了RPF算法来构建该树,同时使用剪枝算法来修正该树。剪枝算法是指:如果一台路由器接收到了娿一个多播分组,而它无加入到该分组的主机,就向其上游发送一个剪枝报文,收到该剪枝报文的路由器将不会向该路由器转发该多播组的分组;如果一台路由器的每个下游路由器都向它发送了剪枝报文,它就向其上游发送一个剪枝报文。 因特网中使用的多播选路算法有DVMRP(Distance Vector Multicast Routing Protocol)和PIM(Protocol-Independent Multicast)。 -五、MAC地址到IP地址的映射 -网络层用于在因特网中标识主机,并为主机之间提供选路和转发功能,但是物理上一个接口能否接收报文则取决于它的链路层地址(不考虑混杂模式,混杂模式下接口网卡会接收所有报文)。对于广播和组播,IP地址和链路层地址之间的关系是有固定算法的,所以很容易由IP地址得到链路层地址,但是对于单播,就必须有一种方法来将IP地址和链路层地址关联起来,在IPv4中这是通过地址解析协议ARP来实现的。ARP为IP地址和对应的硬件地址之间提供了动态映射。 -1.多播地址的MAC地址 -IPv4中多播地址与MAC地址的对应关系如图: - -即MAC地址的高25比特固定为00000001 00000000 01011110 0,低23比特取自IP多播地址的低23比特。由于除了作为前缀的4个比特之外,还有5个比特未进入MAC地址,因而一个MAC多播地址对应了32个IP多播地址。 -IPv6中多播地址与MAC地址的对应关系如图: - - -即MAC地址的高16比特固定为3333,低32比特取自IP多播地址的低32比特。 -2.ARP的报文格式为: - - -以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。 -两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。 -形容词hardware(硬件)和protocol(协议)用来描述ARP分组中的各个字段。例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)。 -硬件类型字段表示硬件地址的类型。它的值为1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为0x0800即表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同。 -接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。 -操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)(我们在第5章讨论RARP)。这个字段必需的,因为ARP请求 -和ARP应答的帧类型字段值是相同的。 -接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。 -对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。 -3.ARP的简单工作过程 -当一台主机需要和另一台主机通信时,它会首先查找路由表来获得下一跳的信息,如果下一跳信息中不包含MAC地址,它就需要解析下一跳的MAC地址,这时它就发送一个ARP请求到下一跳,而下一跳收到该请求后,就会发送一个ARP应答报文来告诉请求者它的MAC地址。在获得这个MAC地址之后,主机就可以继续自己的通信过程了。 -ARP请求报文是一个广播报文,目的MAC地址为全F,而源MAC地址为自己的MAC地址。负载中的信息包含了发送者的IP地址和MAC地址,以及目的IP地址,目的MAC地址为全0,一个例子如图: - - -ARP响应报文是一个单播报文,只会被发送给请求者。一个例子如图: - - -4.ARP代理 -如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理(ProxyARP)。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。 -5.免费ARP -一个ARP特性称作免费ARP(gratuitousARP)。它是指主机发送ARP查找自己的IP地址。通常,它发生在系统引导期间进行接口配置的时候。 -免费ARP可以有两个方面的作用: -一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。 -如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。一个比较著名的ARP协议事实[Plummer1982]是,如果主机收到某个IP地址的ARP请求,而且它已经在接收者的高速缓存中,那么就要用ARP请求中的发送端硬件地址(如以太网地址)对高速缓存中相应的内容进行更新。主机接收到任何ARP请求都要完成这个操作(ARP请求是在网上广播的,因此每次发送ARP请求时网络上的所有主机都要这样做)。 -5.IPv6的地址解析 -IPv6不适用ARP协议,而是使用ICMPv6协议中的ND(neighbor discover)来完成对应的解析过程。 diff --git a/计算机网络/4.5 网络层实验.md b/计算机网络/4.5 网络层实验.md deleted file mode 100644 index e69de29b..00000000 diff --git a/计算机网络/5 链路层.md b/计算机网络/5 链路层.md deleted file mode 100644 index e69de29b..00000000 diff --git a/计算机网络/5.1 链路层-基本原理.md b/计算机网络/5.1 链路层-基本原理.md new file mode 100644 index 00000000..c1f27fc3 --- /dev/null +++ b/计算机网络/5.1 链路层-基本原理.md @@ -0,0 +1,63 @@ +# 基本原理 + +## 1 概述 + +### 两种链路 + +* 广播信道:有线局域网、卫星网、混合光纤同轴电缆接入网的多台主机。需要媒体访问控制协议(多路访问控制协议) +* 点对点通信链路。不需要多路访问控制协议。 + +### 概念 +* 结点:运行链路层协议的设备 +* 链路:沿通信路径,连接相邻节点的通信信道 + +### 服务 +* 成帧:用链路层帧封装上层数据。网络层数据报插在数据字段。 +* 链路接入:媒体访问控制协议规定了帧在链路上的传输规则,MAC协调多个节点的帧传输,点对点传输不需要媒体访问控制协议。 +* 可靠交付:通过确认重传 +* 差错检测和纠正。 + +### 实现 + +在网络适配器中实现。 + +在发送端,控制器取的协议栈高层生成并存储在主机内存中的数据包,在链路层中封装该数据包。遵循链路接入协议,将该帧传入通信链路。 + +在接收端,控制器接受了整个帧,抽取网络层数据报。执行差错检测。 + +## 2 差错检测和纠正技术 + +### 概述 +比特及差错检测和纠正。从一个结点到临近节点,发送的链路层帧中,比特损伤检测和纠正。(Error-Detection and Correction,EDC) + +包括奇偶校验、校验和方法、循环冗余检测。 + +### 奇偶校验 + +发送方附加一个比特,使得d+1个比特中的1的总数是奇数或者偶数。接收方进行校验(前向纠错FEC) + +二维奇偶校验,在行列二维进行奇偶校验,能够定位错误并纠正。 +![](\image/二维奇偶校验.png) +### 检验和方法 + +d比特数据作为一个k比特整数序列处理。将k个比特整数加起来,并且用得到的和作为差错检测比特。 + +### 循环冗余检测 + +![](\image/CRC检测.png) + +1. 构造CRC冗余检测帧: +接收方和发送方协商一个r+1比特,称为G。d比特的帧D,在其后添加r比特校验位R。计算R的方法,d后添加r个0bit,再用G去除以这个加了0bit的帧。得到的余R。发送方使用D与R构成循环校验的帧。 +$$ +R=remainder\frac{D\times2^r}{G} +$$ + + + +2. 计算说明:CRC冗余检测中的加减都是XOR异或运算,加法不进位,减法不借位。 + +3. 接受方检测:接受方把得到的帧去除以G。如果余数为0,则表示传输正确。否则传输出错。 +$$ +\frac{D\times 2^r XOR R}{G}= \dotsm 0 +$$ + diff --git a/计算机网络/5.2 链路层-多路访问.md b/计算机网络/5.2 链路层-多路访问.md new file mode 100644 index 00000000..b2ce21ed --- /dev/null +++ b/计算机网络/5.2 链路层-多路访问.md @@ -0,0 +1,82 @@ +# 多路访问控制 +> 参考文献 +> * [计算机网络——“自顶向下方法之链路层](https://blog.csdn.net/diaotai/article/details/79329853) +> * [计算机网络-链路层](https://blog.csdn.net/Hemk340200600/article/details/61424709) + + + +## 1 概述 + +### 点对点链路 + +由链路一端的单个发送方和链路另一端的单个接收方组成。使用的协议包括:点对点协议(PPP)、高级数据链路控制(HDLC)。 + +### 广播链路 + +多个发送和接受节点都连接到相同的、单一的、共享的广播信道上。多路访问协议用于规范节点在共享的广播信道上的传输行为。 + +多路访问控制(multiple access control protocol,MAC)协议可以分为三类——信道划分协议,随机接入协议和轮流协议。 + +* TDM和FDM都是信道划分协议,而CDMA则是码分多址,如果配置恰当,可以同时接收节点而不被干扰。 + +* 随机接入协议在每一次碰撞后等待随机时间再发。时隙ALOHA是一个很简单的随机接入协议,而AHOHA效率是时隙ALOHA的一半。载波侦听多路访问(CSMA)会在开始之前监测是否有人说话,而如果其他人同时开始说话,则停下。 + +* 轮流协议轮效率低下,若调配节点出问题则崩盘。轮流协议包括令牌协议。 + + + +## 2 MAC-信道划分协议 +### TDM +时分多路复用(TDM),将时间划分为时间帧,并进一步划分每个时间帧为N个时隙,每个时隙分配给N个结点中的一个,结点有分组要发送时,在循环的TDM帧中指派给它的时隙内传输分组比特。时隙长度应该使得一个时隙内能够传输单个分组。它消除了碰撞并且十分公平,然而结点被限制为R/N的最高速率,即使他是唯一有分组要发送的结点时。 + +### FDM +频分多路复用(FDM),将R bps信道划分为不同的频段,并把每个频率分配给N个结点中的一个。FDM的优缺点跟TDM一样。 + +### CDMA +码分多址(CDMA),CDMA每个结点分配一种不同的编码。每个结点用它唯一的编码发对它发送的数据进行编码,如果精心选择这些编码,则不同的结点能够同时传输,并且相应的接收方仍能正确接收发送方编码的数据比特(接收方必须知道发送方的编码),而不在乎其他结点的干扰。 + +## 3 MAC-随机接入协议 + +### 时隙ALOHA + +该协议操作如下: + +1. 当有一个新帧要发送时,等到下一个时隙开始并在该时隙传输整个帧。 + +2. 如果没有碰撞则结点成功传输它的帧,不需要考虑重传。如果该结点还有新帧要传输,则进行准备。 + +3. 如有有碰撞,在时隙结束之前检测到这次碰撞。以概率p在后续的每个时隙中重传它的帧,知道该帧被无碰撞地传输出去。 + +该协议允许该结点以全速传输,并且每个结点需要对时隙同步。该协议的一个结论是,当有大量结点有很多帧要传输时,最多仅有37%的时隙做有用工作,37%的时隙是空闲的,26%的时隙有碰撞。 + +### ALOHA +第一个ALOHA实际上是一个非时隙,完全分散的协议。当一个帧首次到达时,结点立刻将该帧完整地传输进广播信道,如果经历碰撞,则立刻以概率p重传该帧,否则等待一个帧传输时间。其最大效率为时隙ALOHA的一半。 + +### CSMA + +载波侦听:一个结点在传输前先听信道,如果来自另外一个结点的帧正在传送,则等待直到检测一小段时间内没有传输再开始传输。 + +### CSMA/CD + +碰撞检测:一个传输结点在传输时一直在侦听信道,如果检测到另一个结点正在传输干扰帧,就停止传输,并等待一段随机时间后再次进入“侦听-当空闲时传输”循环。具有碰撞检测的CSMA被称为CSMA/CD(CSMAwith cCollision Detection). + +所有结点都监听信道,为什么还会发生碰撞呢?这是因为,比特沿着广播媒体传播锁实际需要的时间不是零(虽然以光的速度),端到端之间存在信道传播时延。 + +在CSMA/CD中,如果在传输过程中检测到其他结点也再传输,则停止自身传输并等待一段时间,这个时间的确定我们使用用于以太网以及DOCSIS电缆网络多路访问协议中的二进制指数后退算法来解决。当一个给定的帧经历第n次碰撞时,它从0到2^n-1中等概率地选择一个数。随着碰撞次数的增大,选择的集合长度呈指数式增长。这是合理的,因为一个帧碰撞的次数越多,说明它应该降低自己传输的频率来让给其他帧更多时间传输完它的数据。 + + +## 4 MAC-轮流协议 + +### 轮询协议 + +对于N个结点,轮询协议要求这些结点之一要被指定为主节点。主节点以循环的方式轮询每个结点。主节点向结点1发送报文告诉它能够传输的帧的最大数量,结点1传输了某些帧后,主节点告诉结点2它可以传输的帧的最大数量……它有几个缺点,第一个缺点是引入了轮询时延(即通知结点的时间),如果只有一个活跃结点,那么每次发送了他能够发送的最多数量的帧时,主结点必须依次轮询每一个非活跃结点。第二个缺点是,如果主节点故障,整个信道将变得不可操作。 + +### 令牌环协议 + +没有轮询协议中所谓的主节点,该协议有一个称为令牌的小的特殊帧在结点之间以某种固定顺序进行交换。一个结点收到令牌,如果它有帧要发送,则发送最大数目的帧数并继续持有该令牌,否则立刻向下一个结点转发该令牌。同样的缺点是,一个结点的故障可能崩溃整个信道,或者结点忘记释放令牌时如何让令牌再次进入循环。 + +## 5 DOCSIS:用于电缆因特网接入的链路层协议 + +我们将在DOCSIS中看到信道划分协议, 随机接入协议和轮流协议这三类的每一种协议。 + +一个电缆接入网将电缆网头端将几千个住宅电缆调制解调器与一个电缆调制解调器端系统(CMTS)连接。DOCSIS使用FDM将下行(CMTS到调制解调器)和上行(调制解调器到CMTS)网络断划分为多个频率信道。每个上行和下行均为广播信道,仅有单一的CMTS在下行信道上传输,不存在多路访问问题。而对于上行则存在。每个上行被划分为时间间隔(类似TDM),每个时间间隔也包括一序列微时隙,调制解调器可以在微时隙中向CMT传输。CMTS在下行信道上通过发送被称为MAP报文的控制报文指定哪个电缆调制解调器能在微时隙中传输控制报文指定的时间间隔。因此能够保证在微时隙中没有碰撞。调制解调器通过向CMTS发送微时隙请求帧来请求传输,这些请求帧可能相互碰撞,如果没有在下一个下行控制报文中收到对请求分配的响应,则推断出请求帧碰撞,使用二进制指数回退将其请求帧延后发送。电缆接入网是FDM,TDM,随机接入和集中分配时隙等协议应用的一个很好的例子。 \ No newline at end of file diff --git a/计算机网络/5.3 链路层-交换局域网.md b/计算机网络/5.3 链路层-交换局域网.md new file mode 100644 index 00000000..d851bacb --- /dev/null +++ b/计算机网络/5.3 链路层-交换局域网.md @@ -0,0 +1,139 @@ +# 交换局域网 + + +主要讲了使用交换机和以太网协议构建局域网 + + + +虚拟局域网跨越通过一个单一的物理局域网基础设施定义多个虚拟局域网。 +## 1 链路层寻址(ARP) + +### MAC地址 + +并不是主机或路由器具有链路层地址,而是它们的适配器(即网络接口)具有链路层地址。因此,具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址,就像他也具有多个与之相关联的IP地址一样。重要的是链路层交换机并不具有于它们的接口相关联的链路层地址。 + +链路层地址被称为MAC地址。MAC地址长度为6字节,有2的48次方可能的地址。通过软件改变一块适配器 的MAC地址现在是可能的。适配器的MAC地址具有扁平结构,而且不论适配器到哪里用都不会变化。带有以太网接口的便携机其总具有相同的MAC地址。 + +当适配器发送一个帧时,发送适配器会将目的适配器的MAC地址插入到该帧当中,并将该帧发送到局域网上。当适配器收到一个帧时,将检查该帧中的目的MAC地址和自己的MAC地址是否匹配。若匹配,则取出数据向上传递,否则丢弃该帧。 + +### 内网地址解析协议 +当适配器要向某个目的适配器发送帧时,将目的适配器的MAC地址插入帧中,发到局域网上。然而如何进行IP地址与MAC地址的转换呢?ARP协议,即地址解析协议实现了这个功能。 + +先考虑在子网以内的情况。三台子网内的主机之间通过一个链路层交换机相连。假设主机A、B、C的IP分别为222.222.222.1,,222.222.222.2,222.222.222.3,A要向B发送数据报,则A不仅要提供B的IP地址,还要提供B的MAC地址,然后发送适配器将构造一个包含目的MAC地址的链路层帧并发送到局域网。发送主机A使用ARP协议获取B的MAC地址。每台主机或者路由器中具有一个ARP表,包含了IP地址到MAC地址的映射关系。如果在主机上的ARP表存在222.222.222.2→88-AB-CD-EF-AA-BB(假设),则ARP模块将返回88-AB-CD-EF-AA-BB给主机A写入帧中。然而如果ARP表中没有该项呢?发送方A将构造一个ARP分组,指示支配器应该用MAC广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,该帧将被子网中所有其他适配器接收到,所有主机的ARP模块都检测自身的IP地址是否与ARP查询分组中的目的IP地址相符合,匹配到的主机B则构造一个ARP响应分组返回给主机A,其中含有对应的MAC地址。A则更新自身的ARP表。从这个过程我们也可以发现,ARP表是可以自动建立的,它不需要系统管理员来配置。 + + +### 外网数据报 + + +广播地址只针对子网内所有主机,如果目的适配器在子网以外呢?我们知道,每台主机仅有一个IP地址和一个MAC地址,路由器上有n个接口,所以有n个IP地址,n个ARP模块和n个适配器,每个适配器有自己的MAC地址。还是刚刚那个例子。假如主机A要像另外一个子网下的111.111.111.1/24主机D发送数据。IP地址我们根据DNS协议可以知道,那么MAC地址呢?为了发送数据到子网外,我们首先要将数据发送到网关路由器,因此最初的MAC地址应该是网关路由器接口的MAC地址。路由器通过查询转发表来向111.111.111.1/24子网的网关路由器转发,网关路由器得到数据报,因为已经跟D在同一个子网下,所以通过ARP协议得到目的地D的MAC地址并向其转发帧。这便是发送目的在子网外的情况。 + +## 2 以太网协议-帧 + +### 以太网帧格式 + +![](image/链路层帧格式.png) + +* 数据字段(46~1500字节)。承载了IP数据报。 + +* 目的地址(6字节) 目的适配器的MAC地址。 + +* 源地址(6字节)源适配器的MAC地址。 + +* 类型字段(2字节)适配器需要知道它应该将数据字段传递给哪个网络层协议,便是通过类型字段。类型字段标识了网络层协议。 + +* CRC(4字节):循环冗余检测字段,检测是否引入了差错。 + +* 前同步码(8字节)。前7个字节都是10101010,最后一字节是10101011,该字段的作用是同步发送方与接收方的时钟,通常适配器不会以精确的额定速率传输帧,这时接收适配器只需要通过锁定前同步码的前7字节比特就能锁定时钟,第8个字节的最后两个比特都为1,警示接收方重要的内容即将到来。 + +### MTU +为了提供足够快的响应时间,以太网和 IEEE802.3 对数据帧长度都有限制,其最大值分别为 1500 字节和 1492 字节,链路层的这个特性称作 MTU ,即 最大传输单元 。 + +当网络层传下来一个 IP 数据报,并且其长度比链路层的 MTU 大,那么网络层就需要对数据报进行分片,使每一片都小于 MTU。 + +MTU 分为接口 MTU 和路径 MTU:接口 MTU 是所指定的接口所允许发送的最大数据长度;路径 MTU 指两台通信主机路径中最小的 MTU 值。路径 MTU 是不对称的,它在两个方向上不一定一致。 + +## 3 链路层交换机(二层交换机) + + + +交换机对于对于子网中的主机和路由器是透明的,这就是说,某主机,路由器向另一个主机路由器寻址一个帧,顺利的将该镇发送进局域网,并不知道该交换机会接收该帧并将它转发到另一个节点。交换机的过滤和转发借助于交换机表,交换机表中一个表项应包括——一个MAC地址,通向该MAC地址的交换机接口,表项存储的时间。交换机转发分组是通过MAC地址而不是IP地址。若表中不存在相应MAC地址,则广播该帧的副本。交换机是自学习的。对于每个进入交换机的入帧,交换机在表中存储——该帧的源地址字段中MAC地址,该帧到达的接口,当前时间。交换机是即插即用的,但是对于广播风暴没有任何保护措施。 + +今天广为使用的以太网是基于交换机的星型拓扑,采用的是存储转发分组交换,交换机协调其传输,在任何时候绝不会向相同接口转发超过一个帧。此外,现代交换机是全双工的,使得一台交换机和一个结点能在同时向对方发送帧而没有干扰。 + +交换机的任务是接收入链路层帧并转发到出链路。交换机具有两个功能,过滤和转发。过滤决定一个帧应该转发到某个接口还是将其丢弃。转发决定一个帧该被导向哪个接口。这两个功能借助于交换机表来完成。交换机表的表项包含一个MAC地址,通向该MAC地址的接口 以及放置时间。 + +假定目的地址为11-11-11-11-11-11(简写为x)的一个链路层帧从接口A到达,此时有几种情况。第一种情况下,表中没有关于x的表项,交换机广播该帧。第二种情况,表中有一个表项将x和A联系起来,这种情况下丢弃该帧执行过滤功能。因为从接口A过来的表项,不可能再从A出口回去,可能是经过了某种循环。第三种情况,表中有一个表项将x和除了A之外其他接口B联系起来,则将该帧转发到接口B完成转发功能。 + +交换机是自学习的,它通过将接收到的每个入帧的源地址和该帧到达的接口以及当前时间存为表项,那么以后发往该MAC地址的帧都通过该接口。因此交换机是即插即用设备,不需要网络管理员配置,同时,任何交换机接口是全双工的,它能够同时发送和接收。 + +## 4 虚拟局域网(VLAN) + +现代机构的局域网通常是配置为等级结构的,也就是说,某些政府网站可能希望自己的流量可以隔离出来,不被其他网络所访问。这可以通过一个支持虚拟局域网(Virtual Local Network,VPN)的链路层交换机来实现。它允许单一的物理局域网基础设施定义多个虚拟局域网,在一个VLAN中的主机彼此通信,仿佛它们与交换机连接。假如有16个端口,我将2到8划分给计算机系,9到15划分为电子工程系,那么从2发出的广播只转发到3到8端口,不会发到9到15。这时又有新的问题,电子工程系与计算机系之间如何进行通信呢?我们可以通过将一个端口配置为属于两者,并将其与一个外部路由器连接。由路由器负责转发。交换机厂商已经通过将VLAN交换机和路由器合并为单一设备方便网络管理员的配置。 + +## 5 虚拟专用网(VPN) + +多协议标签转换(MPLS): + +虚电路网络领域的一个关键概念,固定长度标签。对于基于固定长度标签和虚电路的技术,在不放弃基于目的IP数据报转发的基础设施的前提下,当可能时通过选择性地标识数据报并允许路由器基于固定长度的标签而不是目的IP地址来转发数据报。MPLS首部增加到网络层与链路层之间,然而这种加强版的帧只能在两个均为MPLS使能的路由器之间发送。一个MPLS使能的路由器常被称为标签交换路由器,它通过在转发表中查找MPLS标签,然后立即将数据报传递给适当的输出接口来转发。我们知道IP路由选择协议指定单一最小费用路径,然而MPLS提供了沿着多条路由转发分组的能力,这是使用MPLS的一种简单形式的流量工程。MPLS能够被用于实现所谓虚拟专用网(Virtual Private Network,VPN),ISP使用它的MPLS使能网络将用户的各种网络连接在一起,MPLS能被用于将资源和用户的VPN使用的寻址方式相隔离,其他用户利用该VPN跨越该ISP网络。 + +VPN属于远程访问技术,简单地说就是利用公用网络架设专用网络。例如某公司员工出差到外地,他想访问企业内网的服务器资源,这种访问就属于远程访问。 + +让外地员工访问到内网资源,利用VPN的解决方法就是在内网中架设一台VPN服务器。外地员工在当地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入企业内网。为了保证数据安全,VPN服务器和客户机之间的通讯数据都进行了加密处理。有了数据加密,就可以认为数据是在一条专用的数据链路上进行安全传输,就如同专门架设了一个专用网络一样,但实际上VPN使用的是互联网上的公用链路,因此VPN称为虚拟专用网络,其实质上就是利用加密技术在公网上封装出一个数据通讯隧道。有了VPN技术,用户无论是在外地出差还是在家中办公,只要能上互联网就能利用VPN访问内网资源,这就是VPN在企业中应用得如此广泛的原因。 + +## 6 ARP地址解析协议 + +ARP address resolution protocol + +地址解析协议。实现MAC地址到IP地址的映射。工作在网络层,服务于链路层寻址。 + +网络层用于在因特网中标识主机,并为主机之间提供选路和转发功能,但是物理上一个接口能否接收报文则取决于它的链路层地址。ARP为IP地址和对应的硬件地址之间提供了动态映射。 + + +### 多播地址的MAC地址 +IPv4中多播地址与MAC地址的对应关系如图: + +![](\\image/多播mac地址.png) +即MAC地址的高25比特固定为00000001 00000000 01011110 0,低23比特取自IP多播地址的低23比特。由于除了作为前缀的4个比特之外,还有5个比特未进入MAC地址,因而一个MAC多播地址对应了32个IP多播地址。 + + +IPv6中多播地址与MAC地址的对应关系如图: + + +![](\\image/多播mac地址2.png) + +即MAC地址的高16比特固定为3333,低32比特取自IP多播地址的低32比特。 + +### ARP报文 + +![](\image/arp地址解析协议.png) + +* 以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。 +* 两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。 +* 形容词hardware(硬件)和protocol(协议)用来描述ARP分组中的各个字段。例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)。 +* 硬件类型字段表示硬件地址的类型。它的值为1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为0x0800即表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同。 +* 接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。 +* 操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)(我们在第5章讨论RARP)。这个字段必需的,因为ARP请求和ARP应答的帧类型字段值是相同的。 + +* 接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。 +* 对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。 + + +### ARP原理 +当一台主机需要和另一台主机通信时,它会首先查找路由表来获得下一跳的信息,如果下一跳信息中不包含MAC地址,它就需要解析下一跳的MAC地址,这时它就发送一个ARP请求到下一跳,而下一跳收到该请求后,就会发送一个ARP应答报文来告诉请求者它的MAC地址。在获得这个MAC地址之后,主机就可以继续自己的通信过程了。 +ARP请求报文是一个广播报文,目的MAC地址为全F,而源MAC地址为自己的MAC地址。负载中的信息包含了发送者的IP地址和MAC地址,以及目的IP地址,目的MAC地址为全0,一个例子如图: + +![](\image/arp请求报文.png) + +ARP响应报文是一个单播报文,只会被发送给请求者。一个例子如图: +![](image/arp响应报文.png) + +### ARP代理 +如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理(ProxyARP)。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。 + +### 免费ARP +一个ARP特性称作免费ARP(gratuitousARP)。它是指主机发送ARP查找自己的IP地址。通常,它发生在系统引导期间进行接口配置的时候。 +免费ARP可以有两个方面的作用: +一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。 +如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。一个比较著名的ARP协议事实[Plummer1982]是,如果主机收到某个IP地址的ARP请求,而且它已经在接收者的高速缓存中,那么就要用ARP请求中的发送端硬件地址(如以太网地址)对高速缓存中相应的内容进行更新。主机接收到任何ARP请求都要完成这个操作(ARP请求是在网上广播的,因此每次发送ARP请求时网络上的所有主机都要这样做)。 +5.IPv6的地址解析 +IPv6不适用ARP协议,而是使用ICMPv6协议中的ND(neighbor discover)来完成对应的解析过程。 diff --git a/计算机网络/2 应用层.md b/计算机网络/5.4 链路层-数据中心网络.md similarity index 100% rename from 计算机网络/2 应用层.md rename to 计算机网络/5.4 链路层-数据中心网络.md diff --git a/计算机网络/image/CRC检测.png b/计算机网络/image/CRC检测.png new file mode 100644 index 00000000..7b6bf2f3 Binary files /dev/null and b/计算机网络/image/CRC检测.png differ diff --git a/计算机网络/image/DNS查询.png b/计算机网络/image/DNS查询.png new file mode 100644 index 00000000..d785b3e7 Binary files /dev/null and b/计算机网络/image/DNS查询.png differ diff --git a/计算机网络/image/DNS查询2.png b/计算机网络/image/DNS查询2.png new file mode 100644 index 00000000..4ae86ab8 Binary files /dev/null and b/计算机网络/image/DNS查询2.png differ diff --git a/计算机网络/image/FTP原理图.png b/计算机网络/image/FTP原理图.png new file mode 100644 index 00000000..b79c0f13 Binary files /dev/null and b/计算机网络/image/FTP原理图.png differ diff --git a/计算机网络/image/FTP命令1.png b/计算机网络/image/FTP命令1.png new file mode 100644 index 00000000..b4f5bba9 Binary files /dev/null and b/计算机网络/image/FTP命令1.png differ diff --git a/计算机网络/image/FTP命令2.png b/计算机网络/image/FTP命令2.png new file mode 100644 index 00000000..101291b1 Binary files /dev/null and b/计算机网络/image/FTP命令2.png differ diff --git a/计算机网络/image/FTP响应码.png b/计算机网络/image/FTP响应码.png new file mode 100644 index 00000000..4e7f0d53 Binary files /dev/null and b/计算机网络/image/FTP响应码.png differ diff --git a/计算机网络/image/HTTP响应实例.png b/计算机网络/image/HTTP响应实例.png new file mode 100644 index 00000000..6b650d33 Binary files /dev/null and b/计算机网络/image/HTTP响应实例.png differ diff --git a/计算机网络/image/HTTP响应报文.jpg b/计算机网络/image/HTTP响应报文.jpg new file mode 100644 index 00000000..40e2e0bb Binary files /dev/null and b/计算机网络/image/HTTP响应报文.jpg differ diff --git a/计算机网络/image/HTTP响应报文.png b/计算机网络/image/HTTP响应报文.png new file mode 100644 index 00000000..56d2713c Binary files /dev/null and b/计算机网络/image/HTTP响应报文.png differ diff --git a/计算机网络/image/HTTP报文.png b/计算机网络/image/HTTP报文.png new file mode 100644 index 00000000..6437f0e2 Binary files /dev/null and b/计算机网络/image/HTTP报文.png differ diff --git a/计算机网络/image/HTTP请求实例.png b/计算机网络/image/HTTP请求实例.png new file mode 100644 index 00000000..c2b64230 Binary files /dev/null and b/计算机网络/image/HTTP请求实例.png differ diff --git a/计算机网络/image/ICMP报文.png b/计算机网络/image/ICMP报文.png new file mode 100644 index 00000000..41b89d6f Binary files /dev/null and b/计算机网络/image/ICMP报文.png differ diff --git a/计算机网络/image/SMTP交互过程.png b/计算机网络/image/SMTP交互过程.png new file mode 100644 index 00000000..d5a55e02 Binary files /dev/null and b/计算机网络/image/SMTP交互过程.png differ diff --git a/计算机网络/image/SMTP原理图.png b/计算机网络/image/SMTP原理图.png new file mode 100644 index 00000000..e3f784fc Binary files /dev/null and b/计算机网络/image/SMTP原理图.png differ diff --git a/计算机网络/image/SMTP命令.png b/计算机网络/image/SMTP命令.png new file mode 100644 index 00000000..fe4bc0b9 Binary files /dev/null and b/计算机网络/image/SMTP命令.png differ diff --git a/计算机网络/image/TCP关闭.jpg b/计算机网络/image/TCP关闭.jpg new file mode 100644 index 00000000..1e1e8430 Binary files /dev/null and b/计算机网络/image/TCP关闭.jpg differ diff --git a/计算机网络/image/TCP同时关闭.png b/计算机网络/image/TCP同时关闭.png new file mode 100644 index 00000000..98fbadcc Binary files /dev/null and b/计算机网络/image/TCP同时关闭.png differ diff --git a/计算机网络/image/TCP同时打开.png b/计算机网络/image/TCP同时打开.png new file mode 100644 index 00000000..c265f7e9 Binary files /dev/null and b/计算机网络/image/TCP同时打开.png differ diff --git a/计算机网络/image/TCP建立.png b/计算机网络/image/TCP建立.png new file mode 100644 index 00000000..d74d56ee Binary files /dev/null and b/计算机网络/image/TCP建立.png differ diff --git a/计算机网络/image/TCP报文段.png b/计算机网络/image/TCP报文段.png new file mode 100644 index 00000000..01ef381b Binary files /dev/null and b/计算机网络/image/TCP报文段.png differ diff --git a/计算机网络/image/TCP报文段2.png b/计算机网络/image/TCP报文段2.png new file mode 100644 index 00000000..67392d33 Binary files /dev/null and b/计算机网络/image/TCP报文段2.png differ diff --git a/计算机网络/image/TCP拥塞控制-快速恢复.png b/计算机网络/image/TCP拥塞控制-快速恢复.png new file mode 100644 index 00000000..98c5aec7 Binary files /dev/null and b/计算机网络/image/TCP拥塞控制-快速恢复.png differ diff --git a/计算机网络/image/TCP拥塞控制.png b/计算机网络/image/TCP拥塞控制.png new file mode 100644 index 00000000..2b1ea5f0 Binary files /dev/null and b/计算机网络/image/TCP拥塞控制.png differ diff --git a/计算机网络/image/TCP流量控制.png b/计算机网络/image/TCP流量控制.png new file mode 100644 index 00000000..ad05894a Binary files /dev/null and b/计算机网络/image/TCP流量控制.png differ diff --git a/计算机网络/image/TCP状态迁移图.png b/计算机网络/image/TCP状态迁移图.png new file mode 100644 index 00000000..689057fd Binary files /dev/null and b/计算机网络/image/TCP状态迁移图.png differ diff --git a/计算机网络/image/UDP伪首部.png b/计算机网络/image/UDP伪首部.png new file mode 100644 index 00000000..cb05427e Binary files /dev/null and b/计算机网络/image/UDP伪首部.png differ diff --git a/计算机网络/image/UDP数据报.png b/计算机网络/image/UDP数据报.png new file mode 100644 index 00000000..16dcd74c Binary files /dev/null and b/计算机网络/image/UDP数据报.png differ diff --git a/计算机网络/image/arp响应报文.png b/计算机网络/image/arp响应报文.png new file mode 100644 index 00000000..f3429180 Binary files /dev/null and b/计算机网络/image/arp响应报文.png differ diff --git a/计算机网络/image/arp地址解析协议.png b/计算机网络/image/arp地址解析协议.png new file mode 100644 index 00000000..03bb55e7 Binary files /dev/null and b/计算机网络/image/arp地址解析协议.png differ diff --git a/计算机网络/image/arp请求报文.png b/计算机网络/image/arp请求报文.png new file mode 100644 index 00000000..fad4c68b Binary files /dev/null and b/计算机网络/image/arp请求报文.png differ diff --git a/计算机网络/image/cookie工作流程.png b/计算机网络/image/cookie工作流程.png new file mode 100644 index 00000000..174ff49d Binary files /dev/null and b/计算机网络/image/cookie工作流程.png differ diff --git a/计算机网络/image/dv过程1.png b/计算机网络/image/dv过程1.png new file mode 100644 index 00000000..de46693e Binary files /dev/null and b/计算机网络/image/dv过程1.png differ diff --git a/计算机网络/image/ipv4.png b/计算机网络/image/ipv4.png new file mode 100644 index 00000000..030b540a Binary files /dev/null and b/计算机网络/image/ipv4.png differ diff --git a/计算机网络/image/ipv6.png b/计算机网络/image/ipv6.png new file mode 100644 index 00000000..da5d1fd6 Binary files /dev/null and b/计算机网络/image/ipv6.png differ diff --git a/计算机网络/image/ipv6单播.png b/计算机网络/image/ipv6单播.png new file mode 100644 index 00000000..a9e01eca Binary files /dev/null and b/计算机网络/image/ipv6单播.png differ diff --git a/计算机网络/image/ipv6地址.png b/计算机网络/image/ipv6地址.png new file mode 100644 index 00000000..a69defed Binary files /dev/null and b/计算机网络/image/ipv6地址.png differ diff --git a/计算机网络/image/ipv6多播.png b/计算机网络/image/ipv6多播.png new file mode 100644 index 00000000..d7efeb95 Binary files /dev/null and b/计算机网络/image/ipv6多播.png differ diff --git a/计算机网络/image/ip分段.jpeg b/计算机网络/image/ip分段.jpeg new file mode 100644 index 00000000..3946f794 Binary files /dev/null and b/计算机网络/image/ip分段.jpeg differ diff --git a/计算机网络/image/web缓存原理.png b/计算机网络/image/web缓存原理.png new file mode 100644 index 00000000..7e5d502b Binary files /dev/null and b/计算机网络/image/web缓存原理.png differ diff --git a/计算机网络/image/二维奇偶校验.png b/计算机网络/image/二维奇偶校验.png new file mode 100644 index 00000000..37a4fd88 Binary files /dev/null and b/计算机网络/image/二维奇偶校验.png differ diff --git a/计算机网络/image/协议栈.gif b/计算机网络/image/协议栈.gif new file mode 100644 index 00000000..4f986cb1 Binary files /dev/null and b/计算机网络/image/协议栈.gif differ diff --git a/计算机网络/image/域名分层.png b/计算机网络/image/域名分层.png new file mode 100644 index 00000000..df2a99a0 Binary files /dev/null and b/计算机网络/image/域名分层.png differ diff --git a/计算机网络/image/多播mac地址.png b/计算机网络/image/多播mac地址.png new file mode 100644 index 00000000..7574f224 Binary files /dev/null and b/计算机网络/image/多播mac地址.png differ diff --git a/计算机网络/image/多播mac地址2.png b/计算机网络/image/多播mac地址2.png new file mode 100644 index 00000000..ec0b7cc3 Binary files /dev/null and b/计算机网络/image/多播mac地址2.png differ diff --git a/计算机网络/image/换回接口处理数据报.png b/计算机网络/image/换回接口处理数据报.png new file mode 100644 index 00000000..13b3bdeb Binary files /dev/null and b/计算机网络/image/换回接口处理数据报.png differ diff --git a/计算机网络/image/条件get.png b/计算机网络/image/条件get.png new file mode 100644 index 00000000..e027ca99 Binary files /dev/null and b/计算机网络/image/条件get.png differ diff --git a/计算机网络/image/路由器交换结构.png b/计算机网络/image/路由器交换结构.png new file mode 100644 index 00000000..0727f7dd Binary files /dev/null and b/计算机网络/image/路由器交换结构.png differ diff --git a/计算机网络/image/路由器组成.png b/计算机网络/image/路由器组成.png new file mode 100644 index 00000000..e7bd88f4 Binary files /dev/null and b/计算机网络/image/路由器组成.png differ diff --git a/计算机网络/image/邮件协议工作原理.png b/计算机网络/image/邮件协议工作原理.png new file mode 100644 index 00000000..57a179af Binary files /dev/null and b/计算机网络/image/邮件协议工作原理.png differ diff --git a/计算机网络/image/链路层帧格式.png b/计算机网络/image/链路层帧格式.png new file mode 100644 index 00000000..8d7bb41d Binary files /dev/null and b/计算机网络/image/链路层帧格式.png differ diff --git a/计算机网络实验.md/&7 OSPF实验.md b/计算机网络实验.md/&7 OSPF实验.md new file mode 100644 index 00000000..1ea3d97a --- /dev/null +++ b/计算机网络实验.md/&7 OSPF实验.md @@ -0,0 +1,25 @@ +# OSPF 实验 +> 兄弟,停下来把,这种抄书行为有点愚蠢。 +## 1 OSPF协议概述及基本配置 + +### 实验原理 + +开放最短路优先协议(OSPF)基于链路状态算法的内部网关协议。每一台路由器将其周边的链路状态描述出来,发送给网络中相邻的路由器。经过一段时间的链路状态信息交互,每台路由器都保存了一个链路状态数据库,该数据库是整个网络完整的链路状态描述。 + +特点 + +* 适应范围广 +* 收敛速度快 +* 无自环 +* 支持验证、组播发送、路由分级、等值路由等功能。 + +自治系统和区域 + +自治系统(Autonomy System,AS)是由同一机构管理的使用同一组选路策略的路由器的集合。能够决定在本系统内部采用何种路由选择协议。 + +区域 + +值一个路由器的集合,相同的区域有相同的拓扑结构数据库。OSPF把AS划分成多个链路状态域。 + +### 基本配置 + diff --git a/计算机网络/5.4 链路层实验.md b/计算机网络实验.md/1 网络实验入门.md similarity index 59% rename from 计算机网络/5.4 链路层实验.md rename to 计算机网络实验.md/1 网络实验入门.md index 8c12eb6a..a59af731 100644 --- a/计算机网络/5.4 链路层实验.md +++ b/计算机网络实验.md/1 网络实验入门.md @@ -1,9 +1,18 @@ -# 实验入门 +# 网络实验入门 -## 1 实验说明 +目录 +1. 实验环境及设备简介 +2. 网线制作和测试 +3. 路由器和交换机的基本配置 +4. 报文分析软件 +5. 简单局域网组建实验 +6. 基于地址转换的组网实验 + +> 网络实验2019年10月17日算是从今天真正的开始做了,之前,可能都是在划水,网络实验,一周付出五天应该不为过。不过我觉得。以后能付出三天应该就能赶上进度。这里主要写一写自己缺少的理论知识。h3c的操作问题全部放到命令行的笔记当中 -## 2 设备简介 +## 1 实验环境及设备简介 + ### 集线器(hub) @@ -43,11 +52,6 @@ > 一会可以查看一下ping不通的原因,以及为什么路由表中没有另外一个地址(真奇怪) -## 3 软件说明 - -> 使用华三通(H3C)的交换机和路由器。 - - ### 路由器和交换机的配置方式 * console口配置 @@ -63,118 +67,23 @@ * 配置级 * 管理级 -## 4 H3C命令行 -> 基于视图的命令行。 +## 2 网线制作和测试 -### 视图切换命令 +RJ-45连接器:水晶头。包括直通线和交叉线两种接线方式。 +## 3 路由器和交换机的基本配置 -``` -system-view //进入系统视图 -interface Ethernet1/0/1 //进入以太网接口视图 +### 配置方式 +* 通过Console口配置 +* 通过Telnet远程登录进行相关配置 -quit //退出当前视图 -``` +## 4 报文分析软件 -### 用户视图 +## 5 简单局域网组建实验 -``` -display * //显示各种配置视图 -display current-configguration -display version -display interface Ethernet1/0/1 -display clock - - -? //查看该视图下的命令 - - -debuging //调试命令 - -reset //重置或清除相关配置 -reset saved-configuration -reset arp -reset ospf process - -reboot //重启 -``` - -### 系统视图 - -``` -sysname R1 //重命名当前视图 - - -``` - - - -### 路由器以太网端口视图 - -``` -# ip协议相关命令 -ip address ip-address mask[sub] -undo ip address [ip-address mask][sub] - -# MTU -mtu 100 -undo mtu - -# speed -speed [100|10|negotiation] //100M,10M,自动协商 - -# display -display interfaces ethernet number - -``` -### 交换机以太网端口视图 - -``` -shutdown -undo shutdown - -duplex full //设置全双工状态 -undo duplex //回复以太网全双工状态 - -spreed [10|100|auto] - -mdi [across|auto|normal] //设置接口网线类型 - -flow-control //流量控制 -undo flow-control //解除流量控制 - -port link-type [acces|hybrid|trunk] //设置接口链路类型 -undo port link-type - -display interface Ethernet1/0/1 -``` -### VLAN视图 - -### VLAN接口视图 - - -### RIP视图 - -### OSPF视图 - -### ACL视图 - - - - -## 5补充ip - -### 子网掩码 - -将IP地址分为网络地址与主机地址。通过子网掩码,就可以判断两个IP在不在一个局域网内部。子网掩码可以看出有多少位是网络号,有多少位是主机号。 - -* 网络地址 -* 主机地址 -* 广播地址:网络位与主机位都为1,是广播地址。 -* 一个交换机下设置同网段的主机会处于同一个局域网下,设置不同网段的主机可以处于不同的局域网下。 - -### 网关 -网间连接器、协议转换器。实现局域网与广域网的互联。 - - -# 链路层实验 \ No newline at end of file +## 6 基于地址转换的组网实验 +acl命令:access control list访问控制列表 +1)限制网络流量、提高网络性能。例如,ACL可以根据数据包的协议,指定这种类型的数据包具有更高的优先级,同等情况下可预先被网络设备处理。 +2)提供对通信流量的控制手段。 +3)提供网络访问的基本安全手段。 +4)在网络设备接口处,决定哪种类型的通信流量被转发、哪种类型的通信流量被阻塞。 diff --git a/计算机网络实验.md/2 链路层实验.md b/计算机网络实验.md/2 链路层实验.md new file mode 100644 index 00000000..7960fe6b --- /dev/null +++ b/计算机网络实验.md/2 链路层实验.md @@ -0,0 +1,173 @@ +# 链路层实验 + +目录 +1. 以太网链路层帧格式分析 +2. 交换机的MAC地址表和端口聚合 +3. VLAN的配置与分析 +4. 广域网协议分析 +5. 设计型实验 + +## 1 以太网链路层帧格式分析 + +以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI和ARCNET。 + +以太网是一种网络链路形式,是星型网络。与令牌环、arcnet是链路层网络技术。而不是泛指整个计算机网络。它只是计算机网络某一个层面的一个子集。因特网也是,他是应用层的一种技术,是应用层众多技术中的一个子集,而不是泛指整个计算机网络。 + +以太网帧格式可以参考[链路层-交换局域网]()的内容。 + +## 2 交换机的MAC地址表和端口聚合 + +### MAC地址表 +交换机的转发是基于MAC地址表的。以太网交换机收到数据帧时会进行一下操作: +* MAC地址表中没有mac-interface匹配项,则向所有(除发送端口外)端口发送数据帧。 +* 如果MAC地址表中有mac-interface匹配项,则表明该端口和目的主机在同一个广播域,转发到指定的端口上。 +* 交换机还将检查收到的数据帧的源mac地址,并查找mac地址表中与之相匹配的项,如果没有,交换机将增加一条由mac和interface组成的记录。 + +### 端口聚合 + +网络接口产生带宽速度限制。多网络接口连接。一台服务器同时通过多个网络接口提供数据传输,提高用户访问速率。应用场景: +* 交换机与交换机之间的连接:汇聚层交换机到核心层交换机或者核心层交换机之间。 +* 交换机与服务器之间的连接:集群服务器采用了多网卡与交换机连接提供集中访问。 +* 交换机与路由器之间的连接:交换机和路由器采用端口聚合可以解决广域网和局域网连接瓶颈。 +* 服务器与服务器之间的连接:集群服务器采用多王凯与路由器连接提供集中访问。 + +### 端口聚合实现原理 + +![](image/端口聚合.jpg) + +* 两个以太网交换机进行n个端口的聚合,此时当交换机A要向交换机B通过聚合链路进行数据传输时,从上层协议封装而来的数据帧进行排队,然后通过帧分发器按照一定的规则将帧分发到不同的端口发送队列分别进行发送。 +* 数据帧到达对端后,交换机B通过帧接收器将接收到的帧按照接收顺序上交给上层协议,再由上层协议处理。 + + +端口汇聚是将2个或多个物理端口组合在一起成为一条逻辑的路径从而增加在交换机和网络节点之间的带宽,将属于这几个端口的带宽合并,给端口提供一个几倍于独立端口的独享的高带宽。简单来说就是将多个端口绑定成一个端口,从而增加带宽。端口聚合的对象可以是交换机和交换机,交换机和路由器,主机与交换机或者路由器之间通过两个或多个端口并行连接同时传输以提供更高带宽、更大吞吐量, 大幅度提供整个网络能力。 + +端口聚合主要用于交换机之间连接。由于两个交换机之间有多条冗余链路的时候,STP会将其中的几条链路关闭,只保留一条,这样可以避免二层的环路产生。主要用途是生成冗余线路,保证通信不会中断。 + +* 生成树协议STP,开启生成树协议,可以在两台交换机形成环路时,自动断开其中一根线,断掉环路。 + + +## 3 VLAN的配置与分析 + +> 默认VLANID只作用在接收端接受没有tag域数据帧上。不会作用在发送端上。!!! + +> VLAN的tag是在接收端判断的。VLAN的tag是在发送端决定是否加标签发送、无标签发送。 + +> VLAN数据帧是否丢弃是在输入端口和查询交换机表的过程中决定的。如果输入端口的VLANtag与数据帧的VLANtag不一致则丢弃数据帧;如果查询交换机表中的vlan+目的mac地址的组合没有出现,则转发失败,地球数据帧。 + + +### VLAN 的产生 + +一种专门为隔离二层广播报文设计的虚拟局域网技术。路由器本身隔离广播域是因为路由器本身的数据转发都在IP层进行的,而广播本身是在广播域进行的,广播域的mac地址为全1。而交换机本身是不隔离广播域的,对收到的广播帧会向所有端口转发。 + +在VLAN当中,交换机的转发是区分广播域的。规定,凡是具有VLAN功能的交换机在转发数据报文时,都需要确认该报文属于某一个VLAN,并且该报文智能被转发到属于同一VLAN的端口或主机。每一个VLAN代表了一个广播域,不同的VLAN属于不同的广播域。 + +广播域是转来用来区分具有相同网络号(网段)的网络接口。 + +### VLAN的优势 +* 限制广播范围,提高带宽的利用率 +* 减少移动和改变的代价 +* 虚拟工作组 +* 用户不受物理设备的限制,VLAN用户可以处于网络中的任何地方 +* VLAN对用户的应用不产生影响,是交换机的工作模式。 +* 增强通信的安全性 +* 增强网络的健壮性 + +### VLAN的划分 + +VLAN的主要目的是划分广播域。 + +1. 基于端口的VLAN划分。利用以太网交换机的端口来划分广播域。VLAN只与交换机有关,与交换机连接的主机无关。 +2. 基于MAC地址的VLAN划分。只与主机的MAC地址有关,当用户改变地理位置时,不需要重新配置,但是初始配置代价很大。 +3. 基于协议的VLAN划分。根据网络主机使用的网络协议来划分广播域。很难将相同协议的主机广播域划分的很小。 +4. 基于子网的划分。根据主机使用的IP地址所在的子网划分广播域。灵活方便管理,但会强迫交换机检查数据包的IP地址,然而这是三层网络层应该做的事情。 + +### VLAN的帧格式 +![](image/VLAN帧格式.jpg) + +规定在标准以太网帧添加一个特殊的标志域-tag域。用于表示数据帧所属的VLANID。tag域包括2字节的标签协议IPID和2字节的标签控制信息TCI。TCI包括3bit的优先级信息Priority,CFI说明VLAN格式。 +### VLAN标签字段说明 + +|字段 |长度 |含义取值| +|-|-|-| +|TPID |2Byte| Tag Protocol Identifier(标签协议标识符),表示数据帧类型。 表示帧类型,取值为0x8100时表示IEEE 802.1Q的VLAN数据帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。 各设备厂商可以自定义该字段的值。当邻居设备将TPID值配置为非0x8100时, 为了能够识别这样的报文,实现互通,必须在本设备上修改TPID值,确保和邻居设备的TPID值配置一致。| +|PRI |3bit| Priority,表示数据帧的802.1p优先级。 取值范围为0~7,值越大优先级越高。当网络阻塞时,设备优先发送优先级高的数据帧。| +|CFI |1bit| Canonical Format Indicator(标准格式指示位),表示MAC地址在不同的传输介质中是否以标准格式进行封装,用于兼容以太网和令牌环网。 CFI取值为0表示MAC地址以标准格式进行封装,为1表示以非标准格式封装。在以太网中,CFI的值为0。| +|VID |12bit| VLAN ID,表示该数据帧所属VLAN的编号。 VLAN ID取值范围是0~4095。由于0和4095为协议保留取值,所以VLAN ID的有效取值范围是1~4094。| + +### 缺省VLAN +缺省VLAN又称PVID(Port Default VLAN ID)。前面提到,设备处理的数据帧都带Tag,当设备收到Untagged帧时,就需要给该帧添加Tag,添加什么Tag,就由接口上的缺省VLAN决定。 + +接口收发数据帧时,对Tag的添加或剥除过程。 + +* 对于Access接口,缺省VLAN就是它允许通过的VLAN,修改缺省VLAN即可更改接口允许通过的VLAN。 +* 对于Trunk接口和Hybrid接口,一个接口可以允许多个VLAN通过,但是只能有一个缺省VLAN。接口的缺省VLAN和允许通过的VLAN需要分别配置,互不影响。 + +### VLAN数据帧的传输 + +主机不支持带有tag域的以太网帧。为了让交换机之间能够知道VLAN信息,只有交换机之间的以太网数据帧,才会有VLAN的标签tag域。 + +过程: +* 交换机收到PC发送的数据帧时,为了让对端交换机知道数据帧的ID,增加VLAN的tag域后在发送。 +* 当交换机收到某数据帧的时候,交换机根据数据帧的tag域或者接口端口默认的VLANID来判断数据帧应该转发到哪些端口。如果目的主机是PC,则删除tag域后发送数据帧;如果目的主句是交换机,则添加tag域后发送数据。 +* 注意:如果检测到数据帧的VLAN ID和Trunk端口默认的VLANID相同时,不会在数据帧中添加tag域。而是到达对端交换机后,交换机发现没有tag域,为该数据帧为接收端默认VLANID。也就是说,默认VLANID只作用在接收端接受没有tag域数据帧上。 + + +### VLAN端口的分类 +* Access端口:连接不支持VLAN技术的端口,常为PC。接受发送不带Tag的以太网数据帧。 +* Trunk端口:连接支持VLAN技术的端口,常为交换机。接收发送到包含VLAN标签的以太网帧(如果数据帧的VLAN标签与默认VLAN相同,则接受到不带VLANtag的数据帧,发送的数据帧也不带VLANtag)。 +* Hybrid端口:Access与Trunk的混合模式。允许多个VLAN报文不带标签,Trunk只允许默认的VLAN的报文不带标签。 + + +### VLAN数据帧的转发过程 +1. 首先检查数据帧是否带有VLAN标签,如果没有,则将该端口默认VLAN ID作为VLAN ID。 +2. 如果带有VLAN标签,则检查是否与该端口的VLAN标签一致,如果不一致则丢弃该数据帧。 +3. 交换机结合VLANID进行源MAC地址学习,更新MAC地址表。 +4. 然后根据数据帧的目的MAC地址和VLANID,查找MAC地址表并向相应的端口转发该数据帧。 +5. 最后在发送端口,根据VLANID类型来决定是否将VLAN标签去掉。然后发送数据帧。 + + +## 4 广域网数据链路层协议分析 + +### PPP协议 + +PPP协议(Point to Point Protocol)点到点协议。数据链路层协议。是跟以太网协议同一个等级,以太网数据帧时用来组建局域网的。由一下三部分组成: +* 一个将IP数据报封装到串行链路的方法。支持异步链路、同步链路。IP数据报是数据部分,受最大接收单元限制MRU。 +* 一个用来建立、配置和测试数据链路连接的链路控制协议(link control protocol,LCP),通信双方用来协商。 +* 一套网络控制协议(Network Control Protocol,NCP),用来支持不同的网络层协议。 + +### PPP帧格式 +![](image/PPP帧格式.jpg) + +F、A、C字段辅助作用,协议0x33表示数据部分是IP数据。用来区分不同协议。 + +不适用序号和确认机制。因为没用。 + +### PPP身份认证 + +![](image/PPP状态图.png) + +总的来说分为两个步骤,通过LCP建立物理链路,通过NCP打开物理链路传输数据。 + +身份认证分为两种方式:PAP和CHAP + +* PAP身份认证。 + +Password Authentication Protocol,密码认证协议。PAP认证在LCP链路控制协议建立链路的过程中。不会出现在NCP数据传输阶段。明文发送用户密码。 + + 1. 客户端发起,用户名+密码明文发送。 + 2. 认证方查询数据库,决定是否通过。 + + +* CHAP身份认证 + +Challenge-Handshake Authentication Protocol,询问握手协议。不仅在LCP链路控制协议连接建立阶段,也会在NCP数据传输阶段随机间隔认证。验证分三步,密文发送验证。 + + 1. 验证方向被验证方发送:随机报文+主机名 + 2. 被验证方接收,查询用户口令秘钥,利用随机报文、秘钥、报文ID用MD5加密算法生成应答。返回主机名 + 3. 验证方接收数据,查询用户口令秘钥,利用随机报文、秘钥、报文ID用MD5加密算法得出结果。返回相应的结果。 +### IPCP协议 + +> 需要重点自学一下。 + +## 5 设计型实验 +无 \ No newline at end of file diff --git a/计算机网络实验.md/3 网络层实验.md b/计算机网络实验.md/3 网络层实验.md new file mode 100644 index 00000000..66272e39 --- /dev/null +++ b/计算机网络实验.md/3 网络层实验.md @@ -0,0 +1,116 @@ +# 网络层实验 + + +目录 +1. ARP分析 +2. ICMP分析 +3. IP分析 +4. 网络层分片实验 +5. 静态路由及其配置实验 +6. VLAN间通信综合实验 +7. 设计型实验 + +## hello +## 1 ARP分析 + +address resolution protocol +### 原理 +[参考计算机网络](../计算机网络/5.3 链路层-交换局域网.md) +物理网络使用硬件地址传输报文,IP地址不能被物理网络识别。建立两种地址的映射关系。将IP地址机械城硬件地址的协议,称为地址解析协议。 + +ARP是动态协议,过程自动完成。主机有ARP表缓存。 + +### 同一网段的ARP解析过程 +* 查表,没有对方主机MAC地址,广播发送ARP请求报文。 +* 目的主机收到请求报文后判断是否在索要自己的MAC地址,若果是,将自己的MAC地址写入应答报文,并发单播回去。 +* 主机A收到单播ARP应答报文,将IP-MAC对应关系存入缓存。 + +### 不同网段的ARP解析过程 +* 源主机将报文发送给默认网关,查找解析自己配置的默认网关的IP地址,得到MAC地址,将默认网关IP-MAC存入缓存。 +* 由默认网关通过网络层根据路由表寻找下一跳地址,解析吓一跳的IP地址,得到MAC地址,将吓一跳IP-MAC存入缓存。 +* + +## 2 ICMP分析 +internet control message protocol,因特网控制协议 +### 原理 +参考[网络层-网际协议](../计算机网络/4.2 网络层-网际协议.md). + +允许主机报告差错情况提供有关信息,用于调试、监控网络。 + +### ICMP报文 +略 + +### ICMP报文分类 +差错报文 +|类型值|ICMP报文类型| +|-|-| +|3|重点不可达| +|4|源站抑制| +|11|超时| +|12|参数问题| +|5|路由重定向| + +询问报文 +|类型值|ICMP报文类型| +|-|-| +|8或0|回送请求或应答| +|13或14|时间戳请求或应答| +|17或18|地址掩码请求或应答| +|10或9|路由器询问或通告| + +### 基于ICMP的应用程序 + +* ping + * 检测网络连通性 + * 确定数据报被丢失、复制或重传。序列号唯一,用来检查结束到的应答报文的序列号。 + * 报文内放置时间戳。分局返回时间计算RTT + * 校验接收到的数据包,确定数据报是否被损坏 + * ping -n count 指定ping数量。-i ttl指定生存时间。-s count 指定转发次数。-w timeout指定超时时间ms。 + +* traceroute + * 本地计算机到目的主机的路径信息。 + * 发送具有不同TTL的ICMP请求报文,以确定每一跳。 + * tracert -d 指定不对计算机名进行解析。-h maxiumhops指定最大跳。-w timeout指定超时时间ms。 + +* Pingtest程序 + * 专门用来发送ICMP报文的程序。 +## 3 IP分析 + +Internet protocol + +参考[网络层-网际协议](../计算机网络/4.2 网络层-网际协议.md)。 +### IP报文格式 +### IP地址编址方式 + +无分类域间路由选择CIDR + +### IP层的路由分析 + +主机路由过程:将目的地之与子网掩码相与计算网络地址,与自身网络地址对比,不一样,则发往网关路由器。 + +路由器转发数据报的算法: +1. 从收到的数据包首部提取目的IP地址D。 +2. 判断是否直接交付。检测直连网络地址,如果有匹配的网段,直接交付。否则执行3 +3. 若路由表中有目的地址为D的特定路由,则将数据传送给路由表中指明的下一跳路由器。否则执行4 +4. 对路由表中的每一行进行扫描,将目的地之与每一项的网络地址对比,找到所有的匹配项。 +5. 选取所有匹配项的最长网络前缀的路由表项。将数据报传送给表向对应的吓一跳路由器。结束,否则执行下一步。 +6. 报告转发分组出错。 + +路由表的生成方式可以分为静态配置和动态生成两种。静态路由和动态路由。动态生成可以通过OSPF算法和BGP算法实现。 + +路由器数据报转发总共有四个分支直接交付、特定路由完全匹配下一跳、最长前缀匹配网络号、报告分组转发出错。对应的三种地址分别是直接路由地址(direct)、静态路由地址(static)、动态路由地址(ospf、rip)。 + + +## 4 网络层分片实验 + +设置以太网端口的MTU实现分片。 + + +## 5 VLAN间通信综合实验 + +### 原理 +VLAN能够隔离二层广播。三层交换机-路由交换机,三层路由模块,实现三层的路由转发;二层交换模块,实现VLAN内的二层转发。用户可以设置默认网关,即VLAN的接口IP地址。 + +三层路由模块采用了以此路由多次转发的技术。 + +## 6 设计型实验 \ No newline at end of file diff --git a/计算机网络实验.md/7 OSPF实验.md b/计算机网络实验.md/7 OSPF实验.md new file mode 100644 index 00000000..808c3415 --- /dev/null +++ b/计算机网络实验.md/7 OSPF实验.md @@ -0,0 +1,23 @@ +# OSPF协议实验 + +目录 +1. OSPF协议概述及基本配置 +2. OSPF协议报文交互过程 +3. OSPF协议链路状态描述 +4. 区域划分及LSA种类 +5. OSPF协议路由的计算 +6. OSPF协议组网设计 + +> 区别 +> * OSPF指出了报文类型,表示建立可靠数据连接的过程的作用,指出了交互逻辑。 +> * LSA链路状态通告类型,用于反映交互双方(携带数据者)的逻辑关系。是反映的数据发送者、接受者的逻辑关系,而非路由表项的内容。与路由器本身的逻辑位置和逻辑角色有关系。 +> * LSA链路状态描述类型,反映了一条路由记录的类型,是一条记录自身的特点,与数据的具体含义有关。 + +> 联系 +> * 链路状态描述信息组成了链路状态通告信息。 + +> 图片说明 +> * 五种链路状态通告类型 +> ![](image/OSPF五种链路通告类型.png) +> * 五种链路状态描述类型 +> ![](image/OSPF五种链路状态描述类型.png) \ No newline at end of file diff --git a/计算机网络实验.md/8 BGP实验.md b/计算机网络实验.md/8 BGP实验.md new file mode 100644 index 00000000..82b8bd5b --- /dev/null +++ b/计算机网络实验.md/8 BGP实验.md @@ -0,0 +1,25 @@ +# BGP实验 + +目录 +1. BGP基本分析 +2. 状态机的分析 +3. BGP的路由聚合 +4. BGP的基本路由属性分析 +5. BGP的同步机制 +6. BGP的路由策略及应用 +7. BGP设计型实验 + + + +> 关于聚合问题需要进一步学习。包括链路层的端口聚合和OSPF与BGP的路由聚合 + + + +## 1 BGP基本分析 + +## 2 状态机的分析 +## 3 BGP的路由聚合 +## 4 BGP的基本路由属性分析 +## 5 BGP的同步机制 +## 6 BGP的路由策略及应用 +## 7 BGP设计型实验 \ No newline at end of file diff --git a/计算机网络实验.md/BGP协议.md b/计算机网络实验.md/BGP协议.md new file mode 100644 index 00000000..e13516ce --- /dev/null +++ b/计算机网络实验.md/BGP协议.md @@ -0,0 +1,456 @@ +# BGP协议 + +- [BGP协议](#bgp%e5%8d%8f%e8%ae%ae) + - [1 BGP概述](#1-bgp%e6%a6%82%e8%bf%b0) + - [BGP简介](#bgp%e7%ae%80%e4%bb%8b) + - [目的](#%e7%9b%ae%e7%9a%84) + - [BGP的优点](#bgp%e7%9a%84%e4%bc%98%e7%82%b9) + - [2 BGP基础](#2-bgp%e5%9f%ba%e7%a1%80) + - [BGP基本概念](#bgp%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5) + - [BGP分类](#bgp%e5%88%86%e7%b1%bb) + - [BGP报文交互中的角色](#bgp%e6%8a%a5%e6%96%87%e4%ba%a4%e4%ba%92%e4%b8%ad%e7%9a%84%e8%a7%92%e8%89%b2) + - [BGP的路由器号(Router ID)](#bgp%e7%9a%84%e8%b7%af%e7%94%b1%e5%99%a8%e5%8f%b7router-id) + - [BGP路由生成](#bgp%e8%b7%af%e7%94%b1%e7%94%9f%e6%88%90) + - [BGP与IGP交互机制](#bgp%e4%b8%8eigp%e4%ba%a4%e4%ba%92%e6%9c%ba%e5%88%b6) + - [3 BGP工作原理:](#3-bgp%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86) + - [3.1 BGP的报文](#31-bgp%e7%9a%84%e6%8a%a5%e6%96%87) + - [BGP报文头](#bgp%e6%8a%a5%e6%96%87%e5%a4%b4) + - [OPEN报文](#open%e6%8a%a5%e6%96%87) + - [UPDATE报文](#update%e6%8a%a5%e6%96%87) + - [Notification报文](#notification%e6%8a%a5%e6%96%87) + - [Keepalive报文](#keepalive%e6%8a%a5%e6%96%87) + - [Refresh报文格式](#refresh%e6%8a%a5%e6%96%87%e6%a0%bc%e5%bc%8f) + - [3.2 BGP状态机:](#32-bgp%e7%8a%b6%e6%80%81%e6%9c%ba) + - [Idle状态](#idle%e7%8a%b6%e6%80%81) + - [Connet状态](#connet%e7%8a%b6%e6%80%81) + - [Active状态](#active%e7%8a%b6%e6%80%81) + - [OpenSent状态](#opensent%e7%8a%b6%e6%80%81) + - [OpenConfirm状态](#openconfirm%e7%8a%b6%e6%80%81) + - [Establish状态](#establish%e7%8a%b6%e6%80%81) + - [3.3 BGP对等体之间的交互原则](#33-bgp%e5%af%b9%e7%ad%89%e4%bd%93%e4%b9%8b%e9%97%b4%e7%9a%84%e4%ba%a4%e4%ba%92%e5%8e%9f%e5%88%99) + - [5 BGP属性:](#5-bgp%e5%b1%9e%e6%80%a7) + - [属性分类](#%e5%b1%9e%e6%80%a7%e5%88%86%e7%b1%bb) + - [BGP常见属性类型:](#bgp%e5%b8%b8%e8%a7%81%e5%b1%9e%e6%80%a7%e7%b1%bb%e5%9e%8b) + - [Origin属性](#origin%e5%b1%9e%e6%80%a7) + - [AS_Path属性:](#aspath%e5%b1%9e%e6%80%a7) + - [Next_hop属性:](#nexthop%e5%b1%9e%e6%80%a7) + - [Local_pref属性:](#localpref%e5%b1%9e%e6%80%a7) + - [MED属性:](#med%e5%b1%9e%e6%80%a7) + - [Community团体属性:](#community%e5%9b%a2%e4%bd%93%e5%b1%9e%e6%80%a7) + - [Originator_ID属性和Cluster_List属性:](#originatorid%e5%b1%9e%e6%80%a7%e5%92%8cclusterlist%e5%b1%9e%e6%80%a7) + - [6 BGP选择路由的策略:](#6-bgp%e9%80%89%e6%8b%a9%e8%b7%af%e7%94%b1%e7%9a%84%e7%ad%96%e7%95%a5) + - [与路由选择相关的过滤器](#%e4%b8%8e%e8%b7%af%e7%94%b1%e9%80%89%e6%8b%a9%e7%9b%b8%e5%85%b3%e7%9a%84%e8%bf%87%e6%bb%a4%e5%99%a8) + - [路由选择](#%e8%b7%af%e7%94%b1%e9%80%89%e6%8b%a9) + - [7 BGP的其他机制](#7-bgp%e7%9a%84%e5%85%b6%e4%bb%96%e6%9c%ba%e5%88%b6) + - [路由聚合](#%e8%b7%af%e7%94%b1%e8%81%9a%e5%90%88) + - [BGP同步机制](#bgp%e5%90%8c%e6%ad%a5%e6%9c%ba%e5%88%b6) + - [BGP安全性](#bgp%e5%ae%89%e5%85%a8%e6%80%a7) + - [BGP负载分担:](#bgp%e8%b4%9f%e8%bd%bd%e5%88%86%e6%8b%85) + - [BGP路由衰减:](#bgp%e8%b7%af%e7%94%b1%e8%a1%b0%e5%87%8f) + +## 1 BGP概述 +### BGP简介 +边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可达,并选择最佳路由的距离矢量路由协议。 + +MP-BGP是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并没有改变。MP-BGP在IPv6单播网络上的应用称为BGP4+,在IPv4组播网络上的应用称为MBGP(Multicast BGP)。 + +### 目的 +为方便管理规模不断扩大的网络,网络被分成了不同的自治系统。1982年,外部网关协议EGP(Exterior Gateway Protocol)被用于实现在AS之间动态交换路由信息。但是EGP设计得比较简单,只发布网络可达的路由信息,而不对路由信息进行优选,同时也没有考虑环路避免等问题,很快就无法满足网络管理的要求。 + +BGP是为取代最初的EGP而设计的另一种外部网关协议。不同于最初的EGP,BGP能够进行路由优选、避免路由环路、更高效率的传递路由和维护大量的路由信息。 + +虽然BGP用于在AS之间传递路由信息,但并不是所有AS之间传递路由信息都需要运行BGP。比如在数据中心上行的连入Internet的出口上,为了避免Internet海量路由对数据中心内部网络的影响,设备采用静态路由代替BGP与外部网络通信。 + +### BGP的优点 + +课本上BGP的特性 +* BGP着眼点不在于**发现和计算**路由。而在于控制路由的**传播和选择**最好的路由。 +* 通过携带AS路径信息,解决了路由环路问题。 +* 为控制路由的传播和路由选择,它为路由附带属性信息 +* 支持无类别域间选路CIDR,引入路由聚合。简化路由表。 +* 路由更新时只发送增量路由,减少了BGP传播路由的占用宽带。 +* 能够对路由进行过滤、选择和控制。 +* BGP拓扑结构图中,断点是一个AS区域,边是AS之间的链路。 +* BGP需要设置AS间的链路花费、AS区域内的花费。 + + +BGP从多方面保证了网络的安全性、灵活性、稳定性、可靠性和高效性。 +* BGP采用认证和GTSM的方式,保证了网络的安全性。 +* BGP提供了丰富的路由策略,能够灵活的进行路由选路,并且能指导邻居按策略发布路由。 +* BGP提供了路由聚合和路由衰减功能由于防止路由震荡,有效提高了网络的稳定性。 +* BGP使用TCP作为其传输层协议(目的端口号179),并支持与BGP与BFD联动、BGP Tracking和BGP GR和NSR,提高了网络的可靠性。 +* 在邻居数目多、路由量大且大部分邻居具有相同出口的策略的场景下,BGP使用按组打包技术极大的提高了BGP打包发包性能。 + + +## 2 BGP基础 +### BGP基本概念 + +* 自治系统ASAutonomous System + +AS是指在一个实体管辖下的拥有相同选路策略的IP网络。BGP网络中的每个AS都被分配一个唯一的AS号,用于区分不同的AS。AS号分为2字节AS号和4字节AS号,其中2字节AS号的范围为1至65535,4字节AS号的范围为1至4294967295。支持4字节AS号的设备能够与支持2字节AS号的设备兼容。 + +### BGP分类 +BGP按照运行方式分为EBGP(External/Exterior BGP)和IBGP(Internal/Interior BGP)。 + +* EBGP:运行于不同AS之间的BGP称为EBGP。为了防止AS间产生环路,当BGP设备接收EBGP对等体发送的路由时,会将带有本地AS号的路由丢弃。 +* IBGP:运行于同一AS内部的BGP称为IBGP。为了防止AS内产生环路,BGP设备不将从IBGP对等体学到的路由通告给其他IBGP对等体,并与所有IBGP对等体建立全连接。为了解决IBGP对等体的连接数量太多的问题,BGP设计了路由反射器和BGP联盟。 + +### BGP报文交互中的角色 + +BGP报文交互中分为Speaker和Peer两种角色。 + +* Speaker:发送BGP报文的设备称为BGP发言者(Speaker),它接收或产生新的报文信息,并发布(Advertise)给其它BGP Speaker。 +* Peer:相互交换报文的Speaker之间互称对等体(Peer)。若干相关的对等体可以构成对等体组(Peer Group)。 + +### BGP的路由器号(Router ID) + +BGP的Router ID是一个用于标识BGP设备的32位值,通常是IPv4地址的形式,在BGP会话建立时发送的Open报文中携带。对等体之间建立BGP会话时,每个BGP设备都必须有唯一的Router ID,否则对等体之间不能建立BGP连接。 + +BGP的Router ID在BGP网络中必须是唯一的,可以采用手工配置,也可以让设备自动选取。缺省情况下,BGP选择设备上的Loopback接口的IPv4地址作为BGP的Router ID。如果设备上没有配置Loopback接口,系统会选择接口中最大的IPv4地址作为BGP的Router ID。一旦选出Router ID,除非发生接口地址删除等事件,否则即使配置了更大的地址,也保持原来的Router ID。 + +### BGP路由生成 + +* 纯动态注入:路由器通过IGP路由协议获得的路由信息注入到BGP当中。 +* 半动态注入:路由器选择性的将IGP发现的动态路由信息注册到BGP当中。 +* 静态注入:静态配置某条路由到BGP当中。 + +### BGP与IGP交互机制 + +BGP与IGP在设备中使用不同的路由表,为了实现不同AS间相互通讯,BGP需要与IGP进行交互,即BGP路由表和IGP路由表相互引入。 + +**BGP引入IGP路由** + +BGP协议本身不发现路由,因此需要将其他路由引入到BGP路由表,实现AS间的路由互通。当一个AS需要将路由发布给其他AS时,AS边缘路由器会在BGP路由表中引入IGP的路由。为了更好的规划网络,BGP在引入IGP的路由时,可以使用路由策略进行路由过滤和路由属性设置,也可以设置MED值指导EBGP对等体判断流量进入AS时选路。 + +BGP引入路由时支持Import和Network两种方式: + +* Import方式是按协议类型,将RIP、OSPF、ISIS等协议的路由引入到BGP路由表中。为了保证引入的IGP路由的有效性,Import方式还可以引入静态路由static和直连路由direct。 +* Network方式是逐条将IP路由表中已经存在的路由引入到BGP路由表中,比Import方式更精确。 + +**IGP引入BGP路由** + +当一个AS需要引入其他AS的路由时,AS边缘路由器会在IGP路由表中引入BGP的路由。为了避免大量BGP路由对AS内设备造成影响,当IGP引入BGP路由时,可以使用路由策略,进行路由过滤和路由属性设置。 +## 3 BGP工作原理: +BGP对等体的建立、更新和删除等交互过程主要有5种报文、6种状态机和5个原则。 + +## 3.1 BGP的报文 +BGP对等体间通过以下5种报文进行交互,其中Keepalive报文为周期性发送,其余报文为触发式发送: + +* Open报文:用于建立BGP对等体连接。 +* Update报文:用于在对等体之间交换路由信息。 +* Notification报文:用于中断BGP连接。 +* Keepalive报文:用于保持BGP连接。 +* Route-refresh报文:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的BGP设备会发送和响应此报文。 + +### BGP报文头 +![](image/BGP报文头格式.png) + +* **Marker**:占16字节,用于检查BGP对等体的同步信息是否完整,以及用于BGP验证的计算。不使用验证时所有比特均为1(十六进制则全“FF”)。 + +* **Length**:占2个字节(无符号位),BGP消息总长度(包括报文头在内),以字节为单位。长度范围是19~4096。 + +* **Type**:占1个字节(无符号位),BGP消息的类型。Type有5个可选值,表示BGP报文头后面所接的5类报文(其中,前四种消息是在RFC4271中定义的,而Type5的消息则是在RFC2918中定义的): + +|TYPE值| 报文类型| +|-|-|-| +|1 |OPEN| +|2 |UPDATE| +|3 |NOTIFICATION| +|4 |KEEPALIVE| +|5 |REFRESH(RFC2918)| + +![](image/BGP报文头实例.png) + +### OPEN报文 +如果BGP报文头中的TYPE为1,则该报文为OPEN报文。报文头后面所接的报文内容如下,OPEN报文用于建立BGP连接。 +* OPEN报文格式 +![](image/BGPOPEN报文格式.png) + +* 字段说明 + +|字段|说明| +|-|-| +|version|表示协议的版本号,现在BGP的版本号为4。| +|My autonomous System|发送者自己的AS域号| +|Hold Time|发送者自己设定的hold time值(单位:秒),用于协商BGP对等体间保持建立连接关系,发送KEEPALIVE或UPDATE等报文的时间间隔。BGP的状态机必须在收到对等体的OPEN报文后,对发出的OPEN报文和收到的OPEN报文两者的hold time时间作比较,选择较小的时间作为协商结果。Hold Time的值可为零(不发KEEPALIVE报文)或大于等于3,我们系统的默认为180。| +|BGP Identifier|发送者的router id。| +|Opt Parm Len|表示Optional Parameters(可选参数)的长度。如果此值为0,表示没有可选参数。| +|Optional Paramters|此值为BGP可选参数列表,每一个可选参数是一个TLV格式的单元(RFC3392)。| + +* OPEN报文实例 + +![](image/OPEN报文实例.png) + +### UPDATE报文 +如果BGP报文头中的TYPE为2,则该报文为UPDATE报文。报文头后面所接的报文内容如下(RFC 4271),UPDATE报文用于通告路由。 +* UPDATE报文格式 +![](image/UPDATE报文格式.png) +* UPDATE报文字段说明 + +|字段|说明| +|-|-| +|**Error code**|占1个字节(无符号位),定义错误的类型,非特定的错误类型用零表示。| +|**Error subcode**|占1个字节(无符号位),指定错误细节编号,非特定的错误细节编号用零表示。| +|**Data**|指定错误数据内容。| +* UPDATE报文实例 +![](image/UPDATE报文实例.png) + +### Notification报文 +如果BGP报文头中的TYPE为3,则该报文为NOTIFICATION报文。报文头后面所接的报文内容如下(RFC 4271),NOTIFICATION报文用于处理BGP进程中的各种错误。 + +* Notification报文格式 +![](image/Notification报文格式.png) +* Notification报文字段说明 + +|字段|说明| +|-|-| +|**Error code**|占1个字节(无符号位),定义错误的类型,非特定的错误类型用零表示。| +|**Error subcode**|占1个字节(无符号位),指定错误细节编号,非特定的错误细节编号用零表示。| +|**Data**|指定错误数据内容。| + +* Notification实例 + +![](image/Notification报文实例.png) + +### Keepalive报文 +如果BGP报文头中的TYPE为4,则该报文为KEEPALIVE报文。KEEPALIVE报文用于保持BGP连接。 + +* Keepalive报文格式 + +KEEPALIVE报文只有BGP报文头,没有具体内容,故其报文长度应固定为19个字节。 +* Keepalive报文实例 + +![](image/Keepalive报文实例.png) +### Refresh报文格式 +Refresh报文格式 +如果BGP报文头中的TYPE为5,则该报文为REFRESH报文。报文头后面所接的报文内容如下(RFC 2918),REFRESH报文用于动态的请求BGP路由发布者重新发布UPDATE报文,进行路由更新。 + +* Refresh报文格式 + +![](image/Refresh报文格式.png) + +* Refresh报文字段说明 + +|Field字段| Length长度 |Description描述| +|-|-|-| +|AFI |2字节(无符号位) |表示地址族id,与UPDATE报文中的定义相同。| +|Res. |1字节(无符号位) |所有为应全为零,在接收报文时,此位被忽略。| +|SAFI |1字节(无符号位) |与UPDATE报文中的定义相同| +* Refresh报文实例 +![](image/Refresh报文实例.png) +## 3.2 BGP状态机: +BGP对等体的交互过程中存在6种状态机:空闲(Idle)、连接(Connect)、活跃(Active)、Open报文已发送(OpenSent)、Open报文已确认(OpenConfirm)和连接已建立(Established)。在BGP对等体建立的过程中,通常可见的3个状态是:Idle、Active和Established。 + +![](image/BGP状态机.png) + +### Idle状态 +Idle状态是BGP初始状态。在Idle状态下,BGP拒绝邻居发送的连接请求。只有在收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。 + +### Connet状态 +在Connect状态下,BGP启动连接重传定时器(Connect Retry),等待TCP完成连接。 +* 如果TCP连接成功,那么BGP向对等体发送Open报文,并转至OpenSent状态。 +* 如果TCP连接失败,那么BGP转至Active状态。 +* 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。 + +### Active状态 +在Active状态下,BGP总是在试图建立TCP连接。 + +* 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。 +* 如果TCP连接失败,那么BGP停留在Active状态。 +* 如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP转至Connect状态。 + +### OpenSent状态 +在OpenSent状态下,BGP等待对等体的Open报文,并对收到的Open报文中的AS号、版本号、认证码等进行检查。 + +* 如果收到的Open报文正确,那么BGP发送Keepalive报文,并转至OpenConfirm状态。 +* 如果发现收到的Open报文有错误,那么BGP发送Notification报文给对等体,并转至Idle状态。 + +### OpenConfirm状态 +在OpenConfirm状态下,BGP等待Keepalive或Notification报文。如果收到Keepalive报文,则转至Established状态,如果收到Notification报文,则转至Idle状态。 + +### Establish状态 +在Established状态下,BGP可以和对等体交换Update、Keepalive、Route-refresh报文和Notification报文。 +* 如果收到正确的Update或Keepalive报文,那么BGP就认为对端处于正常运行状态,将保持BGP连接。 +* 如果收到错误的Update或Keepalive报文,那么BGP发送Notification报文通知对端,并转至Idle状态。 +Route-refresh报文不会改变BGP状态。 +* 如果收到Notification报文,那么BGP转至Idle状态。 +* 如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态。 + +## 3.3 BGP对等体之间的交互原则 +BGP设备将最优路由加入BGP路由表,形成BGP路由。BGP设备与对等体建立邻居关系后,采取以下交互原则: + +1. 从IBGP对等体获得的BGP路由,BGP设备只发布给它的EBGP对等体。 +2. 从EBGP对等体获得的BGP路由,BGP设备发布给它所有EBGP和IBGP对等体。 +3. 当存在多条到达同一目的地址的有效路由时,BGP设备只将最优路由发布给对等体。 +4. 路由更新时,BGP设备只发送更新的BGP路由。 +5. 所有对等体发送的路由,BGP设备都会接收。 + +BGP路由通告原则 +1. 连接建立时,BGP Speaker只把本身用的最优路由通告给对等体。 + +2. 多条路径时,BGP Speraker只选择最优的路由放入路由表。 + +3. BGP Speraker从EBGP获得路由会向它所有的BGP对等体通告(包括EBGP和IBGP)。通告给EBGP时,下一跳为自己。(注:如果通告路由的EBGP邻居需要接收的的EBGP邻居在同一网段,则通告时不修改下一跳。)通告给IBGP时,不更改下一跳。防止次优路径。 + +4. BGP Speraker从IBGP获得的路由不会通告给其他的IBGP邻居。IBGP的水平分割原理:从一个IBGP邻居收到的路由条目不会再通告给其他IBGP邻居。如果想让所有的IBGP邻居都能收到路由,有三种解决方案: + * 全互联(每两台设备之间都建立IBGP邻居)。 + * RP(路由反射器)。 + * 联盟 +5. BGP与IGP同步。BGP不将从IBGP对等体获得的路由通告给它的EBGP对等体,除非该路由信息也能通过IBGP过得。 + +所有厂商同步功能默认关闭。华为不支持开启,思科可以开启。 + + + +## 5 BGP属性: + +### 属性分类 +路由属性是对路由的特定描述,所有的BGP路由属性都可以分为以下4类,常见BGP属性类型所示: + +* 公认必须遵循(Well-known mandatory):所有BGP设备都可以识别此类属性,且必须存在于Update报文中。如果缺少这类属性,路由信息就会出错。 +* 公认任意(Well-known discretionary):所有BGP设备都可以识别此类属性,但不要求必须存在于Update报文中,即就算缺少这类属性,路由信息也不会出错。 +* 过渡(Optional transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,但它仍然会接收这类属性,并通告给其他对等体。 +* 非过渡(Optional non-transitive):BGP设备可以不识别此类属性,如果BGP设备不识别此类属性,则会被忽略该属性,且不会通告给其他对等体。 + +### BGP常见属性类型: + +|属性名| 类型| +|-|-| +|Origin属性| 公认必须遵循| +|AS_Path属性| 公认必须遵循| +|Next_Hop属性| 公认必须遵循| +|Local_Pref属性| 公认任意| +|MED属性| 可选非过渡| +|团体属性| 可选过渡| +|Originator_ID属性| 可选非过渡| +|Cluster_List属性| 可选非过渡| + +### Origin属性 +Origin属性用来定义路径信息的来源,标记一条路由是怎么成为 + +BGP路由的。它有以下3种类型: + +* IGP:具有最高的优先级。通过network命令注入到BGP路由表的路由,其Origin属性为IGP。 +* EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。 +* Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。 + +### AS_Path属性: +AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。在接收路由时,设备如果发现AS_Path列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。 + +当BGP Speaker传播自身引入的路由时: + +* 当BGP Speaker将这条路由通告到EBGP对等体时,便会在Update报文中创建一个携带本地AS号的AS_Path列表。 +* 当BGP Speaker将这条路由通告给IBGP对等体时,便会在Update报文中创建一个空的AS_Path列表。 + +当BGP Speaker传播从其他BGP Speaker的Update报文中学习到的路由时: + +* 当BGP Speaker将这条路由通告给EBGP对等体时,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。收到此路由的BGP设备根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。 +* 当BGP Speaker将这条路由通告给IBGP对等体时,不会改变这条路由相关的AS_Path属性。 + + +### Next_hop属性: +Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则: + +* BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。 +* BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。 +* BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。 + +### Local_pref属性: +Local_Pref属性表明路由器的BGP优先级,用于判断流量离开AS时的最佳路由。当BGP的设备通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。Local_Pref属性仅在IBGP对等体之间有效,不通告给其他AS。Local_Pref属性可以手动配置,如果路由没有配置Local_Pref属性,BGP选路时将该路由的Local_Pref值按缺省值100来处理。 + +### MED属性: +MED(Multi-Exit Discriminator)属性用于判断流量进入AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED值较小者作为最佳路由。 + +MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。 + +### Community团体属性: +团体属性(Community)用于标识具有相同特征的BGP路由,使路由策略的应用更加灵活,同时降低了维护管理的难度。 + +团体属性分为自定义团体属性和公认团体属性。公认团体属性如下所示: + +![](image/团体属性说明.png) + +### Originator_ID属性和Cluster_List属性: +Originator_ID属性和Cluster_List属性用于解决路由反射器场景中的环路问题。 + +## 6 BGP选择路由的策略: +### 与路由选择相关的过滤器 + +* 路由策略。设定匹配条件,属性匹配后进行设置操作。 +* 访问控制列表。匹配路由信息的目的网段地址或吓一跳地址,过滤不符合条件的路由信息。 +* 前缀列表。匹配路由信息的目的地之或直接作用于路由器对象 +* 自制系统路径信息访问控制列表。匹配BGP路由信息 +* 团体属性列表。匹配BGP路由信息的自治系统域。 + + +### 路由选择 +当到达同一目的地存在多条路由时,BGP依次对比下列属性来选择路由: + +1. 优选协议首选值(PrefVal)最高的路由。 + +协议首选值(PrefVal)是华为设备的特有属性,该属性仅在本地有效。 + +2. 优选本地优先级(Local_Pref)最高的路由。 + +如果路由没有本地优先级,BGP选路时将该路由按缺省的本地优先级100来处理。 + +3. 依次优选手动聚合路由、自动聚合路由、network命令引入的路由、import-route命令引入的路由、从对等体学习的路由。 + +4. . 优选AS路径(AS_Path)最短的路由。 + +5. 依次优选Origin类型为IGP、EGP、Incomplete的路由。 + +6. 对于来自同一AS的路由,优选MED值最低的路由。 + +7. 依次优选EBGP路由、IBGP路由、LocalCross路由、RemoteCross路由。 + +PE上某个VPN实例的VPNv4路由的ERT匹配其他VPN实例的IRT后复制到该VPN实例,称为LocalCross;从远端PE学习到的VPNv4路由的ERT匹配某个VPN实例的IRT后复制到该VPN实例,称为RemoteCross。 + +8. 优选到BGP下一跳IGP度量值(metric)最小的路由。 + +9. 优选Cluster_List最短的路由。 + +10. 优选Router ID最小的设备发布的路由。 + +11. 优选从具有最小IP Address的对等体学来的路由。 + +## 7 BGP的其他机制 +### 路由聚合 +在大规模的网络中,BGP路由表十分庞大,给设备造成了很大的负担,同时使发生路由振荡的几率也大大增加,影响网络的稳定性。 + +路由聚合是将多条路由合并的机制,它通过只向对等体发送聚合后的路由而不发送所有的具体路由的方法,减小路由表的规模。并且被聚合的路由如果发生路由振荡,也不再对网络造成影响,从而提高了网络的稳定性。 + +BGP在IPv4网络中支持自动聚合和手动聚合两种方式,而IPv6网络中仅支持手动聚合方式: + +* 自动聚合:对BGP引入的路由进行聚合。配置自动聚合后,BGP将按照自然网段聚合路由(例如非自然网段A类地址10.1.1.1/24和10.2.1.1/24将聚合为自然网段A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。 + +* 手动聚合:对BGP本地路由表中存在的路由进行聚合。手动聚合可以控制聚合路由的属性,以及决定是否发布具体路由。 + +为了避免路由聚合可能引起的路由环路,BGP设计了AS_Set属性。AS_Set属性是一种无序的AS_Path属性,标明聚合路由所经过的AS号。当聚合路由重新进入AS_Set属性中列出的任何一个AS时,BGP将会检测到自己的AS号在聚合路由的AS_Set属性中,于是会丢弃该聚合路由,从而避免了路由环路的形成。 + +### BGP同步机制 +### BGP安全性 +BGP使用认证和通用TTL安全保护机制GTSM(Generalized TTL Security Mechanism)两个方法保证BGP对等体间的交互安全。 + +* BGP认证 +BGP认证分为MD5认证和Keychain认证,对BGP对等体关系进行认证是提高安全性的有效手段。MD5认证只能为TCP连接设置认证密码,而Keychain认证除了可以为TCP连接设置认证密码外,还可以对BGP协议报文进行认证。 + +* BGP GTSM +BGP GTSM检测IP报文头中的TTL(time-to-live)值是否在一个预先设置好的特定范围内,并对不符合TTL值范围的报文进行允许通过或丢弃的操作,从而实现了保护IP层以上业务,增强系统安全性的目的。 + +例如将IBGP对等体的报文的TTL的范围设为254至255。当攻击者模拟合法的BGP协议报文,对设备不断的发送报文进行攻击时,TTL值必然小于254。如果没有使能BGP GTSM功能,设备收到这些报文后,发现是发送给本机的报文,会直接上送控制层面处理。这时将会因为控制层面处理大量攻击报文,导致设备CPU占用率高,系统异常繁忙。如果使能BGP GTSM功能,系统会对所有BGP报文的TTL值进行检查,丢弃TTL值小于254的攻击报文,从而避免了因网络攻击报文导致CPU占用率高的问题。 + +### BGP负载分担: +当到达同一目的地址存在多条等价路由时,可以通过BGP等价负载分担实现均衡流量的目的。形成BGP等价负载分担的条件是“BGP选择路由的策略”的1至8条规则中需要比较的属性完全相同。 + +### BGP路由衰减: +当BGP应用于复杂的网络环境时,路由振荡十分频繁。为了防止频繁的路由振荡带来的不利影响,BGP使用路由衰减来抑制不稳定的路由。 + +路由振荡指路由表中添加一条路由后,该路由又被撤销的过程。当发生路由振荡时,设备就会向邻居发布路由更新,收到更新报文的设备需要重新计算路由并修改路由表。所以频繁的路由振荡会消耗大量的带宽资源和CPU资源,严重时会影响到网络的正常工作。 + + +![](image/BGP路由衰减.png) + +路由衰减使用惩罚值(Penalty value)来衡量一条路由的稳定性,惩罚值越高说明路由越不稳定。如上图所示,路由每发生一次振荡,BGP便会给此路由增加1000的惩罚值,其余时间惩罚值会慢慢下降。当惩罚值超过抑制阈值(suppress value)时,此路由被抑制,不加入到路由表中,也不再向其他BGP对等体发布更新报文。被抑制的路由每经过一段时间,惩罚值便会减少一半,这个时间称为半衰期(half-life)。当惩罚值降到再使用阈值(reuse value)时,此路由变为可用并被加入到路由表中,同时向其他BGP对等体发布更新报文。从路由被抑制到路由恢复可用的时间称为抑制时间(suppress time)。 + +路由衰减只对EBGP路由起作用,对IBGP路由不起作用。这是因为IBGP路由可能含有本AS的路由,而IGP网络要求AS内部路由表尽可能一致。如果路由衰减对IBGP路由起作用,那么当不同设备的衰减参数不一致时,将会导致路由表不一致。 diff --git a/计算机网络实验.md/DHCP.md b/计算机网络实验.md/DHCP.md new file mode 100644 index 00000000..058579ff --- /dev/null +++ b/计算机网络实验.md/DHCP.md @@ -0,0 +1,637 @@ +# DHCP + +> 参考文献 +> * [DHCP基础](https://blog.csdn.net/qq_38265137/article/details/80404407) +> * 等到复习的时候过来整理这玩意。 + +DHCP简介 +动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种用于集中对用户IP地址进行动态管理和配置的技术。 + +DHCP采用客户端/服务器通信模式,由客户端(DHCP Client)向服务器(DHCP Server)提出配置申请,服务器返回为客户端分配的配置信息(包括IP地址、缺省网关、DNS Server、WINS Server等参数),可以实现IP地址动态分配,以及其他网络参数的集中配置管理。 + +DHCP的发展: +DHCP是在BOOTP(BOOTstrap Protocol)基础上发展而来,但BOOTP运行在相对静态(每台主机都有固定的网络连接)的环境中,管理员为每台主机配置专门的BOOTP参数文件,该文件会在相当长的时间内保持不变。DHCP从以下两方面对BOOTP进行了扩展: + +DHCP加入了对重新使用的网络地址的动态分配和附加配置选项的功能,可使计算机仅用一个消息就获取它所需要的所有配置信息。 +DHCP允许计算机动态地获取IP地址,而不是静态为每台主机指定地址。 +DHCP技术实现用户地址和配置信息的动态分配和集中管理,使企业可以动态地为企业用户分配和管理地址,避免繁琐的手工配置,可以快速适应网络的变化。 + +DHCP原理描述 +DHCP角色: +DHCP客户端:通过DHCP协议请求获取IP地址等网络参数的设备。例如,IP电话、PC、手机、无盘工作站等。 +DHCP服务器:负责为DHCP客户端分配网络参数的设备。 +(可选)DHCP中继:负责转发DHCP服务器和DHCP客户端之间的DHCP报文,协助DHCP服务器向DHCP客户端动态分配网络参数的设备。 +DHCP客户端广播发送请求报文(即目的IP地址为255.255.255.255),位于同一网段内的DHCP服务器能够接收请求报文。如果DHCP客户端和DHCP服务器不在同一个网段,DHCP服务器无法接收来自客户端的请求报文,此时,需要通过DHCP中继来转发DHCP报文。不同于传统的IP报文转发,DHCP中继接收到DHCP请求或应答报文后,会重新修改报文格式并生成一个新的DHCP报文再进行转发。 + +在企业网络中,如果需要规划较多网段,且网段中的终端都需要通过DHCP自动获取IP地址等网络参数时,可以部署DHCP中继。这样,不同网段的终端可以共用一个DHCP服务器,节省了服务器资源,方便统一管理。 + +DHCP报文是基于UDP协议传输的。DHCP客户端向DHCP服务器发送报文时采用67端口号,DHCP服务器向DHCP客户端发送报文时采用68端口号。 + +DHCP服务器给首次接入网络的客户端分配网络参数的工作原理: +无中继场景时DHCP客户端首次接入网络的工作原理: + + +图:无中继场景DHCP客户端首次接入网络的报文交互示意图 +发现阶段,即DHCP客户端发现DHCP服务器的阶段。 + +DHCP客户端发送DHCP DISCOVER报文来发现DHCP服务器。由于DHCP客户端不知道DHCP服务器的IP地址,所以DHCP客户端以广播方式发送DHCP DISCOVER报文(目的IP地址为255.255.255.255),同一网段内所有DHCP服务器或中继都能收到此报文。DHCP DISCOVER报文中携带了客户端的MAC地址(DHCP DISCOVER报文中的chaddr字段)、需要请求的参数列表选项(Option55中填充的内容,标识了客户端需要从服务器获取的网络配置参数)、广播标志位(DHCP DISCOVER报文中的flags字段,表示客户端请求服务器以单播或广播形式发送响应报文)等信息。 + +DHCP DISCOVER报文中的Option字段定义了网络参数信息,不同Option值代表了不同的参数。例如,Option3表示客户端的网关地址选项(当客户端发送的DHCP DISCOVER报文的Option55中填充了选项值3,就表示客户端希望从服务器获取网关地址);Option53表示DHCP报文类型(例如,DHCP DISCOVER报文)。Option选项分为知名选项和自定义选项,关于知名选项的含义请参见RFC2132。除了RFC2132里面定义的知名选项,不同厂商可以根据需求自己定义自定义选项,例如,Option43为厂商特定信息选项。 +RFC2131中定义了DHCP报文的广播标志字段(flags),当标志字段的最高位为0时,表示客户端希望服务器以单播方式发送DHCP OFFER/DHCP ACK报文;当标志字段的最高位为1时,表示客户端希望服务器以广播方式发送DHCP OFFER/DHCP ACK报文。Huawei AR100&AR120&AR150&AR160&AR200&AR1200&AR2200&AR3200&AR3600系列作为客户端时,此字段为1。 +提供阶段,即DHCP服务器提供网络配置信息的阶段。 + +位于同一网段的DHCP服务器都会接收到DHCP DISCOVER报文,每个DHCP服务器上可能会部署多个地址池,服务器通过地址池来管理可供分配的IP地址等网络参数。服务器接收到DHCP DISCOVER报文后,选择跟接收DHCP DISCOVER报文接口的IP地址处于同一网段的地址池,并且从中选择一个可用的IP地址,然后通过DHCP OFFER报文发送给DHCP客户端。DHCP OFFER报文里面携带了希望分配给指定MAC地址客户端的IP地址(DHCP报文中的yiaddr字段)及其租期等配置参数。 + +通常,DHCP服务器的地址池中会指定IP地址的租期,如果DHCP客户端发送的DHCP DISCOVER报文中携带了期望租期,服务器会将客户端请求的期望租期与其指定的租期进行比较,选择其中时间较短的租期分配给客户端。 + +DHCP服务器上已配置的与客户端MAC地址静态绑定的IP地址。 +客户端发送的DHCP DISCOVER报文中Option50字段(请求IP地址选项)指定的地址。 +DHCP服务器上记录的曾经分配给客户端的IP地址。 +按照IP地址从大到小的顺序查询,选择最先找到的可供分配的IP地址。 +如果未找到可供分配的IP地址,则依次查询超过租期、处于冲突状态的IP地址,如果找到可用的IP地址,则进行分配;否则,发送DHCP NAK报文作为应答,通知DHCP客户端无法分配IP地址。DHCP客户端需要重新发送DHCP DISCOVER报文来申请IP地址。 +为了防止分配出去的IP地址跟网络中其他客户端的IP地址冲突,DHCP服务器在发送DHCP OFFER报文前可以通过发送源地址和目的地址都为预分配出去IP地址的ICMP ECHO REQUEST报文对分配的IP地址进行地址冲突探测。如果在指定的时间内没有收到应答报文,表示网络中没有客户端使用这个IP地址,可以分配给客户端;如果指定时间内收到应答报文,表示网络中已经存在使用此IP地址的客户端,则把此地址列为冲突地址,然后等待重新接收到DHCP DISCOVER报文后按照前面介绍的选择IP地址的优先顺序重新选择可用的IP地址。 + +此阶段DHCP服务器分配给客户端的IP地址不一定是最终确定使用的IP地址,因为DHCP OFFER报文发送给客户端等待16秒后如果没有收到客户端的响应,此地址就可以继续分配给其他客户端。通过下面的选择阶段和确认阶段后才能最终确定客户端可以使用的IP地址。 + +选择阶段,即DHCP客户端选择IP地址的阶段。 + +因为DHCP DISCOVER报文是广播发送的,所以如果同一网段内存在多个DHCP服务器,接收到DHCP DISCOVER报文的服务器都会回应DHCP OFFER报文。如果有多个DHCP服务器向DHCP客户端回应DHCP OFFER报文,则DHCP客户端一般只接收第一个收到的DHCP OFFER报文,然后以广播方式发送DHCP REQUEST报文,该报文中包含客户端想选择的DHCP服务器标识符(即Option54)和客户端IP地址(即Option50,填充了接收的DHCP OFFER报文中yiaddr字段的IP地址)。 + +以广播方式发送DHCP REQUEST报文,是为了通知所有的DHCP服务器,它将选择某个DHCP服务器提供的IP地址,其他DHCP服务器可以重新将曾经分配给客户端的IP地址分配给其他客户端。 + +确认阶段,即DHCP服务器确认所分配IP地址的阶段。 + +当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文后,DHCP服务器回应DHCP ACK报文,表示DHCP REQUEST报文中请求的IP地址(Opton50填充的)分配给客户端使用。 + +DHCP客户端收到DHCP ACK报文,会广播发送免费ARP报文,探测本网段是否有其他终端使用服务器分配的IP地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。如果收到了回应,说明有其他终端使用了此地址,客户端会向服务器发送DECLINE报文,并重新向服务器请求IP地址,同时,服务器会将此地址列为冲突地址。当服务器没有空闲地址可分配时,再选择冲突地址进行分配,尽量减少分配出去的地址冲突。 + +当DHCP服务器收到DHCP客户端发送的DHCP REQUEST报文后,如果DHCP服务器由于某些原因(例如协商出错或者由于发送REQUEST过慢导致服务器已经把此地址分配给其他客户端)无法分配DHCP REQUEST报文中Opton50填充的IP地址,则发送DHCP NAK报文作为应答,通知DHCP客户端无法分配此IP地址。DHCP客户端需要重新发送DHCP DISCOVER报文来申请新的IP地址。 + +有中继场景时DHCP客户端首次接入网络的工作原理: + + +图:有中继场景时DHCP客户端首次接入网络的工作原理 +发现阶段 + +检查DHCP报文中的hops字段,如果大于16,则丢弃DHCP报文;否则,将hops字段加1(表明经过一次DHCP中继),并继续下面的操作。 + +DHCP报文中的hops字段表示DHCP报文经过的DHCP中继的数目,该字段由客户端或服务器设置为0,每经过一个DHCP中继时,该字段加1。hops字段的作用是限制DHCP报文所经过的DHCP中继的数目。目前,设备最多支持DHCP客户端与服务器之间有存在16个中继。 + +检查DHCP报文中的giaddr字段。如果是0,将giaddr字段设置为接收DHCP DISCOVER报文的接口IP地址。如果不是0,则不修改该字段,继续下面的操作。 + +DHCP报文中的giaddr字段标识客户端网关的IP地址。如果服务器和客户端不在同一个网段且中间存在多个DHCP中继,当客户端发出DHCP请求时,第一个DHCP中继会把自己的IP地址填入此字段,后面的DHCP中继不修改此字段内容,DHCP服务器会根据此字段来判断出客户端所在的网段地址,从而为客户端分配该网段的IP地址。 + +将DHCP报文的目的IP地址改为DHCP服务器或下一跳中继的IP地址,源地址改为中继连接客户端的接口地址,通过路由转发将DHCP报文单播发送到DHCP服务器或下一跳中继。 + +如果DHCP客户端与DHCP服务器之间存在多个DHCP中继,后面的中继接收到DHCP DISCOVER报文的处理流程同前面所述。 + +提供阶段 + +DHCP服务器接收到DHCP DISCOVER报文后,选择与报文中giaddr字段为同一网段的地址池,并为客户端分配IP地址等参数然后向giaddr字段标识的DHCP中继单播发送DHCP OFFER报文。 + +检查报文中的giaddr字段,如果不是接口的地址,则丢弃该报文;否则,继续下面的操作。 +DHCP中继检查报文的广播标志位。如果广播标志位为1,则将DHCP OFFER报文广播发送给DHCP客户端;否则将DHCP OFFER报文单播发送给DHCP客户端。 +选择阶段 + +确认阶段 + +选择阶段和确认阶段的过程同无中继场景。 + +DHCP客户端重用曾经使用的地址的工作原理: +DHCP客户端非首次接入网络时,可以重用曾经使用过的地址。 + + + +图:DHCP客户端重用曾经使用过的IP地址的报文交互过程 +客户端广播发送包含前一次分配的IP地址的DHCP REQUEST报文,报文中的Option50(请求的IP地址选项)字段填入曾经使用过的IP地址。 +DHCP服务器收到DHCP REQUEST报文后,根据DHCP REQUEST报文中携带的MAC地址来查找有没有相应的租约记录,如果有则返回DHCP ACK报文,通知DHCP客户端可以继续使用这个IP地址。否则,保持沉默,等待客户端重新发送DHCP DISCOVER报文请求新的IP地址。 +DHCP客户端更新租期的工作原理: +DHCP服务器采用动态分配机制给客户端分配IP地址时,分配出去的IP地址有租期限制。DHCP客户端向服务器申请地址时可以携带期望租期,服务器在分配租期时把客户端期望租期和地址池中租期配置比较,分配其中一个较短的租期给客户端。租期时间到后服务器会收回该IP地址,收回的IP地址可以继续分配给其他客户端使用。这种机制可以提高IP地址的利用率,避免客户端下线后IP地址继续被占用。如果DHCP客户端希望继续使用该地址,需要更新IP地址的租期(如延长IP地址租期)。 + +当租期达到50%(T1)时,DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。 +当租期达到87.5%(T2)时,如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。 +如果租期时间到时都没有收到服务器的回应,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。 +客户端在租期时间到之前,如果用户不想使用分配的IP地址(例如客户端网络位置需要变更),会触发DHCP客户端向DHCP服务器发送DHCP RELEASE报文,通知DHCP服务器释放IP地址的租期。DHCP服务器会保留这个DHCP客户端的配置信息,将IP地址列为曾经分配过的IP地址中,以便后续重新分配给该客户端或其他客户端。 + +客户端可以通过发送DHCP INFORM报文向服务器请求更新配置信息。 + +DHCP报文: +DHCP报文类型: +DHCP Discover + +由客户端来查找可用的服务器。 + +DHCP offer + +服务器用来响应客户端的DHCP Discover报文,并指定相应的配置参数。 + +DHCP Resquet + +由客户端发送给服务器来请求配置参数或者请求配置确认或者续借租期。 + +DHCP ACK + +由服务器到客户端,含有配置参数包括IP地址。 + +DHCP Decline + +当客户端发现地址已经被使用时,用来通知服务器。 + +DHCP Inform + +客户端已经有IP地址时用它来向服务器请求其他的配置参数。 + +DHCP NAK + +由服务器发送给客户端来报名客户端的地址请求不正确或者租期已过期。 + +DHCP Release + +客户端要释放地址时用来通知服务器。 + +DHCP报文是承载于UDP上的高层协议报文,采用67(DHCP服务器)和68(DHCP客户端)两个端口号。 + +DHCP的报文格式如下图所示。 + +DHCP报文格式: + + +图:DHCP报文格式 +报文字段解释: +字段 长度 含义 +OP (op code) 1字节 表示报文的类型:1:客户端请求报文2:服务器响应报文 +htype (hardware type) 1字节 表示硬件地址的类型。对于以太网,该类型的值为“1”。 +hlen (hardware type) 1字节 表示硬件地址的长度,单位是字节。对于以太网,该值为6。 +Hops 1字节 表示当前的DHCP报文经过的DHCP中继的数目。该字段由客户端或服务器设置为0,每经过一个DHCP中继时,该字段加1。此字段的作用是限制DHCP报文所经过的DHCP中继数目。 +xid 4字节 事务ID,由客户端选择的一个随机数,被服务器和客户端用来在它们之间交流请求和响应,客户端用它对请求和应答进行匹配。该ID由客户端设置并由服务器返回,为32位整数。 +secs (seconds) 2字节 由客户端填充,表示从客户端开始获得IP地址或IP地址续借后所使用了的秒数。 +flags 2字节 此字段在BOOTP中保留未用,在DHCP中表示标志字段。只有标志字段的最高位才有意义,其余的位均被置为0。最左边的字段被解释为广播响应标志位,内容如下所示:0:客户端请求服务器以单播形式发送响应报文1:客户端请求服务器以广播形式发送响应报文 +ciaddr (client ip address) 4字节 表示客户端的IP地址。可以是服务器分配给客户端的IP地址或者客户端已有的IP地址。客户端在初始化状态时没有IP地址,此字段为0.0.0.0。IP地址0.0.0.0仅在采用DHCP方式的系统启动时允许本主机利用它进行临时的通信,不是有效目的地址。 +yiaddr (your client ip address) 4字节 表示服务器分配给客户端的IP地址。当服务器进行DHCP响应时,将分配给客户端的IP地址填入此字段。 +siaddr (server ip address) 4字节 DHCP客户端获得启动配置信息的服务器的IP地址。 +giaddr (gateway ip address) 4字节 该字段表示第一个DHCP中继的IP地址(注意:不是地址池中定义的网关)。当客户端发出DHCP请求时,如果服务器和客户端不在同一个网络中,那么第一个DHCP中继在转发这个DHCP请求报文时会把自己的IP地址填入此字段。服务器会根据此字段来判断出网段地址,从而选择为用户分配地址的地址池。服务器还会根据此地址将响应报文发送给此DHCP中继,再由DHCP中继将此报文转发给客户端。若在到达DHCP服务器前经过了不止一个DHCP中继,那么第一个DHCP中继后的中继不会改变此字段,只是把Hops的数目加1。 +chaddr (client hardware address) 16字节 该字段表示客户端的MAC地址,此字段与前面的“Hardware Type”和“Hardware Length”保持一致。当客户端发出DHCP请求时,将自己的硬件地址填入此字段。对于以太网,当“Hardware Type”和“Hardware Length”分别为“1”和“6”时,此字段必须填入6字节的以太网MAC地址。 +sname (server host name) 64字节 该字段表示客户端获取配置信息的服务器名字。此字段由DHCP Server填写,是可选的。如果填写,必须是一个以0结尾的字符串。 +file (file name) 128字节 该字段表示客户端的启动配置文件名。此字段由DHCP Server填写,是可选的,如果填写,必须是一个以0结尾的字符串。 +options 可变 该字段表示DHCP的选项字段,至少为312字节,格式为"代码+长度+数据"。DHCP通过此字段包含了服务器分配给终端的配置信息,如网关IP地址,DNS服务器的IP地址,客户端可以使用IP地址的有效租期等信息。 +DHCP报文抓包示例: + + +图:DHCP报文抓包示例 +DHCP Opthion字段选项: +DHCP报文中的Options字段可以用来存放普通协议中没有定义的控制信息和参数。如果用户在DHCP服务器端配置了Options字段,DHCP客户端在申请IP地址的时候,会通过服务器端回应的DHCP报文获得Options字段中的配置信息。 + +Options字段由Type、Length和Value三部分组成。这三部分的表示含义如下所示: + +字段 长度 含义 +Type 1字节 该字段表示信息类型。 +Length 1字节 该字段表示后面信息内容的长度。 +Value 其长度为Length字段所指定 该字段表示信息内容。 +DHCP Options选项的取值范围为1~255。 + +Options号 Options作用 +1 设置子网掩码选项。 +3 设置网关地址选项。 +6 设置DNS服务器地址选项。 +12 设置DHCP客户端的主机名选项。 +15 设置域名后缀选项。 +33 设置静态路由选项。该选项中包含一组有分类静态路由(即目的地址的掩码固定为自然掩码,不能划分子网),客户端收到该选项后,将在路由表中添加这些静态路由。如果存在Option121,则忽略该选项。 +44 设置NetBios服务器选项。 +46 设置NetBios节点类型选项。 +50 设置请求IP地址选项。 +51 设置IP地址租约时间选项。 +52 设置Option附加选项。 +53 设置DHCP消息类型。 +54 设置服务器标识。 +55 设置请求参数列表选项。客户端利用该选项指明需要从服务器获取哪些网络配置参数。该选项内容为客户端请求的参数对应的选项值。 +58 设置续约T1时间,一般是租期时间的50%。 +59 设置续约T2时间。一般是租期时间的87.5%。 +60 设置厂商分类信息选项,用于标识DHCP客户端的类型和配置。 +61 设置客户端标识选项。 +66 设置TFTP服务器名选项,用来指定为客户端分配的TFTP服务器的域名。 +67 设置启动文件名选项,用来指定为客户端分配的启动文件名。 +77 设置用户类型标识。 +121 设置无分类路由选项。该选项中包含一组无分类静态路由(即目的地址的掩码为任意值,可以通过掩码来划分子网),客户端收到该选项后,将在路由表中添加这些静态路由。 +根据Options选项功能的不同,此字段的作用对象也不同。比如Option77用于DHCP客户端,用于识别用户所属的类型,根据Options字段中所携带的用户类型(User Class),DHCP服务器选择适当的地址池为客户端分配IP地址以及相关配置参数。Option77一般在客户端由用户进行配置,而不必在服务器端配置。 + +自定义DHCP选项: +除了RFC2132中规定的字段选项外,还有部分选项内容没有统一规定,例如Option82。 + +Option82称为中继代理信息选项,该选项记录了DHCP客户端的位置信息。DHCP中继或DHCP Snooping设备接收到DHCP客户端发送给DHCP服务器的请求报文后,在该报文中添加Option82,并转发给DHCP服务器。 + +**管理员可以从Option82中获得DHCP客户端的位置信息,以便定位DHCP客户端,实现对客户端的安全和计费等控制。**支持Option82的服务器还可以根据该选项的信息制定IP地址和其他参数的分配策略,提供更加灵活的地址分配方案。 + +Option82最多可以包含255个子选项。若定义了Option82,则至少要定义一个子选项。目前设备只支持两个子选项:sub-option1(Circuit ID,电路ID子选项)和sub-option2(Remote ID,远程ID子选项)。 + +由于Option82的内容没有统一规定,不同厂商通常根据需要进行填充。 + +DHCP的Option82原理: +DHCP Relay Agent插入到用户的DHCP报文,DHCP服务器通过识别Option82来执行IP地址分配策略或其他策略。 +DHCP服务器的响应报文也带Option82,Relay Agent将Option82剥离后发给用户。 +Agent Information Fied中包含多个子选项,每个子选项格式为iSubOpt/Length/Value三元组。 +使能Option82功能,可以根据Option82信息建立精确到接口的绑定表。 + +DHCP服务器如果存在多个地址池,如何判断应该分配哪个地址池的地址? +如果discovery报文中gateway ip address (relay agent address)被填充地址,则分配该IP地址所在网段的地址。 +如果discovery报文中gateway ip address 为空,则分配discovery报文接收端口所在IP网段的地址。 +unr:Uer Nerwork Router,用户网络路由。由DHCP服务器通告给客户端的静态路由。 + +DHCP配置 +配置为客户端分配IP地址: +创建地址池: +基于接口方式的地址池:在DHCP Server与Client相连的接口上配置IP地址,地址池是跟此接口地址所属同一网段的IP地址,且地址池中地址只能分配给此接口下的Client。这种配置方式简单,仅适用于DHCP Server与Client在同一个网段,即不存在中继的场景。例如,设备做DHCP Server仅给一个接口下的Client分配IP地址或者给多个接口下的Client分别分配不同网段的IP地址。 +基于全局方式的地址池:在系统视图下创建指定网段的地址池,且地址池中地址可以分配给设备所有接口下的Client。这种配置方式适用于: +DHCP Server与Client在不同网段,即存在中继的场景。 +DHCP Server与Client在同一网段,且需要给一个接口下的Client分配IP地址或者给多个接口下的Client分别分配IP地址。 +DHCP基于接口配置: +如下图,AR1为DHCP服务器,接口配置地址为192.168.0.1/24.给接口下所连接的设备主机分配IP地址。 + + + +图:DHCP基于接口配置拓扑 +配置文件: +DHCP服务器配置: + +dis current-configuration +# + sysname DHCP +# +dhcp enable //使能DHCP功能 +# +interface GigabitEthernet0/0/0 + ip address 192.168.0.1 255.255.255.0 + dhcp check dhcp-rate enable + //使能DHCP报文速率检查功能。 + dhcp check dhcp-rate 90 + //配置DHCP报文上送到DHCP协议栈的检查速率。 + dhcp alarm dhcp-rate enable + //使能DHCP报文速率告警功能。 + dhcp alarm dhcp-rate threshold 500 + //配置DHCP报文速率检查告警阈值。 + dhcp select interface + //开启接口采用接口地址池的DHCP Server功能。 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +AR3作为DHCP客户端配置: + +dis current-configuration + sysname AR2 +# +dhcp enable //使能DHCP功能 +# +interface GigabitEthernet0/0/0 + dhcp client default-route preference 100 + //配置DHCP服务器下发给DHCP客户端的路由表项优先级。 + dhcp client gateway-detect period 3600 retransmit 3 timeout 500 + //来配置DHCP Client网关探测功能。 + dhcp client expected-lease 3600 + //配置DHCP Client期望租期功能。 + dhcp client class-id huawei +//配置设备作为DHCP客户端时,发送DHCP请求报文中的Option60字段。 + dhcp client hostname DHCPClient + //配置DHCP客户的主机名 + ip address dhcp-alloc + //配置ip地址获取方式为通过DHCP获取 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +dhcp client gateway-detect period 3600 retransmit 3 timeout 500 +参数 参数说明 取值 +period period 指定DHCP Client网关探测周期。 整数形式,取值范围是1~86400。单位是秒。 +retransmit retransmit 指定DHCP Client网关探测重传次数。 整数形式,取值范围是1~10。 +timeout time 指定DHCP Client网关探测超时时间。 整数形式,取值范围是300~2000。单位是毫秒。 +应用场景 + +此命令应用于DHCP客户端。当DHCP Client成功获取IP地址后,该功能可以使DHCP Client迅速检测正在使用的网关状态,如果网关地址错误或网关设备故障,DHCP Client将向DHCP Server重新发送IP地址请求。 + +注意事项 + +DHCP Client网关探测功能适用于双上行链路场景。 + +dhcp client class-id +DHCP服务器需要根据请求报文中的Option60字段内容来区分不同设备,用户可以使用此命令自定义设备作为DHCP客户端时,发送的请求报文中封装的Option60内容。 + +接口下配置此命令后,设备作为DHCP客户端时,从该接口发送的DHCP请求报文中将使用配置的内容填充Option60字段。 + +dhcp client client-id +该命令用来配置DHCP客户端的标识,该标识将会封装在DHCP请求报文中与服务器进行交互。DHCP客户端在申请IP地址的时候,DHCP服务器会获取请求报文中的DHCP客户端标识信息,DHCP服务器将根据该标识,为DHCP客户端分配IP地址。 + +DHCP基于全局配置: +如下图,路由器AR1为DHCP服务器,为不同VLAN的主机分配不同网段的IP地址,同时,为了节约IP地址,使用了聚合VLAN。 + + + +基于全局的配置文件: +AR1DHCP服务器的配置文件: + +dis current-configuration +# + sysname DHCP +# +dhcp enable +# +dhcp snooping enable +# +ip pool VLAN100 + gateway-list 10.0.10.254 + network 10.0.10.0 mask 255.255.255.0 + excluded-ip-address 10.0.10.1 + lease day 1 hour 23 minute 30 + dns-list 114.114.114.144 8.8.8.8 + domain-name VLAN100 +# +ip pool VLAN200 //配置VLAN200地址池 + gateway-list 10.0.20.254 + network 10.0.20.0 mask 255.255.255.0 + excluded-ip-address 10.0.20.1 + dns-list 10.0.20.254 + domain-name VLAN200 +# +ip pool VLAN300 + gateway-list 10.0.30.1 10.0.30.254 + network 10.0.30.0 mask 255.255.255.0 + dns-list 10.0.30.254 8.8.8.8 + domain-name VLAN300 +# +interface GigabitEthernet0/0/0 + ip address 10.0.0.1 255.255.255.0 + dhcp select global + //开启接口采用全局地址池的DHCP Server功能。 +# +//配置去往DHCP中继不同网段的路由 +ip route-static 10.0.10.0 255.255.255.0 10.0.0.2 +ip route-static 10.0.20.0 255.255.255.0 10.0.0.2 +ip route-static 10.0.30.0 255.255.255.0 10.0.0.2 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 + + +图:DHCP服务器分配情况 +SW1作为DHCP中继的配置: + +[SW]dis current-configuration +# +sysname SW +# +vlan batch 10 to 11 20 to 21 30 to 31 100 200 300 +//批量创建VLAN +# +dhcp enable//使能DHCP功能 +# +dhcp snooping enable //使能DHCP Snooping功能 +# +//在每个VLAN下都开启DHCP Snooping功能 +vlan 1 + dhcp snooping enable +vlan 10 + dhcp snooping enable +vlan 11 + dhcp snooping enable +vlan 20 + dhcp snooping enable +vlan 21 + dhcp snooping enable +vlan 30 + dhcp snooping enable +vlan 31 + dhcp snooping enable +vlan 100 //聚合VLAN + aggregate-vlan + access-vlan 10 to 11 +vlan 200 //聚合VLAN + aggregate-vlan + access-vlan 20 to 21 +vlan 300 //聚合VLAN + aggregate-vlan + access-vlan 30 to 31 +# +interface Vlanif1 + ip address 10.0.0.2 255.255.255.0 + //配置与DHCP服务器直通的路由 +# +interface Vlanif100 + ip address 10.0.10.254 255.255.255.0 + dhcp select relay //开启DHCP 中继 + dhcp relay server-ip 10.0.0.1 + //DHCP服务器IP地址 +# +interface Vlanif200 + ip address 10.0.20.254 255.255.255.0 + dhcp select relay + dhcp relay server-ip 10.0.0.1 +# +interface Vlanif300 + ip address 10.0.30.254 255.255.255.0 + dhcp select relay + dhcp relay server-ip 10.0.0.1 +# +interface GigabitEthernet0/0/1 + port link-type trunk + dhcp snooping trusted + //配置接口为信任状态。 +# +interface GigabitEthernet0/0/2 + port link-type trunk + port trunk allow-pass vlan 10 to 11 +# +interface GigabitEthernet0/0/3 + port link-type trunk + port trunk allow-pass vlan 20 to 21 +# +interface GigabitEthernet0/0/4 + port link-type trunk + port trunk allow-pass vlan 30 to 31 +# +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 + + +图:DHCP中继情况 +SW2配置文件:SW3,4与之类似。 + +dis current-configuration +# +sysname SW2 +# +vlan batch 10 to 11 +# +dhcp enable +# +dhcp snooping enable +# +interface GigabitEthernet0/0/1 + port link-type trunk + port trunk allow-pass vlan 2 to 4094 + dhcp snooping enable + dhcp snooping trusted +# +interface GigabitEthernet0/0/2 + port link-type access + port default vlan 10 +# +interface GigabitEthernet0/0/3 + port link-type access + port default vlan 11 +# +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 diff --git a/计算机网络实验.md/H3C COMMAND.md b/计算机网络实验.md/H3C COMMAND.md new file mode 100644 index 00000000..334cbe91 --- /dev/null +++ b/计算机网络实验.md/H3C COMMAND.md @@ -0,0 +1,276 @@ +# H3C命令行 + +> 基于视图的命令行。 + +## 1 入门实验 + +### 视图结构图树 +* user +* system + * interface + * ospf + * ospf-area + * vlan + * vlan-interface + +### 视图切换命令 + +``` +system-view //进入系统视图 + +interface Ethernet1/0/1 //进入以太网接口视图 +ospf processid //进入ospf视图 +vlan 2 //创建VLAN2,并进入VLAN视图 + +area 2 //ospf视图下创建并进入 area视图 + +quit //退出当前视图到上一个视图 +``` + +### 用户视图 + +``` +display * //显示各种配置视图 +display current-configguration +display version +display interface Ethernet1/0/1 +display clock + +? //查看该视图下的命令 + +debuging //调试命令 + +reset //重置或清除相关配置 +reset saved-configuration//重置到出厂设置 +reset arp //重置arp设置 +reset ospf process //重置ospf进程,并重启进程 + +save //用来保存道歉的配置信息 + +reboot //重启 +``` + +### 以太网端口视图 + +``` +[system]interface Ethernet0/1 +[Ethernet] +# ip协议相关命令 +[Ethernet]ip address ip-address mask[sub] +[Ethernet]undo ip address [ip-address mask][sub] + +# MTU +[Ethernet]mtu 100 +[Ethernet]undo mtu + +# speed +[Ethernet]speed [100|10|negotiation] //100M,10M,自动协商 + +# display +[system]display interfaces ethernet number + +# 打开关闭以太网端口 +[Ethernet]shutdown +[Ethernet]undo shutdown + +# 端口工作模式 +[Ethernet]duplex full //设置全双工状态 +[Ethernet]undo duplex //回复以太网全双工状态 + +# 端口类型 +[Ethernet]spreed [10|100|auto] + +# 接口类型 +[Ethernet]mdi [across|auto|normal] //设置接口网线类型 + +# 流量控制 +[Ethernet]flow-control //流量控制 +[Ethernet]undo flow-control //解除流量控制 + +# 链路类型 +[Ethernet]port link-type [acces|hybrid|trunk] //设置接口链路类型 +[Ethernet]undo port link-type + +# 显示接口信息 +[Ethernet]display interface Ethernet1/0/1 +``` + +### NAT联网相关命令 + +``` +# 访问控制列表access control list:acl +[R]acl number 2001 //设置访问控制号 +[R-acl-2001]rule permit source 10.0.0.0 0.0.0.255//设置访问控制列表的规则内容 +[R-acl-2001]rule deny source any//设置不可访问的内容:这里是其他所有的 + +# 设置nat地址转换,address group 规定了地址转换后的组 +[R]nat address-group 1 192.168.5.105 192.168.5.109 + +# 在接口上绑定nat对外解析的地址池 +[R-Ethernet0/1]nat outbound 2001 address-group 1 + +# 设置静态ip 路由地址,如果目的IP地址和掩码都为0.0.0.0(或掩码为0),则配置的路由为缺省路由。当检查路由表失败的时候,将使用缺省路由进行报文转发。 +[R]ip route-static 0.0.0.0 0.0.0.0 192.168.5.1 + +``` +## 2 链路层实验 + +### 端口聚合 +``` +# 设置一台网端口聚合 +link-aggragation ethernet port_num1 to ethernet port_num2 {ingress|both}//设置聚合端口 +undo link-aggregation {ethernet master_port_num |all}//删除聚合端口 +display link-aggregation[ethernet master_port_num] + + +# 进入聚合端口 +[S]interface Bridge-Aggregation 1//设置并进入端口聚合视图 +[S-bridge-aggregation 1]link-aggeragation mode dynamic //设置端口聚合模式 +[s-ethernet0/1]port link-aggregation group 1//加入端口聚合组 +[s]link-aggeragation load-sharing mode destionation-mac source-mac //配置聚合组的分发方式 + + +# 生成树协议 +[S]stp enable +[S]stp disenable +``` +### VLAN实验 + +``` +# 创建删除vlan +[S]vlan vlan_id +[S]undo vlan vlan_id + +# 向vlan中添加删除端口 +[S-vlan2]port port_num to port_num +[S-vlan2]undo port port_num + +# 指定端口类型 +[S-Ethernet0/1]port link-type {access|trunk|hybrid} +[S-Ethernet0/1]undo port link-type trunk + +# 指定删除pvid +[S-Ethernet]port trunk pvid vlan vlan_id +[S-Ethernet0/1]undo port trunk pvid vlan vlan_id + +# 指定删除trunk的vlan +[S-Ethernet0/1]port trunk permit vlan{vlan_id_list | all} +[S-Ethernet0/1]undo port trunk permit {vlan_id_list} + +# hybrid端口添加删除vlantag +[S-Ethernet]prot hybrid vlan vlan_id_list untagged|tagged + +``` +### 广域网协议-PPP + +``` +# 配置ppp链路协议 +[R-serial1/0]link-protocol ppp + +# 显示ppp的debugging信息 +[user]debugging ppp all //打开debug开关 +[user]termimal debugging//显示debug信息 + +# 设置ppp服务认证 +[R]local-user RTB class network//配置用户列表 +[R-luser-network-RTB]service-type ppp//配置服务类型 +[R-luser-network-RTB]password simple aaa//配置用户密码 +# 设置pap验证 +[R-serial1/0]ppp authentication pap//授权pap认证 +# 对端pap设置 +[R-serial1/0]ppp pap local-user RTB password simple aaa + +# 设置ppp服务 +[R]local-user RTB class network//配置用户列表 +[R-luser-network-RTB]service-type ppp//配置服务类型 +[R-luser-network-RTB]password simple aaa//配置RTB用户密码 +# 设置chap验证 +[R-serial0/0]ppp authentication-mode chap//配置验证方式 +[R-serial0/0]ppp chap user RTA//配置本地名称 +# 对端对端路由器配置 +[R]lcoal-user RTA class network +[R-luser-network]service-type ppp +[R-luser-network]password simple aaa//配置RTA密码 +[R-serial0/0]ppp chap user RTB +``` + +## 3 网络层实验 + +### ARP分析 +``` +# 使用三层交换机的第三层。可以用开启VLAN的端口作为其三层协议驻留的端口。配置VLAN,开启第三层网络层服务。 +[S-vlan2]inter vlan 2//进入vlan2的接口(虚拟接口) +[S-Vlan-interface2]ip address 192.168.1.10 255.255.255.0 //配置虚拟局域网VLAN的虚拟接口的IP地址。开放第三层服务。 + +``` + +### ICMP分析 +``` +# 网络设备出于安全性考虑对tracert命令不回复。避免称为攻击目标。实验中可以打开 +[S]ip ttl-expires enable//打开ttl计数 +[S]ip unreachables enable//打开ip +``` + +### IP 分析 +``` +# 显示路由表。 +display ip routing-table +``` + +### 网络层分片实验 +``` +# 设置接口最大传输单元 +[R-Ethernet0/0]mtu 100 +``` + +### VLAN间通信 +``` +# 开启VLAN的三成转发 +[S]inter vlan 2 +[S-vlan-interface2]ip address 192.168.2.1 255.255.255.0 +``` +## 4 OSPF协议实验 + +``` +# display ospf命令的说明,下面是三个不同的表格。 +display ospf peer //显示的是邻居信息,有几个邻居路由器 +display ospf routing //是路由信息,具体用来决定从哪个接口,寻找下一跳。通过lsdb与ospf算法计算而来。 +display ospf lsdb //是整个区域的链路拓扑结构,即通过lsa链路状态通告而来。 +display adjacent-table //显示邻接信息。 + +# router id相关命令 +[system]router id router-id //设置router id +[system]undo router id //删除router id + +[system]ospf [process-id[router-id]] //创建并进入ospf视图 +[system]undo ospf [process-id]关闭ospf视图 + +[ospf]area area-id //创建并进入ospf下area视图 +[ospf]undo area area-id //删除ospf area + +[area]network ip-address wildcard-mask //指定网段运行OSPF协议 +[area]undo network ip-address wildcard-mask //取消网段运行OSPF协议 + +# 重置 +[user]reset ospf all process +# 显示 +[user]display ospf peer/brief/error/routing +# 调试 +[user]debugging ospf event/lsa/packet/spf + +# 用来显示ospf的lsdb(链路状态数据库)自组织成第一类router-lsa的内容。 +[R]dis ospf 1 lsdb router self-originate +# ospf的lsdb自组织第二类network-lsa +[R]dis ospf 1 lsdb network self-originate +# ospf的lsdb自组织第三类第四类summary lsa +[R]dis ospf 1 lsdb summary self-originate +# ospf的lsdb自组织第五类lsa +[R]dis ospf lsdb ase +``` + + +## 4 交换机系统视图 + +``` +``` + diff --git a/计算机网络实验.md/OSPF协议.md b/计算机网络实验.md/OSPF协议.md new file mode 100644 index 00000000..d08d9996 --- /dev/null +++ b/计算机网络实验.md/OSPF协议.md @@ -0,0 +1,489 @@ +# OSPF协议 + +> 参考文献 +> * [OSPF报文类型](https://blog.csdn.net/qq_38265137/article/details/80390729) + + +- [OSPF协议](#ospf%e5%8d%8f%e8%ae%ae) + - [1 OSPF协议概述](#1-ospf%e5%8d%8f%e8%ae%ae%e6%a6%82%e8%bf%b0) + - [OSPF原理](#ospf%e5%8e%9f%e7%90%86) + - [OSPF特点](#ospf%e7%89%b9%e7%82%b9) + - [OSPF优点](#ospf%e4%bc%98%e7%82%b9) + - [自制系统和OSPF区域](#%e8%87%aa%e5%88%b6%e7%b3%bb%e7%bb%9f%e5%92%8cospf%e5%8c%ba%e5%9f%9f) + - [OSPF路由器逻辑角色](#ospf%e8%b7%af%e7%94%b1%e5%99%a8%e9%80%bb%e8%be%91%e8%a7%92%e8%89%b2) + - [OSPF路由器逻辑位置](#ospf%e8%b7%af%e7%94%b1%e5%99%a8%e9%80%bb%e8%be%91%e4%bd%8d%e7%bd%ae) + - [邻居和邻接](#%e9%82%bb%e5%b1%85%e5%92%8c%e9%82%bb%e6%8e%a5) + - [OSPF更新](#ospf%e6%9b%b4%e6%96%b0) + - [OSPF中的表](#ospf%e4%b8%ad%e7%9a%84%e8%a1%a8) + - [2 OSPF协议报文交互过程](#2-ospf%e5%8d%8f%e8%ae%ae%e6%8a%a5%e6%96%87%e4%ba%a4%e4%ba%92%e8%bf%87%e7%a8%8b) + - [OSPF报文总体结构](#ospf%e6%8a%a5%e6%96%87%e6%80%bb%e4%bd%93%e7%bb%93%e6%9e%84) + - [OSPF报文头](#ospf%e6%8a%a5%e6%96%87%e5%a4%b4) + - [5种OSPF报文类型-Hello报文](#5%e7%a7%8dospf%e6%8a%a5%e6%96%87%e7%b1%bb%e5%9e%8b-hello%e6%8a%a5%e6%96%87) + - [5中OSPF报文类型-DD报文](#5%e4%b8%adospf%e6%8a%a5%e6%96%87%e7%b1%bb%e5%9e%8b-dd%e6%8a%a5%e6%96%87) + - [5种OSPF报文类型-LSR报文](#5%e7%a7%8dospf%e6%8a%a5%e6%96%87%e7%b1%bb%e5%9e%8b-lsr%e6%8a%a5%e6%96%87) + - [5种OSPF报文类型-LSU报文](#5%e7%a7%8dospf%e6%8a%a5%e6%96%87%e7%b1%bb%e5%9e%8b-lsu%e6%8a%a5%e6%96%87) + - [5种OSPF报文类型-LSACK报文](#5%e7%a7%8dospf%e6%8a%a5%e6%96%87%e7%b1%bb%e5%9e%8b-lsack%e6%8a%a5%e6%96%87) + - [OSPF可靠传输机制](#ospf%e5%8f%af%e9%9d%a0%e4%bc%a0%e8%be%93%e6%9c%ba%e5%88%b6) + - [OSPF邻居状态机](#ospf%e9%82%bb%e5%b1%85%e7%8a%b6%e6%80%81%e6%9c%ba) + - [OSPF报文交互过程](#ospf%e6%8a%a5%e6%96%87%e4%ba%a4%e4%ba%92%e8%bf%87%e7%a8%8b) + - [3 OSPF协议链路状态描述](#3-ospf%e5%8d%8f%e8%ae%ae%e9%93%be%e8%b7%af%e7%8a%b6%e6%80%81%e6%8f%8f%e8%bf%b0) + - [LSA 相同的Header](#lsa-%e7%9b%b8%e5%90%8c%e7%9a%84header) + - [五种链路状态通告类型](#%e4%ba%94%e7%a7%8d%e9%93%be%e8%b7%af%e7%8a%b6%e6%80%81%e9%80%9a%e5%91%8a%e7%b1%bb%e5%9e%8b) + - [Router-LSA(1类)](#router-lsa1%e7%b1%bb) + - [Network- LSA(2类)](#network--lsa2%e7%b1%bb) + - [Network Summary-LSA(3类)](#network-summary-lsa3%e7%b1%bb) + - [ASBR Summary-LSA(4类)](#asbr-summary-lsa4%e7%b1%bb) + - [AS External-LSA(5类)](#as-external-lsa5%e7%b1%bb) + - [OSPF协议的4种网络类型](#ospf%e5%8d%8f%e8%ae%ae%e7%9a%844%e7%a7%8d%e7%bd%91%e7%bb%9c%e7%b1%bb%e5%9e%8b) + - [OSPF周围4种网络拓扑结构](#ospf%e5%91%a8%e5%9b%b44%e7%a7%8d%e7%bd%91%e7%bb%9c%e6%8b%93%e6%89%91%e7%bb%93%e6%9e%84) + - [链路状态描述信息](#%e9%93%be%e8%b7%af%e7%8a%b6%e6%80%81%e6%8f%8f%e8%bf%b0%e4%bf%a1%e6%81%af) + - [DR与BDR的选举](#dr%e4%b8%8ebdr%e7%9a%84%e9%80%89%e4%b8%be) + - [4 区域划分及LSA种类](#4-%e5%8c%ba%e5%9f%9f%e5%88%92%e5%88%86%e5%8f%8alsa%e7%a7%8d%e7%b1%bb) + - [原理](#%e5%8e%9f%e7%90%86) + - [路由器类型](#%e8%b7%af%e7%94%b1%e5%99%a8%e7%b1%bb%e5%9e%8b) + - [与自治系统外部通信](#%e4%b8%8e%e8%87%aa%e6%b2%bb%e7%b3%bb%e7%bb%9f%e5%a4%96%e9%83%a8%e9%80%9a%e4%bf%a1) + - [骨干区域与虚连接](#%e9%aa%a8%e5%b9%b2%e5%8c%ba%e5%9f%9f%e4%b8%8e%e8%99%9a%e8%bf%9e%e6%8e%a5) + - [5 OSPF协议路由的计算](#5-ospf%e5%8d%8f%e8%ae%ae%e8%b7%af%e7%94%b1%e7%9a%84%e8%ae%a1%e7%ae%97) + - [SPF算法和COST值](#spf%e7%ae%97%e6%b3%95%e5%92%8ccost%e5%80%bc) + - [区域内OSPF路由计算过程](#%e5%8c%ba%e5%9f%9f%e5%86%85ospf%e8%b7%af%e7%94%b1%e8%ae%a1%e7%ae%97%e8%bf%87%e7%a8%8b) + - [区域间OSPF路由计算过程](#%e5%8c%ba%e5%9f%9f%e9%97%b4ospf%e8%b7%af%e7%94%b1%e8%ae%a1%e7%ae%97%e8%bf%87%e7%a8%8b) + - [区域外OSPF路由的计算过程](#%e5%8c%ba%e5%9f%9f%e5%a4%96ospf%e8%b7%af%e7%94%b1%e7%9a%84%e8%ae%a1%e7%ae%97%e8%bf%87%e7%a8%8b) + - [路由的类型和优选顺序](#%e8%b7%af%e7%94%b1%e7%9a%84%e7%b1%bb%e5%9e%8b%e5%92%8c%e4%bc%98%e9%80%89%e9%a1%ba%e5%ba%8f) + + + + +## 1 OSPF协议概述 + +> 主要介绍了OSPF一些静态的基础知识。 + + +### OSPF原理 +每一台路由器将其周边的链路状态描述出来,发送给网络中相邻的路由器。经过一段时间的链路状态信息交互,每台路由器都保存了一个链路状态数据库,该数据库是整个网络完整的链路状态描述。然后应用最短路优先算法计算路由。主要是Djskra算法。 + +OSPF组播的方式在所有开启OSPF的接口发送Hello包,用来确定是否有OSPF邻居,若发现了,则建立OSPF邻居关系,形成邻居表,之后互相发送LSA(链路状态通告)相互通告路由,形成LSDB(链路状态数据库)。再通过SPF算法,计算最佳路径(cost最小)后放入路由表。 + + +### OSPF特点 +* OSPF是一种无类别域间路由协议,支持VLSM可变长子网掩码。支持IPV4和IPV6. +* 组播地址:224.0.0.5 224.0.0.6。 +* OSPF度量:从源到目的所有出接口的度量值,和接口带宽反比(10^8/带宽)。 +* 收敛速度极快,但大型网络配置很复杂。 +* IP封装,协议号89 + + +### OSPF优点 +* 适应范围广 +* 快速收敛 +* 无自环 +* 支持验证、组播发送、路由分级、等值路由。 + +### 自制系统和OSPF区域 +自治系统(Autonomy System,AS)由统一机构管理的,使用同一组选路策略的路由器集合。OSPF是自治系统内部的路由选择协议。 + +区域(Area)是指一个路由器的集合,相同的区域有着相同的拓扑结构数据库。OSPF用区域把一个AS分成多个链路状态。分为骨干区域和非骨干区域。 + +* 骨干区域(区域0):骨干区域必须连接所有的非骨干区域,而且骨干区域不可分割,有且只有一个,一般情况下,骨干区域内没有终端用户。 +* 非骨干区域(非0区域):非骨干区域一般根据实际情况而划分,必须连接到骨干区域(不规则区域也需通过tunnel或virtual-link连接到骨干区域)。一般情况下,费骨干区域主要连接终端用户和资源。 + +### OSPF路由器逻辑角色 +* DR(Designated Router):指定路由器,OSPF协议启动后开始选举而来 +* BDR(Back-up Designated Router):备份指定路由器,同样是由OSPF启动后选举而来 +* DRothers:其他路由器,非DR非BDR的路由器都是DRothers。 + +### OSPF路由器逻辑位置 + +* 区域内路由器(IAR internal area router):所有端口在同一区域的路由器,维护一个链路状态数据库。 + +* 区域边界路由器(ABR area border router):具有连接多区域端口的路由器,一般作为一个区域的出口。ABR为每一个所连接的区域建立链路状态数据库,负责将所连接区域的路由摘要信息发送到主干区域,而主干区域上的ABR则负责将这些信息发送到各个区域。 + + +* 骨干路由器(BBR backbone router):具有连接主干区域端口的路由器。 至少有一个接口属于骨干区域(area = 0) + +* 自治域系统边界路由器(ASBR as boundary router):至少拥有一个连接外部自治域网络(如非OSPF的网络)端口的路由器,负责将非OSPF网络信息传入OSPF网络。 + + +### 邻居和邻接 +邻居不一定是邻接,邻接一定是邻居,只有交互了LSA的OSPF邻居才成为OSPF的邻接,只交互Hello包的支撑位邻居。 + +在点对点网络中,所有邻居都能成为邻接。 + +MA(广播多路访问网络,比如以太网)网络类型中,DR,BDR,DRothers三者关系为:DR、BDR与所有的邻居形成邻接,DRothers之间只是邻居而不交换LSA。 + +* OSPF发送hello报文(只有一跳)收到报文进行协商建立邻居关系。是一种物理上直接相连的关系,但不一定是逻辑上的邻接关系。 +* 当双方成功交换链路状态通告信息后才会成为邻接关系。建立了逻辑上的邻接关系。 + +### OSPF更新 +OSPF是一种触发更新的机制。一旦拓扑发生变化便会更新。 +OSPF也有周期性更新(30分钟一次) + +当收到一条LSA之后: +首先查看是否在LSDB中,若没有则假如LSDB,回复LSACK。继续泛洪出去,并且通过SPF算法计算最佳路径并加入路由表。若存在,则比较谁的更“新”(看序号),序号大者新,若本地不如收到的信更新本地LSDB并泛洪,且通过SPF算法计算最佳路径并加入路由表,若比收到的新,则将本地的泛洪出去。 + +### OSPF中的表 + +* 邻居表:记录了建立邻居关系的路由器 +* LSDB(链路状态数据库):包含了本路由器上的区域的所有的链路状态信息,并实时同步。 +* 路由转发表:由LSDB和SPF算法计算得到。 + +## 2 OSPF协议报文交互过程 + +> 主要介绍了OSPF报文和动态交互过程。面向的对象OSPF协议本身。建立可靠数据连接的过程。 + +### OSPF报文总体结构 +![](image/OSPF报文.jpg) + +IP 封装了OSPF报文,LSU(链路状态更新类型的报文)类型的OSPF报文封装了LSA(链路状态通告)报文,LSA报文封装了多个LSA数据。 + +更具体的封装格式: +IPHeader----OSPFHeader----particularHeader----LSAHeader----LSAData + +### OSPF报文头 +![](image/OSPF报文头.png) +|字段 |长度 |含义| +|-|-|-| +|Version |1字节 |版本,OSPF的版本号。对于OSPFv2来说,其值为2。| +|Type |1字节 |类型,OSPF报文的类型,有下面几种类型:1:Hello报文;2:DD报文;3:LSR报文;4:LSU报文;5:LSAck报文。| +Packet length| 2字节| OSPF报文的总长度,包括报文头在内,单位为字节。 +Router ID |4字节 |发送该报文的路由器标识。 +Area ID |4字节 |发送该报文的所属区域。 +Checksum| 2字节| 校验和,包含除了认证字段的整个报文的校验和。 +AuType |2字节 |验证类型,值有如下几种表示, 0:不验证;1:简单认证;2:MD5认证。 +Authentication |8字节 |鉴定字段,其数值根据验证类型而定。当验证类型为0时未作定义;类型为1时此字段为密码信息;类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。 + +### 5种OSPF报文类型-Hello报文 + +Hello:周期性地发送给本路由器的邻居,使用的组播地址224.0.0.5。DR和BDR发送报文使用的组播地址是224.0.0.6。其作用为建立和维护邻接关系,周期性的在使能了OSPF的接口上发送。报文内容包括一些定时器的数值、DR、BDR以及自己已知的邻居。 + +* OSPF-hello报文格式 +![](image/ospfhello报文格式.png) + +* OSPF-hello字段说明 + +|字段 |长度 |含义| +|-|-|-| +|Network Mask |32比特| 发送Hello报文的接口所在网络的掩码。| +|HelloInterval| 16比特| 发送Hello报文的时间间隔。| +|Options |8比特 |可选项:E:允许Flood AS-External-LSAs MC:转发IP组播报文 N/P:处理Type-7 LSAs DC:处理按需链路| +|Rtr Pri |8比特| DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。| +|RouterDeadInterval |32比特| 失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。| +|Designated Router |32比特| DR的接口地址。| +|Backup Designated Router| 32比特| BDR的接口地址。| +|Neighbor |32比特 |邻居,以Router ID标识。| + +* OSPF-hello报文实例 + +![](image/OSPFhello报文.png) + + +### 5中OSPF报文类型-DD报文 +DD:Database Description 本地数据库摘要,供路由器核对数据库是否同步。只交换摘要,减少带宽占用。包括空DD报文和带有摘要信息的DD报文。空DD报文用来确定Master/Slave关系,由Master规定起始序列号,每发送一个DD报文序列号加1,Slave方使用Master的序列号作为确认。 +* OSPF-DD报文格式 + +![](image/OSPFDD报文格式.png) + +* OSPF-DD报文字段说明 + +|字段 |长度|含义| +|-|-|-| +|Interface MTU |16比特 |在不分片的情况下,此接口最大可发|出的IP报文长度。 +|Options |8比特| 可选项:E:允许Flood AS-External-LSAs|;MC:转发IP组播报文;N/P:处理Type-7 LSAs;DC:处理按需链路。 +|I |1比特| 当发送连续多个DD报文时,如果这是第一个DD报文|,则置为1,否则置为0。 +|M (More) |1比特| 当发送连续多个DD报文时,如果这是最后|一个DD报文,则置为0。否则置为1,表示后面还有其他的DD报文。 +|M/S (Master/Slave) |1比特| 当两台OSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。| +|DD sequence number |32比特| DD报文序列号。主从双方利|用序列号来保证DD报文传输的可靠性和完整性。 +|LSA Headers |可变| 该DD报文中所包含的LSA的头部信息。| +* OSPF-DD报文实例 + +![](image/OSPFDD报文实例.png) + +### 5种OSPF报文类型-LSR报文 +LSR:Link-State Request 请求链路状态,在数据库同步过程中使用,请求其他角色发送自己失去的LSA最新版本。内容包括所需要的LSA的摘要。 +* OSPF-LSR报文格式 + +![](image/OSPFLSR报文格式.png) + +* OSPF-LSR报文字段说明 + +|字段 |长度 |含义| +|-|-|-| +|LS type |32比特| LSA的类型号。| +|Link State ID| 32比特| 根据LSA中的LS Type和LSA description在路由域中描述一个LSA。| +|Advertising Router |32比特 |产生此LSA的路由器的Router ID。| + +* OSPF-LSR报文实例 + +![](image/OSPFLSR报文实例.png) + + +### 5种OSPF报文类型-LSU报文 +LSU:Link-State Update 链路状态更新,用来向对端Router发送其所需要的LSA或者泛洪自己更新的LSA,内容是多条LSA(全部内容)的集合。LSU包括几种类型的LSA,LSU负责泛洪LSA,和响应LSR。LSA只会发送给之前以LSR请求的LSA的直连邻居,进行泛洪的时候,邻居路由负责把收到的LSA信息重新封装在新的LSU中。 + +* OSPF-LSU报文格式 + +![](image/OSPFLSU报文格式.png) + +* OSPF-LSU报文字段说明 + +|字段|长度| 含义| +|-|-|-| +|Number of LSAs |32比特| LSA的数量。| + +* OSPF-LSU报文实例 + +![](image/OSPFLSU报文实例.png) + + +### 5种OSPF报文类型-LSACK报文 +LSACK:链路状态确认,路由器必须对每个收到的LSA进行LSACK确认,但可以用一个LSACK确认多个LSA。 +* OSPF-LSACK报文格式 + +![](image/OSPFLSACK报文格式.png) + +* OSPF-LSACK报文字段说明 + +|字段 |长度 |含义| +|-|-|-| +|LSAs Headers |可变 |通过LSA的头部信息确认收到该LSA。| + +* OSPF-LSACK报文实例 + +![](image/OSPFLSACK报文实例.png) + + +### OSPF可靠传输机制 + +采用了确认重传机制,确保OSPF路由信息的可靠传输。 + +### OSPF邻居状态机 + +![](image/OSPF邻居状态机.png) + +邻居状态机的状态说明 +* Down +邻居状态机的初始状态,是指在过去的Dead-Interval时间内没有收到对方的Hello报文 + +* Init +本状态表示已经收到了邻居的HELLO报文,但是该报文中列出的邻居中没有包含本Router ID(对方并没有收到我发的HELLO +* Attempt +只适用于NBMA类型的接口,处于本状态时,定期向那些手工配置的邻居发送HELLO报文 +* 2-Way +本状态表示双方互相收到了对端发送的HELLO报文,建立了邻居关系。在广播和NBMA类型的网络中,两个接口状态是DROther的路由器之间将停留在此状态。其他情况状态机将继续转入高级状态。 +* ExStart +在此状态下,路由器和它的邻居之间通过互相交换DD报文(该报文并不包含实际的内容,只包含一些标志位)来决定发送时的主/从关系。建立主/从关系主要是为了保证在后续的DD报文交换中能够有序的发送。 +* Exchange +路由器将本地的LSDB用DD报文来描述,并发给邻居 +* Loading +路由器发送LSR报文向邻居请求对方的LSU报文 +* Full +在此状态下,邻居路由器的LSDB中所有的LSA本路由器全都有了。本路由器和邻居建立了邻接状态 + +### OSPF报文交互过程 +![](image/OSPF报文交互过程.png) + +具体步骤 +1. 通过HELLO报文的邻居发现 +2. DD报文的主从关系协商 +3. DD报文交换摘要信息 +4. LSA的请求 +5. LSA的更新 +6. LSA 的确认 + +## 3 OSPF协议链路状态描述 + +> 主要介绍了LSA链路状态通告和与LSA有关的逻辑关系 + +链路状态描述即使用链路状态通告。不同的链路类型课能对应不同的链路状态通告。每种链路状态通告包括两部分,链路状态通告的头部信息,和链路状态的通告的数据内容。 + + + +常用的LSA共有5种,分别为:Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA和AS-External-LSA。 + +### LSA 相同的Header +![](image/LSAHeader.png) + +* 字段说明 + + +|字段 |长度| 含义| +|-|-|-| +|LS age |16比特| LSA产生后所经过的时间,以秒为单位。无论LSA是在链路上传送,还是保存在LSDB中,其值都会在不停的增长。| +|Options |8比特| 可选项:E:允许泛洪AS-External-LSA;MC:转发IP组播报文;N/P:处理Type-7 LSA;DC:处理按需链路。| +|LS type |8比特| LSA的类型:Type1:Router-LSA Type2:Network-LSA Type3:Network-summary-LSA Type4:ASBR-summary-LSA Type5:AS-External-LSA Type7:NSSA-LSA| +|Link State ID |32比特| 与LSA中的LS Type和LSA description一起在路由域中描述一个LSA。| +|Advertising Router| 32比特| 产生此LSA的路由器的Router ID。| +|LS sequence number |32比特 |LSA的序列号。其他路由器根据这个值可以判断哪个LSA是最新的。| +|LS checksum |16比特| 除了LS age外其它各域的校验和。| +|length |16比特 |LSA的总长度,包括LSA Header,以字节为单位。| + +### 五种链路状态通告类型 +![](image/OSPF五种链路通告类型.png) + +### Router-LSA(1类) +Router-LSA(Type1):每个路由器都会产生,描述了路由器的链路状态和花费,在所属的区域内传播。 + +* Router-LSA通告格式 + +![](image/Router-LSA通告格式.png) + + +* Router-LSA通告字段说明 + +|字段| 长度 |含义| +|-|-|-| +|Link State ID |32比特 |生成LSA的Router ID。| +|V (Virtual Link) |1比特| 如果产生此LSA的路由器是虚连接的端点,则置为1。| +|E (External) |1比特| 如果产生此LSA的路由器是ASBR,则置为1。| +|B (Border)| 1比特| 如果产生此LSA的路由器是ABR,则置为1。| +|# links |16比特 |LSA中所描述的链路信息的数量,包括路由器上处于某区域中的所有链路和接口。| +|Link ID |32比特 |路由器所接入的目标,其值取决于连接的类型:1:Router ID;2:DR的接口IP地址;3:网段/子网号;4:虚连接中对端的Router ID。| +|Link Data |32比特| 连接数据,其值取决于连接的类型:unnumbered P2P:接口的索引值;stub网络:子网掩码;其它连接:路由器接口的IP地址。| +|Type |8比特| 路由器连接的基本描述:1:点到点连接到另一台路由器;2:连接到传输网络;3:连接到stub网络;4:虚拟链路。| +|# TOS |8比特| 连接不同的TOS数量。| +|metric |16比特| 链路的开销值。| +|TOS |8比特| 服务类型。| +|TOS metric |16比特| 和指定TOS值相关联的度量。| + + + +### Network- LSA(2类) +Network-LSA(Type2):由广播网或NBMA网络中的DR产生,Network-LSA中记录了这一网络上所有路由器的Router +ID,描述本网段的链路状态,在所属的区域内传播。 + +* Network-LSA通告格式 + +![](image/NetworkLSA通告格式.png) + +* Network-LSA通告字段说明 + +|字段| 长度| 含义| +|-|-|-| +|Link State ID |32比特| DR的接口IP地址。| +|Network Mask |32比特| 该广播网或NBMA网络地址的掩码。| +|Attached Router |32比特| 连接在同一个网络上的所有路由器的Router ID,也包括DR的Router ID。| + + +### Network Summary-LSA(3类) + +Network-summary-LSA(Type3):描述区域内所有网段的路由,并通告给其他相关区域。ASBR-summary-LSA(Type4):描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。Type3和Type4的LSA有相同的格式,它们都是由ABR产生。 + +* Network Summary-LSA&ASBR Summary-LSA通告格式 + +![](image/Summary-LSA通告格式.png) + + +* Network Summary-LSA&ASBR Summary-LSA通告字段说明 + +|字段 |长度| 含义| +|-|-|-| +|Link State ID |32比特| 通告的网络地址。如果是ASBR Summary LSA,此字段表示ASBR的Router ID。| +|Network Mask |32比特| 该广播网或NBMA网络地址的掩码。如果是ASBR Summary LSA,此字段无意义,设置为0.0.0.0。| +|metric |24比特| 到目的地址的路由开销。| +|TOS |8比特| 服务类型。| +|TOS metric |24比特| 和指定TOS值相关联的度量。| + +### ASBR Summary-LSA(4类) +ASBR-Summary-LSA(Type4):描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。Type3和Type4的LSA有相同的格式,它们都是由ABR产生。 +### AS External-LSA(5类) +AS-External-LSA(Type5):由ASBR产生,描述到AS外部的路由,这是五种LSA中,唯一一种通告到所有区域(除了Stub区域和NSSA区域)的LSA。 + +* AS External-LSA通告格式 +![](image/ASExternal-LSA通告格式.png) + +* AS External-LSA通告字段说明 + +|字段 |长度| 含义| +|-|-|-| +|Link State ID |32比特| 通告的网络地址。| +|Network Mask |32比特| 通告的目的地址的掩码。| +|E |1比特| 外部度量值类型:0:第一类外部路由;1:第二类外部路由。| +|metric |24比特| 到目的地址的路由开销。| +|Forwarding Address |32比特| 到所通告的目的地址的报文将被转发到这个地址。| +|External Route Tag |32比特| 添加到外部路由上的标记。OSPF本身并不使用这个字段,它可以用来对外部路由进行管理。| +|TOS |8比特| 服务类型。| +|TOS metric |24比特| TOS附加距离信息。| + + +### OSPF协议的4种网络类型 + +* Broadcast类型。广播网络。选举指定路由器DR与备份指定路由器BDR。广播型全连接网络拓扑结构。 +* NBMA类型。非广播多点可达。选举DR与BDR。单播型全连接网络拓扑结构。 +* PRMP类型。点到多点网络。不要求DR和BDR。使用组播24.0.0.5发送协议。非全连接拓扑结构。 +* PTP类型。点到点网络。无序选择DR和BDR。使用组播224.0.0.5发送协议。点对点拓扑结构。 + +### OSPF周围4种网络拓扑结构 +![](image/四中网络类型.png) +* Stub net:末端网络拓扑结构,路由器直连其他PC,网段中没有其他运行OSPF协议的网络设备。 +* PPP网络描述:点到点拓扑结构,链路连接另一个OSPF的路由器。 +* 点到多点:非全连接拓扑结构。 +* 全连接网络:全连接拓扑结构。信息冗余。选取DR与BDR。 + +### 链路状态描述信息 + +链路状态描述信息+链路状态通告头组成了链路状态通告信息。链路状态描述信息描述了一条记录的具体含义,反映了路由器周边的网络拓扑结构。不同的网络结构使用不同的链路状态描述信息。链路状态描述是链路状态通告的主体部分。 + +| 类型值 | 链路类型|LinkID|LinkData| +|-|-|-|-| +|1-router|Point-to-Point链路|邻居路由器的RouterID|始发路由器在该网段时的接口IP地址| +|2-transit|连接Transit网络链路|DR接口的IP地址|始发路由器在该网段是的接口IP地址| +|3-stubnet|连接Stub网络链路|Stub网络的IP地址|Stub网络的子网掩码| +|4-virtual|Virtual Link|邻居路由器的RouterID|始发路由器接口的MIB-IIifINDEX值| + +![](image/OSPF五种链路状态描述类型.png) + +### DR与BDR的选举 +1. 登记本网段内运行OSPF的路由器; +2. 登记具有DR候选资格的路由器,即本网段内的Priority>0的OSPF路由器(Priority可以手工配置,缺省值是1); +3. 所有的Priority>0的OSPF路由器都认为自己是DR; +4. Priority值最大,若Priority值相等则Router ID最大的路由器将成为DR。第二为BDR。 +5. 每台路由器通过互相发送Hello报文,同时将自己选出的DR写入Hello报文中,本网段中所有路由器共同选举出DR和BDR。 + +选举的原则 + +* 选举制 +DR是各路由器选出来的,而非人工指定的,虽然管理员可以通过配置Priority干预选举过程。 +* 终身制 +DR一旦当选,除非路由器故障,否则不会更换,即使后来的路由器Priority更高。 +* 世袭制 +DR选出的同时也选出BDR来,DR故障后,由BDR接替DR成为新的DR。 +* 稳定压倒一切 +如果DR频繁的更迭,则每次都要重新引起本网段内的所有路由器与新的DR建立邻接关系。 +* BDR快速响应 +BDR与DR同时被选举出来。BDR也与本网段内的所有路由器建立邻接关系并交换路由信息。DR失效后,BDR立即成为DR。 + +## 4 区域划分及LSA种类 + +### 原理 +路由器数量增多,LSDB庞大,占用存储空间,增加运行SPF算法的复杂度,同时两台路由器之间进行LSDB同步的时间变长。 + +减少LSA的数量,缩小网络变化的搏击范围。 + +OSPF协议通过将自治系统划分成不同的区域解决问题。区域内使用第一类和第二类LSA链路通告类型。第三类LSA主要对区域内的路由(网段)信息进行描述,大大减少了路由信息描述的数量。 + +路由聚合功能。 + +### 路由器类型 + +在第一章讲过 + +### 与自治系统外部通信 + +ASBR可以在系统中的任何位置。将其他路由协议(包括静态路由和接口直连路由)导入到OSPF路由器中。 + +使用第五类LSA描述包括该路由的目的地之、掩码和花费等信息。将外部信息导入到自制系统内部传播。 + +### 骨干区域与虚连接 + + +## 5 OSPF协议路由的计算 + +### SPF算法和COST值 + +### 区域内OSPF路由计算过程 + +### 区域间OSPF路由计算过程 + +### 区域外OSPF路由的计算过程 + +### 路由的类型和优选顺序 + diff --git a/计算机网络实验.md/RIP协议.md b/计算机网络实验.md/RIP协议.md new file mode 100644 index 00000000..d5d58df6 --- /dev/null +++ b/计算机网络实验.md/RIP协议.md @@ -0,0 +1,401 @@ +# RIP协议 +> 参考文献 +> * [RIP基础知识](https://blog.csdn.net/qq_38265137/article/details/80503512) +> * 等到复习的时候整理这篇文档 + + +RIP简介 +RIP是Routing Information Protocol(路由信息协议)的简称,它是一种较为简单的内部网关协议(Interior Gateway Protocol)。RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量来衡量到达目的网络的距离。RIP通过UDP报文进行路由信息的交换,使用的端口号为520。 + +RIP包括RIP-1和RIP-2两个版本,RIP-2对RIP-1进行了扩充,使其更具有优势。 + +RIP原理描述 +RIP基本原理: +RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量值来衡量到达目的地址的距离。在RIP网络中,缺省情况下,设备到与它直接相连网络的跳数为0,通过一个设备可达的网络的跳数为1,其余依此类推。也就是说,度量值等于从本网络到达目的网络间的设备数量。为限制收敛时间,RIP规定度量值取0~15之间的整数,大于或等于16的跳数被定义为无穷大,即目的网络或主机不可达。由于这个限制,使得RIP不可能在大型网络中得到应用。 + +RIPv1报文: +RIP-1报文由头部(Header)和多个路由表项(Route Entries)部分组成。在一个RIP报文中,最多可以有25个路由表项。RIP是一个基于UDP协议的,并且RIP-1的数据包不能超过512字节。 + + + +图:RIPv1报文格式 +字段解释: + +字段名 长度 含义 +Command 8比特 标识报文的类型:1:Request报文,向邻居请求全部或部分路由信息;2:Reponse报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。 +Version 8比特 RIP的版本号:1:RIP-12:RIP-2 +Must be zero 16/32比特 必须为零字段。 +AFI(Address family identifier) 16比特 地址族标识,其值为2时表示IP协议。对于Request报文,此字段值为0。 +IP Address 32比特 该路由的目的IP地址,可以是自然网段的地址,也可以是子网地址或主机地址。 +Metric 32比特 路由的开销值。对于Request报文,此字段值为16。 +RIPv1报文抓包示例: + + + +图:RIPv1报文抓包示例 +RIPv1的特点: +有类别路由协议。 +广播更新。 +基于UDP,端口号520. +RIP是一个基于UDP的路由协议,并且RIPv1的数据包不能超过512字节(RIP报文头部占用4个字节,而每个路由条目占用20个八位组字节。因此,RIP消息最大为4+(25*20)=504个字节,再加上8个字节的UDP头部,所以RIP数据报的大小(不含IP包的头部)最大可达512个字节。)。RIPv1的协议报文中没有携带掩码信息,所以RIPv1在发送和接收路由更新时会根据主类网段掩码和接口地址掩码来处理路由条目。因此RIPv1无法支持路由聚合,也不支持不连续子网。RIPv1的协议报文中没有验证字段,所以RIPv1也不支持验证。 + +RIP工作过程分析: + + +图:RIP工作过程分析 +初始状态:路由器开启RIP进程,宣告相应接口,则设备就会从相关接口发送和接收RIP报文。 +构建路由表:路由器依据收到的RIP报文构建自己的路由表项 +维护路由表:路由器每隔30秒发送更新报文,同时接收相邻路由器发送的更新报文以维护路由表项。 +老化路由表项:路由器为将自己构建的路由表项启动180秒的定时器。180秒内,如果路由器收到更新报文,则重置自己的更新定时器和老化定时器。 +垃圾收集表项:如果180秒过后,路由器没有收到相应路由表项的更新,则启动时长为120秒的垃圾收集定时器,同时将该路由表项的度量置为16。 +删除路由表项:如果120秒之后,路由器仍然没有收到相应路由表项的更新,则路由器将该表项删除。 +RIP路由表的形成: +RIP启动时的初始路由表仅包含本设备的一些直连接口路由。通过相邻设备互相学习路由表项,才能实现各网段路由互通。 + + + +图:RIP路由表形成过程 +RIP路由表形成过程如上图所示: + +RIP协议启动之后,RouterA会向相邻的路由器广播一个Request报文。 +当RouterB从接口接收到RouterA发送的Request报文后,把自己的RIP路由表封装在Response报文内,然后向该接口对应的网络广播。 +RouterA根据RouterB发送的Response报文,形成自己的路由表。 +RIPv1的发送和接收规则: +RIPv1的发送规则: +注意发送时没有子网掩码。 + +将要发送的前缀路由和出接口网段匹配: + +如果不在同一主网,此为主网边界,将前缀自动汇总为有类网段发送前缀到出接口。 +如果在同一主网,检查发送的前缀是否为32位: +如果是,发送32位前缀到出接口。 +如果不是,检查前缀和出口掩码是否相同: +如果不同,抑制发送或者汇聚为主网络号。 +如果相同,没有边界,发送正确的前缀到出接口。 +RIPv1接收规则: +收到一个前缀后,如果发现是主网络号,直接放入路由表,掩码是8/16/24. + +如果不是主网络号,检查是否在同一主网: + +如果不在,生成有类路由,掩码按有类路由计算。 +如果在同一主网,用接口掩码去掩,然后检查该前缀是网络地址还是主机地址: +如果是网络地址,生成路由,掩码等于自己的接口掩码,放入路由表。 +如果不是网络地址,就默认是主机地址,生成32位路由,放入路由表。 +RIP的更新与维护: +RIP协议在更新和维护路由信息时主要使用四个定时器: + +更新定时器(Update timer):当此定时器超时时,立即发送更新报文。 +老化定时器(Age timer):RIP设备如果在老化时间内没有收到邻居发来的路由更新报文,则认为该路由不可达。 +垃圾收集定时器(Garbage-collect timer):如果在垃圾收集时间内不可达路由没有收到来自同一邻居的更新,则该路由将被从RIP路由表中彻底删除。 +抑制定时器(Suppress timer):当RIP设备收到对端的路由更新,其cost为16,对应路由进入抑制状态,并启动抑制定时器。为了防止路由震荡,在抑制定时器超时之前,即使再收到对端路由cost小于16的更新,也不接受。当抑制定时器超时后,就重新允许接受对端发送的路由更新报文。 +RIP路由与定时器之间的关系: + +RIP的更新信息发布是由更新定时器控制的,默认为每30秒发送一次。 +每一条路由表项对应两个定时器:老化定时器和垃圾收集定时器。当学到一条路由并添加到RIP路由表中时,老化定时器启动。如果老化定时器超时,设备仍没有收到邻居发来的更新报文,则把该路由的度量值置为16(表示路由不可达),并启动垃圾收集定时器。如果垃圾收集定时器超时,设备仍然没有收到更新报文,则在RIP路由表中删除该路由。 +注意事项: + +如果设备不具有触发更新功能,一个路由表项最多需要300秒才能被删除(老化时间+垃圾收集时间)。 +如果存在触发更新,那么一个路由条目最多需要120秒才能被删除(即为垃圾收集时间)。 +触发更新: +触发更新可以缩短网络收敛时间。在路由表项变化时立即向其他设备广播该信息,而不必等待定时更新。如果没有触发更新,缺省情况下,失效的路由条目会在路由表停留最多300秒(老化定时器+垃圾收集定时器)。 + +RIPv2的增强特性: +RIPv2特点: +无类别路由协议。 +组播更新,组播地址224.0.0.9 +基于UDP,端口号520. +支持外部Tag。 +支持路由聚合和CIDR +支持指定下一跳。 +支持认证。 +RIPv2的报文: + + +图:RIPv2报文格式 +字段解释: + +字段名 长度 含义 +Command 8比特 标识报文的类型:1:Request报文,向邻居请求全部或部分路由信息;2:Reponse报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。 +Version 8比特 RIP的版本号:1:RIP-12:RIP-2 +Must be zero 16比特 必须为零字段。 +AFI(Address Family Identifier) 16比特 地址族标识,其值为2时表示IP协议。对于Request报文,此字段值为0。 +Route Tag 16比特 外部路由标记。 +IP Address 32比特 该路由的目的IP地址,可以是自然网段的地址,也可以是子网地址或主机地址。 +Subnet Mask 32比特 目的地址的掩码。 +Next Hop 32比特 提供一个更好的下一跳地址。如果为0.0.0.0,则表示发布此路由的路由器地址就是最优下一跳地址。 +Metric 32比特 路由的开销值。对于Request报文,此字段为16。 +RIPv2报文抓包示例: + + + +图:RIPv1报文抓包示例 +RIPv1与RIPv2的比较: +RIPv1是有类路由协议,RIPv2是无类路由协议 +RIPv1不能支持VLSM,RIPv2可以支持VLSM +RIPv1没有认证的功能,RIPv2可以支持认证,并且有明文和MD5两种认证 +RIPv1没有手工汇总的功能,RIPv2可以在关闭自动汇总的前提下,进行手工汇总 +RIPv1是广播更新,RIPv2是组播更新, +RIPv1对路由没有标记的功能,RIPv2可以对路由打标记(tag),用于过滤和做策略 +RIPv1发送的updata最多可以携带25条路由条目,RIPv2在有认证的情况下最多只能携带24条路由 +RIPv1发送的updata包里面没有next-hop属性,RIPv2有next-hop属性,可以用与路由更新的重定 +RIPv2路由聚合: +路由聚合的原理是,同一个自然网段内的不同子网的路由在向外(其它网段)发送时聚合成一个网段的路由发送。 + +RIPv2支持路由聚合,因为RIPv2报文携带掩码位,所以支持子网划分。在RIPv2中进行路由聚合可提高大型网络的可扩展性和效率,缩减路由表。 +基于RIPv2进程的有类聚合即实现自动聚合。 +基于接口的聚合即实现手动聚合。 +如果被聚合路由携带了Tag,那么路由聚合发生之后,Tag信息将被清除。 +路由聚合有两种方式: + +基于RIP进程的有类聚合: + +聚合后的路由使用自然掩码的路由形式发布。比如,对于10.1.1.0/24(metric=2)和10.1.2.0/24(metric=3)这两条路由,会聚合成自然网段路由10.0.0.0/8(metric=2)。RIP–2聚合是按类聚合的,聚合得到最优的metric值。 + +基于接口的聚合: + +用户可以指定聚合地址。比如,对于10.1.1.0/24(metric=2)和10.1.2.0/24(metric=3)这两条路由,可以在指定接口上配置聚合路由10.1.0.0/16(metric=2)来代替原始路由。 + +RIP的特性: +水平分割: +水平分割(Split Horizon)的原理是,RIP从某个接口学到的路由,不会从该接口再发回给邻居路由器。这样不但减少了带宽消耗,还可以防止路由环路。 + +水平分割在不同网络中实现有所区别,分为按照接口和按照邻居进行水平分割。广播网、P2P和P2MP网络中是按照接口进行水平分割的,如下图所示: + + + +图:按照接口进行水平分割原理图 +RouterA会向RouterB发送到网络10.0.0.0/8的路由信息,如果没有配置水平分割,RouterB会将从RouterA学习到的这条路由再发送回给RouterA。这样,RouterA可以学习到两条到达10.0.0.0/8网络的路由:跳数为0的直连路由;下一跳指向RouterB,且跳数为2的路由。 + +但是在RouterA的RIP路由表中只有直连路由才是活跃的。当RouterA到网络10.0.0.0的路由变成不可达,并且RouterB还没有收到路由不可达的信息时,RouterB会继续向RouterA发送10.0.0.0/8可达的路由信息。即,RouterA会接受到错误的路由信息,认为可以通过RouterB到达10.0.0.0/8网络;而RouterB仍旧认为可以通过RouterA到达10.0.0.0/8网络,从而形成路由环路。配置水平分割后,RouterB将不会再把到网络10.0.0.0/8的路由发回给RouterA,由此避免了路由环路的产生。 + +对于NBMA(Non-Broadcast Multiple Access)网络,由于一个接口上连接多个邻居,所以是按照邻居进行水平分割的。路由就会按照单播方式发送,同一接口上收到的路由可以按邻居进行区分。从某一接口的对端邻居处学习到路由,不会再通过该接口发送回去。 + + + +图:按照邻居进行水平分割原理图 +在NBMA网络配置了水平分割之后,RouterA会将从RouterB学习到的172.16.0.0/16路由发送给RouterC,但是不会再发送回给RouterB。 + +毒性反转: +毒性反转(Poison Reverse)的原理是,RIP从某个接口学到路由后,从原接口发回邻居路由器,并将该路由的开销设置为16(即指明该路由不可达)。利用这种方式,可以清除对方路由表中的无用路由。 + +配置毒性反转后,RouterB在接收到从RouterA发来的路由后,向RouterA发送一个这条路由不可达的消息(将该路由的开销设置为16),这样RouterA就不会再从RouterB学到这条可达路由,因此就可以避免路由环路的产生。 + +水平分割和毒性逆转的区别: +水平分割和毒性逆转都是为了防止RIP中的路由环路而设计的,但是水平分割是不将收到路由条目再按“原路返回”来避免环路,而毒性逆转遵循“坏消息比没消息好”的原则,即将路由条目按“原路返回”,但是该路由条目被标记为不可达(度量值为16)。 + +缺省情况下不使能毒性逆转。一般情况下,在华为设备中均使能水平分割(除NBMA网络外)而禁用毒性逆转。 + +多进程和多实例: +RIP多进程允许为指定的RIP进程关联一组接口,从而保证该进程进行的所有协议操作都仅限于这一组接口。这样,就可以实现一台设备有多个RIP进程,不同RIP进程之间互不影响,它们之间的路由交互相当于不同路由协议之间的路由交互。 + +RIP多实例是为每个VPN实例绑定一个RIP进程,从而实现VPN实例与指定进程下的所有接口相关联。 + +RIP与BFD联动: +网络上的链路故障会导致路由器重新计算路由,因此缩短路由协议的收敛时间对于提高网络性能是非常重要的。加快故障感知速度并快速通告给路由协议是一种可行的方案。 + +双向转发检测BFD(Bidirectional Forwarding Detection)是一种用于检测邻居路由器之间链路故障的检测机制,它通常与路由协议联动,通过快速感知链路故障并通告使得路由协议能够快速地重新收敛,从而减少由于拓扑变化导致的流量丢失。在RIP与BFD联动中,BFD可以快速检测到链路故障并通知RIP协议,从而加快RIP协议对于网络拓扑变化的响应。 + +RIP故障排除流程: +检查接口是否在RIP中使能:使用display rip process-id interface 可以查看运行rip的接口; +检查对方发送版本号和本地接口接收的版本号是否匹配:缺省情况下,接口只发送RIPv1报文,但可以接收RIPv1和RIPv2报文。当入接口与收到的RIP报文使用不同的版本号时,有可能造成RIP路由不能被正确的接收; +检查在RIP中是否配置了策略,过滤掉收到的RIP路由:如果被路由策略过滤掉,则需修改路由策略; +RIP使用的端口520是否被禁用; +检查接口是否配置了undo rip input/output或者rip metricin设置度量值过大; +检查接口是否配置了抑制接口; +检查路由度量值是否大于16; +检查链路两端是否配置了认证,认证的配置是否正确。 +RIPv1和RIPv2的兼容性问题 +RIPv1和RIPv2默认互相不兼容。 +运行RIPv2的路由器默认只发送和接收v2的报文,不接收v1的报文。 +运行RIPv1的路由器可以接收v2的报文。 +RIPv1和RIPv2兼容性实验验证: + + +图:RIPv1与RIPv2版本兼容性实验 +配置如下: + +AR1: + + sysname AR1 +# +interface GigabitEthernet0/0/0 + ip address 10.1.1.1 255.255.255.252 +# +interface LoopBack0 + ip address 1.1.1.1 255.255.255.255 +# +rip 1 + version 2 + network 10.0.0.0 + network 1.0.0.0 +# +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +AR2: + +dis current-configuration +# + sysname AR2 +# +interface GigabitEthernet0/0/0 + ip address 10.1.1.2 255.255.255.252 +# +interface LoopBack0 + ip address 2.2.2.2 255.255.255.255 +# +rip 1 + network 10.0.0.0 + network 2.0.0.0 +# +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +实验现象: + + + +图:AR1的路由表 +在AR1上开启的位RIPv2版本,路由表中并未收到从AR2中RIPv1发来的路由更新。 + + + +图:在AR2上配置为RIPv1,收到了从AR1中发送的路由,1.1.1.1/32路由条目。 + + +图:抓包情况 +实验结果: + +v2版RIP,将只发送v2,接收v2。 + +v1版本的RIP可以接收v2的报文。 + +当两边都是RIPv2时: + + +图:当都是RIPv2时Ar1的路由表 +当两边都是v2时,AR1可以收到AR2发送的2.2.2.2/32这条路由条目,AR2也可以收到1.1.1.1/32. + +当两边都是RIPv1时: + + +图:当两边都是v1版本时,AR1的路由表 + + +图:当两边都是v1版本时,AR2的路由表 +两边都是v1时,收到对方的路由条目都是有类路由,1.0.0.0/8和2.0.0.0/8。而v2版本中,收到的都是无类路由,1.1.1.1/32和2.2.2.2/32. + +RIP配置命令 +checkzero +//使能对RIP-1报文中的零域进行检查。 +//RIP-1报文中的有些字段必须为零,称之为零域。RIP-1在接收报 +//文时将对零域进行检查,零域的值不为零的RIP-1报文将不被处理。 +//checkzero只对RIP-1报文有效。 +host-route +//允许32位主机路由加到路由表里。 +network network-address +//对指定网段接口使能RIP路由。 +peer ip-address +//指定RIP邻居的IP地址。配置此命令后,更新报文以单播形式发 +//送到对端,而不采用正常的组播或广播的形式。 +preference 100 +//配置RIP路由的优先级 +rip authentication-mode +//配置RIP-2的认证方式及认证参数。 +rip bfd +//指定接口上配置动态BFD会话的参数值。 +rip input +//控制允许指定接口接收RIP报文。 +rip output +//允许接口发送RIP报文。 +rip metricin +//配置接口接收RIP报文时给路由增加的度量值。 +rip metricout +//配置接口发送RIP报文给路由增加的度量值。 +//缺省情况下,接口发送RIP报文时给路由增加度量值为1。 +rip pkt-transmit +//指定接口上设置RIP发送更新报文的时间间隔和每次发送报文的数量。 +//缺省情况下,RIP接口发送更新报文的时间间隔为200毫秒,每次发送的报文数量为50。 +rip poison-reverse +//使能RIP的毒性反转功能。 +rip split-horizon +//使能RIP的水平分割功能。 +//如果毒性反转和水平分割都配置了,简单的水平分割行为(从某 +//接口学到的路由再从这个接口发布时将被抑制)会被毒性反转行为代替。 +rip summary-address +//配置RIP路由器发布一个聚合的本地IP地址。 +silent-interface + //来抑制接口,使其只接收报文,用来更新自己的路由表,而不发送RIP报文。 +summary [ always ] +//使能RIP有类聚合,指定有类聚合被使能,不论水平分割功能是否配置。 +timers rip 30 +//调整定时器。 +//缺省情况下,路由更新报文的发送间隔为30秒,路由老化时间为180秒,路由被从路由表中删除的时间为120秒。 + +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 diff --git a/计算机网络实验.md/STP 协议.md b/计算机网络实验.md/STP 协议.md new file mode 100644 index 00000000..e14b6eb8 --- /dev/null +++ b/计算机网络实验.md/STP 协议.md @@ -0,0 +1,246 @@ +# STP 协议 + +## 1 STP简介 +### STP概述 +生成树协议STP(Spanning Tree Protocol)将环形网络修剪成为一个无环的树型网络,避免报文在环形网络中的增生和无限循环。 + +在一个复杂的网络环境中,难免会出现环路。由于冗余备份的需要,网络设计者都倾向于在设备之间部署多条物理链路,其中一条作主用链路,其他链路作备份,这样都有可能会导致环路产生。 + +环路会产生广播风暴,最终导致整个网络资源被耗尽,网络瘫痪不可用。环路还会引起MAC地址表震荡导致MAC地址表项被破坏。 + +为了破除环路,可以采用数据链路层协议STP,运行该协议的设备通过彼此交互信息发现网络中的环路,并有选择的对某个端口进行阻塞,最终将环形网络结构修剪成无环路的树形网络结构,从而防止报文在环形网络中不断循环,避免设备由于重复接收相同的报文造成处理能力下降。 + +### STP相关概念 + +* 根桥 + +树形网络结构必须有树根,于是STP/RSTP引入了根桥(Root Bridge)概念。 + +对于一个STP/RSTP网络,根桥有且只有一个,它是整个网络的逻辑中心,但不一定是物理中心。但是根据网络拓扑的变化,根桥可能改变。 + +* BID(Bridge ID):桥ID + +IEEE 802.1d标准中规定BID是由2字节的桥优先级(Bridge Priority)与桥MAC地址构成,即BID(8字节) = 桥优先级(2字节) + 桥MAC(6字节)。 + +在STP网络中,桥ID最小的设备会被选举为根桥。在华为公司的设备上,桥优先级支持手工配置。 + +* PID(Port ID):端口ID + +PID由两部分构成的,即PID(16位) = 端口优先级(4位) + 端口号(12位)。 + +PID只在某些情况下对选择指定端口有作用,即在选择指定端口时,两个端口的根路径开销和发送交换设备BID都相同的情况下,比较端口的PID,PID小者为指定端口。 + +* 路径开销(RPC) + +路径开销是STP/RSTP协议用于选择链路的参考值。STP/RSTP协议通过计算路径开销,选择较为“强壮”的链路,阻塞多余的链路,将网络修剪成无环路的树形网络结构。根设备的端口的路径开销都为0。 + +在一个STP/RSTP网络中,某端口到根桥累计的路径开销就是所经过的各个桥上的各端口的开销。 + +* PC(port cost) + +PC的计算需要依据端口带宽来计算。 + +### 端口角色: +* 根端口(RP): + +即去往根桥路径最近的端口。根端口负责向根桥方向转发数据,根端口同时还负责接收上游设备的BPDU报文和用户流量转发。根端口的选择标准是依据根路径开销判定。在一台设备上所有使能STP的端口中,根路径开销最小者,就是根端口。在一个运行STP/RSTP协议的设备上根端口有且只有一个,而且根桥上没有根端口。 + +* 指定端口(DP): + +对一台交换设备而言,它的指定端口是向下游交换设备转发BPDU报文的端口。根桥的所有端口都是指定端口。在环网的每一网段都会选举出一个指定端口,在一个网段上拥有指定端口的交换设备被称作该网段的指定桥。 + +* 替代端口(AP): + +由于学习到其它设备发送的配置BPDU报文而阻塞的端口,作为根端口的备份端口,提供了从指定桥到根的另一条可切换路径。 + +### 端口状态 + +|端口状态 |目的| 说明| +|-|-|-| +|Forwarding(转发) |端口既转发用户流量也处理BPDU报文。| 只有根端口或指定端口才能进入Forwarding状态。| +|Learning (学习) |设备会根据收到的用户流量构建MAC地址表,但不转发用户流量。| 过渡状态,增加Learning状态防止临时环路。(15s)| +|Listening(监听) |确定端口角色,将选举出根桥、根端口和指定端口。 |过渡状态。(15s)| +|Blocking(阻塞) |端口仅仅接收并处理BPDU报文,不转发用户流量| 阻塞端口的最终状态。| +|Disabled(禁用) |端口既不处理BPDU报文,也不转发用户流量。| 端口状态为Down。| + +### 三种定时器 +|类型 |说明| +|-|-| +|Hello Time |Hello Timer定时器时间的大小控制配置BPDU发送间隔。| +|Forward Delay Timer| Forward Delay Timer定时器时间的大小控制端口在Listening和Learning状态的持续时间。| +|Max Age| Max Age定时器时间的大小控制存储配置BPDU的超时时间,超时认为根桥连接失败。| + +## 2 STP报文 + +### STP报文格式 + +![](image/STP报文格式.png) + + +### STP报文字段解释 +|字段内容 |说明| +|-|-| +|Protocol Identifier |协议ID=“0”| +|Protocol Version Identifier |协议版本标识符,STP为0,RSTP为2,MSTP为3。| +|BPDU Type |BPDU类型,MSTP为0x02。0x00:STP的Configuration BPDU0x80:STP的TCN BPDU(Topology Change Notification BPDU)0x02:RST BPDU(Rapid Spanning-Tree BPDU)或者MST BPDU(Multiple Spanning-Tree BPDU)| +|Flags |对于“标记域”(Flags),第一个bit(左边、高位bit)表示“TCA(拓扑改变响应)”,最后一个bit(右边、低位bit)表示“TC(拓扑改变)”。| +|Root Identifier |网桥ID都是8个字节——前两个字节是网桥优先级,后6个字节是网桥MAC地址。| +|Root Path Cost |根路径开销,本端口累计到根桥的开销。| +|Bridge Identifier |发送者BID,本交换机的BID。| +|Port Identifier |发送端口PID,发送该BPDU的端口ID。| +|Message Age |该BPDU的消息年龄。| +|Max Age |消息老化年龄。| +|Hello Time |发送两个相邻BPDU间的时间间隔。| +|Forward Delay |控制Listening和Learning状态的持续时间。| + + +### STP报文抓包示例 + +![](image/STP报文实例.png) + + +## 3 STP 原理 + +### STP原理: +找到冗余的一端,然后阻塞端口,避免环路。 + +### STP版本 +IEEE 802.1D STP +IEEE802.1W RSTP +IEEE802.1S(华为) MSTP +### STP的选举过程 +1. 在一个交换网络中选举一个根桥,根桥是设备的概念。 + +2. 根桥选举后,交换网络中的其他设备都是非根桥,每个非根桥还需选取一个到达根桥最短路径的端口称为根端口。 + +注:非根桥只能有一个根端口。 + +3. 每条链路上,还需选举一个指定端口,默认情况下根桥的所有端口都是指定端口。 + +4. 既不是根端口,也不是指定端口的其他端口需要被阻塞,不能转发数据帧。 + +### 根桥的选举 +1. 通过比较BID选举,优选BID小的。BID由优先级+MAC地址组成。 +2. 首先比较优先级,优先级越小越优。 +3. 如果优先级一样,比较MAC地址,MAC地址越小越优。 + +### 指定端口的选举 +1. 比较RID,优选小的。 +2. 比较到达根桥的RPC(Root Path Cost),越小越优。 +3. 比较BPDU包发送者的BID,越小越优。 +4. 比较BPDU包发送者的PID,越小越优。 +5. 比较BPDU包接收者的PID,越小越优。 + +### BPDU报文的两种类型 +* 配置BPDU + +包含了桥ID,路径开销,端口ID等参数。 + +* TCN BPDU + +指下游交换机感知到拓扑发生变化时向上游交换机发送的拓扑变化通知。用以快速刷新MAC地址表。 + +### STP故障: +* 根桥故障 + +非根桥会在BPDU老化之后,开始根桥的重新选举。 + +* 直连链路故障 + +交换机检测到直连链路故障后,会将预备端口转换为根端口。 + +预备端口会在30s后恢复到转发状态。 + +* 间接链路故障 + +间接链路故障进入到转发状态需要50s(MAX age + Forwarding delay * 2)。 + +* 拓扑改变导致MAC地址表错误 + +MAC地址默认老化时间为300s,这段时间内无法转发数据。 + +### STP用于拓扑改变的报文 +TCN BPDU报文:拓扑改变通知。 + +TCN BPDU报文只能由非根桥发出,通告给根桥。 + +TCA BPDU报文:用于确认接收到的TCN PBDU报文。 + +TC BPDU报文:只能由根桥发起,连续发送35s(MAX age + Forwarding delay)。 + +非根桥收到TC BPDU报文后会将MAC地址的老化时间设置为15s,加速老化。 + +### STP拓扑改变 + +1. 如果非根桥上发生拓扑变化,向根桥发送TCN BPDU包,通告根桥拓扑已改变。 +2. 上联的非根桥从指定端口收到TCN BPDU包后,会向发送者回复TCA flag位置位的配置BPDU包,同时继续向根桥发送TCN BPDU包。 +3. 根桥收到TCN BPDU包后,向发送者回复TCA Flag位置位的配置BPDU包,同时向所有指定端口发送TC Flag位置位的配置BPDU包。TC置位的配置BPDU包会连续发送35s,同时将自己的MAC aging 设置为15s。 +4. 其他非根桥收到TC置位的配置BPDU包后,将自己的MAC地址的老化时间设置为15s,加速老化。 + +### STP触发拓扑改变条件 +* 一个端口从forwarding状态过渡到disable或blocking状态。 +* 一个非根桥如果从指定端口接收到TCN BPDU包,需要向根桥装发TCN BPDU包。 +* 一个端口进入转发状态,并且本地已存在一个指端端口。 + +### STP配置命令行 +``` +stp mode { stp | rstp | mstp} +//配置交换机的STP工作模式,默认情况下,交换设备运行MSTP模式,MSTP模式兼容STP和RSTP模式。 + +stp root primary +//配置当前设备为根桥设备。缺省情况下,交换设备不作为任何生成树的根桥。配置后该设备优先级BID值自动为0,并且不能更改设备优先级。 + +stp root secondary +//配置当前交换机设备为备份根桥设备。缺省情况下,交换设备不作为任何生成树的备份根桥。配置后该设备优先级BID值为4096,并且不能更改设备优先级。 + +stp priority 32768 +//配置交换设备在系统中的优先级。缺省情况下,交换设备的优先级取值是32768。 配置时,优先级必须为4096的倍数。 + +stp pathcost-standard { dot1d-1998 | dot1t | legacy } +//配置端口路径开销计算方法。缺省情况下,路径开销值的计算方法为IEEE 802.1t(dot1t)标准方法。 + +[接口视图]stp cost 100 +//设置当前端口的路径开销值。 +//使用华为计算方法时参数cost取值范围是1~200000。 +//使用IEEE 802.1d标准方法时取值范围是1~65535。 +//使用IEEE 802.1t标准方法时取值范围是1~200000000。 + +[接口视图] stp port priority 128 +//配置端口的优先级。缺省情况下,交换设备端口的优先级取值是128。 + +stp enable //使能交换设备的STP功能。缺省情况下,设备的STP/RSTP功能处于启用状态。 + +stp converge { fast | normal} +//配置端口的收敛方式 +//根据对ARP表项的处理方式不同,STP/RSTP的收敛方式分为fast和normal两种: +//fast:ARP表将需要更新的表项直接删除。 +//normal:ARP表中需要更新的表项快速老化。 +//交换设备将ARP表中这些表项的剩余存活时间置为0,对这些表项进行老化处理。如果配置的ARP老化探测次数大于零,则ARP对这些表项进行老化探测。 + +//建议选择normal收敛方式。若选择fast方式,频繁的ARP表项删除可能会导致设备CPU占用率高达100%,报文处理超时导致网络震荡。 + +stp bridge-diameter 5 +//配置网络直径。缺省情况下,网络直径为7。 + +stp timer-factor factor +//配置未收到上游的BPDU就重新开始生成树计算的超时时间。 缺省情况下,设备未收到上游的BPDU就重新开始生成树计算的超时时间是Hello Timer的9倍。 + +stp timer forward-delay 1500 +//配置设备的Forward Delay时间。 缺省情况下,设备的Forward Delay时间是1500厘秒(15秒)。 + +stp timer hello 200 +//配置设备的Hello Time时间。 缺省情况下,设备的Hello Time时间是200厘秒(2秒)。 + +stp timer mac-age 2000 +//配置设备的Max Age时间。缺省情况下,设备的Max Age时间是2000厘秒(20秒)。 + +max bandwidth-affected-linknumber 8 +//配置影响带宽的最大连接数。 缺省情况下,影响链路聚合带宽的最大连接数是8。 + +reset stp error packet statistics +//清除生成树协议的错误报文计数。 + +display stp toplogy-change +//查看STP/RSTP拓扑变化相关的统计信息 + +``` diff --git a/计算机网络实验.md/VLAN技术.md b/计算机网络实验.md/VLAN技术.md new file mode 100644 index 00000000..bf4791a1 --- /dev/null +++ b/计算机网络实验.md/VLAN技术.md @@ -0,0 +1,372 @@ +# VLAN技术 +> 参考文献 +> * [VLAN基础知识](https://blog.csdn.net/qq_38265137/article/details/80390759) +> * 可以等到以后复习的时候,补充完整这一块。 + +VLAN简介 +定义: +VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接通信,从而将广播报文限制在一个VLAN内。 + +目的: +以太网是一种基于CSMA/CD(Carrier Sense Multiple Access/Collision Detection)的共享通讯介质的数据网络通讯技术。当主机数目较多时会导致冲突严重、广播泛滥、性能显著下降甚至造成网络不可用等问题。通过交换机实现LAN互连虽然可以解决冲突严重的问题,但仍然不能隔离广播报文和提升网络质量。 + +在这种情况下出现了VLAN技术,这种技术可以把一个LAN划分成多个逻辑的VLAN,每个VLAN是一个广播域,VLAN内的主机间通信就和在一个LAN内一样,而VLAN间则不能直接互通,这样,广播报文就被限制在一个VLAN内。 + +作用: +限制广播域:广播域被限制在一个VLAN内,节省了带宽,提高了网络处理能力。 +增强局域网的安全性:不同VLAN内的报文在传输时是相互隔离的,即一个VLAN内的用户不能和其它VLAN内的用户直接通信。 +提高了网络的健壮性:故障被限制在一个VLAN内,本VLAN内的故障不会影响其他VLAN的正常工作。 +灵活构建虚拟工作组:用VLAN可以划分不同的用户到不同的工作组,同一工作组的用户也不必局限于某一固定的物理范围,网络构建和维护更方便灵活。 +VLAN的基本概念 +VLAN标签: +要使设备能够分辨不同VLAN的报文,需要在报文中添加标识VLAN信息的字段。IEEE 802.1Q协议规定,在以太网数据帧的目的MAC地址和源MAC地址字段之后、协议类型字段之前加入4个字节的VLAN标签(又称VLAN Tag,简称Tag),用以标识VLAN信息。 + +VLAN帧格式: + + +图:VLAN数据帧格式 +字段解释: + +字段 长度 含义 取值 +TPID 2Byte Tag Protocol Identifier(标签协议标识符),表示数据帧类型。 表示帧类型,取值为0x8100时表示IEEE 802.1Q的VLAN数据帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。 各设备厂商可以自定义该字段的值。当邻居设备将TPID值配置为非0x8100时, 为了能够识别这样的报文,实现互通,必须在本设备上修改TPID值,确保和邻居设备的TPID值配置一致。 +PRI 3bit Priority,表示数据帧的802.1p优先级。 取值范围为0~7,值越大优先级越高。当网络阻塞时,设备优先发送优先级高的数据帧。 +CFI 1bit Canonical Format Indicator(标准格式指示位),表示MAC地址在不同的传输介质中是否以标准格式进行封装,用于兼容以太网和令牌环网。 CFI取值为0表示MAC地址以标准格式进行封装,为1表示以非标准格式封装。在以太网中,CFI的值为0。 +VID 12bit VLAN ID,表示该数据帧所属VLAN的编号。 VLAN ID取值范围是0~4095。由于0和4095为协议保留取值,所以VLAN ID的有效取值范围是1~4094。 +设备利用VLAN标签中的VID来识别数据帧所属的VLAN,广播帧只在同一VLAN内转发,这就将广播域限制在一个VLAN内。 + +常用设备收发数据帧的VLAN标签情况: +在一个VLAN交换网络中,以太网帧主要有以下两种格式: + +有标记帧(Tagged帧):加入了4字节VLAN标签的帧。 +无标记帧(Untagged帧):原始的、未加入4字节VLAN标签的帧。 +常用设备中: + +用户主机、服务器、Hub只能收发Untagged帧。 +交换机、路由器和AC既能收发Tagged帧,也能收发Untagged帧。 +语音终端、AP等设备可以同时收发一个Tagged帧和一个Untagged帧。 +为了提高处理效率,设备内部处理的数据帧一律都是Tagged帧。 + +链路类型和接口类型: +设备内部处理的数据帧一律都带有VLAN标签,而现网中的设备有些只会收发Untagged帧,要与这些设备交互,就需要接口能够识别Untagged帧并在收发时给帧添加、剥除VLAN标签。同时,现网中属于同一个VLAN的用户可能会被连接在不同的设备上,且跨越设备的VLAN可能不止一个,如果需要用户间的互通,就需要设备间的接口能够同时识别和发送多个VLAN的数据帧。 + +为了适应不同的连接和组网,设备定义了Access接口、Trunk接口和Hybrid接口3种接口类型,以及接入链路(Access Link)和干道链路(Trunk Link)两种链路类型。 + +链路类型: +根据链路中需要承载的VLAN数目的不同,以太网链路分为: + +接入链路 + +接入链路只可以承载1个VLAN的数据帧,用于连接设备和用户终端(如用户主机、服务器等)。通常情况下,用户终端并不需要知道自己属于哪个VLAN,也不能识别带有Tag的帧,所以在接入链路上传输的帧都是Untagged帧。 + +干道链路 + +干道链路可以承载多个不同VLAN的数据帧,用于设备间互连。为了保证其它网络设备能够正确识别数据帧中的VLAN信息,在干道链路上传输的数据帧必须都打上Tag。 + +接口类型: +根据接口连接对象以及对收发数据帧处理的不同,以太网接口分为: + +Access接口 + +Access接口一般用于和不能识别Tag的用户终端(如用户主机、服务器等)相连,或者不需要区分不同VLAN成员时使用。它只能收发Untagged帧,且只能为Untagged帧添加唯一VLAN的Tag。 + +Trunk接口 + +Trunk接口一般用于连接交换机、路由器、AP以及可同时收发Tagged帧和Untagged帧的语音终端。它可以允许多个VLAN的帧带Tag通过,但只允许一个VLAN的帧从该类接口上发出时不带Tag(即剥除Tag)。 + +Hybrid接口 + +Hybrid接口既可以用于连接不能识别Tag的用户终端(如用户主机、服务器等)和网络设备(如Hub),也可以用于连接交换机、路由器以及可同时收发Tagged帧和Untagged帧的语音终端、AP。它可以允许多个VLAN的帧带Tag通过,且允许从该类接口发出的帧根据需要配置某些VLAN的帧带Tag(即不剥除Tag)、某些VLAN的帧不带Tag(即剥除Tag)。 + +Hybrid接口和Trunk接口在很多应用场景下可以通用,但在某些应用场景下,必须使用Hybrid接口。比如一个接口连接不同VLAN网段的场景中,因为一个接口需要给多个Untagged报文添加Tag,所以必须使用Hybrid接口。 + +缺省VLAN: +缺省VLAN又称PVID(Port Default VLAN ID)。前面提到,设备处理的数据帧都带Tag,当设备收到Untagged帧时,就需要给该帧添加Tag,添加什么Tag,就由接口上的缺省VLAN决定。 + +接口收发数据帧时,对Tag的添加或剥除过程。 + +对于Access接口,缺省VLAN就是它允许通过的VLAN,修改缺省VLAN即可更改接口允许通过的VLAN。 +对于Trunk接口和Hybrid接口,一个接口可以允许多个VLAN通过,但是只能有一个缺省VLAN。接口的缺省VLAN和允许通过的VLAN需要分别配置,互不影响。 +同类型接口添加或剥除VLAN标签的比较: +接口类型 对接收不带Tag的报文处理 对接收带Tag的报文处理 发送帧处理过程 +Access接口 接收该报文,并打上缺省的VLAN ID。 当VLAN ID与缺省VLAN ID相同时,接收该报文。当VLAN ID与缺省VLAN ID不同时,丢弃该报文。 先剥离帧的PVID Tag,然后再发送。 +Trunk接口 打上缺省的VLAN ID,当缺省VLAN ID在允许通过的VLAN ID列表里时,接收该报文。打上缺省的VLAN ID,当缺省VLAN ID不在允许通过的VLAN ID列表里时,丢弃该报文。 当VLAN ID在接口允许通过的VLAN ID列表里时,接收该报文。当VLAN ID不在接口允许通过的VLAN ID列表里时,丢弃该报文。 当VLAN ID与缺省VLAN ID相同,且是该接口允许通过的VLAN ID时,去掉Tag,发送该报文。当VLAN ID与缺省VLAN ID不同,且是该接口允许通过的VLAN ID时,保持原有Tag,发送该报文。 +Hybrid接口 打上缺省的VLAN ID,当缺省VLAN ID在允许通过的VLAN ID列表里时,接收该报文。打上缺省的VLAN ID,当缺省VLAN ID不在允许通过的VLAN ID列表里时,丢弃该报文。 当VLAN ID在接口允许通过的VLAN ID列表里时,接收该报文。当VLAN ID不在接口允许通过的VLAN ID列表里时,丢弃该报文。 当VLAN ID是该接口允许通过的VLAN ID时,发送该报文。可以通过命令设置发送时是否携带Tag。 +当接收到不带VLAN标签的数据帧时,Access接口、Trunk接口、Hybrid接口都会给数据帧打上VLAN标签,但Trunk接口、Hybrid接口会根据数据帧的VID是否为其允许通过的VLAN来判断是否接收,而Access接口则无条件接收。 + +当接收到带VLAN标签的数据帧时,Access接口、Trunk接口、Hybrid接口都会根据数据帧的VID是否为其允许通过的VLAN(Access接口允许通过的VLAN就是缺省VLAN)来判断是否接收。 + +当发送数据帧时: + +Access接口直接剥离数据帧中的VLAN标签。 +Trunk接口只有在数据帧中的VID与接口的PVID相等时才会剥离数据帧中的VLAN标签。 +Hybrid接口会根据接口上的配置判断是否剥离数据帧中的VLAN标签。 +因此,Access接口发出的数据帧肯定不带Tag,Trunk接口发出的数据帧只有一个VLAN的数据帧不带Tag,其他都带VLAN标签,Hybrid接口发出的数据帧可根据需要设置某些VLAN的数据帧带Tag,某些VLAN的数据帧不带Tag。 + +VLAN通信 +VLAN内互访: +同一VLAN内用户互访(简称VLAN内互访)会经过如下三个环节。 + +用户主机的报文转发 + +源主机在发起通信之前,会将自己的IP与目的主机的IP进行比较,如果两者位于同一网段,会获取目的主机的MAC地址,并将其作为目的MAC地址封装进报文;如果两者位于不同网段,源主机会将报文递交给网关,获取网关的MAC地址,并将其作为目的MAC地址封装进报文。 + +设备内部的以太网交换 + +设备 + +如果目的MAC地址+VID匹配自己的MAC表且三层转发标志置位,则进行三层交换,会根据报文的目的IP地址查找三层转发表项,如果没有找到会将报文上送CPU,由CPU查找路由表实现三层转发。 +如果目的MAC地址+VID匹配自己的MAC表但三层转发标志未置位,则进行二层交换,会直接将报文根据MAC表的出接口发出去。 +如果目的MAC地址+VID没有匹配自己的MAC表,则进行二层交换,此时会向所有允许VID通过的接口广播该报文,以获取目的主机的MAC地址。 +设备之间交互时,VLAN标签的添加和剥离 + +设备内部的以太网交换都是带Tag的,为了与不同设备进行成功交互,设备需要根据接口的设置添加或剥除Tag。不同接口VLAN标签添加和剥离情况不同。 + +从以太网交换原理可以看出,划分VLAN后,广播报文只在同一VLAN内二层转发,因此同一VLAN内的用户可以直接二层互访。根据属于同一VLAN的主机是否连接在不同的设备,VLAN内互访有两种场景:同设备VLAN内互访和跨设备VLAN内互访。 + +同设备VLAN内互访: +如下图所示,用户主机Host_1和Host_2连接在同台设备上,属于同一VLAN2,且位于相同网段,连接接口均设置为Access接口。 +(假设Router上还未建立任何转发表项)。 + + +Host_1判断目的IP地址跟自己的IP地址在同一网段,于是发送ARP广播请求报文获取目的主机Host_2的MAC地址,报文目的MAC填写全F,目的IP为Host_2的IP地址10.1.1.3。 +报文到达Router的接口IF_1,发现是Untagged帧,给报文添加VID=2的Tag(Tag的VID=接口的PVID),然后根据报文的源MAC地址、VID和报文入接口(1-1-1, 2, IF_1)生成MAC表。 +根据报文目的MAC地址+VID查找Router的MAC表,没有找到,于是在所有允许VLAN2通过的接口(本例中接口为IF_2)广播该报文。 +Router的接口IF_2在发出ARP请求报文前,根据接口配置,剥离VID=2的Tag。 +Host_2收到该ARP请求报文,将Host_1的MAC地址和IP地址对应关系记录ARP表。然后比较目的IP与自己的IP,发现跟自己的相同,就发送ARP响应报文,报文中封装自己的MAC地址2-2-2,目的IP为Host_1的IP地址10.1.1.2。 +Router的接口IF_2收到ARP响应报文后,同样给报文添加VID=2的Tag。 +Router根据报文的源MAC地址、VID和报文入接口(2-2-2, 2, IF_2)生成MAC表,然后根据报文的目的MAC地址+VID(1-1-1, 2)查找MAC地址表,由于前面已记录,查找成功,向出接口IF_1转发该ARP响应报文。 +Router向出接口IF_1转发前,同样根据接口配置剥离VID=2的Tag。 +Host_1收到Host_2的ARP响应报文,将Host_2的MAC地址和IP地址对应关系记录ARP表。 +后续Host_1与Host_2的互访,由于彼此已学习到对方的MAC地址,报文中的目的MAC地址直接填写对方的MAC地址。 + +此组网场景下,当同一VLAN的用户处于不同网段时,主机将在报文中封装网关的MAC地址,可借助VLANIF技术(需配置主从IP地址)实现互访。 + +跨设备VLAN内互访: +如下图,用户主机Host_1和Host_2连接在不同的设备上,属于同一个VLAN2,且位于相同网段。为了识别和发送跨越设备的数据帧,设备间通过干道链路连接。 + + +当用户主机Host_1发送报文给用户主机Host_2时,报文的发送过程如下(假设Router_1和Router_2上还未建立任何转发表项)。 + +经过与同设备VLAN内互访的步骤1~2一样的过程后,报文被广播到Router_1的IF_2接口。 +Router_1的IF_2接口在发出ARP请求报文前,因为接口的PVID=1(缺省值),与报文的VID不相等,直接透传该报文到Router_2的IF_2接口,不剥除报文的Tag。 +Router_2的IF_2接口收到该报文后,判断报文的Tag中的VID=2是接口允许通过的VLAN,接收该报文。 +经过与同设备VLAN内互访的步骤3~6一样的过程后,Router_2将向其出接口IF_2转发Host_2的ARP响应报文,转发前,因为接口IF_2为Trunk接口且PVID=1(缺省值),与报文的VID不相等,直接透传报文到Router_1的IF_2接口。 +Router_1的IF_2接口收到Host_2的ARP响应报文后,判断报文的Tag中的VID=2是接口允许通过的VLAN,接收该报文。后续处理同同设备VLAN内互访的步骤7~9一样。 +可见,干道链路除可传输多个VLAN的数据帧外,还起到透传VLAN的作用,即干道链路上,数据帧只会转发,不会发生Tag的添加或剥离。 + +VLAN间互访: +划分VLAN后,由于广播报文只在同VLAN内转发,所以不同VLAN的用户间不能二层互访,这样能起到隔离广播的作用。但实际应用中,不同VLAN的用户又常有互访的需求,此时就需要实现不同VLAN的用户互访,简称VLAN间互访。 + +同VLAN间互访一样,VLAN间互访也会经过用户主机的报文转发、设备内部的以太网交换、设备之间交互时VLAN标签的添加和剥离三个环节。同样,根据以太网交换原理,广播报文只在同一VLAN内转发,不同VLAN内的用户则不能直接二层互访,需要借助三层路由技术或VLAN转换技术才能实现互访。 + +VLAN间互访技术: +华为提供了多种技术实现VLAN间互访,常用的两种技术为VLANIF接口和Dot1q终结子接口。 + +VLANIF接口 + +VLANIF接口是一种三层的逻辑接口。在VLANIF接口上配置IP地址后,设备会在MAC地址表中添加VLANIF接口的MAC地址+VID表项,并且为表项的三层转发标志位置位。当报文的目的MAC地址匹配该表项后,会进行三层转发,进而实现VLAN间的三层互通。 + +VLANIF配置简单,是实现VLAN间互访最常用的一种技术。但每个VLAN需要配置一个VLANIF,并在接口上指定一个IP子网网段,比较浪费IP地址。 + +Dot1q终结子接口 + +子接口也是一种三层的逻辑接口。跟VLANIF接口一样,在子接口上配置Dot1q终结功能和IP地址后,设备也会添加相应的MAC表项并置位三层转发标志位,进而实现VLAN间的三层互通。 + +Dot1q终结子接口适用于通过一个三层以太网接口下接多个VLAN网络的环境。由于不同VLAN的数据流会争用同一个以太网主接口的带宽,网络繁忙时,会导致通信瓶颈。 + +通过VLANIF接口实现VLAN间互访,必须要求VLAN间的用户都只能处于不同的网段(因为相同网段,主机会封装目的主机的MAC地址,设备判断进行二层交换,二层交换只在同VLAN内,广播报文无法到达不同的VLAN,获取不到目的主机的MAC地址,也就无法实现互通)。现网中,也存在不同VLAN相同网段的组网需求,此时可通过VLAN聚合实现。 + +VLAN聚合(又称Super VLAN)通过引入Super-VLAN和Sub-VLAN,将一个Super-VLAN和多个Sub-VLAN关联,多个Sub-VLAN共享Super-VLAN的IP地址作为其网关IP,实现与外部网络的三层互通;并通过在Sub-VLAN间启用Proxy ARP,实现Sub-VLAN间的三层互通,进而即节约IP地址资源,又实现VLAN间的三层互通。 + +VLAN聚合通常用于多个VLAN共用一个网关的组网场景。 + +同设备VLAN间互访: +如下图:互访的源主机Host_1和目的主机Host_2连接在同一台设备Router上,分别属于VLAN2和VLAN3,并位于不同的网段。在Router上分别创建VLANIF2和VLANIF3并配置其IP地址,然后将用户主机的缺省网关设置为所属VLAN对应VLANIF接口的IP地址。 + + + +当用户主机Host_1发送报文给用户主机Host_2时,报文的发送过程如下(假设Router上还未建立任何转发表项)。 + +Host_1判断目的IP地址跟自己的IP地址不在同一网段,因此,它发出请求网关MAC地址的ARP请求报文,目的IP为网关IP 10.1.1.1,目的MAC为全F。 +报文到达Router的接口IF_1,Router给报文添加VID=2的Tag(Tag的VID=接口的PVID),然后将报文的源MAC地址+VID与接口的对应关系(1-1-1, 2, IF_1)添加进MAC表。 +Router检查报文是ARP请求报文,且目的IP是自己VLANIF2接口的IP地址,给Host_1应答,并将VLANIF2接口的MAC地址3-3-3封装在应答报文中,应答报文从IF_1发出前,剥掉VID=2的Tag。同时,Router会将Host_1的IP地址与MAC地址的对应关系记录到ARP表。 +Host_1收到Router的应答报文,将Router的VLANIF2接口的IP地址与MAC地址对应关系记录到自己的ARP表中,并向Router发送目的MAC为3-3-3、目的IP为Host_2的IP地址 10.2.2.2的报文。 +报文到达Router的接口IF_1,同样给报文添加VID=2的Tag。 +Router根据报文的源MAC地址+VID与接口的对应关系更新MAC表,并比较报文的目的MAC地址与VLANIF2的MAC地址,发现两者相等,进行三层转发,根据目的IP查找三层转发表,没有找到匹配项,上送CPU查找路由表。 +CPU根据报文的目的IP去找路由表,发现匹配了一个直连网段(VLANIF3对应的网段),于是继续查找ARP表,没有找到,Router会在目的网段对应的VLAN3的所有接口发送ARP请求报文,目的IP是10.2.2.2。从接口IF_2发出前,根据接口配置,剥掉VID=2的Tag。 +Host_2收到ARP请求报文,发现请求IP是自己的IP地址,就发送ARP应答报文,将自己的MAC地址包含在其中。同时,将VLANIF3的MAC地址与IP地址的对应关系记录到自己的ARP表中。 +Router的接口IF_2收到Host_2的ARP应答报文后,给报文添加VID=3的Tag,并将Host_2的MAC和IP的对应关系记录到自己的ARP表中。然后,将Host_1的报文转发给Host_2,发送前,同样剥离报文中的Tag。同时,将Host_2的IP、MAC、VID及出接口的对应关系记录到三层转发表中。 +至此,Host_1完成对Host_2的单向访问。Host_2访问Host_1的过程与此类似。这样,后续Host_1与Host_2之间的往返报文,都先发送给网关Router,由Router查三层转发表进行三层转发。 + +跨设备VLAN间互访: +由于VLANIF接口的IP地址只能在设备上生成直连路由,当不同VLAN的用户跨多台设备互访时,除配置VLANIF接口的IP地址外,还需要配置静态路由或运行动态路由协议。 + +如下图所示,互访的源主机Host_1和目的主机Host_2连接在不同的设备Router_1和Router_2上,分别属于VLAN2和VLAN3,并位于不同的网段。在Router_1上分别创建VLANIF2和VLANIF4,配置其IP地址为10.1.1.1和10.1.4.1;在Router_2上分别创建VLANIF3和VLANIF4,配置其IP地址为10.1.2.1和10.1.4.2,并在Router_1和Router_2上分别配置静态路由。Router_1上静态路由的目的网段是10.1.2.0/24,下一跳是10.1.4.2;Router_2上静态路由的目的网段是10.1.1.0/24,下一跳是10.1.4.1。 + + + +当用户主机Host_1发送报文给用户主机Host_2时,报文的发送过程如下(假设Router_1和Router_2上还未建立任何转发表项)。 + +与同设备VLAN间互访的步骤1~6一样,经过“Host_1比较目的IP地址—>Host_1查ARP表—>Host_1获取网关MAC地址—>Host_1将发给Host_2的报文送到Router_1—>Router_1查MAC表—>Router_1查三层转发表”的过程,Router_1上送CPU查找路由表。 +Router_1的CPU根据报文的目的IP 10.1.2.2去找路由表,发现匹配了一个路由网段10.1.2.0/24(VLANIF3对应的网段),下一跳IP地址为10.1.4.2,于是继续查找ARP表,没有找到,Router_1会在下一跳IP地址对应的VLAN4的所有接口发送ARP请求报文,目的IP是10.1.4.2。报文从Router_1的接口IF_2发出前,根据接口配置,直接透传该报文到Router_2的IF_2接口,不剥除报文的Tag。 +ARP请求报文到达Router_2后,发现目的IP为VLANIF4接口的IP地址,给Router_1回应,填写VLANIF4接口的MAC地址。 +Router_2的ARP响应报文从其IF_2接口直接透传到Router_1,Router_1接收后,记录VLANIF4的MAC地址与IP地址的对应关系到ARP表项。 +Router_1将Host_1的报文转发给Router_2,报文的目的MAC修改为Router_2的VLANIF4接口的MAC地址,源MAC地址修改自己的VLANIF4接口的MAC地址,并将刚用到的转发信息记录在三层转发表中(10.1.2.0/24,下一跳IP的MAC地址, 出口VLAN, 出接口)。同样,报文是直接透传到Router_2的IF_2接口。 +Router_2收到Router_1转发的Host_1的报文后,与同设备VLAN间互访的步骤6~9一样,经过“查MAC表—>查三层转发表—>送CPU—>匹配直连路由—>查ARP表并获取Host_2的MAC地址—>将Host_1的报文转发给Host_2”的过程,同时将Host_2的IP地址、MAC地址、出口VLAN、出接口记录到三层转发表项。 +VLAN Damping: +VLAN抑制 + +如果指定VLAN已经创建对应的VLANIF接口,当VLAN中所有接口状态变为Down而引起VLAN状态变为Down时,VLAN会向VLANIF接口上报接口Down状态,从而引起VLANIF接口状态变化。 + +为避免由于VLANIF接口状态变化引起的网络震荡,可以在VLANIF接口上启动VLAN Damping功能,抑制VLANIF接口状态变为Down的时间。 + +当使能VLAN Damping功能,VLAN中最后一个处于Up状态的接口变为Down后,会抑制一定时间(抑制时间可配置)再上报给VLANIF接口。如果在抑制时间内VLAN中有接口Up,则VLANIF接口状态保持Up状态不变。即VLAN Damping功能可以适当延迟VLAN向VLANIF接口上报接口Down状态的时间,从而抑制不必要的路由震荡。 + +VLAN内二层隔离: +为了实现用户之间的二层隔离,可以将不同的用户加入不同的VLAN。但若企业规模很大,拥有大量的用户,那么就要为不能互相访问的用户都分配VLAN,这不但需要耗费大量的VLAN,还增加了网络管理者配置和维护的工作量。 + +为此,华为提供了一些VLAN内二层隔离技术,如端口隔离、MUX VLAN和基于MQC的VLAN内二层隔离等。 + +端口隔离: +端口隔离可实现同一VLAN内端口之间的隔离。用户只需要将端口加入到隔离组中,就可以实现隔离组内端口之间的二层隔离,不同隔离组的端口之间或者不属于任何隔离组的端口与其他端口之间都能进行正常的数据转发。同时,用户还可以通过配置实现端口的单向隔离,为用户提供更安全、更灵活的组网方案。 + +MUX VLAN: +MUX VLAN(Multiplex VLAN)提供了一种通过VLAN进行网络资源控制的机制。它既可实现VLAN间用户通信,也可实现VLAN内的用户相互隔离。 + +比如,企业有如下需求: + +要求企业内部员工之间可以互相交流,而企业客户之间是隔离的,不能够互相访问。 +要求企业员工和企业客户都可以访问企业的服务器。 +此种场景,通过部署MUX-VLAN就可以实现。 + +基于流策略的VLAN内二层隔离: +流策略是将流分类和流行为关联后形成的完整的QoS策略。基于流策略的VLAN内二层隔离指用户可以根据匹配规则对报文进行流分类,然后通过流策略将流分类与permit/deny动作相关联,使符合流分类的报文被允许或被禁止通过,从而实现灵活的VLAN内单向或双向隔离。 + +VLAN间三层隔离: +VLAN间实现三层互通后,两VLAN内的所有用户之间都可以互相访问,但某些场景中,需要禁止部分用户之间的互访或者只允许用户单向访问,比如用户主机和服务器之间一般是单向访问、企业的访客一般只允许上网和访问部分服务器等。此时,就需要配置VLAN间互访控制。 + +VLAN间互访控制一般通过流策略实现。用户可根据实际需求定义匹配规则对报文进行流分类,然后通过流策略将流分类与permit/deny动作相关联,使符合流分类的报文被允许或禁止通过,从而实现灵活的VLAN间互访控制。 + +管理VLAN: +当用户通过远端网管集中管理设备时,需要在设备上通过VLANIF接口配置IP地址作为设备管理IP,通过管理IP来STelnet到设备上进行管理。若设备上其他接口相连的用户加入该VLAN,也可以访问该设备,增加了设备的不安全因素。 + +这种情况下可以配置VLAN为管理VLAN(与管理VLAN对应,没有指定为管理VLAN的VLAN称为业务VLAN),不允许Access类型和Dot1q-tunnel类型接口加入该VLAN。由于Access类型和Dot1q-tunnel类型通常用于连接用户,限制这两种类型接口加入管理VLAN后,与该接口相连的用户就无法访问该设备,从而增加了设备的安全性。 + + + +VLAN聚合简介: +VLAN聚合(VLAN Aggregation,也称Super VLAN)指在一个物理网络内,用多个VLAN(称为Sub-VLAN)隔离广播域,并将这些Sub-VLAN聚合成一个逻辑的VLAN(称为Super-VLAN),这些Sub-VLAN使用同一个IP子网和缺省网关。 + +通过引入Super-VLAN和Sub-VLAN的概念,使每个Sub-VLAN对应一个广播域,并让多个Sub-VLAN和一个Super-VLAN关联,只给Super-VLAN分配一个IP子网,所有Sub-VLAN都使用Super-VLAN的IP子网和缺省网关进行三层通信。 + +这样,多个Sub-VLAN共享一个网关地址,节约了子网号、子网定向广播地址、子网缺省网关地址,且各Sub-VLAN间的界线也不再是从前的子网界线了,它们可以根据各自主机的需求数目在Super-VLAN对应子网内灵活的划分地址范围,从而即保证了各个Sub-VLAN作为一个独立广播域实现广播隔离,又节省了IP地址资源,提高了编址的灵活性。 + +原理描述: +VLAN聚合通过定义Super-VLAN和Sub-VLAN,使Sub-VLAN只包含物理接口,负责保留各自独立的广播域;Super-VLAN不包含物理接口,只用来建立三层VLANIF接口。然后再通过建立Super-VLAN和Sub-VLAN间的映射关系,把三层VLANIF接口和物理接口两部分有机的结合起来,实现所有Sub-VLAN共用一个网关与外部网络通信,并用ARP Proxy实现Sub-VLAN间的三层通信,从而在实现普通VLAN的隔离广播域的同时,达到节省IP地址的目的。 + +Sub-VLAN:只包含物理接口,不能建立三层VLANIF接口,用于隔离广播域。每个Sub-VLAN内的主机与外部的三层通信是靠Super-VLAN的三层VLANIF接口来实现的。 +Super-VLAN:只建立三层VLANIF接口,不包含物理接口,与子网网关对应。与普通VLAN不同的是,它的VLANIF接口的Up不依赖于自身物理接口的Up,而是只要它所含Sub-VLAN中存在Up的物理接口就Up。 +一个Super-VLAN可以包含一个或多个Sub-VLAN。Sub-VLAN不再占用一个独立的子网网段。在同一个Super-VLAN中,无论主机属于哪一个Sub-VLAN,它的IP地址都在Super-VLAN对应的子网网段内。 + +这样,Sub-VLAN间共用同一个网关,既减少了一部分子网号、子网缺省网关地址和子网定向广播地址的消耗,又实现了不同广播域使用同一子网网段地址的目的,消除了子网差异,增加了编址的灵活性,减少了闲置地址浪费。 + +Sub-VLAN之间的通信: +VLAN聚合在实现不同VLAN共用同一子网网段地址的同时,也给Sub-VLAN间的三层转发带来了问题。普通VLAN中,不同VLAN内的主机可以通过各自不同的网关进行三层互通。但是Super-VLAN中,所有Sub-VLAN内的主机使用的是同一个网段的地址,共用同一个网关地址,主机只会做二层转发,而不会送网关进行三层转发。即实际上,不同Sub-VLAN的主机在二层是相互隔离的,这就造成了Sub-VLAN间无法通信的问题。 + +解决这一问题的方法就是使用Proxy ARP。 + +示列: +如下图所示,假设Sub-VLAN2内的主机Host_1与Sub-VLAN3内的主机Host_2要通信,在Super-VLAN10的VLANIF接口上启用Proxy +ARP。 + + + +图:Proxy ARP实现不同Sub-VLAN间的三层通信组网图 +Host_1与Host_2的通信过程如下(假设Host_1的ARP表中无Host_2的对应表项): + +Host_1将Host_2的IP地址(10.1.1.12)和自己所在网段10.1.1.0/24进行比较,发现Host_2和自己在同一个子网,但是Host_1的ARP表中无Host_2的对应表项。 +Host_1发送ARP广播报文,请求Host_2的MAC地址,目的IP为10.1.1.12。 +网关Router收到Host_1的ARP请求,由于网关上使能Sub-VLAN间的Proxy ARP,开始使用报文中的目的IP地址在路由表中查找,发现匹配了一条路由,下一跳为直连网段(VLANIF10的10.1.1.0/24),VLANIF10对应Super-VLAN10,则向Super-VLAN10的所有Sub-VLAN接口发送一个ARP广播,请求Host_2的MAC地址。 +Host_2收到网关发送的ARP广播后,对此请求进行ARP应答。 +网关收到Host_2的应答后,就把自己的MAC地址回应给Host_1。 +Host_1之后要发给Host_2的报文都先发送给网关,由网关做三层转发。 +Host_2发送报文给Host_1的过程和上述的Host_1发送报文给Host_2的过程类似,不再赘述。 + +Sub_VLAN与其他网络的三层通信: +以所示组网为例,介绍Sub-VLAN内主机与其他网络内的主机间通信过程。 + +如下图,用户主机与服务器处于不同的网段中,Router_1上配置了Sub-VLAN2、Sub-VLAN3、Super-VLAN4和VLAN10,Router_2上配置了VLAN10和VLAN20。 + + + +图:Sub-VLAN与其他网络的三层通信组网图 +假设Sub-VLAN2下的主机Host_1想访问与Router_2相连的Server,报文转发流程如下(假设Router_1上已配置了去往10.1.2.0/24网段的路由,Router_2上已配置了去往10.1.1.0/24网段的路由,但两设备没有任何三层转发表项): + +Host_1将Server的IP地址(10.1.2.2)和自己所在网段10.1.1.0/24进行比较,发现和自己不在同一个子网,发送ARP请求给自己的网关,请求网关的MAC地址,目的MAC为全F,目的IP为10.1.1.1。 +Router_1收到该请求报文后,查找Sub-VLAN和Super-VLAN的对应关系,知道应该回应Super-VLAN4对应的VLANIF4的MAC地址,并知道从Sub-VLAN2的接口回应给Host_1。 +Host_1学习到网关的MAC地址后,开始发送目的MAC为Super-VLAN4对应的VLANIF4的MAC地址、目的IP为10.1.2.2的报文。 +Router_1收到该报文后,根据Sub-VLAN和Super-VLAN的对应关系以及目的MAC判断进行三层转发,查三层转发表项没有找到匹配项,上送CPU查找路由表,得到下一跳地址为10.1.10.2,出接口为VLANIF10,并通过ARP表项和MAC表项确定出接口,把报文发送给Router_2。 +Router_2根据正常的三层转发流程把报文发送给Server。 +Server收到Host_1的报文后给Host_1回应,回应报文的目的IP为10.1.1.2,目的MAC为Router_2上VLANIF20接口的MAC地址,回应报文的转发流程如下: + +Server给Host_1的回应报文按照正常的三层转发流程到达Router_1。到达Router_1时,报文的目的MAC地址为Router_1上VLANIF10接口的MAC地址。 +Router_1收到该报文后根据目的MAC地址判断进行三层转发,查三层转发表项没有找到匹配项,上送CPU,CPU查路由表,发现目的IP为10.1.1.2对应的出接口为VLANIF4,查找Sub-VLAN和Super-VLAN的对应关系,并通过ARP表项和MAC表项,知道报文应该从Sub-VLAN2的接口发送给Host_1。 +回应报文到达Host_1。 +Sub-VLAN与其他设备的二层通信: +如下图所示组网为例,介绍Sub-VLAN内主机与其他设备的二层通信情况。Router_1上配置了Sub-VLAN2、Sub-VLAN3和Super-VLAN4,_Router_1的_IF_1和IF_2配置为Access接口,IF_3接口配置为Trunk接口,并允许VLAN2和VLAN3通过;Router_2连接Router_1的接口配置为Trunk接口,并允许VLAN2和VLAN3通过。 + + +图:Sub-VLAN与其他设备的二层通信组网图 +从Host_1进入Router_1的报文会被打上VLAN2的Tag。在Router_1中这个Tag不会因为VLAN2是VLAN4的Sub-VLAN而变为VLAN4的Tag。该报文从Router_1的Trunk接口IF_3出去时,依然是携带VLAN2的Tag。 + +也就是说,Router_1本身不会发出VLAN4的报文。就算其他设备有VLAN4的报文发送到该设备上,这些报文也会因为Router_1上没有VLAN4对应的物理接口而被丢弃。因为Router_1的IF_3接口上根本就不允许Super-VLAN4通过。对于其他设备而言,有效的VLAN只有Sub-VLAN2和Sub-VLAN3,所有的报文都是在这些VLAN中交互的。 + +这样,Router_1上虽然配置了VLAN聚合,但与其他设备的二层通信,不会涉及到Super-VLAN,与正常的二层通信流程一样。 + +配置Super-VALN: +配置注意事项: +VLAN1不能配置为Super-VLAN。 +配置某VLAN为Super-VLAN后,该VLAN类型改变为super,不允许任何物理接口加入该VLAN。 +流策略只有在Super-vlan的所有Sub-vlan下配置才能生效,在Super-vlan下配置不生效。 +配置某个VLAN为子接口的终结VLAN后,该VLAN不能再配置为Super-VLAN或Sub-VLAN。 +Super-VLAN对应的VLANIF接口配置IP地址后Proxy ARP才能生效。 +配置聚合VLAN: +拓扑: +PC1,2 属于VLAN10 ,PC3,4属于VLAN20,通过聚合VLAN100,实现共用网关IP地址,开启VLAN间ARP代理,实现VLAN间通信。 + + + +图:VLAN聚合配置拓扑 +配置参数: +[SW]dis current-configuration +# +sysname SW +# +vlan batch 10 20 100 + //批量创建VLAN +# +vlan 100 + aggregate-vlan//创建聚合VLAN + access-vlan 10 20//将valn10 20 添加进聚合和VLAN +# +interface Vlanif100 + ip address 10.0.100.254 255.255.255.0 + arp-proxy inter-sub-vlan-proxy enable + //开启VLAN间ARP代理,实现VLAN间通信 +# +interface GigabitEthernet0/0/1 + port link-type access + port default vlan 10 +# +interface GigabitEthernet0/0/2 + port link-type access + port default vlan 10 +# +interface GigabitEthernet0/0/3 + port link-type access + port default vlan 20 +# +interface GigabitEthernet0/0/4 + port link-type access + port default vlan 20 +# \ No newline at end of file diff --git a/计算机网络实验.md/image/ASExternal-LSA通告格式.png b/计算机网络实验.md/image/ASExternal-LSA通告格式.png new file mode 100644 index 00000000..bd8c8966 Binary files /dev/null and b/计算机网络实验.md/image/ASExternal-LSA通告格式.png differ diff --git a/计算机网络实验.md/image/BGPOPEN报文格式.png b/计算机网络实验.md/image/BGPOPEN报文格式.png new file mode 100644 index 00000000..27ce314c Binary files /dev/null and b/计算机网络实验.md/image/BGPOPEN报文格式.png differ diff --git a/计算机网络实验.md/image/BGP报文头实例.png b/计算机网络实验.md/image/BGP报文头实例.png new file mode 100644 index 00000000..bd0e296d Binary files /dev/null and b/计算机网络实验.md/image/BGP报文头实例.png differ diff --git a/计算机网络实验.md/image/BGP报文头格式.png b/计算机网络实验.md/image/BGP报文头格式.png new file mode 100644 index 00000000..d5f0bc69 Binary files /dev/null and b/计算机网络实验.md/image/BGP报文头格式.png differ diff --git a/计算机网络实验.md/image/BGP状态机.png b/计算机网络实验.md/image/BGP状态机.png new file mode 100644 index 00000000..8d20d85f Binary files /dev/null and b/计算机网络实验.md/image/BGP状态机.png differ diff --git a/计算机网络实验.md/image/BGP路由衰减.png b/计算机网络实验.md/image/BGP路由衰减.png new file mode 100644 index 00000000..e6bda8f8 Binary files /dev/null and b/计算机网络实验.md/image/BGP路由衰减.png differ diff --git a/计算机网络实验.md/image/Keepalive报文实例.png b/计算机网络实验.md/image/Keepalive报文实例.png new file mode 100644 index 00000000..2799862a Binary files /dev/null and b/计算机网络实验.md/image/Keepalive报文实例.png differ diff --git a/计算机网络实验.md/image/LSAHeader.png b/计算机网络实验.md/image/LSAHeader.png new file mode 100644 index 00000000..c36f6c5c Binary files /dev/null and b/计算机网络实验.md/image/LSAHeader.png differ diff --git a/计算机网络实验.md/image/NetworkLSA通告格式.png b/计算机网络实验.md/image/NetworkLSA通告格式.png new file mode 100644 index 00000000..12db754d Binary files /dev/null and b/计算机网络实验.md/image/NetworkLSA通告格式.png differ diff --git a/计算机网络实验.md/image/Notification报文实例.png b/计算机网络实验.md/image/Notification报文实例.png new file mode 100644 index 00000000..8e1c11de Binary files /dev/null and b/计算机网络实验.md/image/Notification报文实例.png differ diff --git a/计算机网络实验.md/image/Notification报文格式.png b/计算机网络实验.md/image/Notification报文格式.png new file mode 100644 index 00000000..38ebf12e Binary files /dev/null and b/计算机网络实验.md/image/Notification报文格式.png differ diff --git a/计算机网络实验.md/image/OPEN报文实例.png b/计算机网络实验.md/image/OPEN报文实例.png new file mode 100644 index 00000000..89d38d4e Binary files /dev/null and b/计算机网络实验.md/image/OPEN报文实例.png differ diff --git a/计算机网络实验.md/image/OSPFDD报文实例.png b/计算机网络实验.md/image/OSPFDD报文实例.png new file mode 100644 index 00000000..15ad11db Binary files /dev/null and b/计算机网络实验.md/image/OSPFDD报文实例.png differ diff --git a/计算机网络实验.md/image/OSPFDD报文格式.png b/计算机网络实验.md/image/OSPFDD报文格式.png new file mode 100644 index 00000000..26f298ed Binary files /dev/null and b/计算机网络实验.md/image/OSPFDD报文格式.png differ diff --git a/计算机网络实验.md/image/OSPFLSACK报文实例.png b/计算机网络实验.md/image/OSPFLSACK报文实例.png new file mode 100644 index 00000000..b1902a25 Binary files /dev/null and b/计算机网络实验.md/image/OSPFLSACK报文实例.png differ diff --git a/计算机网络实验.md/image/OSPFLSACK报文格式.png b/计算机网络实验.md/image/OSPFLSACK报文格式.png new file mode 100644 index 00000000..32722702 Binary files /dev/null and b/计算机网络实验.md/image/OSPFLSACK报文格式.png differ diff --git a/计算机网络实验.md/image/OSPFLSR报文实例.png b/计算机网络实验.md/image/OSPFLSR报文实例.png new file mode 100644 index 00000000..ddb84de8 Binary files /dev/null and b/计算机网络实验.md/image/OSPFLSR报文实例.png differ diff --git a/计算机网络实验.md/image/OSPFLSR报文格式.png b/计算机网络实验.md/image/OSPFLSR报文格式.png new file mode 100644 index 00000000..0cb64145 Binary files /dev/null and b/计算机网络实验.md/image/OSPFLSR报文格式.png differ diff --git a/计算机网络实验.md/image/OSPFLSU报文实例.png b/计算机网络实验.md/image/OSPFLSU报文实例.png new file mode 100644 index 00000000..0ac523f1 Binary files /dev/null and b/计算机网络实验.md/image/OSPFLSU报文实例.png differ diff --git a/计算机网络实验.md/image/OSPFLSU报文格式.png b/计算机网络实验.md/image/OSPFLSU报文格式.png new file mode 100644 index 00000000..f03db8ec Binary files /dev/null and b/计算机网络实验.md/image/OSPFLSU报文格式.png differ diff --git a/计算机网络实验.md/image/OSPFhello报文.png b/计算机网络实验.md/image/OSPFhello报文.png new file mode 100644 index 00000000..3e5b42af Binary files /dev/null and b/计算机网络实验.md/image/OSPFhello报文.png differ diff --git a/计算机网络实验.md/image/OSPF五种链路状态描述类型.png b/计算机网络实验.md/image/OSPF五种链路状态描述类型.png new file mode 100644 index 00000000..e657a5b4 Binary files /dev/null and b/计算机网络实验.md/image/OSPF五种链路状态描述类型.png differ diff --git a/计算机网络实验.md/image/OSPF五种链路通告类型.png b/计算机网络实验.md/image/OSPF五种链路通告类型.png new file mode 100644 index 00000000..0f8f3895 Binary files /dev/null and b/计算机网络实验.md/image/OSPF五种链路通告类型.png differ diff --git a/计算机网络实验.md/image/OSPF报文.jpg b/计算机网络实验.md/image/OSPF报文.jpg new file mode 100644 index 00000000..ece3d912 Binary files /dev/null and b/计算机网络实验.md/image/OSPF报文.jpg differ diff --git a/计算机网络实验.md/image/OSPF报文交互过程.png b/计算机网络实验.md/image/OSPF报文交互过程.png new file mode 100644 index 00000000..aabbedfd Binary files /dev/null and b/计算机网络实验.md/image/OSPF报文交互过程.png differ diff --git a/计算机网络实验.md/image/OSPF报文头.png b/计算机网络实验.md/image/OSPF报文头.png new file mode 100644 index 00000000..92e6acc6 Binary files /dev/null and b/计算机网络实验.md/image/OSPF报文头.png differ diff --git a/计算机网络实验.md/image/OSPF邻居状态机.png b/计算机网络实验.md/image/OSPF邻居状态机.png new file mode 100644 index 00000000..10e5aa23 Binary files /dev/null and b/计算机网络实验.md/image/OSPF邻居状态机.png differ diff --git a/计算机网络实验.md/image/PPP帧格式.jpg b/计算机网络实验.md/image/PPP帧格式.jpg new file mode 100644 index 00000000..686a8ec3 Binary files /dev/null and b/计算机网络实验.md/image/PPP帧格式.jpg differ diff --git a/计算机网络实验.md/image/PPP状态图.jpg b/计算机网络实验.md/image/PPP状态图.jpg new file mode 100644 index 00000000..c1ad9f97 Binary files /dev/null and b/计算机网络实验.md/image/PPP状态图.jpg differ diff --git a/计算机网络实验.md/image/PPP状态图.png b/计算机网络实验.md/image/PPP状态图.png new file mode 100644 index 00000000..ae003ce6 Binary files /dev/null and b/计算机网络实验.md/image/PPP状态图.png differ diff --git a/计算机网络实验.md/image/Refresh报文实例.png b/计算机网络实验.md/image/Refresh报文实例.png new file mode 100644 index 00000000..47a19161 Binary files /dev/null and b/计算机网络实验.md/image/Refresh报文实例.png differ diff --git a/计算机网络实验.md/image/Refresh报文格式.png b/计算机网络实验.md/image/Refresh报文格式.png new file mode 100644 index 00000000..ee1a7a8c Binary files /dev/null and b/计算机网络实验.md/image/Refresh报文格式.png differ diff --git a/计算机网络实验.md/image/Router-LSA通告格式.png b/计算机网络实验.md/image/Router-LSA通告格式.png new file mode 100644 index 00000000..0450c3d9 Binary files /dev/null and b/计算机网络实验.md/image/Router-LSA通告格式.png differ diff --git a/计算机网络实验.md/image/STP报文实例.png b/计算机网络实验.md/image/STP报文实例.png new file mode 100644 index 00000000..a04e7ba8 Binary files /dev/null and b/计算机网络实验.md/image/STP报文实例.png differ diff --git a/计算机网络实验.md/image/STP报文格式.png b/计算机网络实验.md/image/STP报文格式.png new file mode 100644 index 00000000..5d2d32dd Binary files /dev/null and b/计算机网络实验.md/image/STP报文格式.png differ diff --git a/计算机网络实验.md/image/Summary-LSA通告格式.png b/计算机网络实验.md/image/Summary-LSA通告格式.png new file mode 100644 index 00000000..93ed132e Binary files /dev/null and b/计算机网络实验.md/image/Summary-LSA通告格式.png differ diff --git a/计算机网络实验.md/image/UPDATE报文实例.png b/计算机网络实验.md/image/UPDATE报文实例.png new file mode 100644 index 00000000..3f8fdd46 Binary files /dev/null and b/计算机网络实验.md/image/UPDATE报文实例.png differ diff --git a/计算机网络实验.md/image/UPDATE报文格式.png b/计算机网络实验.md/image/UPDATE报文格式.png new file mode 100644 index 00000000..a029303d Binary files /dev/null and b/计算机网络实验.md/image/UPDATE报文格式.png differ diff --git a/计算机网络实验.md/image/VLAN帧格式.jpg b/计算机网络实验.md/image/VLAN帧格式.jpg new file mode 100644 index 00000000..9b745df8 Binary files /dev/null and b/计算机网络实验.md/image/VLAN帧格式.jpg differ diff --git a/计算机网络实验.md/image/VLAN数据帧格式.png b/计算机网络实验.md/image/VLAN数据帧格式.png new file mode 100644 index 00000000..d33ab2ee Binary files /dev/null and b/计算机网络实验.md/image/VLAN数据帧格式.png differ diff --git a/计算机网络实验.md/image/VLAN聚合图1.gif b/计算机网络实验.md/image/VLAN聚合图1.gif new file mode 100644 index 00000000..459992e2 Binary files /dev/null and b/计算机网络实验.md/image/VLAN聚合图1.gif differ diff --git a/计算机网络实验.md/image/VLAN聚合图2.gif b/计算机网络实验.md/image/VLAN聚合图2.gif new file mode 100644 index 00000000..459992e2 Binary files /dev/null and b/计算机网络实验.md/image/VLAN聚合图2.gif differ diff --git a/计算机网络实验.md/image/ospfhello报文格式.png b/计算机网络实验.md/image/ospfhello报文格式.png new file mode 100644 index 00000000..a01f243e Binary files /dev/null and b/计算机网络实验.md/image/ospfhello报文格式.png differ diff --git a/计算机网络实验.md/image/不同设备VLAN内互访.gif b/计算机网络实验.md/image/不同设备VLAN内互访.gif new file mode 100644 index 00000000..e07eb3fd Binary files /dev/null and b/计算机网络实验.md/image/不同设备VLAN内互访.gif differ diff --git a/计算机网络实验.md/image/同设备VLAN内互访.gif b/计算机网络实验.md/image/同设备VLAN内互访.gif new file mode 100644 index 00000000..7951b5a6 Binary files /dev/null and b/计算机网络实验.md/image/同设备VLAN内互访.gif differ diff --git a/计算机网络实验.md/image/同设备VLAN间互访.gif b/计算机网络实验.md/image/同设备VLAN间互访.gif new file mode 100644 index 00000000..11305edc Binary files /dev/null and b/计算机网络实验.md/image/同设备VLAN间互访.gif differ diff --git a/计算机网络实验.md/image/四中网络类型.png b/计算机网络实验.md/image/四中网络类型.png new file mode 100644 index 00000000..e36fe1d4 Binary files /dev/null and b/计算机网络实验.md/image/四中网络类型.png differ diff --git a/计算机网络实验.md/image/团体属性说明.png b/计算机网络实验.md/image/团体属性说明.png new file mode 100644 index 00000000..83081881 Binary files /dev/null and b/计算机网络实验.md/image/团体属性说明.png differ diff --git a/计算机网络实验.md/image/端口聚合.jpg b/计算机网络实验.md/image/端口聚合.jpg new file mode 100644 index 00000000..5bd0efc2 Binary files /dev/null and b/计算机网络实验.md/image/端口聚合.jpg differ diff --git a/计算机网络实验.md/image/网络类型NBMA.png b/计算机网络实验.md/image/网络类型NBMA.png new file mode 100644 index 00000000..1e3fb1cc Binary files /dev/null and b/计算机网络实验.md/image/网络类型NBMA.png differ diff --git a/计算机网络实验.md/image/跨设备VLAN间互访.gif b/计算机网络实验.md/image/跨设备VLAN间互访.gif new file mode 100644 index 00000000..464a766a Binary files /dev/null and b/计算机网络实验.md/image/跨设备VLAN间互访.gif differ