计网实验&数理统计

This commit is contained in:
estomm
2019-10-15 14:14:50 +08:00
parent 4f92cac76e
commit 3430a045de
158 changed files with 6239 additions and 531 deletions

View File

@@ -2,6 +2,9 @@
> 用来记录各个科目的markdown笔记并逐渐从有道云笔记将内容移植过来。
> 关于笔记记录的说明:我觉得笔记记录的内容过于细节。所有的知识应该以书上为准。整理笔记的目的应该是作为一种快速参考或者索引,而不是详细的记录所有的细节。说实话,我觉得你的笔记废话太多,自己都不一定会看。
> 我觉得是时间放弃你愚蠢的笔记策略了。
## 1 分类标题(用来描述主题的各个方面或者分类)

68
Reference/Human-agent.md Normal file
View File

@@ -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
用来发现潜在的价值。

View File

@@ -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))
$$
* 结论
$$
$$

View File

@@ -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 极大似然估计

View File

@@ -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$的的估计。
在样本的实验中出现了一种情况。这总情况可以用带参数的联合概率计算公式表示。在参数范围取参数的一个值使得本次实验的情况达到最大值。
### 例题

View File

@@ -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 一致最小方差无偏估计

View File

@@ -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)]
$$

View File

@@ -1,5 +0,0 @@
# 其他估计方法
> 这节课没怎么听,需要问一下别人数学课讲了啥。
##

View File

@@ -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))的相合估计
$$
> 频率估计、矩估计、极大似然估计都是相合估计。
> 统计量的计算过于复杂,可以使用特征函数来简化计算。所以特征函数到底是一个什么东西。
### 定义:渐进正太统计量估计量
> 均值、频率估计、矩估计、极大似然估计都是渐进正太统计量估计量。

View File

@@ -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正太分布。

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View File

@@ -0,0 +1,35 @@
# 绪论
## 1 语言
### 语言的一般特性
* 媒体性
* 规范性
* 演进性
* 抽象性
* 冗余多义性
### 程序设计语言的特性
* 人工语言
* 对象是机器
* 用于表达软件
### 程序设计语言的作用
*
## 2 程序设计语言的定义与处理器
### 解释器
解释器读入一段相对完整源代码(多数情况下是一句)翻译为目标代码后,立即解释执行。
### 编译器
编译器读入一个独立的编译单元(程序的逻辑单元,如主程序 、函数,子程序。或若干个逻辑单元组成的编译单元,如文件、模块、包) 翻译为可执行的目标代码单元,经过连接必要的库支持例程成为可执行内存映象,加载到内存中运行,由于是按单元翻译,可以经过上下文分析作若干次优化,目标代码质量高。
### 元语言(metalanguage)
表达每一个语法特征
* 字符集、词条表由它们提供标识符、运算符、关键字、空格、限制符、各种数字量、字符串常量等语法概念。
* 注释 注释符号之内(或以后)的符号串是为人们阅读,处理器要略去的。
* 语法结构定义,定义以上符号组合的合法结构。它给出语句、表达式、程序单元、块(如FORTRAN的循环域)、作用域、嵌套与结合等语法概念。

View File

@@ -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。

View File

@@ -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 规格说明

View File

@@ -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是产生式
$$
α→β \\α,β∈(TN)^*
$$
* “→”表示左端可推导出右端,如α→β, α→Υ, α→δ则可写为:α→β|Υ
* 如果产生式将语言的非终结符中的每一个标记都推得为终结符号, 则这一组产生式集即为该语言的全部文法。
## 4 Chomsky的四种文法
产生式左符号集→右符号集,由左符号集推导出右符号集。
### 0型文法
$$
α→β α∈(NT)+,β∈(NT)*
$$
递归可枚举语言 图灵机可以识别
### 1型文法
$$
αAβ→αα,β∈(NT)*A∈N B∈(NT)+
$$
上下文相关文法上下文敏感语言 线性有界自动机可识别
### 2型文法
$$
A→α α∈(NUT)*,A∈N
$$
上下文无关文法语言 非确定下推自动机可识别
### 3型文法
$$
A→αBBα α∈T*, A, B∈N
$$
正则文法、正则语言、有限自动机可以识别可消除右端非终法符P可以成为终结符表达式。

View File

@@ -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 数据中心
-----
# 无线网络和移动网络

View File

@@ -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)

View File

@@ -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 网络构成
### 网络边缘

View File

@@ -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级
* FTPFile Translation Protocol文件传输协议。FTP默认有两个端口21和20。21用于控制连接20用于数据传输。
* DHCP(Dynamic Host Configuration Protocol)动态主机分配协议,使用 UDP 协议工作给主机自动分配IP地址作为网络管理员的主要管理手段。实现即插即用即联网功能。
* HTTPHyperText Transfer Protocol超文本传输协议它是Web的核心。
* SMTPSimple Mail Transfer Protocol )简单邮件传输协议 <端口号25> 用于发送邮件。
* POP3Post 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 )网络校时协议。

View File

@@ -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/pngpng图片格式
application
* application/xhtml+xml XHTML格式
* application/xml XML数据格式
* application/atom+xml Atom XML聚合格式
* application/json JSON数据格式
* application/pdfpdf格式
* 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)

View File

@@ -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)

View File

@@ -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-VersionMIME版本
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命令格式 |说明|
|-|-|
|user<SP>username<CRLF> | user 命令是POP3客户端程序与POP3邮件服务器建立连接后通常发送的第一条命令参数 username 表示收件人的帐户名称。
|pass<SP>password<CRLF> | pass 命令是在user命令成功通过后POP3客户端程序接着发送的命令它用于传递帐户的密码参数 password 表示帐户的密码。
|apop<SP>name,digest<CRLF> | apop 命令用于替代user和pass命令它以MD5 数字摘要的形式向POP3邮件服务器提交帐户密码。
|stat<CRLF> | stat 命令用于查询邮箱中的统计信息,例如:邮箱中的邮件数量和邮件占用的字节大小等。
|uidl<SP>msg#<CRLF> | uidl 命令用于查询某封邮件的唯一标志符参数msg#表示邮件的序号是一个从1开始编号的数字。
|list<SP>[MSG#]<CRLF> | list 命令用于列出邮箱中的邮件信息,参数 msg#是一个可选参数表示邮件的序号。当不指定参数时POP3服务器列出邮箱中所有的邮件信息当指定参数msg#时POP3服务器只返回序号对应的邮件信息。
|retr<SP>msg#<CRLF> | retr 命令用于获取某封邮件的内容,参数 msg#表示邮件的序号
|dele<SP>msg#<CRLF> | dele 命令用于在某封邮件上设置删除标记参数msg#表示邮件的序号。POP3服务器执行dele命令时只是为邮件设置了删除标记并没有真正把邮件删除掉只有POP3客户端发出quit命令后POP3服务器才会真正删除所有设置了删除标记的邮件。
|rest<CRLF> | rest 命令用于清除所有邮件的删除标记。
|top<SP>msg#<SP>n<CRLF> | top 命令用于获取某封邮件的邮件头和邮件体中的前n行内容参数msg#表示邮件的序号参数n表示要返回邮件的前几行内容。使用这条命令以提高 Web Mail系统通过Web站点上收发邮件中的邮件列表显示的处理效率因为这种情况下不需要获取每封邮件的完整内容而是仅仅需要获取每封邮件的邮件头信息。
|noop<CRLF> | noop 命令用于检测POP3客户端与POP3服务器的连接情况。
|quit<CRLF> | 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等等。

View File

@@ -0,0 +1,87 @@
# DNS 域名解析
## 1 概述
Domain Name System 域名系统
### DNS功能
* DNS 提供从主机名到IP地址的目录服务。一个由分层的 DNS 服务器实现的分布式数据库。一个使得主机能够查询分布式数据库的应用层协议。
* DNS协议运行在UDP上使用 53 端口。
* DNS通常是由其他应用层协议所使用的包括 HTTPSMTP 和 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里配置是可以做到直接访问谷歌服务器的。说到翻墙一般大家都是用某种方法配置一台海外服务器当做中转国家一般不墙这种个人服务器来访问墙外服务器的比如shadowsocksshadowrocket之类的软件可以用来配置中转服务器。
* DNS反射攻击请求中冒充目标主机源地址大量请求DNS服务器DNS就大量向源地址主机发送回答淹没目标主机。

View File

@@ -0,0 +1,34 @@
# P2P
## 1 概述
比于客户-服务器体系结构P2P具有自扩展性表现在对等方N越大最小分发时间也趋于平缓。这种自扩展性的直接成因是对等方除了是比特的消费者外还是它们的重新分发者。
### P2P 体系结构的扩展性
* 最小分发时间对等方N越大P2P的最小分发时间越小
* 对等方除了是比特的消费者外还是他们的重新分发者
## 2 BitTorrent
### 工作过程
* P2P文件共享协议参与一个特定文件分发的所有对等方结合被称为一个洪流torrent在一个洪流的对等方彼此下载等长度的文件块可以随时离开洪流也可继续向其他对等方上载
* Alice加入某洪流时会在追踪器里进行注册周期性通知追踪器它仍在洪流中。
* 洪流随机从参与对等方的结合中选择一个子集将他们的IP地址发给AliceAlice维护这张对等方列表视图与所有对等方建立并行的TCP连接。
* Alice周期询问每个邻近对等方连上的他们有的文件块列表她随时知道邻居有哪些文件块
* Alice使用最稀缺优先技术首先请求那些邻居们副本数量最少的块使该文件块迅速分发以均衡每个块在洪流中的副本数量
* BitTorrent使用一种算法Alice优先从像她传时速度最快的邻居4个每10s修改一次那里获取文件块。
* 每过30sAlice也要随机选择另外一个对等方Bob向他发送块。若Alice是Bob最快的前四快Bob也是Alice的前4快则Bob和Alice互相发送数据。
* 每过30s换一个新的对象互相交换数据一报还一报为了使对等方能够找到彼此协调的速率上传
### BitTorrent其他机制和变种
片、流水线、随机优先选择、残局模型、反怠慢等机制
变种P2P直播流式应用如PPLive和PPstream****PPstream
## 3 分布式散列表DHT
* 分布式、P2P版本的key-value数据库在大量对等方上存储key-value值键值对
* 分布式数据库用来定位拥有某key-value的对等方然后向查询方返回该键值对
* 环形DHT、对等方扰动

View File

@@ -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 报文段携带了初始创建连接的请求

View File

@@ -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提供的两个服务之一。

View File

@@ -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否则接收方就无法区分一个分组是新的分组还是一个重传。

View File

@@ -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的无符号数序号到达2321后又从0开始。当建立一个新的连接时SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISNInitialSequenceNumber。该主机要发送数据的第一个字节序号为这个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中有一个报文段最大生存MSLMaximum 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确认序号为收到序号+1Server进入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的接收方会区分另一端执行的是异常关闭还是正常关闭。并可以通知应用程序。

View File

@@ -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连接建立之后应用程序即可使用该连接进行数据收发。应用程序将数据提交给TCPTCP将数据放入自己的缓存并且在其认为合适的时候将数据发送出去。在TCP中数据会被当做字节流并按照MSS的大小进行分段然后加上TCP头部并提交给网络层。之后数据就会被网络层提交给目地主机目地主机的IP层会将分组提交给TCPTCP根据报文段的头部信息找到相应的socket并将报文段提交给该socketsocket是和应用关联的也就提交给了应用。
## 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比特和指向紧急数据最后一个字节的指针。其他的事情留给应用程序去处理。

View File

@@ -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中有更新但是总体就是一个较小的值SMSSSENDER MAXIMUM SEGMENT SIZE : The SMSS is the size of the largest segment that the sender can transmit。(对于SCTPcwnd初始值为min(4*MTU)。
* 收到对该报文的ack则cwnd被设置为2个MSS可以发送两个报文
* 收到对2个报文的确认后cwnd更新为4个MSS可以发送四个报文一依次类推。
该过程会一直持续直到遇到一个丢包事件为止或者等于ssthresh时ssthresh事实上是用于区分是进行的拥塞避免还是慢启动初始化时它被设置为65536事实上该算法相当于每收到对一个MSS的确认就将cwnd增大一个MSScwnd决定了当前可以发送cwnd/MSS个报文当这个cwnd/MSS个报文段都被确认后就将cwdn增大了cwnd/MSS × MSS即cwnd。发送方取拥塞窗口与对端通告窗口中的最小值作为发送上限。由于初始的拥塞窗口很小的值因为该启动方式被称为慢启动。
但是对于SCTP它只有在满足三个条件时才增大cwndmin(上次发送的所有数据的大小MTU)
* cwnd已经被用完
* 累积确认被更新了
* 当前不处于快速恢复模式
## 3 拥塞避免(加性增,乘性减)
![](image/TCP拥塞控制.png)
当遇到一个丢包事件时TCP会将其拥塞窗口降低为原来值的一半同时将ssthresh设置为 max (FlightSize / 2, 2*SMSS) FlightSizeThe 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因此在该算法下经过一个RTTcwnd最多增大一个MSS。
因此TCP的拥塞控制方式又称为加性增乘性减。拥塞窗口的增加受惠的只是自己而拥塞窗口减少受益的是大家当出现拥塞时通过乘性减虽然损害了自己但是可以让更多的其它网络参与者受益这也证实TCP拥塞控制中的公平性的核心所在。
## 4 对超时事件的处理
虽然超时和收到三个冗余ACKSCTP中不存在三个冗余ACK对应的事件是三个SACK都不包含都某个报文段的确认则认为该报文段丢失需要重传都被认为是丢包事件但是TCP在二者的处理上并不全相同。当收到三个冗余ACK时TCP的处理就是“加性增乘性减”。但是如果是超时事件则TCP会更新ssthresh的值为max (FlightSize / 2, 2*SMSS)对于SCTPmax(cwnd/2, 4*MTU)然后进入“慢启动”过程即将拥塞窗口设置为一个MSS然后指数增加拥塞窗口大小。此时“慢启动”会持续到遇到一个丢包事件或者拥塞窗口被增大到了ssthresh如果是增大到了ssthresh则进入“拥塞避免”的模式即开始加性增。
因此对于丢包事件来说只要发生了丢包则ssthresh都会更新max (FlightSize / 2, 2*SMSS)对于SCTPmax(cwnd/2, 4*MTU)。如果是超时cwnd被设置为一个MSS对于SCTP1个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)对于SCTPmax(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).

View File

@@ -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步之内找到相应的转发表项。
* 内容可寻址内存CAMCAM允许将一个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以太网的设备驱动程序的

View File

@@ -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为4IPv6则为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为4IPv6则为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。片偏移字段指的是该片偏移原始数据报开始处的位置。另外当数据报被分片后每个片的总长度值要改为该片的长度值。
标志字段中有一个比特称作“不分片”位。如果将这一比特置1IP将不对数据报进行分片在这种情况下如果路由器判断需要分片就把数据报丢弃并发送一个ICMP差错报文“需要进行分片但设置了不分片比特”给数据报的源主机。
当IP数据报被分片后每一片都成为一个分组具有自己的IP首部并在选择路由时与其他分组独立。这样当数据报的这些片到达目的端时有可能会失序但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。
但是IP分片存在一个严重的缺陷即使只丢失一片数据也要重传整个数据报
在IPv6中分片功能被限制在源主机进行这是因为分片增加了网络核心即路由器的工作量使得它不得不为所有报文进行分片处理的判断网络核心应该更专注于它选路和转发的功能而不是被额外的处理所打断。
二、IPv4地址
在因特网中无论是主机还是路由器都通过接口接入网络。接口是主机或路由器接入网络的装置一般情况下一个主机由一个接口而路由器有多个接口。为了使得接口能够工作在网络层每个接口都需要有IP地址。因此IP实际上是和接口相关联的而不是与主机或路由器相连的。
1.IPv4地址格式
### IP分片过程
1. 分片原理
数据链路层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时查询该接口获得其MTU。IP把MTU与数据报长度进行比较如果需要则进行分片。
分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
但是分片报文只有到了最终目的地才会被重组。重新组装由目的地的IP层来完成其目的是使分片和重新组装过程对运输层是透明的。
2. 分片标志
IP头部包含一个由数据报原始发送者设置的标识字段它在由该发送者发送的IP数据报中是唯一的。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外当数据报被分片后每个片的总长度值要改为该片的长度值。
3. 不分片标志
标志字段中有一个比特称作“不分片”位。如果将这一比特置1IP将不对数据报进行分片在这种情况下如果路由器判断需要分片就把数据报丢弃并发送一个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 1262^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| 1262^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地址“184289255255”是当前子网的广播地址网络ID的第一个6位组也不能全置为“0”全“0”表示本地网络。127.X.X.X是保留地址用做循环测试用的。
### CIDR编址
当前采用的地址分配策略为CIDRClassless 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地址“255255255255”是当前子网的广播地址
IP地址中凡是以“llll0”开头的E类IP地址都保留用于将来和实验使用。
IP地址中不能以十进制“127”作为开头该类地址中数字127001到127255255255用于回路测试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)是指改变外出数据包的源端口并进行端口转换即端口地址转换PATPort 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 ProtocolInternet控制报文协议。它是TCP/IP协议族的一个子协议用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据但是对于用户数据的传递起着重要的作用
ICMP属于网络层协议它提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误纠正错误的任务由发送方完成。
ICMP报文如下
*态转换是指将内部网络的私有IP地址转换为公IP地址IP地址对是一对一的是一成不变的某个私有IP地址只转换为某个公有IP地址。借助于静态转换可以实现外部网络内部网络中某些特定设备(如服务器)的访问
* 动态转换是指将内部网络的私有IP地址转换为公用IP地址时IP地址是不确定的是随机的所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式
* 端口多路复用Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换即端口地址转换PATPort Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问从而可以最大限度地节约IP地址资源。同时又可隐藏网络内部的所有主机有效避免来自internet的攻击。
### UPnP通用即插即用
UPnPUniversal Plug and Play指的是通用即插即用它可以用来支持NAT穿越。它要求主机和NAT是UPnP兼容的。使用它时在一台主机上运行的应用程序能够请求一个NAT映射该映射位于私有IP地址私有端口号公共IP地址公共端口号之间。如果NAT接受了这个请求并且声称该映射则来自外部的节点就能够发起到公共IP地址公共端口号的TCP连接
## 4 ICMP协议
ICMP是Internet Control Message ProtocolInternet控制报文协议。它是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
相对于IPv4IPv6的变化主要包括
扩展地址。地址扩展到了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.其它
类似于IPv4IPv6也使用了ICMP和DHCP这两个协议都有对应于IPv6的版本。详细的信息可参考相关协议。
1. 多播:一组接口(一般属于不同节点)的标识符。送往一个多播地址的包将被传送至有该地址标识的所有接口上。

View File

@@ -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算法概述
距离向量算法DVDistance-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)变化后它显然是一个错误的值。更重要的是在这个时刻会出现选路环路为了到达xy通过z选路而z又选择通过y选路这样的选路结果是分组无法到达目的地。
y计算出来了一个新的到x的最低费用因而它在t1时刻将新的距离向量通告给z
z收到y的新的距离向量后更新其距离向量它计算出来的新的Dz(x)=7
该过程一直循环直到计算出来一个正确的值Dy(x)=40Dz(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的管理组织可以运行它选择的任何内部选路协议。

View File

@@ -1,92 +1,77 @@
一、RIP
在因特网中AS即自制系统内部使用的两个选路协议是RIP路由信息协议Routing information Protocol和OSPFOpen Shortcut Path First
RIP是一种距离向量协议运行方式和理想化的DV算法相似。在RIP中DV算法中的费用采用的是跳数即从源路由器到目的路由器的最短路径上的路由器数。RIP中一条路径的最大跳数被限制为15因此RIP被限制用在网络直径不超过15的自制系统内。DV算法需要在路由器之间发送每个路由器的距离向量信息RIP通过RIP通告也称为RIP响应报文来完成这个功能RIP通告大约30秒相互交换一次。RIP通告包含了选路更新信息
每台路由器都维护有一张选路表,它包含了路由器的距离向量个该路由器的转发表。
# 网络层-路由协议
> 在因特网中AS即自制系统内部使用的两个选路协议是RIP路由信息协议Routing information Protocol和OSPFOpen 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算法来构建该树同时使用剪枝算法来修正该树。剪枝算法是指如果一台路由器接收到了娿一个多播分组而它无加入到该分组的主机就向其上游发送一个剪枝报文收到该剪枝报文的路由器将不会向该路由器转发该多播组的分组如果一台路由器的每个下游路由器都向它发送了剪枝报文它就向其上游发送一个剪枝报文。
因特网中使用的多播选路算法有DVMRPDistance Vector Multicast Routing Protocol和PIMProtocol-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)来完成对应的解析过程。

View File

@@ -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
$$

View File

@@ -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
码分多址CDMACDMA每个结点分配一种不同的编码。每个结点用它唯一的编码发对它发送的数据进行编码如果精心选择这些编码则不同的结点能够同时传输并且相应的接收方仍能正确接收发送方编码的数据比特接收方必须知道发送方的编码而不在乎其他结点的干扰。
## 3 MAC-随机接入协议
### 时隙ALOHA
该协议操作如下:
1. 当有一个新帧要发送时,等到下一个时隙开始并在该时隙传输整个帧。
2. 如果没有碰撞则结点成功传输它的帧,不需要考虑重传。如果该结点还有新帧要传输,则进行准备。
3. 如有有碰撞在时隙结束之前检测到这次碰撞。以概率p在后续的每个时隙中重传它的帧知道该帧被无碰撞地传输出去。
该协议允许该结点以全速传输并且每个结点需要对时隙同步。该协议的一个结论是当有大量结点有很多帧要传输时最多仅有37%的时隙做有用工作37%的时隙是空闲的26%的时隙有碰撞。
### ALOHA
第一个ALOHA实际上是一个非时隙完全分散的协议。当一个帧首次到达时结点立刻将该帧完整地传输进广播信道如果经历碰撞则立刻以概率p重传该帧否则等待一个帧传输时间。其最大效率为时隙ALOHA的一半。
### CSMA
载波侦听:一个结点在传输前先听信道,如果来自另外一个结点的帧正在传送,则等待直到检测一小段时间内没有传输再开始传输。
### CSMA/CD
碰撞检测:一个传输结点在传输时一直在侦听信道,如果检测到另一个结点正在传输干扰帧,就停止传输,并等待一段随机时间后再次进入“侦听-当空闲时传输”循环。具有碰撞检测的CSMA被称为CSMA/CDCSMAwith 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,随机接入和集中分配时隙等协议应用的一个很好的例子。

View File

@@ -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.2222.222.222.3A要向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字节适配器需要知道它应该将数据字段传递给哪个网络层协议便是通过类型字段。类型字段标识了网络层协议。
* CRC4字节循环冗余检测字段检测是否引入了差错。
* 前同步码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)来完成对应的解析过程。

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -0,0 +1,25 @@
# OSPF 实验
> 兄弟,停下来把,这种抄书行为有点愚蠢。
## 1 OSPF协议概述及基本配置
### 实验原理
开放最短路优先协议OSPF基于链路状态算法的内部网关协议。每一台路由器将其周边的链路状态描述出来发送给网络中相邻的路由器。经过一段时间的链路状态信息交互每台路由器都保存了一个链路状态数据库该数据库是整个网络完整的链路状态描述。
特点
* 适应范围广
* 收敛速度快
* 无自环
* 支持验证、组播发送、路由分级、等值路由等功能。
自治系统和区域
自治系统Autonomy System,AS是由同一机构管理的使用同一组选路策略的路由器的集合。能够决定在本系统内部采用何种路由选择协议。
区域
值一个路由器的集合相同的区域有相同的拓扑结构数据库。OSPF把AS划分成多个链路状态域。
### 基本配置

View File

@@ -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是广播地址。
* 一个交换机下设置同网段的主机会处于同一个局域网下,设置不同网段的主机可以处于不同的局域网下。
### 网关
网间连接器、协议转换器。实现局域网与广域网的互联。
# 链路层实验
## 6 基于地址转换的组网实验
acl命令access control list访问控制列表
1限制网络流量、提高网络性能。例如ACL可以根据数据包的协议指定这种类型的数据包具有更高的优先级同等情况下可预先被网络设备处理。
2提供对通信流量的控制手段。
3提供网络访问的基本安全手段。
4在网络设备接口处决定哪种类型的通信流量被转发、哪种类型的通信流量被阻塞。

View File

@@ -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的优先级信息PriorityCFI说明VLAN格式。
### VLAN标签字段说明
|字段 |长度 |含义取值|
|-|-|-|
|TPID |2Byte| Tag Protocol Identifier标签协议标识符表示数据帧类型。 表示帧类型取值为0x8100时表示IEEE 802.1Q的VLAN数据帧。如果不支持802.1Q的设备收到这样的帧,会将其丢弃。 各设备厂商可以自定义该字段的值。当邻居设备将TPID值配置为非0x8100时 为了能够识别这样的报文实现互通必须在本设备上修改TPID值确保和邻居设备的TPID值配置一致。|
|PRI |3bit| Priority表示数据帧的802.1p优先级。 取值范围为07值越大优先级越高。当网络阻塞时设备优先发送优先级高的数据帧。|
|CFI |1bit| Canonical Format Indicator标准格式指示位表示MAC地址在不同的传输介质中是否以标准格式进行封装用于兼容以太网和令牌环网。 CFI取值为0表示MAC地址以标准格式进行封装为1表示以非标准格式封装。在以太网中CFI的值为0。|
|VID |12bit| VLAN ID表示该数据帧所属VLAN的编号。 VLAN ID取值范围是04095。由于0和4095为协议保留取值所以VLAN ID的有效取值范围是14094。|
### 缺省VLAN
缺省VLAN又称PVIDPort 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 ProtocolNCP用来支持不同的网络层协议。
### 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 设计型实验

View File

@@ -0,0 +1,116 @@
# 网络层实验
目录
1. ARP分析
2. ICMP分析
3. IP分析
4. 网络层分片实验
5. 静态路由及其配置实验
6. VLAN间通信综合实验
7. 设计型实验
## hello
## 1 ARP分析
address resolution protocol
### 原理
[参考计算机网络](../计算机网络/5.3&#32;链路层-交换局域网.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&#32;网络层-网际协议.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&#32;网络层-网际协议.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 设计型实验

View File

@@ -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)

View File

@@ -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设计型实验

Some files were not shown because too many files have changed in this diff Show More