TCP概述
- 点对点
- 一个发送方,一个接收方
- 可靠的、按序的字节流
- 流水线机制
- TCP拥塞控制和流量控制机制设置窗口尺寸
- 发送方/接收方缓存
- 全双工(full-duplex)
- 同一连接中能够传输双向数据流
- 面向连接
- 通信双方在发送数据之前必须建立连接
- 连接状态只在连接的两端中维护,在沿途节点中并不维护状态
- TCP连接包括:两台主机上的缓存、连接状态变量、socket等
- 流量控制机制
TCP段结构
序列号
- 序列号指的是segment中第一个字节的编号,而不是segment的编号
- 建立TCP连接时,双方随机选择序列号
ACKs
- 希望接收到的下一个字节的序列号
- 累计确认:该序列号之前的所有字节均已被正确接收到
可靠数据传输
- TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务
- 流水线机制
- 累计确认
- TCP使用单一重传定时器
- 触发重传的事件
- 超时
- 收到重复ACK
- 渐进式
RTT和超时
TCP发送方事件
- 从应用层收到数据
- 创建Segment
- 序列号是Segment第一个字节的编号
- 开启计时器
- 设置超时时间:Timeout
- 超时
- 重传引起超时的Segment
- 重启计时器
- 收到ACK
- 如果确认此前未确认的Segment
- 更新SendBase
- 如果窗口中还有未被确认的分组,重启定时器
- 如果确认此前未确认的Segment
图例
快速重传机制
TCP流量控制
TCP连接管理
- 一次握手:
客户端
发送带有SYN
标志的连接请求数据包
给服务端 - 二次握手:
服务端
发送带有SYN+ACK
标志的连接请求和应答数据包
给客户端 - 三次握手:
客户端
发送带有ACK
标志的应答数据包
给服务端(可以携带数据了)
拥塞控制原理
拥塞(Congestion)
- 表现
- 分组丢失(路由器缓存溢出)
- 分组延迟过大(在路由器缓存中排队)
- 拥塞控制 vs 流量控制
方法
- 端到端拥塞控制
- 网络层不需要显式的提供支持
- 端系统通过观察loss、delay等网络行为判断是否发生拥塞
- TCP采用这种方法
- 网络辅助的拥塞控制
- 路由器向发送方显式地反馈网络拥塞信息
- 简单的拥塞指示
- 指示发送方应该采取何种速率
- 案例:ATM ABR拥塞控制