TCP协议可靠性以及传输速率的保证(图解)
2021/10/16 6:17:22
本文主要是介绍TCP协议可靠性以及传输速率的保证(图解),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
TCP协议可靠性以及传输速率的保证
- 可靠性的保证
- 1.缓冲区
- 2. 确认应答机制
- 3. 超时重传机制
- 4. 差错校验机制
- 传输速率的保证
- 1. 全双工
- 2. 滑动窗口
- 3. 拥塞控制
- 4.延持应答
- 5.捎带应答
可靠性的保证
1.缓冲区
- 在UDP协议中是没有真正意义的发送缓冲区的,所以这也就确定了UDP是不可靠传输。发送缓冲区的作用是缓存应用层将要发送的数据,数据发送之后,在没有收到对应的确认包之前,这些数据是不会从发送缓冲区清除的,为重传做准备。
2. 确认应答机制
- 在A向B发送数据时,如果没有收到 相应的确认包,那么该数据包将会被重发,保证了每一个数据包都能够被对方接受到。
- 通信两端在建立初期都会为自己随机分配一个序号,以后在发送的所有数据中都会按字节累加每个包的序号。如果由于网络原因确认包没能及时收到,发送端会重新发送,由于接收端已经接收过此包,就会选择过滤掉,并再次发送确认包。
为啥是删除确认号之前的数据?这和下边讲的滑动窗口有关。因为接收数据方在接收数据时会判断此包确认号之前的数据是否接受全,全则发送确认包。这样做也是能够提高传输效率的,即使前边有确认包丢失,那么收到之后的确认包,能够减少重发的数据包。 - 因为TCP是滑动窗口设计,所以序号还有一个作用就是将数据包按序号排序
3. 超时重传机制
- 在每一个数据包发送的时候,发送方都会记录一个动态的超时时间RTT,如果过了超时时间没有收到确认包,那么发送方重新发送这个数据包,每次超时重传都会在上一个超时时间的两倍,在重传一定次数还没有成功,则返回错误。
RTT是数据包往返的时间,会根据网络情况等因素动态确定。 - 超市重传分为两种,一种是接收端收到数据包而没收到确认包,就是上图的那种情况。一种是数据包没有被接收端收到。
4. 差错校验机制
差错校验机制是校验接收到的数据包在网络传输过程中有没有改变改变则丢弃,等待超时重传。
差错码是发送端根据TCP包头和TCP包内容部分来进行计算发错码的,在接收端还是根据TCP整个包来进行差错码校验。
传输速率的保证
1. 全双工
- 通信双方能同时发送和接收数据,这一点是通过双方的发送缓冲区、接收缓冲区以及序号保证的。
2. 滑动窗口
- TCP传输速率的保证
试想如果发送方发送数据时都要等到确认包的到来在发送下一个数据,那么效率可想而知。所以TCP协议引入滑动窗口机制,滑动窗口是双发在每次发送时都会在数据包头标明自己所能接收的最大数据长度,通过收到接收包来确定对方能够接收的最大长度,根据这个长度就可以连续可分多包发送,而不用等到接收包的到来。看图就明白了!!
3. 拥塞控制
在控制发送窗口的时候,如果只通过接收包中的窗口大小RWND是不够的,所以引入了控制窗口CWND。 作用:提高网络利用率,降低丢包率,保证每条数据流的公平性
- 四部分组成:慢启动,拥塞避免,快重传,快回复。
拥塞控制最终受控变量是网络一次连续发送写入的数据量(SWND,发送窗口),接收端可以通过接收通告窗口(RWND)来控制发送端的SWND,但这显然不够,所以发送端引入一个拥塞窗口(CWND)的状态变量。实际SWND = min(CWND,RWND)
1.慢启动和拥塞避免
慢启动:TCP建立好之后,CWND=IW,其大小为2~4个SMSS(TCP报文段数据的最大长度),此时发送端最多能发送IW个数据,此后每收到接收端的确认,CWND += min(N,SMSS),N为之前未被确认的字节数 。
拥塞避免:当CWND达到慢启动门限值时,启动拥塞避免。
如何判断拥塞已经发生:
传输超时,TCP重传定时器溢出
接收到重复的确认报文段(定时器溢出前)
2.快重传,快回复
连续收到三个重复确认报文段,就是拥塞发生,此时启用快重传快恢复。
4.延持应答
看到上边的滑动窗口,每一个包都需要一个确认包来回复,这样显然有点浪费网络流量,所以可以等一段时间在发送确认包,。
5.捎带应答
可以将数据包和确认包合并一起发送,因为确人包只需要将TCP头部的ACK标志位置1即可。
这篇关于TCP协议可靠性以及传输速率的保证(图解)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享