TCP 协议
- TCP 是传输控制协议
- 特点:
- 提供面向连接的可靠的双向字节流传输服务
- 只能点对点,不支持广播
- Socket:
- TCP 连接的两端点抽象概念为 Socket(套接字/插口)
- Socket = IP + 端口号
可靠传输原理
- 停止等待协议:
- 发送方每发送一个分组就停止发送,等待对方确认。
- 发送方每收到一个确认就发送下一个分组。
- 存在确认丢失和迟到,需要支持超时重传和丢弃重复。
- 缺点是信道利用率低。
- 滑动窗口协议:
- 发送方维持一个发送窗口,流水线发送。
- 如果发送窗口已满,则停止发送。
- 接收方采用累积确认。
- 可以提高信道利用率。
- 可以实现流量控制。
- TCP 可靠通信原理:
- 连接两端都有一个发送窗口和一个接收窗口。
- 窗口大小在建立连接时协商确定。
- 对字节的序号进行确认,确认后发送窗口才向前滑动。
拥塞控制原理
- 拥塞控制的方法是动态控制拥塞控制窗口大小。
- 判断拥塞的依据是没有按时到达的确认报文。
- 拥塞窗口控制算法:
- 慢开始:开始传输时采用指数级增大窗口。
- 拥塞避免:慢开始结束后进入拥塞避免阶段,采用线性增大窗口。
- 慢开始和拥塞避免之间通过一个门限变量控制。
- 快速重传:只要一连收到三个重复确认就立即重传,而不必继续等待重传计时器到期。
- 快速重传可以避免丢包时误判拥塞,降低传输效率。
- 快速恢复:在快速重传后,不执行慢开始,而是将门限减半,然后进入拥塞避免阶段。
TCP报文段头部
- 固定长度 20 字节,最大 60 字节。
- 源端口目的端口号各 16 位。
- 序号32位,表示本报文段第一个字节的序号。
- 确认号32位,表示期望收到对方下一个报文段的数据的第一个字节的序号。
- 数据偏移4位,单位为4字节,表示首部长度。
- 保留字段占6位。
- 标志位6位:
- URG,表明紧急指针字段有效,有高优先级的数据。
- ACK,表明确认号字段有效。
- PSH,表明接收方应该立即将数据推送给应用层。
- RST,表明发送方出现严重差错,必须重新建立连接。
- SYN,表明这是一个连接请求或连接接受报文。
- FIN,表明发送方已经完成,要求释放连接。
- 窗口大小16位,表示接收窗口大小。
- 校验和16位,类似 UDP 会增加伪首部进行计算。
- 紧急指针16位,少用。
- 选项字段,长度可变。
- MSS
- 最大报文段长度,告诉对方报文段的数据最大长度。
- 如果超过 MTU 网络层需要进行分片。
- 如果一方不接受另一方的 MSS,则定为默认值 536,
- 互联网MTU(576) – IP头(20) – TCP头(20)。
TCP 连接目的
- 确认对方存在
- 协商参数,如 MSS,窗口大小等。
三次握手建立连接
- SYN,seq=x
- SYN,ACK,seq=y,ack=x+1
- ACK,seq=x+1,ack=y+1
- 三次握手可以避免超时重传时建立错误的历史连接。
- 异常情况:
- 第一次握手丢失,客户端重传。
- 第二次握手丢失,客户端和服务端都重传。
- 第三次握手丢失,服务端超时重传,客户端已建立连接如果发送数据没有得到确认也会重传。
- 采用指数退避计算重传周期,linux默认从1s开始重传5次。
四次挥手释放连接
- FIN,seq=u
- ACK,seq=v,ack=u+1
- FIN,ACK,seq=w,ack=u+1
- ACK,seq=u+1,ack=w+1
- 四次挥手的原因是:另一端可能还有数据没有传完。
重传机制
- 超时重传,每个报文段都设置计时器。
- 超时时间 RTO 标准算法
- RTO = srtt + 4*rttvar
- rttvar = (1-h)rttvar + h(|M-srtt|)
- srtt = (1-g)srtt + gM
- M:往返时延RTT测量值
- 建立连接时没有RTT 测量值,初始RTO为1s
- 快速重传,三次相同 ACK 则重传。
连接不存在IP时的处理方式
- 局域网内,发送 ARP 获取 MAC 地址,然后才发送握手请求。
- 局域网外,直接发送握手请求,路由转发到外部。
连接不存在的端口时的处理方式
- 主机响应 RST,发送端关闭连接。
- 防火墙限制则直接丢弃,发送端超时重试直至失败。