From 2fcd6ec9617fac7c2a291ad23e8bcae67d706ac0 Mon Sep 17 00:00:00 2001 From: Zhou Date: Sun, 19 Jul 2020 20:57:11 +0800 Subject: [PATCH] finish computer network --- 计算机网络/img/应用层/HTTP报文.png | Bin 0 -> 80781 bytes 计算机网络/传输层.md | 324 +++++++++++++++++++++ 计算机网络/应用层.md | 249 +++++++++++++++++ 计算机网络/数据链路层.md | 31 ++ 计算机网络/网络层.md | 435 +++++++++++++++++++++++++++++ 5 files changed, 1039 insertions(+) create mode 100644 计算机网络/img/应用层/HTTP报文.png create mode 100644 计算机网络/传输层.md create mode 100644 计算机网络/应用层.md create mode 100644 计算机网络/网络层.md diff --git a/计算机网络/img/应用层/HTTP报文.png b/计算机网络/img/应用层/HTTP报文.png new file mode 100644 index 0000000000000000000000000000000000000000..f27b1238275cb1a156f2e875d48e36fbad280407 GIT binary patch literal 80781 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 bv7IBo`1|uBpU}GOZv5jk+ub44-aG8S&Xg{h literal 0 HcmV?d00001 diff --git a/计算机网络/传输层.md b/计算机网络/传输层.md new file mode 100644 index 0000000..9bd4664 --- /dev/null +++ b/计算机网络/传输层.md @@ -0,0 +1,324 @@ +# 传输层 + +## 功能 + +* 提供应用进程间逻辑通信 +* 差错检测 +* 提供无连接或面向连接的服务 +* 复用和分用 +* 面向连接的服务特有功能 + * 连接管理 + * 流量控制和拥塞控制 + +## 传输层寻址和端口号 + +* 使用端口号标识进程 + +### 端口号分类 + +#### 熟知端口 + +* 0~1023 + +* 常见熟知端口 + + | 应用名 | 端口号 | + | ------------------------ | ------------------------------ | + | FTP | 21(控制端口),20(数据端口) | + | TELNET | 23 | + | SMTP | 25 | + | DNS | 53 | + | TFTP | 69 | + | HTTP | 80 | + | SNMP(简单网络管理协议) | 161 | + | HTTPS | 403 | + +### 登记端口 + +* 1024~49151 +* 为没有熟知端口号的应用程序使用,使用这类端口号需要在IANA登记,避免重复 + +### 客户端端口或短暂端口 + +* 49152~65535 +* 客户进程运行时动态运行时的临时端口 +* 通信结束后,此端口自动空闲出来 + +## 套接字(SOCKET) + +* 用于标识某一主机的某个进程 +* Socket= ( IP地址 , 端口号 ) + +## 无连接和有连接服务 + +### 无连接服务(UDP) + +* 传输数据无需建立连接 +* 数据到达后无需确认 +* 不可靠交付 +* 报文头部段,传输开销小,时延较短 + +### 有连接服务(TCP) + +* 面向连接 +* 不提供短播,多播服务 +* 报文头部长,传输开销大 + +## UDP(用户数据报协议) + +### 优点 + +* 无需连接 +* 无需维护连接状态表 +* 首部只有8B +* 发送速率不受网络拥塞状态影响(无拥塞控制),适合实时性应用 +* 支持一对一,一对多,多对一,多对多的交互通信 + +### 数据报组成 + +* 首部字段:8B +* 数据字段 + +### 数据单元 + +* 数据报(传输上层交付的整块数据) + +### 首部格式 + +* 源端口:2B +* 目的端口:2B +* 长度:2B,(数据报长度最大为2^16^-1B,但一般取512B以下) +* 校验和:2B,校验伪首部,首部和数据 + +### 伪首部 + +* 仅用于校验 +* 可从IP数据报中提取 +* 不向下传送,也不向上递交 +* 长度:12B +* 组成 + * 源IP地址:4B + * 目的IP地址:4B + * 全0字段:1B + * 协议字段:1B,UDP为17 + * UDP长度字段:2B + +### UDP校验 + +#### 发送方步骤 + +1. 添加12B伪首部 +2. 将全零字段填入校验和字段 +3. 添加8B首部 +4. 添加数据字段(若数据字段为奇数,再补一个全0字节,该字节不发送,仅用于计算校验和) +5. 将这些数据以4B为一组,使用二进制反码计算进行累加 +6. 得到的结果的反码即为校验和,将其填入校验和字段 + +#### 接收方步骤 + +1. 添加12B伪首部 +2. 添加8B首部 +3. 添加数据字段(若数据字段为奇数,再补一个全0字节,该字节不发送,仅用于计算校验和) +4. 将这些数据以4B为一组,使用二进制反码计算进行累加 +5. 若结果为**1111 1111 1111 1111**(全1),则数据无误 + +#### 差错处理 + +* 可丢弃,也可附上错误报告交付上层 + +#### 优点 + +* 简单 +* 速度快 + +#### 缺点 + +* 检错能力差 + +## TCP(传输控制协议) + +### 特点 + +* 面向连接 +* 端到端 +* 可靠交付服务 +* 全双工通信 +* 使用缓存 + * 发送缓存 + * 准备发送的数据 + * 已发送未确认的数据 + * 接收缓存 + * 按序到达但未交付上层的数据 + * 不按序到达的数据 +* 面向字节流 + +### 数据单元 + +* 报文段(认为所有数据都是无结构字节流,不按结构切分数据) + +### TCP报文段 + +#### 首部长度 + +* 最短为20B +* 可以4B为单位增加首部选项 +* 最大长度为60B + +#### 组成 + +* 源端口:2B + +* 目的端口:2B + +* 序号:4B,每一字节数据编上一个序号,该字段为本次传输数据的第一个字节序号 + +* 确认号字段:4B,期待的下一个报文段的第一个序号,确认号为N,则证明前N-1个数据已收到 + +* 数据偏移:4位,数据字段距离报文段起始处的距离,代表首部长度 + +* 保留字段:6位,全0 + +* 紧急位字段URG:1位,URG=1,代表该数据有高优先级 + +* 确认位ACK:1位,连接建立后必须把ACK置1 + +* 推送位PSH:1位,置1代表应尽快交付数据,无需等缓存填满 + +* 复位RST:1位,置1代表线路出现严重错误,需要断开连接重连 + +* 同步位SYN:1位,SYN=1,代表请求连接或连接接收报文 + + | SYN | ACK | 含义 | + | ---- | ---- | ------------ | + | 1 | 0 | 请求连接 | + | 1 | 1 | 同意建立连接 | + +* 中止位FIN,1位,置1时代表此报文段发送方数据已发送完毕 + +* 窗口字段:2B,代表报文段发送者当前的接收窗口大小 + +* 校验和:2B,与UDP一样的计算方式,协议字段改为6 + +* 紧急指针字段:16位,代表本报文段的紧急数据长度(单位B),紧急数据放于报文段数据开头,与URG一同使用,紧急数据不经过缓冲区直接发送 + +* 选项字段:长度可变 + + * MSS:报文段数据最大长度 + +* 填充字段:使首部长度为4B的整数倍 + +### 连接管理 + +#### 规定 + +* 当SYN=1时,不携带数据,但消耗一个序号 + +#### 建立连接 + +* 三次握手 +* 主机A向主机B建立连接步骤 + 1. A发送SYN=1,ACK=0,seq=x + 2. B发送SYN=1,ACK=1,seq=y,ack=x+1 + 3. A发送ACK=1,ack=y+1(该报文段可携带数据,不携带数据时,不消耗序号) + +#### 断开连接 + +* 四次挥手 +* 主机A与主机B断开连接步骤 + 1. A发送FIN=1,seq=u + 2. B发送ACK=1,seq=v,ack=u+1 + 3. A关闭发送数据通路 + 4. B继续发送数据 + 5. B发送FIN=1,seq=w,ack=u+1 + 6. A发送ACK=1,seq=u+1,ack=w+1 + 7. A等待2MSL,关闭连接 + +#### A等待2MSL的原因 + +* 保证网络中所有报文段消失 +* 若A发送的ACK丢失,B将重发FIN,二者花费时间不会超过2MSL +* 若重传FIN丢失,B将无法正常关闭 + +#### 四次挥手原因 + +* 一个FIN和一个ACK断开一端发送数据通道 + +#### 三次挥手原因 + +* 采用二次挥手 + * 若ACK丢失,A将不知道B是否准备好连接,也不知道B起始序号 + * B将认为A准备好数据通信 + * A会认为连接未建立,忽略B的所有数据,产生死锁 + + + +### 可靠传输 + +#### 编号和确认 + +* 使用累计确认 +* 支持可选选项**选择确认SACK**(携带已收到的数据段),兼容累计确认 + +#### 重传 + +* 重传时延计算,使用加权平均 + * $平均RTT=(1-\alpha)*(平均RTT)+\alpha*(新时延) \ \ \alpha一般取0.125$ + * $重传时间RTO=\beta*平均RTT \ \ 其中\beta>1$ +* Karnn算法 + * 发生重传后,就不采用其作为时延样本 + * 令$RTO=\gamma*RTO \ \ 其中\gamma>1,一般取2$ + * 不发生重传时,再使用往返时延更新RTT + +### 流量控制 + +* 采用滑动窗口 +* TCP为每个连接建立持续计数器,若一方接到**零窗口通知**,则启动计数器,到期时发送零窗口探测报文段,若窗口大小仍为0,重置计数器 +* 发送时机控制 + * TCP维持一个MSS变量,当缓存区数据达MSS大小时,发送 + * 发送方使用PSH字段指名发送 + * 计数器到期,将缓存区不超过MSS的数据发送 + +### 拥塞控制 + +#### 变量定义 + +1. 各变量单位为MSS + +1. 接收窗口rwnd:接收方目前的接收窗口大小 +2. 拥塞窗口cwnd:发送方根据网络情况估计的窗口大小 +3. $实际发送窗口=min(cwnd,rwnd)$ +4. ssthresh:慢开始门限 + +#### 算法 + +##### 慢开始算法 + +1. 初始时,设cwnd=1 +2. 每收到一个ACK报文cwnd+=1 +3. 故在网络畅通且不断发送数据的情况下,第i个RTT后,cwnd=2^i^ + +##### 拥塞避免算法 + +* 每隔1个RTT,cwnd+=1 + +##### 算法选择 + +* 当cwndssthresh时,使用拥塞避免算法 +* 当cwnd=ssthresh时,任意选择一个(一般使用拥塞避免) + +#### 拥塞处理 + +* 发送超时时,ssthresh=cwnd/2 +* cwnd=1 + +##### 快重传算法 + +* 接收方向发送方连续发送3个重复ACK +* 发送方收到后,立刻重传缺失的报文段 + +#### 快恢复算法 + +- 发送方收到连续3个重复确认后,令ssthresh=cwnd/2 +- cwnd=ssthresh +- 执行拥塞避免算法 \ No newline at end of file diff --git a/计算机网络/应用层.md b/计算机网络/应用层.md new file mode 100644 index 0000000..7c0dfa3 --- /dev/null +++ b/计算机网络/应用层.md @@ -0,0 +1,249 @@ +# 应用层 + +## 应用模型 + +### 客户/服务器模型(C/S) + +#### 工作流程 + +1. 服务器等待请求 +2. 客户机发出请求,等待接收结果 +3. 服务器收到请求后进行处理,并返回客户机 + +#### 常见C/S模型应用 + +* Web +* FTP +* 远程登录 +* 电子邮件 + +#### 特点 + +* 地位不平等 +* 客户机间互相不直接通信 +* 可扩展性不佳 + +### P2P模型 + +#### 特点 + +* 网络中任意一对计算机(对等方)都可直接通信 +* 减轻了服务器的依赖 +* 可扩展性好 +* 网络健壮性强 + +#### 缺点 + +* 占用较多内存 +* 损害硬盘 +* 使网络拥塞 + +## DNS + +### 组成 + +* 层次域名空间 +* 域名服务器 +* 解析器 + +### 层次域名空间 + +* 域名不区分大小写 +* 除**连字符(-)**外不允许使用其他标点 +* 每个标号不允许超过63字符,整个域名最长不能超过255字符 +* 域名级别从左到右递增 +* 顶级域名分类 + * 国际顶级域名(nTLD),如cn,us + * 通用顶级域名(gTLD),如com,net + * 基础结构域名:只有一个arpa,用于反向解析域名 + +### 域名服务器 + +#### 根域名服务器 + +* 13个冗余集群服务器 +* 管理顶级域 + +#### 顶级域名服务器 + +* 管理该顶级域名下的所有二级域名 + +#### 授权域名服务器 + +- 将其管辖的主机域名转换为IP地址 + +#### 本地域名服务器 + +* 用于接收主机发出的DNS解析请求 +* 在网络配置中填写的域名服务器地址 + +### 域名解析过程 + +#### 递归查询 + +1. 主机查询本地DNS +2. 本地DNS查询跟DNS +3. 根DNS再查询下一个DNS +4. 以此类推,得到结果后递归返回 + +#### 迭代查询 + +1. 主机查询本地DNS +2. 本地DNS查询根DNS +3. 根DNS告诉本地DNS下一个查询的DNS +4. 本地DNS继续查询,以此类推 +5. 得到结果后返回主机 + +### 缓存 + +* 当一个DNS得到某个域名解析结果后,可对其进行缓存,优化查询时间 + + + +## FTP + +### 功能 + +* 提供不同种类主机间的文件传输能力 +* 以用户权限管理的方式提供用户对远程FTP服务器上的文件管理能力 +* 以匿名FTP的方式提供公用文件共享能力 + +### 工作步骤 + +1. 打开熟知端口(21)等待连接 +2. 用户发送请求后,启动从属进程处理用户请求,处理结束后从属进程关闭 +3. 回到等待状态 + +**注**: + +* FTP在整个会话期间保持用户信息,以跟踪用户当前目录等 + +#### 控制连接 + +* 使用21端口 +* 用于传输控制信息(使用7为ASCII码) + +#### 数据连接 + +* 用于传输数据 +* 一般使用20端口 +* 修改文件时,先将文件副本传送到本地主机,再将修改后的文件副本传回服务器 + +#### 主动模式与被动模式 + +* 主动模式:服务器使用20端口主动连接客户机传送数据 +* 被动模式:客户机连接服务器的随机端口进行数据传输 + +## 电子邮件 + +### 构件 + +* 用户代理:用户与邮件系统的接口 +* 邮件服务器 +* 邮件协议 + * SMTP(简单邮件传输协议):发送邮件 + * POP3(邮局协议版本3):拉取邮件 + * IMAP(交互邮件访问协议):拉取邮件 + +### 发送和接收过程 + +1. 发信人使用**用户代理**编写邮件,**用户代理**使用**SMTP**将邮件发送至发送端邮件服务器 +2. 发送端邮件服务器将邮件放入缓存区中,等待发送 +3. 发送端邮件服务器的SMTP客户进程发现有待发送邮件,向接收端邮件服务器的SMTP服务器建立TCP连接,传输邮件 +4. 接收端邮件STMP服务器收到邮件后,将其放入用户邮箱中 +5. 收件人调用**用户代理**,**用户代理**使用**POP(或IMAP)**将邮件从邮件服务器的用户信箱取回 + +### 邮件格式 + +* 信封 +* 内容 + * 首部:由RFC 822规定 + * 主体:用户自行编写 + +### 多用途网际邮件扩充(MIME) + +* 定义了传送非ASCII编码的邮件 +* 内容 + * 新首部字段 + * MIME版本 + * 内容描述 + * 内容标识 + * 内容传送编码 + * 内容类型 + * 定义了新的内容格式(包括多媒体邮件) + * 定义了传送编码 +* 传送编码 + * quoted-printable编码 + * ASCII编码不败你 + * 对于非ASCII编码,每两B前增加一个'='字符 + * 对于等号,也再其前面增加一个'='字符 + * base64 + * 将二进制代码划分为若干24位长度的单元 + * 每六位一组,从0~63分别用大写字母,小写字符,数字,‘+’,‘/’表示 + * 最后使用==表示最后一组只有8位,用=表示最后一组只有16位 + +### STMP + +* 步骤 + 1. 建立连接,发送主机的STMP客户端和接收主机的SMTP服务器,不需要中间主机 + 2. 邮件传输 + 3. 释放连接 +* 缺点: + * 任何客户端都可向邮件服务器发送邮件,造成垃圾邮件泛滥 + +### POP3 + +* 工作方式(按拉起邮件之后邮件服务器是否删除邮件来区分) + * 下载并保留 + * 下载并删除 +* 密码:明文存储 + +### WEB邮件系统 + +* 客户代理与邮件服务器使用HTTP通信 +* 邮件服务器之间使用SMTP + + + +## WWW(万维网) + +### 组成 + +* 统一资源定位符(URL) +* 超文本传输协议(HTTP) +* 超文本标记语言(HTML) + +### HTTP + +* 无状态 +* 连接方式 + * 非持久连接:每个网页连接都需要建立一个TCP连接 + * 持久连接(HTTP/1.1支持):服务器响应请求后保持连接 + * 非流水线:客户机收到前一个响应后才能发送下一个请求 + * 流水线(默认):客户机可连续发送对引用对象的请求 + +* 步骤 + 1. 浏览器分析URL + 2. 浏览器向DNS申请解析域名 + 3. DNS解析域名并返回 + 4. 浏览器与服务器建立TCP连接 + 5. 浏览器发出HTTP请求 + 6. 浏览器相应请求 + 7. TCP连接断开 + 8. 浏览器解释html文件,并将界面显示给用户 + +* 报文结构 + + * 分类 + + * 请求报文 + * 响应报文 + + * 结构 + + * 开始行:区分报文类型 + * 首部行:说明浏览器,服务器以及报文主题的一些信息 + * 实体主体 + + ![image-20200719205609443](img/应用层/HTTP报文.png) + diff --git a/计算机网络/数据链路层.md b/计算机网络/数据链路层.md index 0f1e730..6fb1b58 100644 --- a/计算机网络/数据链路层.md +++ b/计算机网络/数据链路层.md @@ -413,6 +413,33 @@ * 各节点地位平等,中间节点皆为转发节点,具有路由功能 * 自组织网络可以使用自己特定的路由选择协议,可以不与因特网相连 +#### 帧地址字段格式 + +地址字段在数据帧中的用法: + +| 功能 | To DS | From DS | Address1(接收端) | Address2(发送端) | Address3 | Address4 | +| --------------------- | ----- | ------- | ------------------ | ------------------ | -------- | -------- | +| IBSS | 0 | 0 | DA | SA | BSSID | 未使用 | +| To AP(基础结构型) | 1 | 0 | BSSID | SA | DA | 未使用 | +| From AP(基础结构型) | 0 | 1 | DA | BSSID | SA | 未使用 | +| WDS(无线分布式系统) | 1 | 1 | RA | TA | DA | SA | + +缩略语: + +IBSS(Independent Basic Service Set)独立基本服务集 + +BSSID(Basic Service Set Identifier)基本服务集标识符 + +DA(Destination Address)目的地址 + +SA(Sender Address)源地址 + +RA(Receiver Address)接收端地址 + +TA(Transmission Address)发送端地址 + +WDS(Wireless Distribution System)无线分布式系统 + #### 物理层 * 跳频扩频(FHSS) @@ -570,6 +597,7 @@ * 直通式交换:只检查目的地址 * 优点:速度快 * 缺点:安全性低,不支持不同速率端口的交换 + * **注**:此时转发时延只有读取目的地址6B的时间,考虑前导码时则是14B * 存储转发式交换:先将帧存储在高速缓存中,检查数据无误后再进行转发,数据有误直接丢弃 * 优点:可靠性高,支持不同速率端口交换 * 缺点:延迟高 @@ -588,3 +616,6 @@ | 网桥 | 是 | 否 | | 路由器 | 是 | 是 | +## 其他零散知识 + +* 计算两节点间最大距离时,应保证最短帧长无法在一个争用期发送完成 \ No newline at end of file diff --git a/计算机网络/网络层.md b/计算机网络/网络层.md new file mode 100644 index 0000000..deb58c7 --- /dev/null +++ b/计算机网络/网络层.md @@ -0,0 +1,435 @@ +# 网络层 + +## 功能 + +### 异构网络互联 + +* 使得适用不同标准的网络在网络层中形成一个虚拟互联网络(逻辑互联网络) +* 网络互联使用的中继设备 + * 物理层:中继器,集线器 + * 数据链路层:网桥,交换机 + * 网络层:路由器 + * 网络层以上:网关 + +### 路由与转发 + +* 路由选择 +* 分组转发 + +### 拥塞控制 + +* 开环控制:设计时考虑发生拥塞的因素,做决定时不考虑当前网络状态 +* 闭环控制:不考虑发生拥塞的因素,监视网络状态,使用响应措施调整系统,主要措施有**检测拥塞**,**报告拥塞**,**调整措施** + +## 路由算法 + +### 静态路由 + +* 手动配置路由表 +* 简单,开销小 +* 不能及时适应网络变化 +* 仅适合于小网络 + +### 动态路由 + +* 较好的适应网络变化 +* 实现复杂,开销大 +* 适合复杂网络 + +#### 距离-向量算法 + +* 每个节点定期发送字节的路由选择表(包含**每条路径目的地**,**路径的代价**,**下一跳**)给所有直接相邻的节点 +* 节点根据其他节点发来的路由表更新自己的路由表 +* 若网络中节点过多,路由选择信息的数量会变得非常庞大 + +* 具体步骤见**RIP协议** + + +#### 状态-链路算法 + +* 主动测试所有邻接节点状态 +* 定期将链路状态广播给其他节点 +* 特征 + * 在自治系统中,发送链路信息采用**洪泛法**(路由通过所有端口向相邻节点发送信息,相邻节点以同样方式转发) + * 发送信息为本路由器的**链路状态**(相邻路由器及其度量值) + * 当链路状态改变时,才发送信息 + +#### 层次路由 + +* 因特网将整个互联网划分成多个**自治系统**(包含多个局域网系统) +* 自治系统内部自行选择路由协议,称为**内部网关协议(IGP)** +* 自治系统间使用**外部网关协议(EGP)**通信 +* 自治系统内路由选择:域内路由选择 +* 自治系统间路由选择:域间路由选择 +* OSPF协议还可以将自治系统进一步划分成更小的子系统,称为**区域** +* OSPF协议按层次将区域分为上层区域(骨干区域,使用0.0.0.0作为标识)和下层区域 +* 骨干区域用来联通所有下层区域,骨干区域内的路由器称为骨干路由 +* 各个**区域**间使用区域边界路由器进行通信,各个**自治系统**间使用自治系统边界路由器 +* 存在骨干区域的自治系统,自治边界路由器位于骨干区域内 + +## IPV4协议 + +### 数据报格式 + +* 首部长度:20~60B,长度必须为4的倍数,不足的部分使用自动填充,默认为20B +* 字段: + * 版本:4位,用于区分IP协议版本 + * 首部长度:4位,单位为4B,故最大可表示60B + * 区分服务:1B + * 总长度:2B,包括首部和数据部分,单位为1B + * 标识:2B,计数器产生的字段,用于标识数据报 + * 标志:3位 + * 第一位:MF字段,标记该数据报是否为最后一个分组,MF=0,代表该数据报为最后一片 + * 第二位:DF字段,若DF=1,则该数据报不能进行分组,此时若长度超限,则丢弃该数据报 + * 第三位:无用 + * 片偏移:13位,代表分片后的数据报起始位置在原数据报的偏移值,单位为8B + * 生存时间(TTL):8位,数据报可通过的最大路由器数 + * 协议:8位,代表传输层使用的协议 + * 首部校验和:8位,仅校验首部 + * 源地址:4B + * 目的地址:4B + +### 地址分类 + +| | A类地址 | B类地址 | C类地址 | D类地址 | E类地址 | +| ---------- | ------- | ------- | ------- | -------- | ------- | +| 起始位 | 0 | 10 | 110 | 1110 | 1111 | +| 网络号位数 | 8 | 16 | 24 | 多播地址 | 保留 | +| 主机号位数 | 24 | 16 | 8 | 多播地址 | 保留 | + +#### 特殊地址 + +| 地址类型 | 网络号 | 主机号 | 作为源地址还是目的地址 | 功能 | +| ---------------- | ------ | ---------- | ---------------------- | ---------------------------- | +| 网络地址 | 特定 | 全0 | 都不是 | 标识一个网络 | +| 直接广播地址 | 特定 | 全1 | 目的地址 | 广播该网络中的所有主机 | +| 受限广播地址 | 全1 | 全1 | 目的地址 | 广播当前网络的所有主机 | +| 0.0.0.0 | 全0 | 全0 | 源地址或默认目的地址 | 代表自己的IP或默认目的地址 | +| 网络中的特定主机 | 全0 | 特定 | 目的地址 | 本网络下的特定主机 | +| 环回地址 | 127 | 不全为0或1 | 源地址或目的地址 | 限制在本机范围(常用于测试) | + +### NAT + +#### 专用地址(仅用于内网通信) + +* **10.**0.0.0~**10.**255.255.255(1个A类地址) +* **172.16.**0.0~**172.31.**255.255(16个B类地址) +* **192.168.0.**0~**192.168.255.**255(256个C类地址) + +#### 功能 + +* 将内网地址映射成外网地址 + +### 子网划分 + +#### 原因 + +* 二级IP地址设计的不合理 +* 地址空间利用率有时很低 +* 每一个物理网络分配一个网络号可能会使路由表过于臃肿 +* 二级IP地址不够灵活 + +#### 子网掩码 + +* 不是必须令**前若干位为1,剩下位为0** + +#### 注意 + +* 子网号不能全0或全1,但由于CIDR的广泛使用,在使用CIDR划分时,支持全0或全1 + +### CIDR + +* 使用网络前缀划分子网,IP地址又变为2级结构 +* 使用最长匹配原则 +* 将小的网络汇聚成大的超网 + +### ARP + +* 网络层协议 +* IP地址转为MAC地址 +* ARP请求分组:广播(携带源主机IP地址和硬件地址,目的主机IP地址) +* ARP响应分组:单播 +* ARP只能解析本网络内的物理地址,对于跨网络的物理地址,只能通过路由器进行代理转发 + +### RARP + +* 将物理地址转化为IP +* 现已淘汰 + +### DHCP + +* 应用层协议 +* 动态分配IP地址 +* 使用UDP协议 +* 请求报文源地址:0.0.0.0,目的地址:255.255.255.255 +* DHCP服务器分配的IP是临时的,分配时间称为租用期 +* 步骤 + 1. 客户机广播**DHCP发现消息**,寻找DHCP服务器 + 2. 服务器收到**DHCP发现消息**后,广播**DHCP提供消息**,提供IP地址和相关配置 + 3. 客户机收到**DHCP提供消息**后,若接受该IP和参数,广播**DHCP请求消息**,申请分配该IP + 4. 服务器收到**DHCP请求消息**后,广播**DHCP确认消息**分配IP + +### ICMP协议 + +* 网络层协议 +* 用于报告发送数据的主机相应错误信息 +* 分类 + * ICMP差错报文 + * ICMP询问报文 +* ICMP差错报文分类 + * 终点不可达 + * 源抑制:发生拥塞 + * 时间超过 + * 参数问题 + * 改变路由(重定向) +* ICMP询问报文分类 + * 有回送请求和回答报文 + * 时间戳请求和回答报文 + * 掩码地址请求和回答报文 + * 路由器询问和通告报文 +* 不发送ICMP的情况 + * 对ICMP差错报文不再发送ICMP差错报文 + * 对第一个分片的后续所有分片 + * 对有组播地址的数据报 + * 对具有特殊地址的数据报(如0.0.0.0,127.0.0.1) +* 应用 + * ping:使用**有回送请求和回答报文**,测试主机联通性,该软件工作在应用层 + * tracert:追踪分组路径 +* ICMP报文组成 + * 类型+代码+校验和:4B + * 内容取决于ICMP报文类型:4B + * IP数据报首部 + * IP数据报数据部分的前8B(带有TCP,UDP报文的端口号) + +## IPV6 + +### 特点 + +* 更大的地址空间(128位) +* 扩展的地址层次结构 +* 灵活的首部格式 +* 改进的选项允许协议继续扩充 +* 支持即插即用(自动配置) +* 支持资源的预分配 +* 长度为8B的整数倍 + +### 基本首部长度 + +* 40B + +### 首部格式 + +* 版本:4位 +* 通信量类:8位,指定数据报类别和优先级 +* 流标号:20位 +* 有效载荷长度:16位,除基本首部外的所有字节数 +* 下一个首部:8位,相当于IPV4的可选字段或协议字段 +* 条数限制:8位 +* 源地址:128位 +* 目的地址:128位 + +### 地址类型 + +* 单播 +* 组播(广播为组播的特例) +* 任播(交付于一组主机中的任意一个) + +### 地址简写 + +* 以每16位作为一个位域 +* 每个16位域的前导0可省略 +* 对于连续0值域,可用一个**::**代替,该简写至多出现一次 + +### 协议过渡 + +* 双协议站 +* 隧道技术 + +## 路由协议 + +### 路由信息协议(RIP) + +* 类型:内部网关协议 +* 协议层级:应用层 +* 使用UDP(端口520) +* 规定 + * 每个路由器维护自身到其他每个目的网络的距离(这是**一组**距离,称为距离向量) + * RIP中距离定义为**跳数** + * RIP认为好的路由即条数最少的路由 + * RIP中跳数最多为15,距离为16时,定义为**不可达** + * 每30s广播一次路由更新信息 + * RIP不支持带子网掩码的RIP广播,故每个网络子网掩码必须相同,RIP2支持变长子网掩码和CIDR +* 特点 + * 仅与相邻路由器交换信息 + * 交换信息为自己的路由表 + * 按规定时间交换信息(如30s) +* 算法(距离向量算法)步骤: + 1. 每个节点定期发送字节的路由选择表(包含**每条路径目的地**,**距离**,**下一跳**)给所有直接相邻的节点 + 2. 节点收到来自节点X的路由表后,修改所有**下一跳**字段为X,**距离**字段+1 + 3. 对每一项条目,执行如下操作 + 1. 若目的网络不在自身路由表中:将该项目添至路由表中 + 2. 若**下一跳**字段与路由表中的地址一样:用该项目替换原项目 + 3. 若新项目距离小于原项目:用该项目替换原项目 + 4. 若180s(默认时间)未收到相邻路由信息,则更新路由表,将该路由设置为不可达路由 + 5. 返回 +* 报文格式: + * 首部:4B,1B命令,1B版本,2B填充0 + * 路由:每条20B,最多25条 +* 优点: + * 简单 + * 开销小 + * 收敛速度快 +* 缺点: + * 最大距离15限制了网络规模 + * 网络规模越大,路由表传输开销也越大 + * 网络出现故障时,会出现慢收敛现象 + +### 开放最短路径优先协议(OSPF) + +* 类型:内部网关协议 +* 协议层级:网络层 +* 使用IP协议 +* 特点 + * 路由器向自治系统内的所有路由器发送信息,使用**泛洪法** + * 交换信息为本路由器和所有相邻节点的链路状态(说明本路由器与哪些路由器相连,以及该链路的度量) + * 链路状态改变时才发送信息 + * 更新过程收敛速度快 + * 针对不同链路以不同方式计算距离度量 + * 负载均衡(相同代价路径上均匀分配流量) + * 支持可变长子网划分和CIDR + * 每个链路状态带有一个序号标识新旧程度 + * 以组播地址发送报文(替代过去的广播发送) +* 原理(链路状态算法): + * 路由器更新链路状态后,使用Dijkstra算法计算最短路径 + * 路由表中只存储下一跳 + * 将自治系统进一步划分成区域,路由器仅在自身区域内使用泛洪法传播信息 + * 各路由器存储全网络的链路状态(链路状态数据库的同步) +* 分组类型 + * 问侯分组:发现和维持邻站的可达性(一般每隔10s交换一次,若40s未收到回复,则认为该节点不可达) + * 数据库描述分组:自己链路状态数据库的所有链路状态的摘要信息 + * 链路状态请求分组:向对方请求某些链路状态项目的详细信息 + * 链路状态更新分组:用泛洪法对全网更新链路状态 + * 链路状态确认分组:对链路更新的分组的确认 + +### 边界网关协议(BGP) + +* 类型:外部网关协议 +* 协议层级:应用层 +* 使用TCP协议 +* 尽力选择一条可达目的地的较好网络,原因如下: + * 因特网规模过大,路由选择非常困难 + * 难以寻找最佳路由 + * 自治系统间的路由选择必须考虑相关策略 +* 原理(路径-向量算法) + * 每个自治系统选择**至少**一个路由器作为**BGP发言人** + * 每个发言人与其他自治系统的发言人交换路由信息(先使用TCP建立连接,之后建立**BGP会话**,再利用**BGP会话**交换信息) + * 各发言人交换完网络可达性信息后,就能找出到达各自治系统的较好路由了 + * 路由交换方式 + * 首次:整个路由表 + * 非首次:有变化的部分 +* BGP报文类型 + * 打开报文:与相邻的BGP发言人建立关系 + * 更新报文:发送某一路由信息和列出要撤销的路由信息 + * 保活(Keep a live)报文:确认打开报文和周期性证实邻站关系 + * 通知(Notification)报文:发送检测到差错 +* 特点 + * 节点数量级为自治系统的数量级 + * 每个自治系统的BGP发言人数目很少 + * 支持CIDR + * 首次交换整个路由表,之后只交换更新的部分 + +## IP组播 + +* 仅用于UDP + +### 组播地址 + +* 使用D类地址 +* 只能用于目的地址 +* 不提供可靠交付 +* 不产生ICMP报文 +* 非所有地址都可组播 + +### 分类 + +* 本局域网上的硬件组播 +* 因特网范围内的组播 + +### 组播IP与MAC转换 + +* 取IP地址后23位,补上前导0,构成24位 +* 前面再补上固定首部01-00-5e,则构成MAC地址 + +### IGMP + +* 用于局域网的组播协议 +* IGMP让本地局域网的组播路由器知道是否有主机参加或退出某个组播组 +* 步骤 + * 新主机加入组播组时,向该组播组发送一个IGMP报文,组播路由器收到后,将组成员关系转发给其他组播路由器 + * 组播路由器周期性探询局域网内主机是否仍是组的成员,若在若干次探询后某一组无主机相应,则不再转发该组的成员关系给其他组播路由器 +* 路由选择:找出以源主机位根节点的组播转发树,每个分组再每条链路上至转发一次。不同源点的同一组播组和不同组播组都对应一个不同的多播转发树 + +### 因特网组播路由算法 + +* 链路状态的路由选择 +* 距离-向量的路由选择 +* 协议无关的组播(PIM) + + + +## 移动IP + +### 实体 + +* 移动节点 +* 本地代理:移动节点所属网络的代理 +* 外部代理:再外部网络中转发移动节点的代理 + +### 技术 + +* 代理搜索:让节点知道自己在漫游 +* 申请转交地址 +* 登录:移动节点在外网进行的认证,注册,建立隧道的过程 +* 隧道:本地代理和外部代理间临时建立的双向数据通道 + +### 过程 + +1. 本地网络中,使用传统的通信方式 +2. 节点漫游到外地网络时,向本地代理注册转发地址(外部代理地址或动态配置的地址) +3. 本地代理接收注册后,构建一条隧道,将发给移动节点的数据转发给转发地址 +4. 移动节点使用网络的路由器和代理进行通信 +5. 移动节点来到另一外网时,向本地代理更新新的转发地址 +6. 移动节点回到本地时,向本地代理注销转发地址,即回到原通信方式 + +## 路由器 + +### 组成 + +* 路由选择部分 + * 功能:更新和维护路由表 + * 核心:路由选择处理器 +* 分组转发部分 + * 组成: + * 输入端口 + * 交换结构 + * 输出端口 + * 交换方法 + * 通过存储器交换 + * 通过总线交换 + * 通过互联网络交换 + +### 转发表和路由表 + +* 转发表根据路由表构建 +* 转发时路由器根据转发表选择下一跳 +* 转发表!=路由表 +* 在路由选择中,一般不对其区分 + +## 其他零散知识 + +* IPV4分组在目的端主机重组 +* IPV6禁止中间路由器进行分配操作 +* IPV6不使用头部校验来保证传输正确性 +* IPV6首部固定长度 + +* IP数据报仅校验首部信息,不校验数据部分 \ No newline at end of file