计算机网络原理(12)——TCP协议
一、TCP概述
- 点对点
- 一个发送方,一个接收方
- 可靠的、按序的字节流
- 流水线机制
- TCP拥塞控制和流量控制设置窗口尺寸
- 发送方/接收方缓存
- 全双工(full-duplex)
- 同一连接中能够传输双向数据流
- 面向连接
- 通信双方在发送数据之前必须建立连接
- 连接状态只在连接的两端中维护,在沿途节点中并不维护状态
- TCP连接包括:两台主机上的缓存、连接状态变量、socket等
- 流量控制机制
二、TCP:序列号和ACK
- 序列号
- 序列号指的是segment中第一个字节的编号,而不是segment的编号
- 建立TCP连接时,双方随机选择序列号
- ACK
- 希望接收到的下一个字节的序列号
- 累计确认:该序列号之前的所有字节均已被正确接收到
- 问题:接收方如何处理乱序到达的segment?
- TCP规范中没有规定,由TCP的实现者做出决策
三、TCP可靠数据传输概述
- TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务
- 流水线机制
- 累计确认
- TCP使用单一重传定时器
- 触发重传的事件
- 超时
- 收到重复ACK
- 渐进式
- 暂不考虑重复ACK
- 暂不考虑流量控制
- 暂不考虑拥塞控制
四、TCP RTT和超时
-
如何设置定时器的超时时间?
- 大于RTT,但RTT是变化的
- 过短:不必要的重传
- 过长:对段丢失时间反应慢
-
如何估计RTT?
- SampleRTT:测量从段发出去到收到ACK的时间,忽略重传
- SampleRTT变化:测量多个SampleRTT,求平均值,形成RTT的估计值EstimatedRTT
-
定时器超时时间的设置
-
EstimatedRTT+“安全边界”
-
EstimatedRTT变化大→较大的边界
-
测量RTT的变化值:SampleRTT与EstimatedRTT的差值
DevRTT=(1-β)×DevRTT + β×|SampleRTT-EstimatedRTT|
(typically,β=0.25)
-
时间设置
TimeoutInterval=EstimatedRTT+4×DevRTT
-
五、TCP发送方事件
- 从应用层收到数据
- 创建Segment
- 序列号是Segment第一个字节的编号
- 开启计时器
- 设置超时时间:TimeOutInterval
- 超时
- 重传引起超时的segment
- 重启定时器
- 收到ACK
- 如果确认此前未确认的segment
- 更新SendBase
- 如果窗口中还有未被确认的分组,重新启动定时器
- 如果确认此前未确认的segment
六、快速重传机制
- TCP的实现中,如果发生超时,超时时间间隔将重新设置,即将超时时间间隔加倍,导致其很大
- 重发丢失的分组之前要等待很长时间
- 通过重复ACK检测分组丢失
- Sender会背靠背地发送多个分组
- 如果某个分组丢失,可能会引发多个重复的ACK
- 如果sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失
- 快速重传:在定时器超时之前即进行重传
七、TCP流量控制
- 思想:接收方为TCP连接分配buffer,上层应用可能处理buffer中数据的速度较慢,控制发送方不会传输的太多、太快以至于淹没接收方(buffer溢出)
- 本质:速度匹配机制
八、TCP连接管理
- TCP sender和receiver在传输数据前需要建立连接
- 初始化TCP变量
- seq.#
- Buffer和流量控制信息
- Client:连接发起者
- Server:等待客户连接请求