.1
- CIDR地址块中还有三个特殊的地址块
a. 前缀 n = 32 , 即32位IP地址都是前缀, 没有主机号, 这其实就是一个IP地址, 用于主机路由
b. 前缀 n = 31 , 这个地址块中有两个IP地址, 主机号分别为0/1 , 这个地址块用于点对点链路
c. 前缀 n = 0 , 用于默认路由 - 使用二叉线索树查找转发表
为进行更有效的查找,通常把无分类编址的转发表存放在一种层次的数据结构中,然后自上而下地按层次进行查找,这里最常使用的即为二叉线索(binary trie).
一般用唯一前缀来构造二叉线索 , 每个叶节点代表一个IP地址, 其内包含完整IP地址 , 前缀 , 子网掩码
唯一前缀是指,在表中所有的IP地址中,该前缀是唯一的。
规则:先检查IP地址的第一位,如为0,则第一层的节点就在根节点的左下方;如为1,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。每个叶节点代表一个唯一前缀。
此外, 即使找到唯一前缀匹配的叶子结点, 还需要将 “目的IP地址” 的 与 “叶子节点” 中的 “子网掩码” 相与, 如果结果等于 “叶子节点” 中的IP地址, 则可以转发. 因为归根到底这个"唯一前缀" 和 CIDR前缀不是一个东西.
- 在IPv6中, ICMP + IGMP + ARP的功能集成到ICMPv6中.
- IPv6首部的几个特点
- 数据报由基本首部 + 有效载荷组成, 有效载荷中有 0 ~ n 个扩展首部, 例如分片扩展首部
- 基本首部固定为40B, 所有可选项都放到扩展首部中, 因此基本首部中删去了首部长度字段
- 基本首部中删去了 检验和 字段, 把差错检测功能交给传输层 , 以加快路由器处理数据报的速度
- 基本首部中删去了 标识/标志/片偏移字段, 因为这些功能在分片扩展首部中实现
- TTL 字段改名为 跳数限制, 更加切合实际
- 基本首部中删去了 总长度 字段, 改用 有效载荷长度 字段
- 基本首部中删去了 协议 字段 , 改用 下一个首部 字段
当数据报没有扩展首部时, 下一个首部 字段作用与协议字段一样, 指明数据报应交付上层哪个协议 , 如6/17代表TCP/UDP
当数据报有扩展首部时, 下一个首部 字段标识第一个扩展首部的类型
- BGP协议同时运行在AS内部和之间, 运行在内部时是iBGP连接, 运行在AS之间时是eBGP连接.
- BGP路由可在eBGP/iBGP上双向传输, 但只能由eBGP传向iBGP.
SDN的几个特点
- 基于流的转发. 分组的转发可以基于网络层/运输层/链路层协议数据单元中的首部字段值, 最终的抓发规则由SDN控制器计算并放置到流表中. 区别与传统仅依靠目的IP地址转发.
- 数据层面与控制层面解耦(decouple).
- 控制层面位于路由器之外, 且用软件实现
- 可编程的网络
SDN控制器从下到上的三个层次
- 通信层, 大多采用openFlow协议
- 状态管理层
- 到网络控制程序层的接口
多协议标签交换MPLS
通过添加短的固定长度标签(MPLS首部)来引导数据包在链路层用硬件进行转发。MPLS使得数据包转发决策可以基于标签而不是基于包内的IP地址进行,从而加快了数据包的处理速度,并支持多种网络协议。
几个特点
.2 ICMP
其中源抑制报文/地址模请求报文 已经不再使用
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。有2种实现方案:基于UDP实现和基于ICMP实现。
基于UDP实现traceroute工作原理:
- 源主机向目的主机发送一连串的 IP 数据报(UDP报文)。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 减 1,此时 TTL 等于 0,R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;
- 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2。P2 先到达 R1,R1 收下后把 TTL 减 1 再转发给 R2,R2 收下后也把 TTL 减 1,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
- 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
- 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。
.1 UDP与TCP
- IP中的检验和只检验IP数据报的首部, 但UDP的检验和检验 伪首部 + 首部 + 数据
- TCP的交互单位是数据块, 但仍说TCP是面向字节流的, 因为TCP仅把应用层传下来的数据看成无结构的字节流, 根据当时的网络环境组装成大小不一的报文段.
- 10秒内有1秒用于发送端发送数据, 信道利用率就是10%
- TCP报文段由首部和数据部分组成, 紧急位URG的作用就是将紧急指针所指示的数据放到数据部分的最前面
- 发送方的发送窗口受接收方的窗口字段 + 拥塞窗口cwnd共同决定, 取二者的更小值.
- TCP为每个连接设有一个持续计时器(Persistence Timer)用以打破死锁.
只要有一方收到零窗口通知, 就启动PT, 当PT时间到了以后就发送一个零窗口探测报文, 对方就回复当前的rwnd. 如果窗口仍为0就重设PT时间; 不为0就可以传送了, 这样就打破了死锁 - TCP的报文段的发送时机
a. 缓存中的数据达到MSS字节时, 就组装成TCP报文发送出去
b. 每次计时器期限到了就自动发送(但不能超过MSS字节)
c. 由发送方的进程指明要发送的报文段, 每次发送采用推push操作
d. nagle算法: 第一轮中, 先发送缓存中的第一个字节, 然后等待对第一个字节的确认再开始第二轮. 以后的每一轮都 将缓存中的数据一次发完(但不能超过MSS字节), 然后等待确认开始下一轮. 同时, 为了提升效率, 只要缓存中数据达到发送窗口的一半或MSS时 , 就不同等待上一轮的确认, 直接发送. - 快重传中, 禁止使用捎带确认, 对每个收到的报文立即确认. 若收到1, 2, 4号报文, 则持续发送2号的确认报文, 连续发送三次后, 发送方就会对3号报文启动快重传
- 路由器的队列通常采用FIFO, 但由于队列长度有限, 队列满了以后再收到的报文段会全部丢弃, 这就是尾部丢弃策略.尾部 丢弃策略会导致一连串分组的丢失, 应采用主动队列管理AQM, 即当队列长度达到某一警示值时, 便按某种算法丢弃个别报文段.
- TCP中新增了一个概念RTTS(smoothed).
第一次测量到RTT 样本时,RTTS值就取为所测量到的RTT样本值。
以后每测量到一个新的RTT 样本,就按下式重新 计算一次RTTS:
式中,0 <α<1, 当α越接近1, RTTS值受新的RTT样本影响较大, RTTS值更新较快. 推荐值为0.125 - TCP中新增了一个概念RTTD(Deviation). 是RTT的偏差的加权平均值
第一次测量到RTT样本时, RTTD值就取为所测量到的RTT样本值的一半
以后每测量到一个新的RTT 样本,就按下式重新 计算一次RTTD :
推荐值为0.25 - TCP中新增了一个概念RTO(Retransmission Time-Out) , 超时计时器中设置的就是RTO, RTO应略大于RTTS, 按照下式计算:
- karn算法 : 计算RTTS时, 只要报文段重传了 , 就不采用其RTT样本进行计算, 以避免不准确RTT样本的影响. 但如果网络拥塞, 所有报文段都是重传的, 而依据karn算法RTO竟然不进行更新, 这显然不合理
改进为 : 每重传一次, 就把RTO设为原来的一倍, 直到不发生重传时, 才采用公式计算RTO.
2.1 DNS系统
- 域名由点和标号(label)组成, 点分割的即是标号
- 每个标号不超过63个字符,总计不超过255个字符, 并且不区分大小写
- 顶级域名TLD(Top Level Domain)分为三类, 国家顶级域名nTLD, 通用顶级域名gTLD, 基础结构域名ID(Infrastructure Domain). 基础结构域名只有一个即 arpa. 用于反向域名解析, 因此被称为反向域名
- 2011年开始, 顶级域名TLD新增了一类新通用顶级域名(New gTLD)
- 域名服务器管辖范围(或有权限的)以区 (zone) 为单位, 而非域(domain)。各单位根据具体情况来划分自己管辖范围的区, 但在一个区中的所有节点必须是能够连通的。管辖一个区的服务器就是权限域名服务器, 后有详细叙述
实际上也很好理解, 例如对于一个com顶级域名, 其下辖的二级域名可能以亿单位, 这时我们当然不可能用一台com顶级域名服务器就全部管辖. 区≤域
- 域名服务器可以划分为四种类型: 根/顶级/权限/本地域名服务器.
其中根域名服务器知道所有顶级域名服务器的域名和ip, 即根域名服务器可以解析所有com/org等顶级域名.
根域名服务器一共有13台(A~M), 每台又由许多物理节点组成, 这些物理节点会分布在世界各地.
每台根域名服务器的IP地址和域名都是不同的, 但同一台内的所有物理节点的IP地址都是相同的, 因此采用了任播(anycast)技术后, 会自动寻找IP地址相同, 但距离最近的物理节点. - 每台域名服务器都会有一些分布式备份, 其中只能在主域名服务器中进行数据更改, 辅助域名服务器是备份.
- 每台域名服务器都启用了高速缓存
- 主机中也启用了高速缓存, 例如在开机后自动从本地域名服务器下载全部数据
.2 HTTP协议
- n个文档的传输时间为 : n X (2RTT + 文本传输时间), 因此HTTP1.1版本后使用了持续连接(Persistent Connection). 持续连接又分为非流水线方式(Without Pipelining)和流水线方式(With Pipelining).
- 非流水方式指的是, 客户端必须要收到上一个请求的响应后, 才能发出下一个请求.
相比非持续连接, n个文档传输能省去 n-1 个建立TCP连接的RTT.
n个文档的传输时间为 : (RTT +nRTT + n X 文本传输时间), - 流水方式中, 由于没有限制请求必须在响应之后发送, 因此文档传输的时间不定.最好的情况下, 客户端一次性发送完所有请求, 传输时间为2RTT+ n X 文本传输时间
- HTTP1.1 版本的一个缺点是, 即使客户端可以一次性发送多个请求, 但服务器只能按照请求的顺序逐一回复, 如果某一请求耗时特别长, 就会阻塞后面的请求
HTTP2 版本中, 服务器可以并行发回所有响应, 而不必按序. - HTTP2 版本中, 把所有报文划分为二进制编码的帧
.3 文件传送协议
基于TCP的文件传输协议FTP(File Transfer Protocol)和基于UDP的简单文件传输协议TFTP(Trivial)共同的特点是: 任何操作都要先获得一个本地副本文件, 任何修改都要先在副本文件上进行.
举个例子, A想要在B的某个文件最后新增一个字母, 则必须先要将文件传输到A, A完成修改后再回传覆盖.
.3.1 TFTP
TFTP主要有以下特点:
- 传输数据块大小为512字节。
- 只支持读取和写入两种操作。
- 没有用户身份验证、加密和完整性校验功能。
- 使用UDP作为传输层协议,不保证可靠性
- 默认使用69号端口。
TFTP的工作过程很像停止等待协议,发送完一个文件块后就等待对方的确认,确认时应指明所确认的块号。
发送完数据后在规定时间内收不到确认就要重发数据PDU,发送确认PDU的一方在规定时间内收不到下一个文件块,也要重发确认PDU。这样保证文件的传送不致因某一个数据报的丢失而告失败。
.4 P2P
- 在BT中, 使用"最稀有的优先(rarest first)" 技术优先请求最稀有的文件块, 避免之后收集不到
- 在BT中, 还运用了对等传输的思想. 如果A以最高速率向B发送文件, B 也会将A的优先级设为最高.