MOOC_TCP简述
TCP基本特点
- 可靠的, 按序的字节流
- 流水线机制
TCP拥塞控制可流量控制机制设置窗口尺寸 - 发送方/接收方都拥有缓存
- 全双工: 同一连接中能够双向传输数据
- 面向连接
a. 通信双方在发送数据之前必须建立连接
b. 连接状态只在连接的两端中维护,在沿途的节点不维护连接状态
c. TCP连接包括:两台主机上的缓存, 连接状态变量, socket等 - 流量控制
TCP段结构
TCP的工作流程简述
TCP是面向连接的协议,在进行数据传输之前要先建立客户机到服务器的连接,然后才能进行通信,TCP的工作流程如下:
- 连接的建立
- 数据传输
- 连接的拆除
连接的建立 & 数据传输
连接的建立的过程通常被称为三次握手: 第一次: 客户端告诉服务器我想和你建立连接, 数据传输序号从client_isn开始, 第二次服务器告诉客户端, 我同意该连接, 我的序号是server_isn, 我期望收到的段序号是client_isn + 1, 第三次, 客户端向服务器报告,对连接进行确认, 同时可以传输数据.
- 连接建立主要完成以下任务:
- 始化TCP变量包括:生成套接字 分配buffer, 生成流量控制信息等.
- 客户端发起请求
- 客户端等待客户的连接请求
- 客户端发送 TCP SYN段到服务器
- SYN段: 该段不包含上层应用的任何信息, 该段的SYN比特被置为1, 客户随机分配一个初始序号(client_isn)到Sequence numbers字段
- 服务器接收到客户机的SYN段后, 提取 TCP SYN报文段, 为该TCP连接分配TCP缓存和变量, 并向该客户端分配允许连接的报文段
- 该报文也不含上层应用的任何信息, SYN比特置为1, ACK = client_isn + 1, Sequence number = server_isn
- 客户端接收到服务器的信息后, 为该TCP连接分配缓存和变量, 并发送另一个报文段, 该报文段中可以传输上层应用的数据
- 该报文段: SYN bit = 0 , Sequence number = client_isn + 1, ACK = server_isn + 1, 因为连接已经建立,所以此后的报文段中 SYN bit 都等于0
连接的拆除
- 客户端向服务器发送TCP FIN 段
- 服务器收到FIN, 回复ACK, 关闭连接, 发送FIN
- 服务器收到FIN, 回复ACK
- 进入等待-如果收到FIN, 会重新发送ACK
- 服务器收到ACK, 连接关闭
TCP的可靠数据传输机制
TCP在IP层提供的 不可靠 的数据传输的基础上提供可靠的数据传输.
- 流水线机制
- 累积确认机制
- 使用单一定时器定时实现重传
可靠数据传输是通过 校验和 + 序列号 + ACK + 重传 +定时器 来实现的
校验和 + 分组序列号 + ACK + 重传 可以解决传输过程中发生的比特位翻转的问题, 使用 定时器 + 重传 可以解决传输过程中发生丢包的问题, 可靠数据传输要解决的重要问题是定时器超时时间的设定
超时时间的设定
超时时间的应该大于RTT,过短,会引起不必要的重发, 过长对段丢失的反应慢, 故,
RTT的变化越大, 所要求的安全边界也就越大
如何估算RTT
测量每次发送到收到ACK的时间作为SampleRTT, 多次测量求平均值形成估计值EstimatedRTT
估算安全边界
安全边界的建立是为了解决在RTT变动时, 超时时间仍然能够大于RTT, 可见, 安全边界与RTT的变化有关, 测量每一次的EstimatedRTT 与当次的SimpleRTT的差值, 即可得到RTT的动态变化范围, 每一次数据传输都计算该差值,并加权平均, 即可得到一个平均的安全边界(DevRTT)
考虑一定的余量, 通常使用n倍的DevRTT, 故, 超时时间公式为
针对超时时间过长的快速重传机制
在实际使用中, 如果TCP连接发生一次超时, 根据超时时间计算公式, 超时时间将会被重新设置的很大, 导致系统响应变慢, 如果Sender发送了多个分组, 如果某个分组丢失, 会产生多个相同的ACK.
假定如果收到三个重复的ACK则认为该段数据已经丢失, 则在定时器超时之前进行重传.
TCP流量控制机制
流量控制主要解决, 发送方发送太快而导致接收方淹没(buffer溢出)的问题(也可能是上层应用处理数据较慢,导致接收方接收速度相对较慢)
流量控制有别于拥塞控制, 流量控制更侧重于,端与端之间的速度匹配, 拥塞控制更关心传输网络上的速度匹配.
Buffer中的可用空间spaceroom:
计算出来得到的Spaceroom告诉发送方, 还能够接收多少数据,借此实现速度匹配.