流量控制
概念
流量控制:控制发送方发送速率不要太快,使自己能够接收
滑动窗口机制
1)使用类似于选择重传协议的规则进行传输
2)接受方回复包含三条“ACK”为 1 表示正确接收,“ack”表示在当前位置之前的数据都正确接收,“rwnd”表示调节发送方的发送窗口大小为该值
3)当发送方收的接收方的“rwnd”为 0 时,启动持续计时器,每超时一次则向接受窗口发送一次零窗口探测报文

拥塞控制
概念
对某一网络资源需求超过了所能提供的部分,网络性能就会下降

拥塞控制算法
慢开始
1.拥塞窗口(cwnd):
1)值取决于网络的拥塞程度,动态变化,发送窗口(swnd)= 拥塞窗口(cwnd)
2)只要没有出现拥塞,cwnd 就增大一倍,出现拥塞就减小一些
2.判断拥塞:是否出现超时重传
3.慢开始门限(ssthresh):
1)当$ cwnd<ssthresh $时,使用慢开始算法
2)当$ cwnd>ssthresh $时,停止慢开始算法,使用拥塞避免算法
3)当$ cwnd=ssthresh $时,既可以使用慢开始算法,又可以使用拥塞避免算法
注意:“慢开始”是指一开始向网络注入的报文段少,并不是指 cwnd 增长速度慢
拥塞避免
1)拥塞避免算法生效时,cwnd每次增加 1
2)网络出现拥塞时,将 ssthresh 更新为 cwnd 的一半,将 cwnd 值减小为 1,开始执行慢开始算法
注意:“拥塞避免”不能完全避免拥塞,而是将 cwnd 控制为线性增长,出现拥塞时降低传输能力
快重传
个别报文段丢失时,实际网络未发生拥塞,导致发送方误认为发生了拥塞,启动慢开始算法,降低了传输效率
快重传是不等“超时重传计时器”超时时再重传,另发送方提前重传
原理:
1)接收方不等自己发送数据时才捎带确认,而是立即发送确认
2)收到了失序的报文段也要继续发送之前的确认,进行重复确认
3)当发送方收到了3个连续的重复确认,就会立即重传

快恢复
当执行完快重传算法后,执行快恢复算法而不是慢开始算法
快恢复:将 ssthresh 与 cwnd 调整为原来的一半,开始执行拥塞避免算法
图像

超时重传时间选择
计算公式
$ RTT_s $:加权平均往返时间
1)第一个$ RTT_{s1}=RTT_1 $
2)$ 新RTT_{s}=(1-\alpha)\times旧RTT_s+\alpha\times新RTT样本 $
$ 0\le \alpha<1 $,标准推荐$ \alpha=\frac{1}{8} $
$ RTT_d $:RTT偏差的加权平均时间
1)第一个$ RTT_{D1}=\frac{RTT_1}{2} $
2)$ 新RTT_D=(1-\beta)\times旧RTT_D+\beta\times|RTT_s-新RTT样本| $
$ 0\le\beta<1 $,标准推荐$ \beta=\frac{1}{4} $
$ RTO $:超时重传时间
$ RTO=RTT_s+4\times RTT_D $
超时数据包的时间测量
超时重传的时间直接丢弃,不记录。并把 RTO 增大一些,如变为原来的两倍
首部格式

1)源端口号与目的端口号:发送方进程与接收方进程的端口号
2)序号:占 32 bit,指本 TCP 报文段数据载荷中的第一个字节位于总数据的字节序号,序号增加到最后一个后,下一个序号又回到零。
3)确认号:占 32 bit ,指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。序号增加到最后一个后,下一个序号又回到零。
4)数据偏移:占 4 bit,以 4 字节为单位。指出 TCP 报文的数据载荷部分距离 TCP 报文段的起始处有多远。因为首部固定 20 字节,扩展最多 40 字节,所以范围为$ [(0101)_2,(1111)_2] $
5)保留:占 6 bit,保留今后使用,目前全部置为 0
6)紧急标志位 URG :取值为 1 时,“紧急指针”部分生效
7)确认标志位 ACK:取值为 1 时,确认号字段生效,建立连接后所有的TCP报文段必须将 ACK 置为 1
8)推送标志位 PSH:接收方的 TCP 收到 PSH 为 1 的报文段后会尽快上交应用,不用等缓存填满再上交
9)复位标志位 RST:复位 TCP 连接。当 RST 为 1 时,表明 TCP 连接出现了异常,必须释放连接,然后再重新建立连接。RST 置 1 还用来拒绝一个非法的报文段或拒绝打开一个 TCP 连接
10)同步标志位 SYN:在建立 TCP 连接时用来同步序号,为 1 时不能携带数据,但要消耗一个序号
11)终止标志位 FIN:用来释放 TCP 连接
12)窗口:占 16 bit,以字节为单位。指出发送本报文段的一方的接收窗口。作为接收方让发送方设置发送窗口的依据,用于流量控制
13)校验和:占 16 bit,用于校验是否出现误码
14)紧急指针:占 16 bit,以字节为单位,指明紧急数据的长度。紧急数据之后是普通数据。(发送方有紧急数据时,将紧急数据插队到发送缓存的最前面,立刻封装一个 TCP 报文段发送。)
15)选项:可以附加其他信息,如窗口扩大选项、时间戳选项等
16)填充:由于选项长度可变,填充为了确保 TCP 首部的字节长度是 4 的倍数
TCP连接
TCP分为以下三个阶段
1)建立 TCP 连接
2)数据传送
3)释放 TCP 连接

连接建立——三次握手
seq 与 ack
1)无论发送方还是接收方 seq 初始状态都是随机序列,往后每发送 x 字节的数据就加 x
2)ask每次都是对方上次发送的seq+1
TCP 规定 SYN 为 1 时不能携带数据,但要消耗一个序号。普通报文若不携带数据则不用消耗序号
三次握手过程
1.服务端处于监听状态
2.第一次握手:
1)客户端发送建立连接请求,将 SYN 置为 1 表示请求建立连接
2)seq 为客户端随机生成的序列号
3.第二次握手:
1)服务器发送确认消息并向客户端建立连接,将 SYN 置为 1 表示请求建立连接
2)将 ACK 置为 1 表示接收到了上一个请求
3)seq 为服务端随机生成的序列号,假设为 y
4)ask 为之前客户端seq +1 即为 x+1
4.第三次握手:
1)客户端发送确认消息,ACK 置为 1 表示确认收到建立请求的消息
2)seq 为第一次握手的 seq +1 即为 x+1
3)ack 为第二次握手服务器端的 seq +1 即为 y+1

连接释放——四次挥手
1.第一次挥手:
1)客户端发送释放连接请求,FIN 置为 1 表示这是一个释放连接请求
2)ACK 置为 1 表示对上一个 TCP 报文段的确认
3)seq:TCP 客户端进程已传送的数据的最后一个字节的序号+1,假设为 u
4)ask:TCP 客户进程已收到的数据的最后一个字节的序号+1,假设为 v
2.第二次挥手:
1)服务端发送确认消息,ACK 置为 1 表示这是一个确认消息
2)seq:TCP 服务器进程已传送过的数据的最后一个字节的序号+1,即为 v
3)ask:为客户端第一次挥手的seq+1,即为 u+1
注意:此时处于半关闭的状态,如果服务器端还要发送数据,客户端仍要接收
3.第三次挥手:
1)服务端发送剩余数据后,发送释放连接请求,FIN 置为 1 表示这是一个释放连接请求
2)ACK 置为 1 表示对之前消息的去人
3)seq:会增加是因为半关闭状态下服务器又传输了一些数据,假设为 w
4)ask:为客户端第一次挥手的seq+1,仍未 u+1
4.第四次挥手:
1)客户端发送确认消息,ACK置为 1 表示这是一个确认请求
2)seq:设置为u+1
3)ask:设置为 w+1
注意:客户端发送第四次挥手后还要等待 2 倍的 MSL 才会关闭连接,等待时间是为了防止第四次挥手丢失,导致服务端反复重传第三次握手

保活计时器
1)TCP 服务器进程每收到一次 TCP 客户进程的数据,就重新设置并启动保活计时器(2小时定时)
2)若保活计时器超时,TCP 服务器每个 75 秒就会发送一次探测报文段,若连续发送 10 个探测报文段后客户端仍没有响应,则认为客户端发生了故障,就会关闭连接
