目录
- 确认应答机制 (安全机制)
- 超时重传机制 (安全机制)
- 连接管理机制 (安全机制)
- 滑动窗口 (效率机制)
- 流量控制 (安全机制)
- 拥塞控制 (安全机制)
- 延迟应答 (效率机制)
- 捎带应答 (效率机制)
一、滑动窗口机制--提供效率
也叫高速重发机制(快重传)
使用滑动窗口可以解决效率问题(类似多线程的并发方式)同时发送多个数据报
- 窗口大小:无需等待确认应答而可以继续发送数据的最大值。 上图的窗口大小就是4000个字节(四个段)
- 发送前四个段的时候,,不需要等待任何ACK, 直接发送
- 收到第一个ACK后, 滑动窗口向后移动,,继续发送第五个段的数据, 依次类推
- 操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答,只有确认应答过的数据,,才能从缓冲区删掉
- 窗口越大, 则网络的吞吐率就越高;
如果出现丢包
情况1:数据报已经抵达,ack丢失
【注】以上情况窗口可以滑动6个段(接收1-6000)
情况2:数据报直接丢失
- 当1001-2000段报文段丢失之后, 主机A会一直收到 1001 这样的ACK, 就像是在提醒主机A "我想要的是 1001"一样
- 如果主机A连续三次收到了同样一个 1001 这样的应答, 就会将对应的数据 1001 - 2000 重新发送
- 这个时候主机B收到了 1001 之后, 再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已经收到了, 只是被放到了接收端操作系统内核的接收缓冲区中
滑动窗口解答
问题1:滑动窗口的大小?
答:无需等待确认应答而可以继续发送数据的最大值
问题2:如何确定滑动窗口大小?
答: 由拥塞窗口和流量控制窗口决定
滑动窗口大小= min(拥塞窗口大小,流量控制窗口大小)
问题3:滑动窗口如何滑动?
答:依赖ack的确认序号(ack确认序号前的数据报都已经接收到了)
在该ack确认序号之前,当次并行接收到多少个数据报,就可以滑动多少
问题4:为什么发送端要有发送缓冲区?
答:记录已发送的数据-----收到对应ack才可以清理该数据
问题5:接收端为什么要有接收缓冲区?
答:记录已接收的数据-----如果发送数据丢包,才知道让对方重发
二、流量控制机制---安全
接收端的接收能力有限,告诉发送端接收能力(类似买卖票,如果人太多,就限制卖票数量,人满后,停止卖票)
流量控制窗口:基于TCP报文中窗口大小字段来设置(间接影响发送端滑动窗口的大小)
- 接收端将自己可以接收的缓冲区大小放入TCP 首部中的 "窗口大小" 字段, 通过ACK端通知发送端
- 窗口大小字段越大, 说明网络的吞吐量越高
- 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端
- 发送端接受到这个窗口之后, 就会减慢自己的发送速度
- 如果接收端缓冲区满了, 就会将窗口置为0,这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端.
问题:接收端使用流量控制窗口保证接收端数据安全是如何保证的?
答:告诉发送端后,影响发送端滑动窗口的大小
三、拥塞控制机制---安全
发送端在网络状态不明的情况下,贸然发送大量数据报会造成网络拥堵,所以需要先发送数据探路,设置拥塞窗口的大小
- 发送开始的时候, 定义拥塞窗口大小为1,每次收到一个ACK应答, 拥塞窗口+1
- 为了不增长的那么快,需要设置慢启动的阈值 ,当拥塞窗口超过这个阈值的时候,不再按照指数方式增长, 而是按照线性方式增长
【注1】少量的丢包,触发超时重传,大量的丢包,就认为网络拥塞
【注2】当TCP通信开始后,网络吞吐量会逐渐上升;随着网络发生拥堵, 吞吐量会立刻下降
四、延迟应答机制---效率
问题:接收端接收到数据,马上响应ack,设置的流量窗口(流量窗口影响滑动窗口的大小,滑动窗口越大,网络吞吐量越大,传输效率越高,反之则越低)控制大小(接口端接收缓冲区空余空间)就会比较小----》需要提高效率
解决:稍等一段时间,让接收端程序接收处理缓冲区数据再返回ack ----延迟应答
- 数量限制: 每隔N个包就应答一次;
- 时间限制: 超过最大延迟时间就应答一次
五、捎带应答机制---效率
接收端响应ack和主动发送的数据可以合并返回
粘包问题
粘包问题的出现:基于传输层TCP协议来实现应用层协议时,因为TCP是基于字节流的,读取时需要考虑格式,包括读取多长,如果格式读取不对,或长度没有设置好,就会出现粘包问题
粘包问题的解决:明确两个包之间的边界
【注】UDP不存在粘包问题