保证一致性和可达性
1、确认应答机制ACK
TCP会将数据进行编号,每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你要从哪里开始发. 比如, 客户端向服务器发送了1005字节的数据, 服务器返回给客户端的确认序号是1003, 那么说明服务器只收到了1-1002的数据. 1003, 1004, 1005都没收到. 此时客户端就会从1003开始重发.
2、超时重传机制
主机会将数据A发送给数据B,当超时一定时间没有接收到ACK时,A将尝试重新发送数据,直到接收到ACK。此时B可能会收到诸多重复数据,则将根据序列号进行数据筛选。
3、滑动窗口
滑动窗口即无需等待即可重复发送数据的最大值。 发送前四个段的时候, 不需要等待任何ACK, 直接发送 收到第一个ACK确认应答后, 窗口向后移动, 继续发送第五六七八段的数据… 因为这个窗口不断向后滑动, 所以叫做滑动窗口. 操作系统内核为了维护这个滑动窗口, 需要开辟发送缓冲区来记录当前还有哪些数据没有应答 只有ACK确认应答过的数据, 才能从缓冲区删掉.
4、丢包
ACK丢失:无影响,通过后续ACK确认前置数据已经收到 报文丢失:当某一段报文丢失之后, 发送端会一直收到 1001 这样的ACK, 就像是在提醒发送端 “我想要的是 1001” 如果发送端主机连续三次收到了同样一个 “1001” 这样的应答, 就会将对应的数据 1001 - 2000 重新发送 这个时候接收端收到了 1001 之后, 再次返回的ACK就是7001了 因为2001 - 7000接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中.
5、流量控制
接收端如果处理性能弱于发送端,则需要进行流量控制: 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK通知发送端; 窗口大小越大, 说明网络的吞吐量越高; 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端; 发送端接受到这个窗口大小的通知之后, 就会减慢自己的发送速度; 如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 让接收端把窗口大小再告诉发送端.
6、拥塞控制
TCP引入慢启动机制,以保证网络的畅通
- 开始时,将拥塞窗口设为1
- 每收到一个ACK,将拥塞窗口数+1
- 取拥塞窗口和缓存窗口中最小值发送数据。
|