TCP协议相关机制及粘包问题

目录

一、滑动窗口机制--提供效率

如果出现丢包

情况1:数据报已经抵达,ack丢失

情况2:数据报直接丢失

滑动窗口解答

二、流量控制机制---安全

三、拥塞控制机制---安全

四、延迟应答机制---效率

五、捎带应答机制---效率

粘包问题


  1. 确认应答机制       (安全机制)
  2. 超时重传机制       (安全机制)
  3. 连接管理机制       (安全机制)
  4. 滑动窗口              (效率机制)
  5. 流量控制              (安全机制)
  6. 拥塞控制              (安全机制)
  7. 延迟应答              (效率机制)
  8. 捎带应答              (效率机制)

一、滑动窗口机制--提供效率

也叫高速重发机制(快重传)

使用滑动窗口可以解决效率问题(类似多线程的并发方式)同时发送多个数据报

  • 窗口大小:无需等待确认应答而可以继续发送数据的最大值。 上图的窗口大小就是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不存在粘包问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值