21-05-18-计网自顶向下方法
3.5.6 TCP连接管理
建立方式:
-
第一步:客户端先发送一个不包含应用层数据的特殊TCP报文段,首部中的SYN比特标志位为 1 ,此报文段称 SYN报文段,且初始序号 seq 是随机的;最终被封装在IP数据报中发送给服务器
-
第二步:IP 数据报到达服务器,TCP SYN报文段会被取出,该TCP将被分配缓存和变量,且向客户发送允许连接的报文段,也不包含应用层数据,该报文段首部: SYN比特 置为 1 ,确认号ack = 客户端初始序号 + 1,初始序号 seq 也是随机的,该报文段称 SYNACK 报文段
-
第三步:收到报文段后,客户也分配缓存和变量,最后客户向服务器发送报文段,对服务器的允许连接进行确认,确认ack = 服务器初始序号 + 1,特别注意的是首部SYN比特为 0 ,且可以携带应用层数据
完成这三步之后的报文段SYN比特都为 0 ,此三步被称为三次握手

关闭TCP连接,以客户关闭为例:
- 客户发送TCP报文段,首部FIN比特为 1
- 服务器收到后返回确认报文段
- 服务器发送终止报文段,FIN比特为 1
- 客户对此报文段进行确认

TCP客户典型状态变换:

在TIME_WAIT状态消耗时间是与具体实现有关,典型是30秒,1分钟或者2分钟,在此时间后连接关闭,资源释放
在TIME_WAIT状态时客户发出的ACK若丢失,则会重传(可能是冗余的终止报文段使其重传)
在三次握手中,在第三步如果客户不发送ACK来确认第三步,通常服务器早一分多钟后终止该半开连接并回收资源
SYN洪泛攻击:攻击者发送大量的TCP SYN报文段,不完成第三步步骤,服务器不断为这些半开连接分配资源(但没有使用),导致资源耗尽
SYN Cookie:
- 服务器收到SYN报文段后不会为该文段生成半开连接,而是生成初始TCP序列号(SYN报文段的源和目的IP地址、端口号和服务器的复杂函数生成的),称cookie,服务器发送此初始序列号的SYN ACK分组,且不记忆Cookie或该SYN的信息
- 客户合法,返回ACK报文段,确认号是cookie + 1,服务器则再次使用源和目的IP地址、端口号和服务器的复杂函数生成的值 + 1进行对比,相同则生成具有套接字的全开连接
- 客户没有返回,则服务器不分配任何资源
服务器TCP典型状态变换:

上述情况都是客户和服务器都准备通信,即服务器在监听客户发送其SYN报文段的端口
假如服务器收到一个TCP报文段,端口号或源IP地址与套接字都不匹配,此时服务器会向客户发送特殊重置报文段,首部 RST 标志为 1 ,
而UDP的话,则是发送一个特殊的ICMP数据报
3.6 拥塞控制原理
3.6.1 拥塞原因与代价
1.情况1:两个发送方和一台无限缓存的路由器

假设共享链路的容量为R,当发送速率接近 R / 2 时平均时延越来越大,当超过时会变得无穷大

2.情况2:两个发送方和一台有限缓存的路由器

a:发送方能够知道路由器是否有空余缓存
b:发送方无法知道,分组丢失
c:发送方提前发生超时提前发送
3.情况3:4个发送方和多台有限缓存及多跳路径

假设A --> C通过R1,R2,B --> D通过R2,R3,在R2中缓存可能被BD占满,导致AC分组无法传输

3.6.2 拥塞控制方法
两种方法:
-
端到端拥塞控制:网络层没有为运输层提供显式支持,端系统自身控制,如报文段丢失可知
-
网络辅助的拥塞控制:路由器向发送方提供网络中的拥塞状态的显式控制反馈信息
- 路由器反馈
- 路由器标记发送方发分组来使接收方发送拥塞反馈,一个RTT时间
3.7 TCP拥塞控制
使用端到端的拥塞控制,因为IP层不提供显式的网络拥塞反馈
TCP限制发送流量方法:
-
拥塞窗口:cwnd
-
发送方已发送未确认的大小
LastByteSent - LastByteAcked <= min {cwnd, rwnd}
此处假设TCP缓存无限,忽略rwnd,因此只受cwnd控制
定义丢包:
- 超时
- 接收方的 3 个冗余ACK(此处 3 个不包括初始确认ACK)
丢包后TCP认为出现了网络拥塞
假设网络没有拥塞,当确认较快速率到达则拥塞窗口增长迅速,反之增长缓慢,因此TCP是自计时的
指导性原则:
- 一个报文的丢失意味着拥塞,即要减小发送速率
- 一个确认报文段说明网络正在像接收方传输报文段,即增加发送速率
- 带宽探测:探测拥塞开始的速率,先增加,看影响,再从该速率后退
TCP拥塞控制算法:
- 慢启动
- 拥塞避免
- 快速恢复
1 和 2 是强制部分,差异是对于收到的ACK做出反应时增加cwnd长度的方式
3 是推荐,并非必须
1.慢启动
cwnd通常设置为 MSS 的较小值
初始发送速率:MSS / RTT
cwnd的值以一个 MSS 开始且收到一个ACK确认就添加一个 MSS ,并发送相应多少段报文段,指数增长

结束增长:
- 超时指示的丢包事件(丢包),则将cwnd设置为1 并重新慢启动的过程,同时将ssthresh(慢启动阈值)设置为 cwnd / 2,即检测到拥塞时将 ssthresh 设置为拥塞窗口值的一半
- 到达或超过ssthresh时,结束慢启动并且TCP转移到拥塞避免模式
- 检测到三个冗余ACK,执行快速重传并进入快速恢复模式

2.拥塞避免
进入拥塞避免状态,cwnd的值是拥塞时值的一半,此后每个RTT只将cwnd的值增加一个 MSS,即对于TCP发送方无论何时到达一个新的确认,就将 cwnd 的值增加一个 MSS(MSS/cwnd)字节
假设MSS = 1460 B,cwnd = 14600 B,在一个 RTT 内发送了 10 个报文段,则对于每个收到的 ACK(假设一个报文段一个ACK)则增加 1 / 10 MSS的拥塞窗口长度,于是在收到 10 个之后,拥塞窗口将增加一个 MSS
结束线性增长:
出现超时丢包时,cwnd被设为 1 个 MSS,ssthresh被设为 cwnd 的一半
出现 3 个冗余ACK时,cwnd的值减半,将ssthresh的值设为 cwnd 的一半,进入快速恢复状态
3.快速恢复
对于引起TCP进入快速恢复状态的缺失报文段,对收到其前一个报文段的冗余ACK,cwnd的值增加一个 MSS,当最后收到丢失报文段的 ACK 时,降低 cwnd 后进入拥塞避免状态
出现超时:
执行慢启动和拥塞避免中相同的动作,cwnd被设为 1 个 MSS,ssthresh被设为 cwnd 的一半,再进入慢启动状态
4.TCP拥塞控制:回顾
忽略慢启动,假设丢包由 3 个冗余 ACK 指示,此时TCP的拥塞控制是:
每个 RTT 内 cwnd 线性增加 1 MSS ,然后出现 3 个冗余 ACK 后, cwnd 减半 --> 加性增,乘性减

5.对TCP吞吐量的宏观描述
w:窗口长度字节
W:发生丢包时窗口长度字节
RTT:报文段发送到接收ACK的往返时间
一条连接的吞吐量:0.75 * W / RTT
6.经高带宽路径的TCP
L:丢包率
MSS:最大报文段长度
一条连接的平均吞吐量: (1.22 * MSS) / (RTT )
$$
(1.22 * MSS) / (RTT * \sqrt x )
$$
3.7.1 公平性
K 条TCP连接,通过传输速率为 R bps的瓶颈链路(对于每条连接,沿着该连接路径上的所有其他段链路都不拥塞,且与该路径相比,传输容量是充足的)都在传输大文件(没有UDP流量)
如果每条连接的平均传输速率接近 R / K,即每条链路得到相同带宽,则认为该拥塞控制是公平的
实际中AIMD(加性增,乘性减)算法是不公平的,对于较小RTT的连接能够在链路空闲时更快地抢到带宽
并行TCP连接:
当一个应用使用多条TCP并行连接时,占用了一条拥塞链路中较大比例的带宽
3.7.2 明确拥塞通告:网络辅助拥塞控制

IP数据报首部的服务类型字段的两个比特被用于ECN(明确拥塞通告)
路由器使用一种ECN比特设置表明该路由器正经历拥塞,此指示标记在IP数据报中,交付给目的主机,再由目的主机通知发送主机
推荐当拥塞持续不断存在时才设置ENC比特,于是在发送给发送方的TCP ACK报文段中设置 ECE(明确拥塞通告回显)比特
发送方接收到后通过减半拥塞窗口对一个具有ECE拥塞指示的ACK作出反应,并在下一个TCP报文段中对 CWR(拥塞窗口缩减)比特进行置
第 4 章 网络层:数据平面
数据平面:
网络层每台路由器的功能,决定到达路由器输入链路之一的数据报如何转发到该路由器的输出链路之一
控制平面:
网络逻辑范围,控制数据沿着从源主机到目的主机的端到端路径中路由器之间的路由方式
4.1 网络层概述

H1 向 H2 发消息,H1 网络层从 H1 运输层取出报文段,封装成IP数据报,再发给邻近路由器,路由器不断转发直到 H2 邻近路由器,H2 从其邻近路由器取出数据报,提取出运输层报文段,交付给 H2 运输层
路由器
-
数据平面:从其输入链路向其输出链路转发数据报
-
控制平面:协调本地的路由器转发动作,使得数据报沿着源和目的主机之间的路由器路径最终进行端到端传送
-
截断的协议栈,没有网络层以上的部分,因为路由器不运行应用层和运输层协议
浙公网安备 33010602011771号