TCP如何保证传输的可靠性的
1.连接管理: 确保连接成功和释放成功
2.校验和: 对数据进行运算, 服务端也进行同样运算
3.序列号和确认号: 每次请求都会对应一个ack确认回应, ack=seq+1
4.超时重传
5.拥塞控制: 如果一次发送太多请求会导致请求丢失且无法重传(因为不知道丢了哪个), 引入拥塞控制
TCP流量控制
服务端维护一个滑动窗口, 每次响应返回滑动窗口的剩余容量(win), 如果下一次发送的数据大于这个容量则等待并定时发送试探报文
TCP滑动窗口
发送窗口:已经被ack的,已经发送未ack(窗口内),可以发送(窗口内),未发送(窗口外)
接收窗口:已经接收,未收到可以接收(窗口内),不可接收
TCP拥塞控制
四种算法:慢启动、拥塞避免、超时重传、快恢复
慢启动:每收到一个ACK,cwnd+1,指数增加,超过阈值进入拥塞避免
拥塞避免:cwnd线性增长,发生拥塞后进入重传阶段
超时重传:阈值变为1/2,cwnd变为1,重新慢启动(容易卡顿)
快速重传:连续收到3个相同的ACK(不需要客户端等待)、客户端立马重传数据,阈值减半,cwnd=阈值+3,重新进入拥塞避免
TCP粘包和拆包
粘包:将多个数据包合并为一个,导致接受方不知道包的边界
拆包:将一个数据包拆成多个,接收方需要重新组装
解决:分隔符、字段长度