当前位置: 首页 > news >正文

TCP协议--传输机制

TCP协议原理 


TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率两个方面,即在保证数据可靠传输的情况下尽可能的提高效率 

 


可靠传输机制


确认应答机制


向对方发送一个数据报,对方要返回一个确认应答的数据报 

实现的方式:序号和确认序号保证了响应应答针对的是哪一条消息的应答

说明:

发送的数据是基于TCP报头中的“32位序号”来保存的,一个字节对应一个序号
确认应答的数据是基于TCP报头中的“32位确认序号”来保存的,ack(确认信息)标志位置为1,返回某个序列号,说明某个序列号之前的数据全部接收到
有了确认应答,它才可以继续发送后边的数据



超时重传机制


发送的数据报可能因为网络拥堵等原因,超过一定时间,还没有收到确认应答的数据报,就需要重新发送 。如果没有收到确认应答,可能是因为发送数据时候就已经发生了丢包,也可能是因为ACK丢包了。这种情况,主机B可能会接收到许多重复的数据,TCP内部有去重操作,接收的数据会放在操作系统内核的接收缓冲区中,接收缓冲区可以是一个内存空间,视为是一个阻塞队列,对于收到的数据,TCP会根据序号检查这个数据是不是在缓冲区中已经存在,如果存在则丢弃,如果不存在则放进去

超时时间如何确定?

如果超时时间设置的太长,会导致重传的效率
如果超时时间设置的太短,会导致频繁发送重复的数据

因此TCP协议为了保证在任何环境中都能有较高性能的通信,系统会动态的计算这个超时时间

  • 超时以500ms为一个单位,每次判定超时重发的时间都是500ms的整数倍
  • 重发一次,仍然不能收到应答,等待2*500ms后再进行重传
  • 仍然等不到应答,等待4*500ms进行重传,以此类推,以指数形式增长
  • 累积到一定重传次数,TCP协议认为网络或者对端主机出现异常,强制关闭连接

连接管理机制(三次握手,四次挥手)


我之前的文章有详细的讲解,可以看前面的文章。


流量控制


接收端主机处理数据的速度有限,如果发送端发送数据太快,导致接收端缓冲区被填满,这时,发送端继续发送数据的话就会造成丢包,继而引起丢包重传等一些列连锁反应,因此TCP协议根据接收端接收数据的能力,来决定发送端发送数据的速度,这个机制就叫作流量控制 

  • 接收端将自己剩余缓冲区大小存入TCP头部中的“16位窗口大小”字段 ,通过ACK通知发送端
  • 窗口大小越大,说明网络吞吐量越高
  • 发送端根据接收到这个窗口的大小,控制自己的发送速度
  • 如果接收缓冲区满了,就会将窗口设置为0,这时,发送端不在发送数据,而是定期的发送一个窗口探测报文(只是为了知道窗口的大小),让接收端将窗口大小告诉发送端

拥塞控制 


刚开始发送数据时,由于中间结点的网络情况不清楚,如果贸然发送大量数据,就会造成大量丢包,所以TCP协议引入慢启动的方式,先发少量数据探探路,再决定按照多大速度发送数据

此处引入拥塞窗口,刚开始时,拥塞窗口设置为1,每收到一个ACK时,拥塞窗口加1,每次发送数据的时候,拥塞窗口和流量窗口的较小的值作为实际发送的窗口,即滑动窗口的大小 

注意:上述增长方式是指数级别的,指数式增长可以快速接近丢包的极限

拥塞窗口变化的方式 

为了不增长那么快,引入一个慢启动的阈值,当拥塞窗口的大小超过了这个阈值,不在按照指数方式增长,而是按照线性方式增长,如下图所示:

开始时,慢启动的阈值为窗口的最大值,线性增长到一定程度时会发生丢包
网络拥塞时,拥塞窗口置1,慢启动阈值变为拥塞窗口/2,重新开始增长。

博客参考:【计算机网络】TCP协议详解-CSDN博客

http://www.lryc.cn/news/338306.html

相关文章:

  • 句柄ros::NodeHandle nh(“~“)与nh对launch文件参数配置(param)的影响
  • C++_List的学习
  • centos 7.9 nginx本地化安装,把镜像改成阿里云
  • JVM规范中的运行时数据区
  • Stable Diffusion文生图技术详解:从零基础到掌握CLIP模型、Unet训练和采样器迭代
  • SDK-0.7.8-Release-实体管理 - ApiHug-Release
  • 3. DAX 时间函数-- DATE 日期--一生二,二生三,三生万物
  • c 解数独(通用方法,适用于9×9 数独)
  • 一篇文章深入学习Java的AQS(AbstractQueuedSynchronizer)
  • Linux sed
  • 【MySQL】MySQL在Centos 7环境安装
  • 【CSS】一篇文章讲清楚screen、window和html元素的位置:top、left、width、height
  • 铸造大型基础平板的结构应该怎样设计
  • 医院预约系统微信小程序APP前后端
  • springboot数字化智慧城市管理系统源码
  • 【鸿蒙开发】第二十一章 Media媒体服务(一)
  • 【QT教程】QT6 Web应用实战
  • (我的创作纪念日)[MySQL]数据库原理7——喵喵期末不挂科
  • 普乐蛙VR航天体验馆设备VR太空飞船VR元宇宙展厅
  • 基于torch的图像识别训练策略与常用模块
  • 微信小程序制作圆形进度条
  • 大模型(Large Models):探索人工智能领域的新边界
  • 缓存相关知识总结
  • Mapmost Alpha:开启三维城市场景创作新纪元
  • 【大模型完全入门手册】——引言
  • 在 Vue 3 中使用 Axios 发送 POST 请求
  • 【LeetCode刷题记录】189. 轮转数组
  • 1.open3d处理点云数据的常见方法
  • https和http有什么区别,为什么要用https
  • 微前端框架主流方案剖析