运输层笔记–TCP
@(TCP/IP)[TCP]
TCP报文段
1. TCP服务
- 进程到进程的通信
- 流交付服务。
- TCP允许进程以字节流的形式来传递数据(UDP中进程传递用户数据报,已定义好边界),但TCP会把若干字节组成报文段
- TCP中会存在两个缓存,即发送缓存和接收缓存,每个方向各一个。这些缓存可用来进行流量控制和差错控制
- 全双工通信
- 复用和分用
- 面向连接的服务。两个TCP之间建立虚连接,而不是物理连接。
- 可靠的服务
2. TCP特点
- 编号系统:TCP是面向字节的,所以首部中的序号和确认号字段所指的都是字节的编号
- 字节号:TCP把一个连接中要发送的所有数据字节都编号,编号从0~ (232−1) 之间的一个随机数开始。
- 序号:每个报文段的序号就是这个报文段中首字节的编号
- 确认号:期望接收的下一个字节的编号
- 流量控制:TCP能够使用面向字节的流量控制
- 差错控制:面向字节
- 拥塞控制
3. TCP连接
3.1 连接建立
三次握手:
1. 客户端发送第一个报文段,即SYN报文段。SYN报文段不携带任何数据,但是它要消耗一个序号
2. 服务器发送第二个报文段,即SYN+ACK报文段。SYN和ACK报文段不携带数据,但要消耗一个序号
3. 客户端发送第三个报文段,即ACK报文段。ACK报文段如果不携带数据就不消耗序号
3.2 数据传送
3.3 连接终止
- 使用三次握手的连接终止
- 客户TCP在受到客户进程发来的关闭命令后,发送第一个报文段,这是一个把FIN置1的FIN报文段。如果FIN报文段不携带数据,它只消耗一个序号
- 服务器TCP收到这个FIN报文段后,通知进程,并发送第二个报文段,这是一个FIN+ACK报文段。如果FIN+ACK报文段不携带数据,则它只消耗一个序号
- 客户TCP发送最后一个报文段,这是一个ACK报文段。不携带数据,不消耗序号
- 使用四次握手的连接终止——半关闭
连接的一方可以停止发送数据,但仍可以接收数据,典型例子:排序
4. 流量控制
TCP中的数据流和流量控制反馈
注意:TCP实现中不提供从接收进程到接收TCP的流量控制反馈。即:接收TCP控制了发送TCP,而发送TCP控制了发送进程
TCP通过强制发送方和接收方不断调整窗口大小,实现流控。
rwnd=缓存大小−正在等待被拉取的字节数
5. 差错控制
- 校验和
- 确认
- 累积确认(ACK)
- 选择确认(SACK)
- 重传
- RTO之后的重传
- 三个重复的ACK报文段之后的重传
TCP保证数据必须按序交付到进程
6. 拥塞控制
拥塞窗口(cwnd):取决于网络
真正窗口大小=minimum(rwnd,cwnd)
6.1 拥塞策略
- 慢开始:指数增大
- 拥塞避免:加法增大
- 拥塞检测:乘法减小