TCP 滑动窗口

作用:

    1. 提供TCP可靠性:对发送的数据进行确认
2. 流量控制:窗口大小随链路变化

一、TCP窗口机制

    TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要传输的数据进行确认。TCP窗口机制有两种,一种是固定窗口大小,另一种是滑动窗口。数据在传输时,TCP会对所有数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送窗口内的数据帧才允许被发送;同时接收方也始终保持着一个接收窗口,只有落在窗口内的数据才会被接收。这样通过改变发送窗口和接收窗口的大小就可以实现流量控制。

二、TCP窗口大小

    TCP的窗口滑动技术通过动态改变窗口的大小来调节两台主机之间数据传输。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口,一个用于接收数据,一个用于发送数据。接收方设备要求窗口大小为0时,表明接收方已经接收了全部数据,或者接收方应用程序没有时间读取数据,要求暂停发送。
TCP在传送数据时,第一次接受方窗口大小是由链路带宽决定的,但是接收方在接收到的数据后,返回ack确认报文,同时也告诉了发送方自己的窗口大小,此时发送方第二次发送数据时,会改变自己的窗口大小和接收方一致。
当窗口过大时,会导致不必要的数据来拥塞我们的链路,但是窗口太小时,会造成很大的延时,比如为1时,发送方每发送一个数据,接收方就会返回一个ack报文,在发送方未接收到接收方的确认报文ack之前不会进行下一次发送。(当链路变好了或者变差了这个窗口还会发生变化,并不是第一次协商好了以后就永远不变了。)【这句话不太理解】

三、窗口滑动协议

    窗口滑动协议是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待接收确认报文前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。

四、滑动窗口原理

  1. 窗口大小是指无需等待确认就可以继续发送数据的最大值,上图的窗口大小是4000字节(4段)

  2. 发送前4段时,无需ACK,直接发送

  3. 收到第一个ACK后,滑动窗口向后移动,继续发送第五段的数据

  4. 操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有应答的数据才会从缓冲区中删除

  5. 窗口越大,则网络的吞吐率就越高

五、滑动窗口丢包原理

发送端丢包原理

当某一段报文丢失了,图中(1001-2000)数据段丢失了,接收方没有接收到该数据段,则会一直给发送端发送ACK(下一个是1001),如果发送端连续收到同样的ACK(下一个是1001),就会将对应的(1001-2000)重新发送,这时候如果接收端收到1001后,再次返回的就是ACK(7001)。这种机制被称为“高速重发机制”(快速重传)

接收端丢包原理

接收端的下一个2001丢失了,但是发送端收到了ACK(下一个3001),说明1-3000的数据段已经接收到了,数据已经传输到了发送端,所以不需要理会。

最新文章

  1. CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
  2. css的active事件在手机端不生效的解决方法
  3. 【最新】2015年7月之15个最新jQuery插件
  4. (EM算法)The EM Algorithm
  5. 图片上传本地预览。兼容IE7+
  6. oracle的char和varchar类型
  7. 转载:mysql ODBC 在64位下提示找不到odbc驱动问题
  8. 三年程序学习之二:(对web初认识)
  9. "Storage Virtualization" VS "Software-Defined Storage"
  10. 返回本机的mac物理路径
  11. Android 事件处理
  12. EditText光标居上
  13. 对图像组成不了解?这样学习Matplotlib必走弯路!
  14. 如何在关闭ssh连接的情况下,让程序继续运行?
  15. java定时任务(三):timerTask定时任务
  16. idea通过mapper快速定位到xml文件
  17. spring ref &history&design philosophy
  18. js 对时间进行判断 现在的时间是否在后台给的开始时间 和 结束时间 内 (时间格式为:2018-09-03 09:20:30)
  19. Java并发编程(三)-- 多线程的“问题”
  20. 网络数据包信息收集工具ferret-sidejack

热门文章

  1. Nginx+php+mysql+wordpress搭建自己的博客站点
  2. pageScope、requestScope、sessionScope、applicationScope的区别
  3. Matplotlib 图表的基本参数设置
  4. Linux两种方式rd.break和init重置root管理员密码
  5. 7 定制10MINs首页2
  6. android stadio open recent 在同一窗口打开
  7. Python的函数一
  8. Quartus 11生成pof文件在AS烧写之后,程序无法启动
  9. 使用Windows SFC和DISM工具来解决服务器OS问题
  10. [转]全图形PPT设计指南