From 4f92cac76e40527089d9899b67af24e81df9c270 Mon Sep 17 00:00:00 2001 From: estomm Date: Sat, 12 Oct 2019 16:22:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- C++/第2章 变量和基本类型.md | 106 +++++++++ Linux/第0章 概述.md | 29 +++ Linux/第1章 文件管理.md | 207 +++++++++++++++-- Linux/第2章 用户管理.md | 20 +- SwarmIntelligence/1 群体智能概述.md | 69 ++++++ .../2 粒子群算法PSO.md | 0 SwarmIntelligence/3 人工蜂群算法ABC.md | 0 SwarmIntelligence/4 蚁群算法ACO.md | 0 SwarmIntelligence/5 布谷鸟算法CS.md | 0 SwarmIntelligence/6 萤火虫算法GSO.md | 0 SwarmIntelligence/7 灰狼算法GWO.md | 0 SwarmIntelligence/8 蝙蝠算法.md | 0 .../中文文献阅读内容整理.md | 0 .../英文文献阅读内容整理.md | 0 TASK.md | 7 +- 概率论与数理统计/第5节 参数估计.md | 27 ++- 概率论与数理统计/第6节 估计量的评优准则.md | 8 + 概率论与数理统计/第7节 其他估计内容.md | 5 + 群体智能/群体智能概述.md | 27 --- 计算机网络/1 自顶向下的计算机网络概述.md | 133 +++++++++++ 计算机网络/2 应用层.md | 0 计算机网络/3 传输层.md | 0 计算机网络/4.1 网络层-基本原理.md | 103 +++++++++ 计算机网络/4.2 网络层-网际协议.md | 214 ++++++++++++++++++ 计算机网络/4.3 网络层-路由算法.md | 89 ++++++++ 计算机网络/4.4 网络层-路由协议.md | 92 ++++++++ 计算机网络/4.5 网络层实验.md | 0 计算机网络/5 链路层.md | 0 计算机网络/5.4 链路层实验.md | 180 +++++++++++++++ 计算机网络/6 无线网络和移动网络.md | 0 计算机网络/image/交换机结构.png | Bin 0 -> 76985 bytes 计算机网络/image/路由器结构.png | Bin 0 -> 51374 bytes {计算机网络实验 => 计算机网络}/课程概要.md | 0 33 files changed, 1261 insertions(+), 55 deletions(-) create mode 100644 C++/第2章 变量和基本类型.md create mode 100644 Linux/第0章 概述.md create mode 100644 SwarmIntelligence/1 群体智能概述.md rename 群体智能/粒子群算法.md => SwarmIntelligence/2 粒子群算法PSO.md (100%) create mode 100644 SwarmIntelligence/3 人工蜂群算法ABC.md create mode 100644 SwarmIntelligence/4 蚁群算法ACO.md create mode 100644 SwarmIntelligence/5 布谷鸟算法CS.md create mode 100644 SwarmIntelligence/6 萤火虫算法GSO.md create mode 100644 SwarmIntelligence/7 灰狼算法GWO.md create mode 100644 SwarmIntelligence/8 蝙蝠算法.md rename {群体智能 => SwarmIntelligence}/中文文献阅读内容整理.md (100%) rename {群体智能 => SwarmIntelligence}/英文文献阅读内容整理.md (100%) create mode 100644 概率论与数理统计/第6节 估计量的评优准则.md create mode 100644 概率论与数理统计/第7节 其他估计内容.md delete mode 100644 群体智能/群体智能概述.md create mode 100644 计算机网络/1 自顶向下的计算机网络概述.md create mode 100644 计算机网络/2 应用层.md create mode 100644 计算机网络/3 传输层.md create mode 100644 计算机网络/4.1 网络层-基本原理.md create mode 100644 计算机网络/4.2 网络层-网际协议.md create mode 100644 计算机网络/4.3 网络层-路由算法.md create mode 100644 计算机网络/4.4 网络层-路由协议.md create mode 100644 计算机网络/4.5 网络层实验.md create mode 100644 计算机网络/5 链路层.md create mode 100644 计算机网络/5.4 链路层实验.md create mode 100644 计算机网络/6 无线网络和移动网络.md create mode 100644 计算机网络/image/交换机结构.png create mode 100644 计算机网络/image/路由器结构.png rename {计算机网络实验 => 计算机网络}/课程概要.md (100%) diff --git a/C++/第2章 变量和基本类型.md b/C++/第2章 变量和基本类型.md new file mode 100644 index 00000000..a57dde21 --- /dev/null +++ b/C++/第2章 变量和基本类型.md @@ -0,0 +1,106 @@ +# 变量和基本类型 + +## 1基本内置类型 + +### 算术类型 + +* 字符型 +bool 1 +char 1 +wchar_t 2 +char16_t +char32_t + +* 整型 +short 2 +int 4 +long 4 +long 8 + +* 浮点型 +float 4 +double 8 +long double 16 + +### 类型修饰符-signed与unsigned +> 常见的类型修饰符:signed、unsigned、long、short、const、static、extern、auto、register、mutable、thread_local、volatile、restrict + +* signed 有符号 +* unsigned 无符号 + + +### 类型转换 +* 强制类型转换 + 可能会丢失精度。 +* 隐式类型转换 + 默认情况下会向上转换,即向位数更多的位置转换。 +* 避免无符号和有符号的混用。 + +### 字面值常量 + +* 整型字面常量 + 不同进制指的是字面格式,其转化为存储格式时,都会变成二进制存储。不必担心十进制与二进制之间的运算。字面常量只是一种数字的表示方法。24,,024,,0x24。会自动选用尺寸最小的整型进行存储;负号是对字面值取相反数,不是字面值的一部分。 +* 浮点型字面值常量 + 默认情况下使用double存储。3.14,3.14E0,10e4 +* 字符和字符串的字面常量 + 'a'"adbd"字符串的字面值是由字符数组构成的。编译器会在每个字符串常量的末尾添加一个'\0' +* 转义序列 + \n\t\a\v\\\b\"\?\'\r\f + \7\0\12\115 +* 可以指定字面值常量的类型 + 常见前缀u U L u8 + 常见后缀u/U,l/L,ll/LL + +## 2 变量 + +> 关于C++中常见的描述总结:对象object,存储数据并具有某种类型的内存空间。已经命名的对象叫变量。 + +### 变量定义 +* 类型说明符+名称+初始化。 +* 初始值:可以直接初始化、复制初始化。不等同于赋值。 +* 列表初始化:使用{}进行初始化。 +* 默认初始化:变量没有被显示初始化。 +### 变量的声明和定义。 +* 声明和定义可以分离。声明使得程序可以被程序所知道,定义负责创建与名字关联的实体。 +* extern可以声明,而不进行定义。变量可以被声明很多次,但只能被定义一次。不能再函数体中对extern声明的变量进行修改,extern声明的变量只能是外部变量。 +``` +extern int i; +int j; +``` + +### 标识符与关键字。 + +### 作用域 +* 名字在所有花括号之外,则成为全局作用域。 +* 名字在其他作用与内,则成为块作用域。 + +## 3 复合类型 + +### 引用 + +* int &ref=a.表示对a的引用。引用本身并非对象,只是已经存在的对象的别名 +* 引用必须在定义的时候被初始化。 +* 引用是变量的别名,具有同一个变量地址。 +* 允许多个连续的引用 + int &r=i,r2=i2.表示r是i的引用,但r2是int + +### 指针 +* 实现了间接访问。本身是一个对象。 +* 允许对指针进行复制和copy。 +* int* dp,dp1.其中dp是int指针,dp1是int类型。 +* 不能定义指向引用的指针,因为引用不是对象,没有内存空间。 +* +### 指针值的四种状态 +* 指向一个对象; +* 指向紧邻对象所占空间的下一个位置; +* 空指针意味着指针没有指向任何对象; +* 无效指针,指针指向的位置被释放。 + +### 指针访问 +* 利用指针运算符访问指针指向的对象(*p) +* 空指针的生成方法 +``` +int *p1 = nullptr; +``` + + diff --git a/Linux/第0章 概述.md b/Linux/第0章 概述.md new file mode 100644 index 00000000..f56f1ceb --- /dev/null +++ b/Linux/第0章 概述.md @@ -0,0 +1,29 @@ +# 概述 + +## 1 帮助命令 + +### man + +查看完整帮助手册。 +* command +* -k 能够搜索不完整命令 + +### whatis +查看简单讲解。 +* command + +### info +查看详细内容 +* command +* -w name pattern contains shell style wildcard + +### which +查看命令位置(一半为系统环境下命令的可执行文件的位置) +* command + + +### whereis keyword +查看所有搜索路径下关键词的位置。 +* command + + diff --git a/Linux/第1章 文件管理.md b/Linux/第1章 文件管理.md index 73a26493..ed83316a 100644 --- a/Linux/第1章 文件管理.md +++ b/Linux/第1章 文件管理.md @@ -1,23 +1,113 @@ -# 第6章 Linux的文件权限域与目录配置 +# 文件管理 +## 1 文件目录操作 -## 1 用户与用户组 -### 用户 -* owner -* 可以属于多个不同group -### 用户组 -* 包含一组用户 -* 一组用户拥有相同的权限。 +### touch +创建文件 +* filename -### others -* 其他人,不属于用户组。 +### mkdir +创建目录 +* dirname -### 记录位置 -* 用户内容-/etc/passwd -* 密码内容-/etc/shadow -* 组内容-/etc/group +### mv +移动 +* sourcefile destfile +* -r 递归 +### cp +复制 +* sourcefile destfile +* -r 递归 -## 2 文件权限 +### rm +删除 +* dirname/filename +* -r 递归删除 +* -f 强制删除不弹出确认步骤 + +### cd +切换目录 +* pathname + +### pwd +显示当前绝对路径 + +### ls +查看目录 +* [filename*] 能够使用通配符 +* -a 所有文件,包括隐藏文件 +* -l 长格式输出 + +### alias +别名 +* newname=aimname + +### wc +print newline, word, and byte counts for each file.输出文件内容的统计数。 +* file or files name +* -c byte counts +* -m character counts +* -l newline counts +* -w word counts + +## 2 查看文件内容 +### cat +查看文件内容 +* filename +* -n 显示行号 + +### more +查看文件内容 +* filename + +### head +查看文件前几行内容 +* filename +* -10 显示前十行 + +### tail +查看文件后几行 +* filename +* -10 显示文件后10行 + +## diff +对比两个文件之间的差别。 +* file1 file2 + +## 3 查找文件名称 + +### find +搜索目录,查找文件名。 +* dirname +* -name keyword 指定字符串查找文件名,支持通配符。 + +> 这个命令还有很多更高级的用法,日后用到再说。直接man查看用法,这是个程序或者说软件。 + +### locate +搜索包含字符串的目录。 +* stringname + +### 4 查找文件内容 + +### grep +查找文件内容,根据文件内容进行匹配。 +Global search Regular Expression and Print the line. +* pattern filename +* -i 不区分大小写 +* -n 显示行号 +* --color 高亮显示 +* -c 只统计目标行数 +* -o 只显示目标行的命中关键词 +* -B 显示目标行之前的行 +* -A 显示目标航之后的行 +* -w 硬匹配到目标单词。 +* -e 能够添加多个匹配项 +* -E 表示支持扩展正则表达式 +> 同find也是一个复杂的程序软件,日后用到查看说明文档。 +``` +grep -e "am" hello.txt +``` +## 5 文件权限操作 ### 查看文件属性 ``` @@ -33,19 +123,26 @@ ls-al * 创建或者修改日期 * 文件名字 -### 改变文件属性 +### chgrp +改变文件属性 + + ``` chgrp [-R] groupname dirname/filename chgrp users install.log ``` * -R 递归更改组 + +### chwon ``` chown [-R] ownername dirname/filename chwon estom install.log ``` * -R 递归更改拥有者 + +### chmod ``` chmod [-R] xyz dirname/filename chmod 777 install.log @@ -55,10 +152,19 @@ chmod u/g/o/a +/-/= r/w/x dirname/filename * 1~7分别对应二进制文件权限 * ugoa 分别设置user,group,other,all的权限。 -### 文件权限的意义 -做好访问控制。 +## 6 符号连接/硬连接 -## 3 目录配置 +### ln +创建一个指向目标的连接。 +* filename destname +* -s 符号连接 +``` +ln cc ccAgain :硬连接;删除一个,将仍能找到; +ln -s cc ccTo :符号链接(软链接);删除源,另一个无法使用;(后面一个ccTo 为新建的文件) +``` + + +## 7 目录配置说明 ### 目录配置标准FHS @@ -85,3 +191,66 @@ chmod u/g/o/a +/-/= r/w/x dirname/filename * /usr/include:C/C++等程序语言的头文件与包含文件 * /usr/lib:包含软件的函数库、目标文件,以及一般用户惯用的执行文件和脚本 + +## 8 管道和重定向 + +* 批处理命令连接执行,使用 | +* 串联: 使用分号 ; +* 前面成功,则执行后面一条,否则,不执行:&& +* 前面失败,则后一条执行: || + +``` +ls /proc && echo suss! || echo failed +if ls /proc; then echo suss; else echo fail; fi +``` +### 管道 | + +表示第一个命令的输出可以作为第二个命令的输入。可以利用管道对前一个命令的输出进行处理、过滤、统计等。 + +``` +find ./ | wc -l +``` +wc 会把前一个命令的输出看做一个文件,然后输出这个文件的行数。所以能够显示./文件下的目录个数。 + +``` +ls | cat -n +``` +cat也会把前一个命令的输出,看做一个文件,然后对文件进行操作。 + +### 重定向> >> +将标准输出和标准错误重定向到一个文件当中。 +``` +> 覆盖文件内容 +>> 添加新内容到结尾 +ls proc/*.c > list 2> &l 将标准输出和标准错误重定向到同一文件; +``` + +## 9 设置环境变量 + +1. 在/etc/profile文件中添加变量【对所有用户生效(永久的)】 +用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。 + +例如:编辑/etc/profile文件,添加CLASSPATH变量 + +``` +# vi /etc/profile +export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib +``` + +注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。 + +2. 在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】 +用VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。 + +例如:编辑guok用户目录(/home/guok)下的.bash_profile + +vi/home/guok/.bash.profile添加如下内容:exportCLASSPATH=./JAVAHOME/lib;JAVA_HOME/jre/lib + +注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。 + +3. 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】 +在shell的命令行下直接使用[export 变量名=变量值] 定义变量, + +该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的, + +shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。 \ No newline at end of file diff --git a/Linux/第2章 用户管理.md b/Linux/第2章 用户管理.md index 4eb229ef..e6727e8a 100644 --- a/Linux/第2章 用户管理.md +++ b/Linux/第2章 用户管理.md @@ -5,4 +5,22 @@ ## 文件内容查阅 ## 文件与目录的默认权限与隐藏权限 ## 命令与文件查询 -## 权限与命令的关系 \ No newline at end of file +## 权限与命令的关系 + + +## 1 用户与用户组 +### 用户 +* owner +* 可以属于多个不同group +### 用户组 +* 包含一组用户 +* 一组用户拥有相同的权限。 + +### others +* 其他人,不属于用户组。 + +### 记录位置 +* 用户内容-/etc/passwd +* 密码内容-/etc/shadow +* 组内容-/etc/group + diff --git a/SwarmIntelligence/1 群体智能概述.md b/SwarmIntelligence/1 群体智能概述.md new file mode 100644 index 00000000..4dfdbacc --- /dev/null +++ b/SwarmIntelligence/1 群体智能概述.md @@ -0,0 +1,69 @@ +# 群体智能算法 + +## 1 群体智能 + + +### 概念 + +* 英文:swarm intelligence +* 超越个体智慧水平的总体智慧 +* 面向共同问题,自发进行组织。 + +* 个体如何通过与群内其它个体的连接、信息交流、沟通、组织和自组织,产生群体的智能优化行为。 + +### 特点 +* 自组织的(self orgnization) +* 分布式的(distributed)没有中心的控制与数据。 +* 个体简单,群体复杂,信息交流 +* 可扩充, + +### 应用领域 + +* 旅行者商问题 +* 车间任务调度问题 +* 资源受限的工程调度问题 +* 多机器人系统的任务分配 +* 目标聚类 +* 通信网的路由选择 +* 图着色 +* 分割等最优化问题 + +## 2 基本群体智能算法 + + +### 粒子群优化算法PSO +### 人工蜂群算法ABC +### 蚁群优化算法ACO +### 布谷鸟算法CS +### 萤火虫优化算法GSO +### 灰狼算法GWO +### 蝙蝠算法 +### 海豚算法 +### 细菌觅食算法 +### 蛙跳算法 + +## 3 群体智能应用方案 + + + +### 群体智能与漏洞挖掘 +* 漏洞挖掘分析的自动化规模化 +* 卡耐基梅隆大学Myahem自动挖掘与利用系统,自动发现二进制代码中的漏洞。->自动化 +* google的并行漏洞挖掘与分析系统->规模化 +* 文章给出了群体智能与漏洞挖掘的理论模型,但并没有详细介绍结合方式。理论构成主要包括:主体集合、工具集合、目标任务集合、上下文环境集合、路径代价函数(负责利用四个集合,寻找最优路径) +* 违章给出了平台的架构设计:理论方法层、基础设施层、资源架构层、应用服务层。 + +### 群体智能算法与密码学 + +* 构造流密码密钥生成器。显然不知道这是个什么东西。 +* 秘钥很难保证真正的随机。使用群体智能算法进行搜索。 + +### 群体智能在网络入侵检测中的应用 + +* 分布式地检测和响应系统。信息素服务器,发送警报信息素;观察者观测主机遭受到攻击时候的状况;淋巴细胞随机游走,寻找信息素,聚集到被感染的主机。 +* PSO-BP,PSO-SVM入侵检测 + + +### +## 4 群体智能优化方案 +> 还有各种诡异的名字的算法,留待以后补充。需要对这些基本的算法进行掌握。然后了解前沿的算法应用。 \ No newline at end of file diff --git a/群体智能/粒子群算法.md b/SwarmIntelligence/2 粒子群算法PSO.md similarity index 100% rename from 群体智能/粒子群算法.md rename to SwarmIntelligence/2 粒子群算法PSO.md diff --git a/SwarmIntelligence/3 人工蜂群算法ABC.md b/SwarmIntelligence/3 人工蜂群算法ABC.md new file mode 100644 index 00000000..e69de29b diff --git a/SwarmIntelligence/4 蚁群算法ACO.md b/SwarmIntelligence/4 蚁群算法ACO.md new file mode 100644 index 00000000..e69de29b diff --git a/SwarmIntelligence/5 布谷鸟算法CS.md b/SwarmIntelligence/5 布谷鸟算法CS.md new file mode 100644 index 00000000..e69de29b diff --git a/SwarmIntelligence/6 萤火虫算法GSO.md b/SwarmIntelligence/6 萤火虫算法GSO.md new file mode 100644 index 00000000..e69de29b diff --git a/SwarmIntelligence/7 灰狼算法GWO.md b/SwarmIntelligence/7 灰狼算法GWO.md new file mode 100644 index 00000000..e69de29b diff --git a/SwarmIntelligence/8 蝙蝠算法.md b/SwarmIntelligence/8 蝙蝠算法.md new file mode 100644 index 00000000..e69de29b diff --git a/群体智能/中文文献阅读内容整理.md b/SwarmIntelligence/中文文献阅读内容整理.md similarity index 100% rename from 群体智能/中文文献阅读内容整理.md rename to SwarmIntelligence/中文文献阅读内容整理.md diff --git a/群体智能/英文文献阅读内容整理.md b/SwarmIntelligence/英文文献阅读内容整理.md similarity index 100% rename from 群体智能/英文文献阅读内容整理.md rename to SwarmIntelligence/英文文献阅读内容整理.md diff --git a/TASK.md b/TASK.md index ae462e44..2ff0a0ea 100644 --- a/TASK.md +++ b/TASK.md @@ -4,11 +4,12 @@ ## 待完成任务 -- [ ] 编程__2019.10.07__Linux系统管理 -- [ ] 编程__2019.10.07__群体智能算法实现 +- [ ] 编程__2019.10.07__Linux系统管理(需要一本书,以及买一本命令参考手册) +- [ ] 编程__2019.10.07__群体智能算法实现(需要一本书,以及一个系统的教程) - [ ] 编程__2019.10.15__遗传算法实现 - [ ] 编程__2019.10.25__神经网络算法学习与实现。完成具体任务。 -- [ ] 编程__2019.10.01__C++拓展深入学习 +- [ ] 编程__2019.10.01__C++拓展深入学习(需要一本书,以及相关的教程) +- [ ] 编程__2019.10.07__C++与Python数据可视化工具 - [ ] 编程__2019.10.10__基础算法复习及C++实现 - [ ] 文献__2019.10.30__Latex模板整理(基础内容可能不需要整理,因为只要有一份参考文档可以随时查阅就行了,但是需要整理自己能够使用的latex论文模板) diff --git a/概率论与数理统计/第5节 参数估计.md b/概率论与数理统计/第5节 参数估计.md index a67ed830..c009c5e2 100644 --- a/概率论与数理统计/第5节 参数估计.md +++ b/概率论与数理统计/第5节 参数估计.md @@ -1,10 +1,27 @@ -# 参数估计 +# 参数的点估计 -## 参数及其估计 +## 1 参数及其估计 -假设存在$p(x,\theta)$总体分布簇。 +假设存在$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$的频率估计 形式计算:可以计算均值方差,包含未知数。统计量:基于样本能够计算均值、方差。二者可以建立方程。 @@ -17,8 +34,8 @@ n次重复独立实验,每次实验中有k个可能的结果$v_1,v_2,\dotsm,v_ ### 频率估计 -### 矩估计 +## 3 矩估计 ### 通过概率分布函数或者联合概率。 联立方程组解未知数。 -## 极大似然估计 +## 4 极大似然估计 diff --git a/概率论与数理统计/第6节 估计量的评优准则.md b/概率论与数理统计/第6节 估计量的评优准则.md new file mode 100644 index 00000000..d79f217e --- /dev/null +++ b/概率论与数理统计/第6节 估计量的评优准则.md @@ -0,0 +1,8 @@ +# 估计量的评优准则 + +## 1 均方误差准则 + +## 2 无偏估计 + + +## 3 一致最小方差无偏估计 \ No newline at end of file diff --git a/概率论与数理统计/第7节 其他估计内容.md b/概率论与数理统计/第7节 其他估计内容.md new file mode 100644 index 00000000..4afb73f1 --- /dev/null +++ b/概率论与数理统计/第7节 其他估计内容.md @@ -0,0 +1,5 @@ +# 其他估计方法 + +> 这节课没怎么听,需要问一下别人数学课讲了啥。 + +## \ No newline at end of file diff --git a/群体智能/群体智能概述.md b/群体智能/群体智能概述.md deleted file mode 100644 index 927d1c71..00000000 --- a/群体智能/群体智能概述.md +++ /dev/null @@ -1,27 +0,0 @@ -# 群体智能算法 - -## 1 群体智能 - - -### 概念 -swarm intelligence -### 特点 - - -## 2 基本群体智能算法 - - -### 粒子群优化算法PSO -### 人工蜂群算法ABC -### 蚁群优化算法ACO -### 布谷鸟算法CS -### 萤火虫优化算法GSO -### 灰狼算法GWO -### 蝙蝠算法 - - -## 3 群体智能应用方案 - - -## 4 群体智能优化方案 -> 还有各种诡异的名字的算法,留待以后补充。需要对这些基本的算法进行掌握。然后了解前沿的算法应用。 \ No newline at end of file diff --git a/计算机网络/1 自顶向下的计算机网络概述.md b/计算机网络/1 自顶向下的计算机网络概述.md new file mode 100644 index 00000000..565f0a7b --- /dev/null +++ b/计算机网络/1 自顶向下的计算机网络概述.md @@ -0,0 +1,133 @@ +# 计算机网络概述 + +## 1 五层模型 + +> 每一层都有自己的数据单位或者说数据结构。每一个传输单位都采用了消息头+数据的组合方式用来传输数据。底层对上层的数据内容进行分割与封装,形成底层数据单位,以达到不同的目的。 + + +### 应用层(application layer) +* 专门针对某些应用提供服务 +* 数据单位:报文Message + + +### 传输层(transport layer) + +* 传输层负责不同主机的进程间的传输,主机到主机(host-to-host)的传输交由网络层。传输层也称为端到端送 +* 数据单位:报文段Segment + + +### 网络层(network layer) +* 从源地址(source)到目的地地址(destination)的过程,达到从源主机传输数据到目标主机的目的,是点到掉通信(point to point) +* 数据单位:数据报datagram + + +### 数据链路层(data-link layer) +* 封装网络层数据包。只完成一个节点到另一个节点的传送(单跳)(hop-by-hop, node-to-node) +* 数据单位:帧Frame + +### 物理层(physical layer) +* 通过线路传送比特(bit)流,只完成一个节点到另一个节点的传送(单跳) +* 数据单位:比特流bit + +## 2 数据单元长度 + +### 链路层-Frame最大长度 +以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这个1500字节被称为链路层的MTU(最大传输单元)。上述数据内容长度不包括链路层的首部和尾部的18个字节。所以真正的链路层帧的长度应该是:(46+18)-(1500+18) + +### 网络层-Datagram最大长度 +对于IP协议来说,数据内容的长度包含20个字节的头部信息,所以数据内容的长度为1480。 + +### 传输层-Segment最大长度 +IP协议数据内容长度1480字节存放TCP报文段或UDP报文段。最大长度理论上2^16 - IPhead - UDPhead= 65535 - 20 - 8=65507字节,但是实际上UDP数据报的数据区最大长度为1480 - 8 = 1472字节(UDP的头部信息占用八个字节)。TCP 1480-TCPHead(20) = 1460 Bytes(TCP 报文段的头部信息占用20个字节) + +### 协议封装过程 +链路层帧只对网络层数据报进行封装不进行分割。传输层数据内容超过MTU最大传输单元时,网络层数据报对传输层报文会进行分片操作。 + +### UDP和TCP的数据长度 +我们在用Socket编程时,UDP协议要求包小于64K。TCP没有限定,TCP包头中就没有“长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。 + + +## 3 因特网 +### 组成 + +因特网通常指的是全球性的公共互联网。从组成上来说由:端系统,通信链路和交换机组成。 + +* 端系统:接入因特网并通过因特网与其他设备通信的设备被称为端系统。它是一次因特网信息交换的发起者或者接收者。 + +* 通信链路:通信链路相当于道路,用于传输信息。在通信链路上传输的信息称为分组。 + +* 交换机:交换机用于辅助信息交换,选择信息交换所使用的通信链路,交换机分为二层交换机即常说的交换机和三层交换机即路由器。 + +> 端系统通过ISP(因特网服务提供商)接入网络,每个是由ISP由多个交换机和多段通信链路组成的网络。ISP是分层级的,用户接入的是底层ISP,底层ISP的服务由高层ISP提供,通过分层可以降低网络管理的难度和复杂度。 + +## 4 网络协议 + +### 网络协议 +定义了在两个或多个通信实体之间交换信息的格式、次序,以及在信息发送、接受以及发生其它事件时采取的动作。网络协议使得网络中各种不同的参与者可以相互通信。 + +网络协议通常被分为不同的层次。每个协议属于一层,每个层次负责不同的功能,并向上一层提供服务。一个协议层能够利用软件、硬件或者两者结合的方式实现。 +协议分层有概念化和结构化的优点,分层提供了一种结构化的方式来讨论系统组件,模块化使得更新组件更为容易。分层的一个潜在缺点是某层可能重复其较低层次的功能。 +各层所有的协议综合起来就构成了协议栈。通常的网络分为五个层次(非ISO OSI模型)。 +应用层:网络应用程序及其应用层协议存在的地方。 +运输层:提供了在主机之间传送应用层报文的服务。最重要的两个协议时UDP和TCP +网络层:负责将数据报从一台主机移动到另一台主机。 +链路层:也称为数据链路层或者网络接口层。链路层沿着路径将数据报传送给下一个节点。链路层传输的单元称为帧。 +物理层:负责将帧的每一个比特从一个节点移动到下一个节点。 +由于网络中有很多不同的参与者,参与者的物理位置是不确定的,信息可能会通过存在恶意用户的网络,通信链路可能坏掉,因而无论对于哪个层次的协议来说,都涉及到如下问题: +如何标识一个参与者,即如何起名字,名字的格式,每个层次都定义了自己的“地址(名字)”格式,最终这些信息都会进入报文中 +参与者如何获取自己的标识,即谁给起名字,可能是协议获取,可能是管理员分配,可能是软件自己选择,可能是统一的机构分配并固化到硬件 +如何将数据送到目的地,通常是通过下一层提供的服务 +如何确保数据的正确性,即收到的数据就是发出去的时候的样子,一般通过校验和来实现 +是否要保证数据的安全性,如果要,如何保证,通常通过各种加密协议 + +## 5 网络构成 +### 网络边缘 +端系统位于网络边缘也称为主机,它们运行网络应用程序。网络应用程序又分为客户端和服务端,客户端是服务的获取者,服务端是服务的提供者。 + +端系统通过边缘路由器接入网络,接入方式主要有有线接入和无线接入。接入的物理媒介有双绞线,同轴电缆,光缆,无线电信道等等。 + +### 网络核心 +网络核心是指互联了因特网端系统的交换机和链路的网状的网络。 +* 电路交换 +电路交换中,当两台主机要通信时,该网络在两台主机之间建立一条专用的端到端的连接。电路交换一般通过多路复用来提高链路的使用效率,多路复用技术包括时分复用(TDM),频分复用(FDM),码分多址(CDMA)。电路交换网络需要信令软件来协调端到端路径上的交换机的操作。 + +* 分组交换 +在分组交换网络中,应用程序的数据被分割成报文进行收发。在源和目的之间,这些分组通过通信链路和分组交换机传送。多数分组交换机在输入端采用存储转发机制工作,存储转发指的是在交换机能够开始向输出链路传输该分组之前,必须接收到整个分组。因此,存储转发式分组交换机沿着该分组的路径在每条链路的输入端引入了存储转发时延。 + +每个分组交换机由多条链路与之相连。对于每条相连的链路,该分组交换机有一个输出缓存,它用于缓存交换机准备发往这条链路的分组。如果分组需要往某个链路发送,但该链路正在发送其它分组,该分组就要在输出缓存排队等待,因此分组交换又引入了排队时延。同时由于缓存大小是有限的,因而如果需要进行缓存一个新的分组时,缓存已满,就会导致该分组被丢失。 +分组交换存在时延并且该时延是不可预测的,因而它不适用于实时服务。 + +由于分组交换不存在专用电路,因而它需要做额外的动作保证分组可以到达目的地。因特网的做法是:每个通过网络传输的分组在其首部包含了其目的地址。地址采用了层次结构。当分组到达网络中的一台交换机时,该交换机检查分组的目的地址的一部分,并向相邻的交换机转发该分组。每个交换机都具有一个转发表,用于将目的地址映射到输出链路。当分组到达一个交换机时,交换机检查其目的地址,并用这个目的地址搜索转发表,以找到合适的输出链路。典型的转发表就是三层交换机即路由器中的路由表。 + +## 6 网络性能 +### 时延 +分组交换中存在各种时延,时延中最重要的包括:处理时延,排队时延,传输时延和传播时延。 + +* 处理时延:检查分组首部和决定该分组如何处理所需时延以及对报文进行各种检查所需的时间之和。 +* 排队时延:分组在队列中等待传输所需的时间 +* 传输时延:分组长度/链路速率(接口速率,比如10M以太网就是10Mbps)。对于超过10Mbps速率的信道而言,该值很小,影响也很小。 +* 传播时延:链路长度/链路传播速度(比特在链路中的物理传输速度)。对于局域网该值往往非常小,但是对于卫星传输可能很大。 + + +在这几种时延中,传输时延、传播时延取决于物理介质,处理时延需要做的动作基本是固定的,因而和处理器的速率和软件设计相关,而排队时延则和系统运行的整体运行相关,是最复杂的时延。 + + +### 丢包 + +让a表示分组到达的平均速率,R是传输速率,即比特从队列中推出的速率,同时假设每个分组都由L比特组成,则L*a/R称为流量强度。它在估量排队时延的影响程度方面起着重要作用。如果流量强度大于1,则比特到达的平均速率超过比特从队列中传输出去的速率,在这种情况下,队列会趋向于无限大,排队时延也会趋向于无穷大。因而设计系统时必须保证流量强度不能大于1。 +如果流量强度小于等于1,则: +如果分组周期性的到达,则每个分组到达时队列都是空的,因而就不会有排队时延。 +如果分组以突发形式到达,则有可能有很大的平均排队时延。并且随着流量强度接近于1,平均排队时延迅速增加。 +在实际设备中,由于设备缓存的有限性,因而如果到达的分组无法被存储就会被丢弃,丢弃的分组会随着流量强度的增加而增加。 + + +### 吞吐量 +吞吐量是单位时间内主机收发的报文的速率。当没有干扰时,吞吐量近似于沿着源到目的的路径上的最小传输速率。 + +## 7 网络攻击 +网络攻击是网络的最大威胁,常见的攻击手段有: +* 病毒入侵:通过病毒进入主机从而进行攻击 +* 拒绝服务攻击:核心思想使得合法用户无法使用服务 +* 嗅探攻击:获得信息的拷贝,在对信息进行分析 +* 伪装攻击:伪装成受信任的人从而获取信息 +* 中间人攻击:插入到两个通信实体之间的通信链路中进行攻击。 \ No newline at end of file diff --git a/计算机网络/2 应用层.md b/计算机网络/2 应用层.md new file mode 100644 index 00000000..e69de29b diff --git a/计算机网络/3 传输层.md b/计算机网络/3 传输层.md new file mode 100644 index 00000000..e69de29b diff --git a/计算机网络/4.1 网络层-基本原理.md b/计算机网络/4.1 网络层-基本原理.md new file mode 100644 index 00000000..1152bc0a --- /dev/null +++ b/计算机网络/4.1 网络层-基本原理.md @@ -0,0 +1,103 @@ +# 网络成-基本原理 + +## 1 基本功能 + +网络层建立在链路层之上,它的最主要的功能是使得网络中的各个主机之间可以互相通信。在因特网中,IP层是TCP/IP协议族中最为核心的协议,也是最复杂的层次之一。网络层的功能是要将分组从一个主机移动到另一个主机从而使得主机之间可以互相通信。为此需要网络层提供两种功能: + +### 存储转发 + +路由器(三层交换机)将进入其某个输入链路的分组转发到其某个输出链路。它是将分组从一个输入链路移动到一个输出链路,是一个路由器的本地动作。 + +### 路由选择 + +在分组从一个主机流向另一个主机的过程中,网络层必须决定分组所走过的路径。计算这个路径信息的算法就是路由算法。它是一个网络范围的动作,决定分组从其源到目的应该走的路径 + +### 连接建立 + +在有些计算机网络中,连接建立也是网络层的重要功能。比如ATM,它要求从源到目的地沿着所选择的路径彼此握手,以便在源和目的之间建立起状态。 + +## 2 服务特点 +* 确保服务:确保能最终到达目的地 +* 时延上界:不仅确保交付,而且确保在时上界内交付 +* 有序分组交付:确保分组按照它们被发送的顺序到达目的地 +* 确保最小带宽:只要发送主机以低于特定比特率的速录传输,分组就不会丢失 +* 确保最大时延抖动:发送方发送两个连续分组的时间间隔和接收方接收它们的时间间隔之间的差值在一定范围内 +* 安全性服务:使用仅仅发送方和接收方所知晓的密钥通信。但是因特网的网络层提供的是无连接的不可靠的服务,尽力而为的服务,其含义是: +* 不可靠:IP层不保证IP数据报能成功到达目的地。如果需要保证可靠传输,则需要使用其它协议,比如TCP。 +* 无连接:IP不维护任何关于后续数据报状态的信息,每个数据报的处理是相互独立的。因此两个IP之间的多个报文可能乱序到达,可能走不同的路径。 + + +## 3 网络类型 + +### 虚电路 + +### 数据报网络 + +在因特网中,每当一个主机要发送一个分组时, 它就为该分组加上目的主机的地址,然后将该分组发送出去。 +当分组在网络中向目的地传输时,它会经过一系列路由器。每个路由器都使用该分组的目的地址来转发给分组。每台路由器都由一个将目的地址映射到链路接口的转发表,每当分组到达时,路由器就利用分组的目的地址在转发表中查找一个合适的输出链路接口,然后路由器将分组从该输出链路接口发送出去。 +在因特网中,路由器的转发表可以由选路算法或者管理员更新。由于转发表的修改可能发生在任意时刻,因而两个主机之间的分组在不同的时刻走的可能是不同的网络路径,并可能无序到达。 + +最长前缀匹配规则 + +网络前缀:是网络地址的前边某些连续比特。比如对于地址 11101111 11011110 1000000 00000001,其对应的8比特前缀为11101111 , 16比特前缀为11101111 11011110 +在该规则下,路由器的转发表中记录的是网络前缀和输出链路接口之间的对应关系。当查转发表时,仍然利用目的地址来进行匹配,但是可能会有很多歌匹配,这个时候取匹配到的比特数目最多的表象作为命中表项,并根据它来转发分组。 + + +## 4 路由器构成(硬件) + + +路由器在网络层是一个极其重要的设备,每台路由器都由一张转发表。路由器检查到达分组首部中的一个字段的值,然后利用该值在路由器的转发表中进行查询,以决定该如何转发该分组。查询的结果是分组将被转发的路由器的链路接口。 + +网络层的最主要的功能是将分组从一台主机移动到另一台主机。该功能主要是由路由器完成的。典型的路由器结构如下: + +### 输入端口 +它接入输入的物理链路,和链路远端的数据链路层交互,并完成查找和转发功能,以使得输入分组能够进入到合适输出链路接口。对于控制分组,它则会进入选路处理器。 + + +输入端口的线路端接功能与数据链路处理实现了与通向路由器的各个输入链路相关的物理层和数据链路层。输入端口的查找/转发功能对路由器的转发功能是非常重要的。在很多路由器中,就是在这里来确定一个到达的分组经交换结构转发给哪个输出端口。输出端口的选择是取决于转发表中的信息,虽然转发表是由选路处理器计算的,但是通常每个输入端口都会有一份转发表的影子拷贝,并且会被及时更新。正因为输入端口拥有转发表的本地拷贝因而就可以在每个输入接口做出转发决策,而无需调用中央选路处理器,这种模式可以避免在路由器的某个节点产生转发处理瓶颈。 +在输入端口处理能力受限的路由器中,输入端口会将分组转发给中央绚丽处理器,然后由它执行转发表查找并将分组转发到恰当的输出端口。 +在有了转发表后,转发决策就很简单,就是查找转发表,但是由于主干路由器的转发表规模很大, 而且我们期望输入端口的处理速度能够达到线速或者说我们期望查表的速度越快越好,因而就需要对转发表的组织和查询进行优化,常见的方式有: +以树形结构存储转发表,树的每一级对应目的地址中的一个比特,如果地址比特位0则搜索其左子树,否则搜索右子树。采用这种结构,N比特的目的地址可以在N步之内找到相应的转发表项。 +内容可寻址内存CAM,采用树形结构对于主干路由器来说还是太慢了,CAM允许将一个IP地址交给CAM,然后由CAM在常数时间内返回该地址对应的转发表项的内容。 +将最近访问的转发表保存在高速缓存。 +找到分组输出端口后,分组就可以进入交换结构。这个时候分组可能会被阻塞,因而来自其它输入端口的分组可能正在使用交换结构。被阻塞的分组需要在输入端口排队。 + +### 交换结构 + +它将路由器的输入接口连接到它的输出接口。 + + + +在这种由纵横式交换机构成的互联网络中任意两个端口之间都有自己的专用总线,因而可以克服单一、共享式总线的带宽限制。使用这种网络时,往往把长度变化的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%,在某些假设前提下,输入队列就将无限增大,从而导致丢包。 diff --git a/计算机网络/4.2 网络层-网际协议.md b/计算机网络/4.2 网络层-网际协议.md new file mode 100644 index 00000000..708306ef --- /dev/null +++ b/计算机网络/4.2 网络层-网际协议.md @@ -0,0 +1,214 @@ +IP(internet protocol)协议是TCP/IP协议族的核心协议,是因特网的网络层。当前的版本号是4,也称为IPv4,下一代IP协议的版本号为6即IPv6。正如描述的网络层功能一样,IP层为因特网提供了选路和转发的功能。接入因特网的主机之间可以通过IP层而互相通信,在IP层,IP地址用于标识接入网络的接口,进而标识一台主机。当信息在TCP/IP协议栈中传递时,每层都会添加其自己的控制信息,即协议头,IP地址被添加在IP头中。IP头提供了IP协议以及数据报的信息。 +一、IPv4数据报格式 +当接入网络的两台设备通过IP层互相通讯时,交互的信息会被封装成网络层分组,网络层分组又被称为数据报。IPv4的数据报格式如下: + + +其各个字段的含义如下: +版本号:协议版本号,IPv4为4,IPv6则为6(当然IPv6的头部不完全是这样,但是4个比特含义一致) +首部长度:首部长度指的是首部占32 bit字的数目,包括任何选项。因此IPv4首部最长为60个字节 +服务类型:服务类型(TOS)字段包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TO S分别代表:最小时延、最大吞吐量、最高可靠性和最小费用 +数据报长度:以字节为单位的整个IP数据报的长度(包括首部)。 +标识、标志、片偏移:标识用来唯一确定主机发送的每一个IP数据报。标志和片偏移用来支持IP分片,当然它们必须和标识一起使用。IPv6则不允许在路由器分片,在IPv6中,分片和重组必须在源和目的进行 +生存时间:数据报可以经过的路由器数,这使得IP数据报早晚会在网络中消失,即要么被消失,要么由于生存时间达到而“死亡” +协议:标识IP层承载的上一层协议类型,比如UDP/TCP/SCTP。 +首部校验和:首部检验和字段是根据I P首部计算的检验和码。IPv6首部中不再包含首部校验和。 +源、目的地址:源的IP地址和目的的IP地址 +选项:最后一个字段是任选项,是数据报中的一个可变长的可选信息。主要包括: +安全和处理限制 +记录路径(让每个路由器都记下它的I P地址) +时间戳(让每个路由器都记下它的I P地址和时间) +宽松的源站选路(为数据报指定一系列必须经过的I P地址) +严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。 +1.IP分片 +数据链路层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。但是分片报文只有到了最终目的地才会被重组。重新组装由目的地的IP层来完成,其目的是使分片和重新组装过程对运输层(比如TCP)是透明的。 +IP头部包含一个由数据报原始发送者设置的标识字段,它在由该发送者发送的IP数据报中是唯一的。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。 +标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片,在这种情况下,如果路由器判断需要分片就把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)给数据报的源主机。 +当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。 +但是IP分片存在一个严重的缺陷:即使只丢失一片数据也要重传整个数据报。 +在IPv6中,分片功能被限制在源主机进行,这是因为分片增加了网络核心(即路由器)的工作量,使得它不得不为所有报文进行分片处理的判断,网络核心应该更专注于它选路和转发的功能,而不是被额外的处理所打断。 +二、IPv4地址 +在因特网中,无论是主机还是路由器,都通过接口接入网络。接口是主机或路由器接入网络的装置,一般情况下,一个主机由一个接口,而路由器有多个接口。为了使得接口能够工作在网络层,每个接口都需要有IP地址。因此,IP实际上是和接口相关联的,而不是与主机或路由器相连的。 +1.IPv4地址格式 +IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。 +因特网中,每台主机或路由器的接口都有一个IP地址。但是每个接口的IP地址不能随意选择,每个接口的IP地址的组成部分需要由其连接的子网来决定。 +1.分类编址 +最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A类~E类。其中A、B、C3类(如下表格)由InternetNIC在全球范围内统一分配,D、E类为特殊地址。 +网络类别 最大网络数 第一个可用的网络号 最后一个可用的网络号 每个网络中的最大主机数 +A 126(2^7-2) 1 126 16777214 +B 16384(2^14) 128.0 191.255 65534 +C 2097152(2^21) 192.0.0 223.255.255 254 +其地址布局如下图: + + +A类IP地址 +一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,可以用于主机数达1600多万台的大型网络。 +A类IP地址 地址范围1.0.0.0到126.255.255.255[2](二进制表示为:00000001 00000000 00000000 00000001 - 01111111 11111111 11111111 11111111)。最后一个是广播地址。 +A类IP地址的子网掩码为255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777214台。 +B类IP地址 +一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,每个网络所能容纳的计算机数为6万多台。 +B类IP地址地址范围128.0.0.0-191.255.255.255[1](二进制表示为:10000000 00000000 00000000 00000001----10111111 11111111 11111111 11111110)。 最后一个是广播地址。 +B类IP地址的子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台 +C类IP地址 +一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,适用于小规模的局域网络,每个网络最多只能包含254台计算机。 +C类IP地址范围192.0.0.0-223.255.255.255[1](二进制表示为: 11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111110)。 +C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台 +D类IP地址 +D类地址被IP用作多播。多播为IP提供了向过个目地转发数据的能力。 +D类地址的28bit均用作多播组号而不再表示其他。多播组地址包括为1110的最高4bit和多播组号。它们通常可表示为点分十进制数,范围从224.0.0.0到239.255.255.255。 +能够接收发往一个特定多播组地址数据的主机集合称为主机组(hostgroup)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。 +一些多播组地址被IANA确定为知名地址。它们也被当作永久主机组。 +特殊的网址 +每一个字节都为0的地址(“0.0.0.0”)对应于当前主机; +IP地址中的每一个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址; +IP地址中凡是以“llll0”开头的E类IP地址都保留用于将来和实验使用。 +IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.255.255.255用于回路测试,如:127.0.0.1可以代表本机IP地址,用“http://127.0.0.1”就可以测试本机中配置的Web服务器。 +网络ID的第一个6位组也不能全置为“0”,全“0”表示本地网络。 +2.CIDR编址 +当前采用的地址分配策略为无类别域间选路(CIDR)。CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。在分类编址方案中,只有A,B,C三类地址可用,但是对于有的组织来说,它的大小可能位于B和C类之间,如果用C类地址,不够用,而用B类地址又会导致宝贵的地址资源的浪费。采用CIDR方案即可解决这个问题。 +在这种编址方案中IP地址被分为网络部分和主机部分两部分,并且具有形式a.b.c.d/x,其中x指示了第一部分中的比特数。前x比特被称为该地址的前缀。该组织内部的设备得IP都将具有该前缀,因而对于外部的路由器,它只需要一条指向该前缀的路由即可。当数据报进入该组织内部网络后,内部的路由器将根据32-x比特的信息转发数据报。 +CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。 +2.地址分配管理 +1.地址管理和获取 +虽然知道了IP的格式,但是用户不可能随意定义自己的IP。做个简单的比方,你不可能给你自家所在的地方随意起个名字,然后就让快递公司给你送件,快递公司是不知道你自定义的这个地址的信息的。为了获得一个可以工的IP地址,这个IP必须是被因特网中的路由器所承认的,为什么是路由器?因为路由器决定了数据报怎么选路,怎么转发,因而只有路由器能够将数据报转发给你的主机,你的主机才算是接入了网络,因而从这个意义说,路由器在因特网中扮演了核心角色。 +从因特网的结构上来说,用户需要从ISP获取一个IP地址或地址块,而ISP则向它的上一级ISP获取地址块,最终所有的地址都来自于ICANN,因特网名字与号码分配机构。 +2.获取主机地址 +上边描述的是地址的来源和管理方式。但是并没有真正将地址分配给接口。从技术上来说,将IP分配给接口有两种方式,手动配置或动态配置。更常用的是动态配置,因为这更加灵活方便,也可以降低 管理员的负担。动态配置是通过DHCP,即动态主机配置协议实现的。它不仅可以用于获取IP信息,它还可以获取子网掩码,第一条路由器,DNS服务器地址等等信息,因而也是很重要很常用的一个协议。 +3.私有地址 +ICANN只管理公共地址,还有部分地址私有地址。私有地址(Private address)属于非注册地址,专门为组织机构内部使用。 +以下列出留用的内部私有地址 +A类 10.0.0.0--10.255.255.255 +B类 172.16.0.0--172.31.255.255 +C类 192.168.0.0--192.168.255.255 +3.NAT和UPnP +1.NAT +网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。 +NAT将自动修改IP报文的源IP地址和目的IP地址,IP地址校验则在NAT处理过程中自动完成。有些应用程序将源IP地址嵌入到IP报文的数据部分中,所以还需要同时对报文的数据部分进行修改,以匹配IP头中已经修改过的源IP地址。否则,在报文数据部分嵌入IP地址的应用程序就不能正常工作。 +NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。 +静态转换:是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。 +动态转换:是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。 +端口多路复用(Port address Translation,PAT):是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。 +无论采用哪种方式,在内部都使用了一张NAT转换表,它记录了地址转换的相关信息。 +NAT也有一些争议: +它使用了端口号,而端口号在设计中是为了区分网络程序的。 +它使得路由器必须处理网络层以上的信息,违反了分层原则 +它违反了端到端原则,即主机之间应相互直接通信 +2.UPnP +UPnP指的是通用即插即用,它可以用来支持NAT穿越。它要求主机和NAT是UPnP兼容的。使用它时,在一台主机上运行的应用程序能够为某些请求的公告端口号请求一个NAT映射,该映射位于(私有IP地址,私有端口号)和(公共IP地址,公共端口号)之间。如果NAT接受了这个请求,并且声称该映射,则来自外部的节点就能够发起到(公共IP地址,公共端口号)的TCP连接。 +三、ICMP +ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 +ICMP属于网络层协议,它提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。 +ICMP报文如下: + +ICMP报文可以分为两大类:ICMP查询报文和ICMP差错报文。 +对于ICMP差错报文,ICMP报文总是会包含引起该ICMP报文首次产生的IP数据报的首部和前8字节的内容,而且以下情形不会产生ICMP差错报文: +ICMP差错报文。 +的地址是广播地址或多播地址的IP数据报。 +作为链路层广播的数据报。 +不是IP分片的第一片。 +源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。 +ICMP查询报文被用来查询网络相关的一些信息,比如回显应答和请求(ping),路由器请求和通告,时间戳等。 +四、IPv6 +现在广泛使用的IP技术是IPv4,它存在一些问题: +地址空间的局限性: I P地址空间的危机由来已久,并正是升级的主要动力。 +性能:尽管I P表现得不错,一些源自2 0年甚至更早以前的设计还能够进一步改进。 +安全性:安全性一直被认为是由网络层以上的层负责,但它现在已经成为IP的下一个版本可以发挥作用的地方。 +自动配置:对于I P v 4节点的配置一直比较复杂,而网络管理员与用户则更喜欢“即插即用”,即:将计算机插在网络上然后就可以开始使用。I P主机移动性的增强也要求当主机在不同网络间移动和使用不同的网络接入点时能提供更好的配置支持。 +这些问题是IP升级的动力,下一代的IP技术室IP版本6即IPv6。 +相对于IPv4,IPv6的变化主要包括: +扩展地址。地址扩展到了128比特,地址空间增大了2的96次方倍。 +简化头格式。字段只有8个,加快报文转发,提高了吞吐量。 +增强对于扩展和选项的支持。可以支持更多的服务,也简化了报文转发的处理。 +流标记。路由器需要对流进行跟踪并保持一定的信息,这些信息在流中的每个包中都是不变的。这种方法使路由器可以对流中的包进行高效处理。 +身份验证和保密。身份认证和隐私权是IPV6的关键特性。 +1.IPv6头部 +IPv6头部如下图所示: + + +版本。长度为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 +这个地址中用于选路的前缀长度为60位。 +IPv6128比特地址空间的划分如下图: + + +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单播地址格式如下: + + +IPv6单播地址包括下面几种类型: +可集聚全球地址。 +未指定地址或全0地址。 +回返地址。 +嵌有IPv4地址的IPv6地址。 +基于供应商和基于地理位置的供应商地址。 +OSI网络服务访问点(NSAP)地址。 +网络互联包交换(IPX)地址。 +2.多播 +多播用于标识一组节点,它的工作过程是:当设备预订多播地址时,它声明要成为多播的一个成员。于是任何本地路由器将以该节点的名义预订多播地址。同一网络上的其他设备要发送信息到该多播地址时,IP多播包将被封装到链路层多播数据传输单元中。并发送给设备。 +IPv6多播地址格式如下图: + + +多播地址只能用作目的地址,没有数据报把多播地址用作源地址。地址格式中的第1个字节为全“1”,标识其为多播地址。多播地址占了IPv6 +地址空间的整整1/256。多播地址格式中除第1字节外的其余部分,包括如下三个字段: +标志字段:由4个单个位标志组成。从左到右分别为: +最高位为保留位,必须为 0。 +R 位取0 表示非内嵌RP 的组播地址;取1 则表示内嵌RP 的组播地址,此时P、T 位也必须置1。 +P 位取0 表示非基于单播前缀的组播地址;取1 则表示基于单播前缀的组播地址,此时T 位也必须置1。 +T 位取0 表示永久分配组播地址;取1 则表示非永久分配的组播地址。 +范围字段:长4位,用来表示多播的范围。即,多播组是只包括同一本地网、同一站点、同一机构中的节点,还是包括IPv6全球地址空间中任何位置的节点。该4位的可能值为0~15, +组标识符字段:长112位,用于标识多播组。根据多播地址是临时的还是熟知的以及地址的范围,同一个多播标识符可以表示不同的组。永久多播地址用指定的赋予特殊含义的组标识符,组中的成员既依赖于组标识符,又依赖于范围。 +多播范围取值及其意义如图: + + +3.泛播 +多播地址在某种意义上可以由多个节点共享。多播地址成员的所有节点均期待着接收发给该地址的所有包。泛播地址与多播地址类似,同样是多个节点共享一个泛播地址,不同的是,只有一个节点期待接收给泛播地址的数据报。 +泛播对提供某些类型的服务特别有用,尤其是对于客户机和服务器之间不需要有特定关系的一些服务,例如域名服务器和时间服务器。名字服务器就是个名字服务器,不论远近都应该工作得一样好。同样,一个近的时间服务器,从准确性来说,更为可取。因此当一个主机为了获取信息,发出请求到泛播地址,响应的应该是与该泛播地址相关联的最近的服务器。 +1.泛播地址的分配及其格式 +泛播地址被分配在正常的IPv6单播地址空间以外。因为泛播地址在形式上与单播地址无法区分开,一个泛播地址的每个成员,必须显式地加以配置,以便识别泛播地址。 +2.泛播选路 +一个泛播地址必定带有一个选路项:该选路项包括一些指针,指向共享该泛播地址的所有节点的网络接口。这个信息将被用于路由器的选路。 +3.其它 +类似于IPv4,IPv6也使用了ICMP和DHCP,这两个协议都有对应于IPv6的版本。详细的信息可参考相关协议。 \ No newline at end of file diff --git a/计算机网络/4.3 网络层-路由算法.md b/计算机网络/4.3 网络层-路由算法.md new file mode 100644 index 00000000..8f0aaabc --- /dev/null +++ b/计算机网络/4.3 网络层-路由算法.md @@ -0,0 +1,89 @@ +# 网络层-选路算法 +网络中的主机通常都直接与一台路由器相连接,该路由器即为该主机的默认路由器,它是该主机的第一跳路由器。每当主机发送一个分组时,它都首先将分组发送给起默认路由器,在接收端,目的主机的默认路由器把来自于网络上其它主机的分组转发给目的主机,因而网络中从源主机到目的主机的选路就是从源主机的默认路由器(也可以成为源路由器)到目的主机的默认路由器(也可以成为目的路由器)之间的选路问题。 +选路算法的目的很简单:给定一组路由器以及连接路由器的链路,选路算法要找到一条从源路由器到目的路由器之间的“好"路径。通常好路径指的是最低费用的路径。由于网络中的路由器组成的拓扑是典型的图结构,因而可以用图来研究选路问题。 +在网络图中,节点表示路由器,边表示路由器之间的链路。给边赋予一个表示费用的值(费用可以为链路速度,金钱,线路长度等等),然后选路算法的目的就变为在图中找到给定的两点之间的具有最低费用的路径。 +1.选路算法的分类 +根据选路算法是全局的还是局部的,选路算法可以分为: +全局选路算法:用完整的,全局性的网络信息来计算从源到目的的最低费用路径。这种算法通常称为链路状态算法即LS算法,因为该算法必须知道网络中每条链路的费用。 +分布式选路算法:以迭代的、分布式的方式计算出最低费用路径。没有节点拥有关于所有网络链路费用的完整信息,而每个节点仅有与其直接相连链路的费用信息即可开始工作。然后通过迭代计算过程并与相邻节点交换信息,一个节点逐渐计算出到达目的节点或者一组目的节点的最低费用路径。 +还可以根据算法是静态的还是动态的来分类: +静态选路算法:随着时间的推移,路由的变化非常缓慢,同时是在人的干预下进行调整。 +动态选路算法:能够在网络流量负载或者拓扑发生变化时改变选路路径。动态选路算法可以周期性的运行或者在拓扑或链路费用发生变化时直接运行。 +还可以根据算法是负载敏感的还是负载迟钝的进行划分: +负载敏感算法:链路费用会动态的变化以反映底层链路的当前拥塞水平。当前的因特网选路算法都是负载迟钝的。 +2.链路状态选路算法 +链路状态算法需要网络拓扑和所有链路费用信息作为输入。实践中,这可以通过让所有节点都向网络中的而所有其它路由器广播链路状态分组来完成。每个链路状态分组包含了它所连接的链路的特征和费用。广播的结果是所有节点都具有了该网络的同一个完整的视图。于是每个节点都可以运行LS算法从而计算出相同的最低费用路径集合。 +根据图论的知识,可以使用Dijkstra算法来计算最短路径,它计算从某个节点到网络中所有其它节点的最低费用路径,它是一个迭代算法,在k次迭代后,就可以得到从源节点触发到k个节点的最短路径。(Prim算法也可以用于计算图中两个节点之间的最短路径,根据图论的知识,它适用于具有稀疏边的图。)算法的复杂度为O(n2)。 +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.距离向量选路算法 +距离向量算法DV(Distance-vector)是一种迭代的、异步的和分布的算法: +分布式的:每个节点都要从一个活多个直接相连的邻居收集某些信息,执行计算,然后将结果发回个邻居。 +迭代的:该过程要一直持续到邻居之间没有更多的信息要交换为止。 +异步的:各个节点的操作不需要保持一致。 +DV算法,利用了Bellman-Ford方程: +dx(y)=minv{c(x,v)+dv(y)} +其中dx(y)表示从节点x到节点y的最低费用路径的费用。c(x,v)的含义是节点x到其邻居v的路径费用。方程式的含义是从节点x到节点y的最低费用路径的费用等于所有邻居v中c(x,v)+dv(y)最小的那个。 +在DV算法中,Bellman-Ford的一个重要的贡献就是,得到最小值的那个v节点就是当前节点向y转发时的下一跳节点,当需要向y转发时,只需要将分组送给节点v即可。算法思想:对于网络N中的素有节点,令Dx=[Dx(y):y属于N]是节点x的距离向量,该向量是从x到N中所有其它节点y的费用估计向量。每个节点x维护下列选路数据: +对于每个邻居v,从x到直接相连的邻居v的费用为c(x,v)。 +节点x的距离向量,它包含了x到N中所有目的地的费用的估计值 +它的每个邻居的距离向量,即对x的每个邻居v有Dv=[Dv(y):y属于N] +DV算法中,每个节点不时的向它的每个邻居发送它的距离向量的拷贝。当节点x收到他的邻居v的一个新的距离向量时,它保存v的距离向量,然后根据Bellman-Ford方程更新自己的距离向量。如果节点x的距离向量因这个更新而改变,则节点x将向它的每个邻居发送它的更新后的距离向量。 +从邻居接收更新距离向量,重新计算选路表项和通知邻居到目的地的最低费用路径的费用已经变化的过程会一直持续知道无更新报文发送为止。DV算法被用于因特网的RIP和BGP。 +1.距离向量算法:链路费用变化和链路故障 +运行DV算法的节点在检测到其到邻居的链路费用发生变化时就会更新器距离向量,并且如果最低费用路径发生了变化,它就向邻居通知其新的距离向量。当链路费用降低时,DV算法可以就得到变化后的最低费用。但是如果是链路费用增加,则会出现一点问题,如下图所示拓扑: + + +链路费用变化前,网络拓扑如上图所示,则Dy(x)=4,Dy(z)=1, Dz(y)=1, Dz(x)=5,在t0时刻,y检测到链路费用变化(从4增加到40)。y会更新器最低费用路径,根据Bellman-Ford方程,其计算出来的值为6。但是观察这个时候的网络拓扑,显然这是不正确的。出现这个现象的原因是:y更新器距离向量时,利用了z通告给它的z的距离向量,Dz(x)=5,但是显然,Dz(x)是依赖于Dy(x)的,在Dy(x)变化后它显然是一个错误的值。更重要的是在这个时刻,会出现选路环路:为了到达x,y通过z选路,而z又选择通过y选路,这样的选路结果是分组无法到达目的地。 +y计算出来了一个新的到x的最低费用,因而它在t1时刻将新的距离向量通告给z +z收到y的新的距离向量后更新其距离向量,它计算出来的新的Dz(x)=7 +该过程一直循环,直到计算出来一个正确的值Dy(x)=40,Dz(x)=41 +从上述过程可以看到使用DV算法时,坏消息传递的比较慢。而且上述过程只是一个链路的费用变高了,如果有多个链路的费用变高,则会遇到所谓的计数到无穷的问题。 +2.距离向量算法:增加毒性逆转 +毒性逆转可以解决上述特定的网络拓扑中的环路状况。其思想是:如果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算法,可以预期它根本就不会收敛。 +管理自治:某些组织可能倾向于按自己的意愿管理自己的网络,对外隐藏自己的内部网络面貌。 +解决这两个问题采用的方法是将路由器组织到自制系统(AS)。 +每个AS由一组通常在相同管理控制下的路由器组成,相同的AS内部的路由器都运行同样的选路算法,且具有彼此之间的信息。在一个自制系统内运行的选路算法叫自制系统内部选路协议。AS内的一台或多台路由器将有另外的任务,即负责向本AS之外的目的地转发分组,这些路由器被称为网关路由器。 +当AS只有一个网关路由器时,AS内的路由器很容易将目的地不属于本AS的分组转发到网关路由器(因为AS内的路由器都知道自己到达网关路由器的最短路径),然后由网关路由器转发到AS外部。 +但是当AS有多个网关路由器时,AS就需要 +知道经过与自己的网关路由器相连的其它AS可以到达哪些目的地 +在本AS内部传播这些可达信息 +这两项任务是由自治系统间选路协议完成的。因特网的所有AS都运行相同的自治系统间选路协议。每台路由器都接收来自一个AS内部的内部选路协议和一个AS间选路协议的信息,并使用这些信息配置自己的转发表。 +当一个AS通过自治系统间选路协议知道它可以通过自己的多个网关路由器到达某个目的地时,AS内部的路由器如何添加自己到该目的的路由?通常采用的策略是热土豆选路(hot potato routing),其思想是让AS尽快摆脱分组,即尽快将分组转发给其它AS,路由器将选择具有下列特性的网关路由器,然后根据本路由器到该网关路由器的路径添加路由: +该网关路由器可以到达该目的地 +该网关路由器到本路由器具有最低费用路径 +当一个AS从一个相邻AS知道了一个目的地时,它可以向它的某些其它邻居AS通告该路由信息,但是是否通告,通告哪些内容是一个AS的管理策略问题。取决于AS的配置管理策略。 +因此总结起来,在一个AS内部,所有路由器都运行相同的内部选路协议。在各AS之间,AS运行相同的自治系统间选路协议。AS内部的路由器仅需要知道本AS内部的路由器,AS的管理组织可以运行它选择的任何内部选路协议。 \ No newline at end of file diff --git a/计算机网络/4.4 网络层-路由协议.md b/计算机网络/4.4 网络层-路由协议.md new file mode 100644 index 00000000..fa26eb08 --- /dev/null +++ b/计算机网络/4.4 网络层-路由协议.md @@ -0,0 +1,92 @@ +一、RIP +在因特网中,AS即自制系统内部使用的两个选路协议是RIP(路由信息协议,Routing information Protocol)和OSPF(Open Shortcut Path First)。 +RIP是一种距离向量协议,运行方式和理想化的DV算法相似。在RIP中,DV算法中的费用采用的是跳数,即从源路由器到目的路由器的最短路径上的路由器数。RIP中一条路径的最大跳数被限制为15,因此RIP被限制用在网络直径不超过15的自制系统内。DV算法需要在路由器之间发送每个路由器的距离向量信息,RIP通过RIP通告(也称为RIP响应报文)来完成这个功能,RIP通告大约30秒相互交换一次。RIP通告包含了选路更新信息。 +每台路由器都维护有一张选路表,它包含了路由器的距离向量个该路由器的转发表。 +运行RIP协议的路由器每隔30秒就会发送RIP通告,如果一台路由器超过180秒还没收到邻居的RIP通告,它就认为邻居不再可达。此时它会更新自己的距离向量,并向相邻路由器通告该信息。 +RIP也允许路由器主动发送请求报文请求某个邻居更新其路由信息,这是通过发送RIP请求报文实现的。RIP协议使用了DUP协议并使用端口520。 +二、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层次结构中,一个区域被配置成主干区域,它包含了AS内所有区域的区域边界路由器以及一些不在任何其它区域内的路由器,该区域的目的是为AS内其它区域之间的流量选路。 +三、BGP +BGP是因特网中使用的自制系统间的选路协议,它极其复杂。 +四、广播和多播选路 +广播选路指的是网络层提供的从一个源节点到网络中所有其它节点的分组选路服务。 +多播选路指的是网络层提供的从一个源节点到网络中一组节点的分组选路服务。 +1.广播选路 +最直接的实现广播选路的方法是由发送节点向所有目的地发送分组的拷贝,这种方法看起来很简单,但是它有一些缺点使得它实用: +效率低下,一个分组变成了N个分组,极大的浪费了带宽 +无法知道所有潜在目的地的地址,除非设计新的协议用于该目的,但是这无疑加大了其难度 +链路状态协议使用了广播来更新链路状态信息,在这种情况下,广播的目的是产生和更新单播路由,因而如果再反过来用单播来实现广播就变得不明智了 +因而必须采用其它方式来实现广播选路。 +1.无控制泛洪 +实现广播最显而易见的方式是使用泛洪,即所有节点都向除了它接收分组的那个邻居之外的所有邻居转发分组。只要网络是连通的,分组必然可以到达所有节点,但是根据最简单的图论知识也可以知道,分组将在整个网络内不受限制的被复制,直到它们的生存时间到期。这将形成广播风暴,导致网络变得不可用。 +2.受控泛洪 +避免广播风暴的关键在于:每个节点可以选择泛洪分组的时机。有两种方案可以解决广播风暴的问题: +序号控制泛洪:源节点将其地址以及广播序号放入广播分组,再向网络泛洪分组。每个节点维护它收到的、复制的和转发的每个广播分组的序号列表,每当它收到一个广播分组时,都检查该表,如果已经存在就不泛洪,否则泛洪,并将新的信息更新到该表中。 +反向路径转发(RPF):当一台路由器接收到具有给定源地址的广播分组时,仅当该分组到达的链路正好是位于它自己到其源的最短单播路径上时,它才泛洪分组。否则它丢弃分组。 +3.生成树广播 +受控泛洪解决了广播风暴的问题,但是网络中还是会存在冗余的广播分组。生成树方案可以解决该问题。 +生成树:包含网络中的所有节点的,并使用网络中的链路所连接起来的连通图。 +最小生成树:每段链路的费用之和在所有生成树中最小的生成树。 +生成树广播指的是首先先对网络节点狗仔一棵生成树,当一个节点要发送一个广播分组时,它向所有属于该生成树的特定链路发送分组。该方案的复杂性在于生成树的生成和维护。 +实际中,OSPF使用了序号控制方法。 +2.多播选路 +多播用于将分组交付给网络节点的一个子集。 +多播通信中,有两个问题,一是怎样标识多播分组的接收方,怎么为多播分组的接收方编址。解决方案是使用简介地址编址,即用一个标识来标识一组接收方,寻址到该组的分组会被交付给与该分组相关的多播接收方。IPv4使用D类地址用于该目的,IPv6也有自己的多播地址格式。与一个多播地址关联的接收方组称为多播组。 +1.IGMP +在有了多播地址后,如果一个主机想要接收多播分组,就必须在多播地址和它自己之间建立关联关系,这是通过IGMP协议来实现的,主机通过该协议来通知主机的默认路由器“我要加入到某个多播组或者退出某个多播组”,路由器根据该信息来决定是否转发多播分组到主机。 +2.多播选路 +多播选路的目的是发现一颗链路树,该树连接了所有属于该多播组的主机相连的路由器。之后多播分组就可以沿着该树从发送方路由到所有属于该多播组的主机。选路树的构建有两种方法: +使用一颗组共享树进行多播选路:该方法基于一棵构建的树,该树包括了所有具有该多播组相连主机的路由器。该多播组的分组基于该树转发 +基于一棵基于源的树进行多播 选路:该方法为多播组中的每个源构建一颗多播选路数。实际中采用了RPF算法来构建该树,同时使用剪枝算法来修正该树。剪枝算法是指:如果一台路由器接收到了娿一个多播分组,而它无加入到该分组的主机,就向其上游发送一个剪枝报文,收到该剪枝报文的路由器将不会向该路由器转发该多播组的分组;如果一台路由器的每个下游路由器都向它发送了剪枝报文,它就向其上游发送一个剪枝报文。 +因特网中使用的多播选路算法有DVMRP(Distance Vector Multicast Routing Protocol)和PIM(Protocol-Independent Multicast)。 +五、MAC地址到IP地址的映射 +网络层用于在因特网中标识主机,并为主机之间提供选路和转发功能,但是物理上一个接口能否接收报文则取决于它的链路层地址(不考虑混杂模式,混杂模式下接口网卡会接收所有报文)。对于广播和组播,IP地址和链路层地址之间的关系是有固定算法的,所以很容易由IP地址得到链路层地址,但是对于单播,就必须有一种方法来将IP地址和链路层地址关联起来,在IPv4中这是通过地址解析协议ARP来实现的。ARP为IP地址和对应的硬件地址之间提供了动态映射。 +1.多播地址的MAC地址 +IPv4中多播地址与MAC地址的对应关系如图: + + +即MAC地址的高25比特固定为00000001 00000000 01011110 0,低23比特取自IP多播地址的低23比特。由于除了作为前缀的4个比特之外,还有5个比特未进入MAC地址,因而一个MAC多播地址对应了32个IP多播地址。 +IPv6中多播地址与MAC地址的对应关系如图: + + +即MAC地址的高16比特固定为3333,低32比特取自IP多播地址的低32比特。 +2.ARP的报文格式为: + + +以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。电缆上的所有以太网接口都要接收广播的数据帧。 +两个字节长的以太网帧类型表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。 +形容词hardware(硬件)和protocol(协议)用来描述ARP分组中的各个字段。例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)。 +硬件类型字段表示硬件地址的类型。它的值为1即表示以太网地址。协议类型字段表示要映射的协议地址类型。它的值为0x0800即表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同。 +接下来的两个1字节的字段,硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。 +操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)和RARP应答(值为4)(我们在第5章讨论RARP)。这个字段必需的,因为ARP请求 +和ARP应答的帧类型字段值是相同的。 +接下来的四个字段是发送端的硬件地址(在本例中是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。注意,这里有一些重复信息:在以太网的数据帧报头中和ARP请求数据帧中都有发送端的硬件地址。 +对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后把它发送回去。 +3.ARP的简单工作过程 +当一台主机需要和另一台主机通信时,它会首先查找路由表来获得下一跳的信息,如果下一跳信息中不包含MAC地址,它就需要解析下一跳的MAC地址,这时它就发送一个ARP请求到下一跳,而下一跳收到该请求后,就会发送一个ARP应答报文来告诉请求者它的MAC地址。在获得这个MAC地址之后,主机就可以继续自己的通信过程了。 +ARP请求报文是一个广播报文,目的MAC地址为全F,而源MAC地址为自己的MAC地址。负载中的信息包含了发送者的IP地址和MAC地址,以及目的IP地址,目的MAC地址为全0,一个例子如图: + + +ARP响应报文是一个单播报文,只会被发送给请求者。一个例子如图: + + +4.ARP代理 +如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理(ProxyARP)。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。 +5.免费ARP +一个ARP特性称作免费ARP(gratuitousARP)。它是指主机发送ARP查找自己的IP地址。通常,它发生在系统引导期间进行接口配置的时候。 +免费ARP可以有两个方面的作用: +一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。 +如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。一个比较著名的ARP协议事实[Plummer1982]是,如果主机收到某个IP地址的ARP请求,而且它已经在接收者的高速缓存中,那么就要用ARP请求中的发送端硬件地址(如以太网地址)对高速缓存中相应的内容进行更新。主机接收到任何ARP请求都要完成这个操作(ARP请求是在网上广播的,因此每次发送ARP请求时网络上的所有主机都要这样做)。 +5.IPv6的地址解析 +IPv6不适用ARP协议,而是使用ICMPv6协议中的ND(neighbor discover)来完成对应的解析过程。 diff --git a/计算机网络/4.5 网络层实验.md b/计算机网络/4.5 网络层实验.md new file mode 100644 index 00000000..e69de29b diff --git a/计算机网络/5 链路层.md b/计算机网络/5 链路层.md new file mode 100644 index 00000000..e69de29b diff --git a/计算机网络/5.4 链路层实验.md b/计算机网络/5.4 链路层实验.md new file mode 100644 index 00000000..8c12eb6a --- /dev/null +++ b/计算机网络/5.4 链路层实验.md @@ -0,0 +1,180 @@ +# 实验入门 + +## 1 实验说明 + + +## 2 设备简介 + +### 集线器(hub) + +* 物理层 +* 将多条以太网双绞线或光纤集合连接在同一段物理介质下的设备。某个端口接收到比特信号,简单的将比特信号复制转发到其他端口。多个端口同时输入信号时会发生冲突。 + +### 交换机(switch) + +* 链路层 +* 是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路,把传输的信息送到符合要求的相应路由上。采用背板总线交互结构,每个端口有一个独立的共享介质,每个冲突域只有一个端口。链路层是根据mac地址进行数据转发。 +* 交换方式主要包括:端口交换、帧交换、信元交换。 +* 具体结构如下: + +![asdf](\image/交换机结构.png) + +### 路由器(router) +* 网络层 +* 根据IP地址进行路由,转发到对应的网络。工作在广域网,连接不通的网络。数据转发基于路由表实现。 +* 路由器的主要功能有两个:存储转发与路由选择。 +* 路由选择主要包括两种方法:静态路由与动态路由。 +* 具体结构如下: + +![ads](\image/路由器结构.png) + +### 说明 +* 集线器本身不能区分广播域和冲突域,对收到的任何目的地之的消息都进行转发。 +* 二层交换机能够区分冲突域,每个端口是一个独立的冲突域,端口之间不会起冲突,会根据不同目的地址进行转发。但是不区分广播域,收到的广播消息会转发给所有同网段的主机。 +* 一个交换机下设置同网段的主机会处于同一个局域网下,设置不同网段的主机可以处于不同的局域网下。 +* 路由器和主机都具有适配器,每个适配器具有ip地址与Mac地址。但是交换机没有网络适配器,所有的接口不具有ip地址与Mac地址,其唯一的作用是维护一个Mac地址和交换机接口映射表。 +* ARP协议是用来解析MAC地址的协议。ARP协议在网络适配器当中执行,而不是交换机中。ARP维护的IP-MAC地址映射表存在主机的内存中,ARP表的每一个动态项都有生存周期,一段时间后自动清除。 +* DNS与ARP协议类似,DNS能够解析因特网中任意地方的主机名解析为IP地址。ARP协议只能讲局域网中的IP地址解析为MAC地址。 + + +* 简单来说,链路层的工作模式:如果是目的ip地址在局域网内,则直接arp拿到mac地址,发送帧。如果目的ip地址在局域网外,直接arp拿到网关mac地址(路由器适配器地址),发送帧。 +* 链路层,只关心目标适配器,不关心路由。只进行一跳。 + + +> 一会可以查看一下ping不通的原因,以及为什么路由表中没有另外一个地址(真奇怪) + +## 3 软件说明 + +> 使用华三通(H3C)的交换机和路由器。 + + +### 路由器和交换机的配置方式 + +* console口配置 +* Telnet配置 +* AUX口远程配置 +* 哑终端配置 +* FTP方式传送配置文件 + +### 控制级别 + +* 参观级 +* 监控级 +* 配置级 +* 管理级 + +## 4 H3C命令行 + +> 基于视图的命令行。 + +### 视图切换命令 + +``` +system-view //进入系统视图 +interface Ethernet1/0/1 //进入以太网接口视图 + +quit //退出当前视图 +``` + +### 用户视图 + +``` +display * //显示各种配置视图 +display current-configguration +display version +display interface Ethernet1/0/1 +display clock + + +? //查看该视图下的命令 + + +debuging //调试命令 + +reset //重置或清除相关配置 +reset saved-configuration +reset arp +reset ospf process + +reboot //重启 +``` + +### 系统视图 + +``` +sysname R1 //重命名当前视图 + + +``` + + + +### 路由器以太网端口视图 + +``` +# ip协议相关命令 +ip address ip-address mask[sub] +undo ip address [ip-address mask][sub] + +# MTU +mtu 100 +undo mtu + +# speed +speed [100|10|negotiation] //100M,10M,自动协商 + +# display +display interfaces ethernet number + +``` +### 交换机以太网端口视图 + +``` +shutdown +undo shutdown + +duplex full //设置全双工状态 +undo duplex //回复以太网全双工状态 + +spreed [10|100|auto] + +mdi [across|auto|normal] //设置接口网线类型 + +flow-control //流量控制 +undo flow-control //解除流量控制 + +port link-type [acces|hybrid|trunk] //设置接口链路类型 +undo port link-type + +display interface Ethernet1/0/1 +``` +### VLAN视图 + +### VLAN接口视图 + + +### RIP视图 + +### OSPF视图 + +### ACL视图 + + + + +## 5补充ip + +### 子网掩码 + +将IP地址分为网络地址与主机地址。通过子网掩码,就可以判断两个IP在不在一个局域网内部。子网掩码可以看出有多少位是网络号,有多少位是主机号。 + +* 网络地址 +* 主机地址 +* 广播地址:网络位与主机位都为1,是广播地址。 +* 一个交换机下设置同网段的主机会处于同一个局域网下,设置不同网段的主机可以处于不同的局域网下。 + +### 网关 +网间连接器、协议转换器。实现局域网与广域网的互联。 + + +# 链路层实验 \ No newline at end of file diff --git a/计算机网络/6 无线网络和移动网络.md b/计算机网络/6 无线网络和移动网络.md new file mode 100644 index 00000000..e69de29b diff --git a/计算机网络/image/交换机结构.png b/计算机网络/image/交换机结构.png new file mode 100644 index 0000000000000000000000000000000000000000..594ca0c31fc45908c06b872d42f825578c7a6e4b GIT binary patch literal 76985 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 z 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 literal 0 HcmV?d00001 diff --git a/计算机网络/image/路由器结构.png b/计算机网络/image/路由器结构.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea197302db9144a13dc84f6c1aff3fab8b05cb1 GIT binary patch literal 51374 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