计算机网络和因特网
网络基础
- 数据分段:将数据分成固定大小的分段,每个分段加上首部称为分组
- 分组交换机
- 链路层交换机(link-layer switch, switch):接入网
- 路由器(router):网络核心
- 因特网工程任务组(Internet Engineering Task Force, IETF):制定因特网标准
- 标准文档:RFC(Request for Comments)
网络边缘
- 主机(host):主机=端系统
- 客户端(client):请求服务
- 服务器(server):提供服务
接入网
家庭接入
- 数字用户线(Digital Subscriber Line,DSL):通过电话线与电话公司的中心局相连
- 家庭中的DSL调解调制器将设备的数字信号转化为模拟信号(高频音,共享线路)
- 中心局接入复用器(DSLAM)将模拟信号转化为数字信号
- 电缆接入(cable Internet modem):通过有线电视公司的有线电视网络共享线路
- 混合光纤同轴电缆(Hybrid Fiber Coax, HFC):光纤到地区枢纽,有线电视到户
- 有线电视调制解调器将设备的数字信号转化为模拟信号
- 电缆调制解调器(CMTS)将模拟信号转化为数字信号
- 光纤到户(Fiber TO The Home,FTTH):本地中心局光纤接入用户家中的光纤接入网
- 有源光纤网络(Active Optical Network,AON):每个用户有一个光接口
- 无源光纤网络(Passive Optical Network,PON):多个用户共享一个光接口
- 家庭光纤网络端接器(Optical NetWork Terminator,ONT):连接到附近的光纤分配器(splitter)
- 光纤线路端接器(OLT):光信号和电信号转换
企业接入
- 以太网:局域网(LAN)接入
- Wi-Fi:无线局域网(WLAN)接入
广域无线接入
- 蜂窝网络(cellular network):无线接入
物理媒介
- 导引型媒介(固体):双绞线、同轴电缆、光纤
- 无导引型媒介(空气和外层空间):无线电波
双绞铜线
- 便宜常用
- 无屏蔽双绞线(Unshielded Twisted Pair, UTP):四对绝缘铜线
- 电话网
同轴电缆
- 电视有线
光纤
- 高带宽、低延迟、抗干扰
- 高成本
陆地无线电信道
- 短距离
- 局域
- 广域
卫星无线电信道
- 同步卫星:距离远,时延大
- 近地轨道卫星:距离近,时延小,但由于不是固定的,需要部署多颗卫星
分组交换
- 端到端时延:$d_{end-end}=N\frac{L}{R}$,存储转发情况下,在有$N$条速率为$R$链路组成的路径上传输$1$个大小为$L$的分组的时延
电路交换
- FDM(Frequency-Division Multiplexing):频分复用,频段宽度称为带宽,TDM(Time-Division Multiplexing):时分复用,时段被划分为帧,每个帧被划分为固定数量的时隙
- 同时活跃的用户数量少,分组交换优于电路交换
网络结构
- 互联网服务提供商(Internet Service Provider, ISP)
- 第一层ISP:必须全部互联
- 区域ISP:连接到第一层ISP
- 接入ISP:家庭、企业
- 多宿(multi-home):非顶层ISP连接多个ISP
- 互联网交换点(IXP):多个ISP在此交换流量(对等)
- 内容提供商(Content Provider NetWork):仅承载内容提供商自身的流量
分组交换网络的评估
时延
类型:
- 处理时延($d_{proc}$):检查首部、决定分组的输出端口,微秒级
- 排队时延($d_{queue}$):分组在队列中等待传输,毫秒到微秒级
- 传输时延($d_{trans}$):路由器向链路推出分组,毫秒到微秒级
- 传播时延($d_{prop}$):分组在链路上传播,毫秒级
总时延:$d_{end-end}=d_{proc}+d_{queue}+d_{trans}+d_{prop}$
令$a$表示分组到达队列的平均速率(分组/秒,pkt/s),$R$为传输速率(bps),分组大小为$L$bit且假设路由器队列的容量无限
流量强度:$\frac{La}{R}$,必须小于1,否则会导致无限制的排队时延,与平均排队时延成近似平方关系
从源主机到目的主机之间有$N-1$台路由器($N$条链路),忽略排队时延情况下的总时延:
$d_{end-end}=N(d_{proc}+d_{tr}+d_{prop})$
吞吐量
- 瞬时吞吐量和平均吞吐量
- 瓶颈链路
- 限制通常是接入网
协议分层
- 应用层:HTTP、SMTP、FTP
- 传输层:TCP、UDP
- 网络层:IP
- 链路层:以太网
- 物理层:双绞线、光纤
应用层
应用体系结构
客户端-服务器体系结构:客户端向服务器请求服务,服务器向客户端提供服务
P2P体系结构:对等体系结构,对等方既是客户端也是服务器
进程通信
套接字(socket):进程间通信的端点,也称为应用程序接口(API),端口用于标识进程
HTTP
Web页面:HTML文件、对象(图片、视频、音频)
客户端:Web浏览器
服务端:Web服务器
- TCP连接:HTTP使用TCP连接,每个HTTP报文都通过一个单独的TCP连接发送
- 无状态:HTTP是无状态协议,服务器不保留客户端的任何状态信息
- 非持续连接:每个对象都需要一个新的TCP连接
- 持续连接:多个对象可以通过一个TCP连接发送
- 非流水线:一个请求的响应返回后再发送下一个请求
- 流水线:多个请求可以并行发送,但是响应必须按照请求的顺序返回
往返时间(RTT):从发送方发送数据到接收方确认收到数据的时间
HTTP的TCP连接建立时间:$2\times RTT$,其中三次握手花费$1.5\times RTT$
持续连接的HTTP请求时间:$2\times RTT+传输时间$
HTTP报文格式
首部行和实体主体之间有一个空行
请求报文
- 请求行:
- 方法字段:GET、POST、HEAD
- URL
- HTTP版本
- 首部行:键值对
- Host:服务器主机名
- Connection:持续连接
- User-Agent:浏览器信息
- Accept-Language:接受的语言
- 实体主体:请求的数据
响应报文
- 状态行:
- HTTP版本
- 状态码:200 OK、404 Not Found
- 状态码原因短语
- 首部行:键值对
- Connection:持续连接
- Date:响应时间
- Server:服务器信息
- Last-Modified:最后修改时间
- Content-Length:实体主体长度
- Content-Type:实体主体类型
- 实体主体:响应的数据
cookie:服务器向客户端发送的数据,客户端保存,下次请求时发送给服务器
- 对应首部行:Set-Cookie,Cookie
- 会话cookie:浏览器关闭后失效
- 持久cookie:指定过期时间
- 第三方cookie:第三方网站的cookie
Web缓存(Web cache):代理服务器(proxy server)既是服务器又是客户,缓存Web页面,减少响应时间
- 现实命中率一般在$0.2$到$0.7$之间
条件GET方法:首部行中包含If-modified-since,未过期时响应报文实体为空
HTTP2
优化
- 队首(Head of Line,HOL)阻塞:一个对于大容量对象请求的延迟会影响其他请求
- HTTP/2成帧:将每个HTTP对象分成多个帧,交错发送。优先次序帧优先发送(权值1-256)
- 服务器推:服务器可以在客户端请求之前推送对象,对一个请求发送多个响应
HTTP3
- 使用QUIC协议,基于UDP
- 低延迟连接建立:0-RTT连接建立
- 报文复用:多个HTTP请求可以在一个连接上并行发送
FTP
- 文件传输协议The File Transfer Protocol,控制端口21,数据传输端口20
- 每次传输一个文件后关闭文件传输,保持状态(当前文件夹、权限)
- Passive模式:客户端打开$N>1023$和$N+1$作为控制端口和数据传输端口,向服务器端口$21$请求数据传输端口,服务器返回$P>1023$作为数据传输端口
DNS
主机表示方法:IP地址、域名
DNS(Domain Name System):域名系统,将域名映射到IP地址
- 分层的DNS服务器实现的分布式数据库
- 查询分布式数据库的应用层协议
- 运行在UDP上,端口53
- 提供服务
- 主机别名:获取规范主机名和IP地址
- 邮件服务器别名
- 负载均衡:将多个IP地址映射到一个域名,通过循环返回不同的IP地址
DNS服务器:递归查询、迭代查询
- 根DNS服务器:顶层域名服务器
- 顶级域名(TLD)服务器:com、org、net、edu、cn
- 权威DNS服务器:负责一个特定域名的IP地址映射
- DNS缓存服务器:缓存查询结果
DNS记录:域名、类型、值、TTL(Time To Live)
类型:
- A:主机地址
- NS:域名服务器
- CNAME:规范名字
- MX:邮件服务器
- AAAA:IPv6地址
P2P文件分发
中心化架构Napster
- 单点故障
- 性能瓶颈
- 版权问题
纯P2P架构
- 无服务器
- 端到端通讯
- 间断连接、IP地址改变
Gnutella协议
- flooding:向所有邻居发送递归查询
- 使用HTTP协议用于文件传输
无结构P2P
- 搜索:广播、随机游走
- 缓存
有结构P2P
- 特定节点维护网络拓扑
- 分布式哈希表(DHT API)
- 每个节点运行DHT应用,维护一个哈希表
- 通过哈希函数将文件名映射到节点
- 算法:Chord
- 固定大小表示空间,$2^m$,$m$为哈希值的位数
- 每个节点和键通过哈希函数映射到ID
- 一致性哈希:环形结构,每个节点负责一个区间
- 查找:顺时针查找最近的节点,编号为$s$的节点第$i$个邻居为$s+2^i \mod ID space$
分发时间:$F/u_s$,$F$为文件大小,$u_s$为服务器上传速率
有$N$个对等方,每个对等方下载速率为$d_i$,上传速率为$u_i$,服务器上传速率为$u_s$,文件大小为$F$
客户-服务器体系
$D_{cs}\ge \max{\frac{NF}{u_s}, \frac{F}{d_{min}}}$
P2P体系
$D_{p2p}\ge \max{\frac{F}{u_s}, \frac{F}{d_{min}}, \frac{NF}{u_{s}+\sum\limits_{i=1}^{N}u_i}}$
BitTorrent
- 一种P2P文件分发协议
- 洪流:参与一个特定文件分发的所有对等方,彼此交换文件块
- 追踪器(tracker):维护所有洪流的对等方列表
- 最稀缺优先:优先下载最少的对等方拥有的文件块
DASH
HTTP的动态适应流(Dynamic Adaptive Streaming over HTTP)
- 根据网络状况选择不同的码率
- 告示文件:描述视频的码率、分辨率、时长等信息,供客户端选择下一个要下载的块
内容分发网络(CDN)
解决的问题:跨越多个ISP的延迟、发送重复的内容、单点故障
专用CDN:内容提供商自己的CDN
第三方CDN:多个内容提供商共享CDN
操作:
- 第一次DNS请求返回CDN的主机名
- 第二次DNS请求返回CDN的IP地址
- HTTP GET请求CDN的内容
运输层
提供服务
- 多路分解:将运输层报文段中的数据交付到正确的套接字\
- 多路复用:从套接字中收集数据,封装首部形成报文段并传递给网络层
UDP
报文结构
- 首部:
- 源端口
- 目的端口
- 长度:首部+数据
- 检验和:对于所有的16位字求和(溢出回卷)后取反,端到端检测
- 数据:应用层数据
可靠数据传输
假设发送的包按序到达
rdt1.0
假设不会出错,不会丢包
发送端仅发送数据,接收端仅接收数据
rdt2.0
自动重传请求(Automatic Repeat reQuest,ARQ):接收端发送ACK,发送端等待ACK
- 差错检测
- 接收方反馈
- 重传
假设出错,不会丢包
发送端依靠接收端的ACK和NAK,接收端依靠发送端的重传
无法解决受损ACK
解决方案:加入序号(01),发送端重传未收到的包,接收端重复接收的包
- rdt2.1:接收端发送NAK0或NAK1,发送端重传未收到的包
- rdt2.2:接收端发送ACK0或ACK1,发送端重传未收到的包
rdt3.0
假设出错,可能丢包
加入了超时重传机制,发送端发送包后等待ACK并启动定时器,超时后重传
流水线协议
rdt协议的效率问题:发送方每次发送一个分组,接收方每次接收一个分组
发送方利用率:$U_{sender}=\frac{发送方传输时间}{总发送时间}$
流水线技术:发送方发送多个分组,接收方接收多个分组
- 增加序号范围
- 发送方和接收方缓存多个分组
- 处理异常分组
基本方法
- 回退N步(GBN):维护一个大小为$N$的窗口
- 基序号(base):第一个未确认的分组
- 下一个发送的分组序号(nextseqnum)
- 丢弃失序分组
- 采用累积确认:接收方正确接收了所有小于等于确认号的分组
- 发送方维护一个定时器,超时后重传窗口内的所有分组
- 选择重传(SR):维护两个大小为$N$的窗口
- 发送方窗口
- 第一个已发送但未确认分组序号(send_base)
- 下一个发送的分组序号(nextseqnum)
- 接收方窗口
- 第一个期望接收的分组序号(rcv_base)
- 超时重传引起超时的分组
- 有限序号:窗口必须小于等于序号的一半
- 发送方窗口
TCP
只在发送方和接收方之间的连接上运行,不在路由器上运行
报文段结构
- 首部:
- 源端口
- 目的端口
- 序号:字节流中的第一个字节的序号
- 确认号:期望接收的下一个字节的序号
- 首部长度:4位,最大60字节
- 标志位:SYN、ACK、FIN、RST、PSH、URG
- 接收窗口:接收方的缓存大小
- 检验和
- 紧急指针:紧急数据的末尾
- 选项:最大报文段长度(MSS,通常由最大链路层帧长度(MTU)确认)、窗口缩放、时间戳
- 数据
往返时间估计:$RTT_{est}=\alpha \cdot RTT_{est}+(1-\alpha)\cdot RTT_{sample}$,$\alpha=0.125$
RTT偏差估计:$RTT_{dev}=(1-\beta)\cdot RTT_{dev}+\beta\cdot |RTT_{sample}-RTT_{est}|$,$\beta=0.25$
超时计算:$Timeout=RTT_{est}+4\cdot RTT_{dev}$
- 超时间隔加倍
- 快速重传:接收方收到失序分组后立即发送ACK
- 类似GBN,但是仅重传丢失的分组
- 流量控制:接收方发送窗口大小,发送方根据窗口大小发送数据
连接:三次握手
- 客户端发送SYN报文,序号为$x$
- 服务器发送SYN+ACK报文,序号为$y$,确认号为$x+1$
- 客户端发送ACK报文,确认号为$y+1$
断开:四次挥手
- 客户端发送FIN报文,序号为$x$
- 服务器发送ACK报文,确认号为$x+1$
- 服务器发送FIN报文,序号为$y$
- 客户端发送ACK报文,确认号为$y+1$
- 客户端等待2MSL(最长报文段寿命)后关闭连接
拥塞控制
端到端
- 慢启动
- 窗口大小为$1MSS$,每首次收到ACK,窗口大小加倍
- 结束
- 超时:重设窗口大小为$1MSS$,并记录$ssthresh$(慢启动阈值)为$cwnd/2$
- 当$cwnd\ge ssthresh$时,进入拥塞避免
- 检测到三个重复ACK时,记录$ssthresh$为$cwnd/2$,设置窗口大小为$ssthresh+3MSS$,重传丢失的分组并进入快速恢复模式
- 拥塞避免
- 每个$RTT$,窗口大小增加$1MSS$,具体做法是每次遇到新的ACK就将$cwnd$增加$\frac{MSS}{cwnd}MSS$
- 结束:除了$cwnd\ge ssthresh$的情况和慢启动一样
- 快速恢复
- 每次收到重复的ACK,$cwnd$增加$1MSS$并重传丢失的分组
- 结束
- 超时:操作和慢启动一样,并进入慢启动
- 丢失的分组被成功接收:$cwnd=ssthresh$,并进入拥塞避免
TCP Tahoe不包含快速恢复,TCP Reno包含快速恢复
TCP CUBIC:拥塞避免阶段,窗口大小随时间变化,$W(t)=C(t-K)^3+W_{max}$,$C$为常数,$K$为时间常数
TCP的传输速率:$\big\lbrack\frac{W}{2RTT},\frac{W}{RTT}\big\rbrack$,$W$为窗口大小
一条TCP连接的平均吞吐量:$T=\frac{3}{4}\frac{W}{RTT}$,$W$为窗口大小
网络辅助
- 明确拥塞通告(Explicit Congestiong, Notification,ECN):显式拥塞通知,路由器向发送方发送拥塞通知(TCP、DCCP)
- 基于时延的拥塞控制:路由器根据时延调整窗口大小(TCP Vegas),未拥塞吞吐量$cwnd/RTT_{min}$
网络层
数据平面
链路层交换机:基于链路层中的目的地址转发数据
路由器:基于网络层数据报首部转发数据
转发表
- 目的地址范围
- 链路接口
- 最长前缀匹配
交换技术
- 内存交换
- 总线交换
- 互联网络交换
排队
- 输入排队:HOL阻塞
- 输出排队:必须丢弃分组,解决方案是填满之前丢弃分组或添加拥塞标记
缓存并不是越大越好,缓存过大会导致缓存膨胀,导致更多的分组丢失
合适缓存大小:$B=RTT\cdot C/\sqrt N$,$C$为链路容量,$N$为TCP连接数
分组调度
- 先进先出(FIFO)
- 优先级调度:高优先级分组优先
- 循环(加权)调度:每个队列(按照队列长度)轮流发送一个分组
IPV4
数据报格式
- 版本
- 首部长度:确定IP数据报的载荷
- 服务类型:优先级、延迟、吞吐量、可靠性
- 数据报长度:总长度=首部+数据
- 标识、标志、片偏移:分片
- 生存时间:TTL,路由器减1,为0时丢弃
- 协议:到达目的地后交付的协议
- 首部校验和:检验IP首部
- 源地址、目的地址
- 选项:时间戳、记录路由
- 数据:上层数据
IPV4地址:32位,分为网络号和主机号
子网掩码:确定网络号和主机号的位数
子网:隔离的网络
255.255.255.255为广播地址
互联网地址分配策略:CIDR(无类域间路由选择),将IP地址分为网络号和主机号
之前采用的是分类地址,网络部分的地址长度被固定为8、16、24位
组织获取地址的方式:ICANN(Internet Corporation for Assigned Names and Numbers)
主机获取地址
- 主动配置
- 动态主机配置协议(Dynamic Host Configuration Protocol,DHCP):每次连接到网络时获取IP地址
- 获取子网掩码
- 获取默认网关地址(第一跳路由器)
- 获取DNS服务器地址
- 报文格式:发现、提供、请求、确认
网络地址转换(NAT)
原因:IP地址不足
解决方案:内部网络使用私有地址,外部网络使用公有地址,路由器使用NAT转换表转换地址
地址空间:10.0.0.0/8
IPV6
IPV4地址耗尽,采用128位地址
数据报格式
- 版本
- 流量类型:与服务类型类似
- 流标签:标识特殊流
- 有效载荷长度:数据长度
- 下一个首部:上层协议
- 跳限制:TTL
- 源地址、目的地址
- 数据
与IPV4的不同
- 取消了首部校验和,由运输层和链路层负责
- 取消了分片,超过MTU的数据报被丢弃并告知发送方,发送方减小分片大小
- 选项:通过下一个首部扩展
与IPV4兼容:隧道技术,将IPV6数据报封装在IPV4数据报中
控制平面
路由选择算法
链路状态(LS)算法:使用Dijsktra算法,每个节点维护链路状态数据库,每个节点向所有邻居发送链路状态信息,会产生振荡的问题
距离向量(DV)算法:使用Bellman-Ford算法,每个节点维护距离向量表,每个节点向邻居发送距离向量,会因为选择环路而产生计数到无穷的问题,通过毒性逆转一部分解决
自治系统(Autonomous System,AS):一组处于相同管理下的路由器
开放最短路优先(Open Shortest Path First,OSPF):链路状态算法,每个AS内部使用,每个路由器维护链路状态数据库,每个路由器向AS内所有路由器广播链路状态信息
边界网关协议(Border Gateway Protocol,BGP):距离向量算法,每个AS之间使用,每个AS维护距离向量表,每个AS向相邻AS发送距离向量
- BGP中分组是路由到CIDR化的前缀(x:138.16.68/22, I:接口号)
- 网关路由器:连接两个AS的路由器
- 内部BGP(iBGP):AS内部使用
- 外部BGP(eBGP):AS之间使用
- BGP路由表:AS路径、下一跳、目的地前缀
- 路由选择
- 热土豆路由:最快离开AS
- 实际选择
- 本地偏好
- 最短AS路径(跨越最少AS)
- 最快离开AS
- 实现IP任播:多个服务器拥有相同的IP地址,接收方选择最近的服务器
软件定义网络(SDN)
- 基于流转发
- 控制平面和数据平面分离
- 网络控制功能
- 可编程网络
OpenFlow协议:控制器向交换机发送流表,交换机根据流表转发数据
- 运行在TCP上,端口6633
- 报文格式:控制器向交换机发送控制消息,交换机向控制器发送状态消息
- 控制器向交换机
- 查询交换机配置
- 修改交换机状态
- 读状态
- 发送分组
- 交换机向控制器
- 删除流表项
- 通知端口状态变化
- 无法处理的分组
- 控制器向交换机
ICMP
因特网控制报文协议(Internet Control Message Protocol):用于主机和路由器间的网络故障诊断和报告,承载在IP数据报中,IP首部的协议字段为1
ICMP报文
- 类型:回显请求、回显应答、目的不可达、超时、路由器通告
- 编码:具体信息
链路层和局域网
链路层提供服务
- 封装数据报为帧
- 链路接入
- 可靠交付
- 差错检测和纠正
在网络适配器上实现
差错检测和纠正
奇偶校验
- 一维奇偶校验:添加一个比特,使得整个数据报的1的个数为偶数(偶校验)或奇数(奇校验)
- 二维奇偶校验:行和列
循环冗余校验(CRC)
也称为多项式编码,将数据看作多项式,除以生成多项式,余数作为校验码
选择$r+1$位生成多项式$G$,$r$位的校验码$R$,数据为$d$位的$D$
则$D\cdot 2^r \oplus R = nG$,有$R\equiv D\cdot 2^r \pmod G$
- 能够检测小于$r+1$位的错误
- 有$1-0.5^r$的概率检测大于$r+1$位的错误
多路访问协议
对于速率为$R$bps的广播信道,期望:
- $M$个节点发送数据饰,每个节点平均发送速率为$R/M$
- 协议去中心化,不会因为单个节点故障而导致整个网络故障
- 协议简单
信道划分协议
- FDM和TDM避免冲突,但是利用率低,$N$个节点,每个节点发送速率为$R/N$
- 码分多址(Code Division Multiple Access,CDMA):每个节点有唯一的码,接收方根据码译码,编码类似TDM的时隙和FDM的频段
随机接入协议
传输节点以信道的速率发送数据,碰撞时等待一个随机时延后重发
时隙ALOHA
假设
- 所有帧都为$L$比特
- 时隙长度为$L/R$
- 节点在时隙开始时发送帧
- 节点是同步的
- 节点在时隙结束时检测冲突
具体过程
- 发送节点在时隙开始时发送帧
- 如果检测到碰撞,以一个固定的概率$p$在下一个时隙重发
最大效率:使$Np(1-p)^{N-1}$最大
ALOHA
不必等待时隙开始,发送帧后立即检测冲突并以概率$p$重发
成功的概率为$p(1-p)^{2(N-1)}$,最大效率为$1/(2e)$
CSMA
载波监听多路访问(Carrier Sense Multiple Access):发送前检测信道是否繁忙,繁忙则等待
未完待续