计算机通信与网络 | HUST.CS | 《计算机网络自顶向下方法》
Chapter 1 - 计算机网络和因特网
什么是因特网
具体构成描述
端系统(主机):连入因特网的设备
端系统通过通信链路和分组交换机连接在一起
链路的传输速率以比特/秒,即 bps 衡量。
分组交换机最出名的类型为路由器和链路层交换机。
ISP:因特网服务提供商。端系统通过 ISP 接入互联网,低级的 ISP 通过高级的 ISP 连接起来
服务描述
因特网:为应用程序提供服务的基础设施
什么是协议
协议三要素:语法、语义、同步
协议定义了在两个或多个通信实体之间交换的报文的格式和顺序,以及报文发送和/或接收一条报文或其他事件所采取的动作。
网络边缘
主机和端系统位于因特网的边缘,有时又被划分为客户和服务器。
接入网
接入网指将端系统物理连接到其边缘路由器的网络。边缘路由器是端系统到任何其他远程端系统的路径上的第一台路由器。
家庭接入:DSL、电缆、FTTH、拨号和卫星
宽带住宅接入最流行的类型:数字用户线(DSL)、电缆。
DSL 调制解调器使用现有的电话线(双绞铜线)与位于电话公司本地中心距的数字用户线接入复用器(DSLAM)交换数据。家用电话线同时承载数据与传统电话信号,用不同的频率进行编码。
不对称接入:DSL 的上下行速率不相同,这种接入被称为不对称的
电缆因特网接入:利用有线电视基础设施。光缆将电缆头端连接到地区枢纽,从这里使用传统的同轴电缆到达用户。应用了光纤和同轴电缆,经常被称为混合光纤同轴(HFC)系统
电缆因特网接入需要特殊的调制解调器:电缆调制解调器(CMTS),将 HFC 划分为上下行两个信道。下行速率通常比上行高。电缆因特网接入的一个重要特征是共享广播媒体。因此需要一个多路访问协议来协调传输和避免碰撞。
FTTH(光纤到户):从本地中心局直接到家庭提供一条光纤路径,分为主动光纤网络(AON)和被动光纤网络(PON)
网络核心
分组交换
通过链路传输大小为 \(L\) 的分组,链路速率为 \(R\),则通过该链路的时间为 \(\frac{L}{R}\)
存储转发传输
多数分组交换机在链路的输入端使用存储转发传输。
排队时延和分组丢失
对于每条相连的链路,有一个输出缓存(输出队列),如果出链路正忙,需要排队,引入排队时延。
输出缓存溢出,产生丢包。
分组交换网络中的时延、丢包和吞吐量
时延概述
分组在途径的每个节点经受不同类型的时延。最为重要的是节点处理时延、排队时延、传输时延和传播时延。
- 节点处理时延 \(d_{proc}\)
检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分。
- 排队时延 \(d_{queue}\)
队列中,当分组在链路上等待传输时,它经受排队时延。如果队列为空,排队时延为 0。如果流量很大,排队时延很长。
- 传输时延 \(d_{trans}\)
分组长度 \(L\),链路速率 \(R\) bps,传输时延为 \(\frac{L}{R}\)。
- 传播时延 \(d_{prop}\)
传播时延取决于链路的物理介质。
传输时延可以理解为路由器将分组推向链路所需要的时间,传播实验可以理解为链路中物理传播的时间。
用 \(d_{nodal}\) 表示节点总时延,\(d_{nodal}=d_{proc}+d_{queue}+d_{trans}+d_{prop}\)
排队时延和丢包
用 \(a\) 表示分组到达队列的平均速率,单位 pkt/s。
流量强度为 \(\frac{La}{R}\),即每秒到达链路的比特数与转发能力的比值。
若 \(\frac{La}{R}>1\),队列长度将无限增加,设计系统时必须保证 \(\frac{La}{R} \le 1\)。
随着 \(\frac{La}{R}\to 1\),\(d_{queue}\) 迅速增加
端到端时延
假定在源到目的地之间共有 \(N-1\) 台路由器,网络是无拥塞的,每台路由器和源主机的处理时延都是 \(d_{proc}\),输出速率都是 \(R\) bps,每条链路的传播时延都是 \(d_{prop}\)。
那么,\(d_{end-end}=N(d_{proc}+d_{trans}+d_{prop})\),其中 \(d_{trans} = \frac{L}{R}\)。
往返时延 RTT,Traceroute 程序
计算机网络中的吞吐量
考虑从 A 到 B 传输一个大文件。
瞬时吞吐量为当前时间主机 B 接收文件的速率。
如果文件大小为 \(F\),主机 B 接收该文件用去 \(T\) 秒,则平均吞吐量为 \(\frac{F}{T}\)。
协议层次及其服务模型
分层的体系结构
协议分层
网络设计者以分层的方式组织协议以及实现这些协议的网络硬件和软件。
某层向上一层提供服务。各层的所有协议被称为协议栈。
- Internet 五层模型:应用层、运输层、网络层、链路层、物理层
- ISO OSI/RM 七层模型:应用层、表示层、会话层、运输层、网络层、链路层、物理层
- 应用层
应用层是网络应用程序及他们的应用层协议留存的地方。
如 HTTP、SMTP、FTP、DNS 等
应用层协议分布在多个端系统,而一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换分组,位于应用层的信息分组称为报文。
- 运输层
运输层在应用程序端点之间传输应用层报文。运输层的分组称为报文段。
如 TCP,UDP
- 网络层
网络层负责将称为数据报的分组从一台主机移动到另一台主机。
如 IP
- 链路层
链路层分组称为帧
- 物理层
物理层分组称为比特流。
应用层
应用层协议原理
网络应用程序体系结构
- 客户-服务器体系结构
- P2P 体系结构
进程通信
在一对进程之间的通信会话场景中,发起通信的进程被标识为客户,在会话开始时等待联系的进程是服务器。
运输层
可靠信道传输
SR 选择重传
\(rcv\_base\) 表示期待收到,还未收到的第一个分组
待收窗口:\([rcv\_base, rcv\_base + N - 1]\)
超时窗口:\([rcv\_base - N, rcv\_base - 1]\)
窗口长度必须小于或等于序号空间大小的一半。
TCP 协议
TCP 连接:三次握手
两个进程在相互通信之前,必须先互相发送某些预备报文段。
clientSocket.connect(serverName, serverPort));
客户端首先发送一个特殊的 TCP 报文段,服务器用另一个特殊的 TCP 报文段相应,客户再用第三个特殊报文段作为响应。前两个报文段不承担有效载荷,第三个可以。
TCP 建立后,从上层接受数据,引入 TCP 发送缓存。每次 TCP 从缓存中取出并放入报文的数据量受制于最大报文长度(MSS)
注意 MSS 指的是报文中含有的应用层数据的最大长度,而不是 TCP 报文的最大长度,TCP 报文需要在应用层数据的基础上增加 TCP Header。MSS 通常根据最大链路层长度(最大传输单元 MTU)设置,保证 MSS + TCP Header + IP Header
TCP 报文结构
- 源端口号 16 bits
- 目的端口号 16 bits
- 序号 32 bits
- 确认号 32 bits
- 首部长度 4 bits,指示 TCP 首部长度,单位为 32 bits,通常选项字段为空,典型 TCP 首部的长度为 20 Bytes
- 保留未用 4 bits
- CWR 1 bit
- ECE 1 bit
- URG 1 bit
- ACK 1 bit
- PSH 1 bit
- RST 1 bit
- SYN 1 bit
- FIN 1 bit
- 接收窗口 16 bits
- 因特网检验和 16 bits
- 紧急数据指针 16 bits
- 选项
- 数据
假设数据 \(A\to B\)。数据流中每一个字节编号,填入序号的是数据开头的字节编号。
TCP 是全双工的,同一份报文填入确认号的,是 A 希望从 B 收到的下一字节的编号。
下一字节。
RTT 估计与超时
SampleRTT:某个数据包从发出(交给 IP)到收到 ACK 的时间
指数加权平均移动(EWMA):\(\operatorname{EstimatedRTT}=(1-\alpha)\cdot \operatorname{EstimatedRTT}+\alpha \cdot \operatorname{SampleRTT}\)
\(\operatorname{DevRTT}=(1-\beta)\cdot \operatorname{DevRTT}+\beta \cdot |\operatorname{SampleRTT}-\operatorname{EstimatedRTT}\)
\(\alpha=\frac{1}{8},\beta=\frac{1}{4}\)
\(\operatorname{TimeoutInterval}=\operatorname{EstimatedRTT}+4\cdot \operatorname{DevRTT}\)
TCP 可靠数据传输
超时间隔加倍
每次超时之后,将 TimeoutInterval 翻倍,保证重传的频率越来越低,是某种形式的拥塞控制。需要注意的是,如果是因为收到 ACK 或者发送新的数据包而重置定时器,TimeoutInterval 依然是用 EstimatedRTT 和 DevRTT 计算出的值。
快速重传
产生 TCP ACK 的建议(RFC 5681):
事件 | TCP receiver |
---|---|
具有所期望序号的按序报文段到达。所有在期望序号及以前的数据都已经被确认 | 延迟的 ACK。对另一个按序报文段的到达最多等待 500ms。如果下一个按序报文段在这个时间间隔内没有到达,则发送一个 ACK |
流量控制
防止接收方缓存溢出导致丢包
维护接收窗口
- RcvBuffer:缓冲区大小
- LastByteRead:接收方从缓存读出的数据流的最后一个字节的编号
- LastByteRcvd:已经放入缓存的最后一个字节编号
\(\operatorname{LastByteRcvd}-\operatorname{LastBytetRead}\le \operatorname{RcvBuffer}\)
\(\operatorname{rwnd}=\operatorname{RcvBuffer} - [\operatorname{LastByteRcvd}-\operatorname{LastBytetRead}]\)
发送方需要维护 \(\operatorname{LastByteSent}\) 和 \(\operatorname{LastByteAcked}\),\(\operatorname{LastByteAcked}-\operatorname{LastByteSent}\) 就是已经发送还未确认,可能已经放入缓冲区的数据量,要保证这个值不超过 \(\operatorname{rwnd}\)
连接管理
三次握手,四次挥手
三次握手
- 客户端向服务器发送一个特殊报文段。首部标志位 SYN 为 1,选择一个随机的初始序号 client_isn,放在报文段中。(称为 SYN 报文段)
- 服务器提取出 TCP SYN 报文段,为客户端分配缓存和变量,并发送允许连接的报文段。SYN=1, ACK=client_isn+1, 初始序号为 server_isn。(称为 SYNACK 报文段)
- 客户端收到 SYNACK 报文段,客户端分配缓存和变量。客户端向服务器发送另外一个报文段,ACK=server_isn+1,用于确认 SYNACK 报文段。在本报文中,SYN=0,可以携带应用层数据。
四次挥手
- 客户端:FIN
- 服务器:ACK
- 服务器:FIN
- 客户端:ACK
三次握手四次挥手的报文丢失怎么办?
拥塞控制原理
网络层:控制平面
路由选择算法
距离向量路由选择算法(DV)
DV 是一种迭代的、异步的、分布式的算法
Bellman-Ford 方程:\(d_x(y)\) 表示 \(x\to y\) 的最低开销,有 \(d_x(y)=\min_v\{c(x,v)+d_v(y)\}\)
Bellman-Ford 方程的解为 \(x\) 提供转发表项。假设 \(v^*\) 是上面方程取得最小值的解,那么 \(v^*\) 就是 \(x\) 转发的下一跳。
用 \(D_x=[D_x(y):y\in N]\) 表示 \(x\) 的距离向量,DV 算法维护信息:
- 对于每个邻居 \(v\),从 \(x\) 到直接相连邻居 \(v\) 的开销为 \(c(x,v)\).
- 节点 \(x\) 的距离向量 \(D_x\),包含了 \(x\) 到 \(N\) 中所有目的地 \(y\) 的开销估计值
- 它的每个邻居的距离向量,即对 \(x\) 的每个邻居 \(v\),有 \(D_v\)
- 不定时向邻居发送自己的距离向量,\(x\) 收到 \(v\) 的距离向量,保存该距离向量,并使用 Bellman-Ford 方程更新自己的距离向量:\(D_x(y)=\min_v\{c(x,v)+D_v(y)\}\)