概述 RFCs-793, 1122, 1323, 2018, 2581
TCP特点
- 点对点连接
- 一个发送方,一个接收方
- 可靠的,按序的字节流
- TCP拥塞控制和流量控制机制
- 设置窗口尺寸
- 发送方/接收方缓存
- 全双工(full-duplex)
- 同一连接中能够传输双向数据流
- 面向连接
- 通信双方在发送数据之前必须建立连接
- 连接状态只在连接两端中维护,在沿途节点中并不维护状态
- TCP连接包括:两台主机上的缓存,连接状态量,socket等
- 流量控制机制
TCP段结构
TCP的序列号和ACK
- 序列号:
- 序列号指的是segment中第一个字节的编号, 而不是segment的编号
- 建立TCP连接时,双方随机选择序列号
- ACKs:
- 希望接收到的下一个字节的序列号
- 累计确认:该序列号之前的所有字节均已被正 确接收到
- Q: 接收方如何处理乱序到达的Segment ?
- A: TCP规范中没有规定,由TCP的实现者做出 决策
TCP可靠数据传输
概述
- TCP在IP层提供的不可靠服务基础上实现了可靠数据传输服务
- 流水线机制
- 累计确认
- TCP使用单一重重传定时器
- 触发重传的事件
- 超时
- 收到重复ACK
- 渐进式
- 暂不考虑重复ACK
- 暂不考虑流量控制
- 暂不控制拥塞控制
RTT和超时
question 1 : 如何设置定时器的超时时间?
- 大于RTT
- RTT是变化的
- 过短
- 不必要的重传
- 过长
- 对段丢失时间反应慢
question 2 : 如何估计RTT?
- SampleRTT: 测量从段发出去到收到ACK的时间
- 忽略重传
- SampleRTT变化
- 测量多个SampleRTT,求均值,形成RTT的估计值EstimatedRTT
answer 1 : 定时器超时时间的设置
EstimatedRTT "安全边界"
EstimatedRTT变化->较大的边界
SampleRTT与EstimatedRTT的差值
定时器超时时间的设置
TimeoutInterval = EstimatedRTT 4 * DevRTT
TCP发送方事件
- 从应用层到数据
- 创建Segment
- 序列号是Segment第一个字节的编号
- 开启计时器
- 设置超时时间 : TimeInterval
- 超时
- 重传引起超时的Segment
- 重启定时器
- 收到ACK
- 若确认此前未确认的Segment
- 更新SendBase
- 如果窗口中还有未确认的分组,重新启动定时器
- 若确认此前未确认的Segment
TCP发送端程序
重传过程
ACK生成 : RFC 1122,RFC 2581
快速重传机制
- TCP的实现过程,如果发生超时,超时时间间隔将重新设置,即将超时时间间隔加倍,导致其很大
- 重发丢失的分组之前要等待很长时间
- 通过重复ACK检测分组丢失
- Sender会背靠背地发送多个分组
- 如果某个分组丢失.可能会引发多个重复的ACK
- 如果sender收到对同一数据的3个ACK,假定该数据之后的段已经丢失
- 快速重传 : 在定时器超时之前即进行重传
- 快速重传算法
TCP连接管理
- TCP sender和receiver在传输数据之前需要建立连接
- 初始化TCP变量
- Seq.#
- Buffer和流量控制信息
- Client : 连接发起者
Socket clientSocket = new Socket("hostname","port number");
- Server : 等待客户连接请求
Socket connectionSocket = welcomeSocket.accpet();
建立连接
- 三次握手(Three way handshake)
- step 1 : client host sends TCP SYN segment to server
- specifies initial seq #
- no data
- step 2 : server host receive SYN, replies with SYNACK segment
- server allocates buffers
- specifies server initial seq.#
- step 3 : client receives SYNACK,replies with ACK segment,whitch may contain data
- step 1 : client host sends TCP SYN segment to server
关闭连接 (Closing a connection)
client closes socket : clientSocket.close();
- 四次挥手
- step 1 : client 向server发送 TCP FIN 控制 segment
- step 2 : server 收到 FIN,回复ACK,关闭连接,发送FIN
- step 3 : client 收到FIN 回复ACK
- 进入"等待"-如果收到FIN,会重新发送ACK
- step 4 : server收到ACK,连接关闭
TCP协议客户端与服务端连接生命周期
TCP拥塞控制
未完待续…