当前位置:网站首页>TCP协议如何确保可靠传输
TCP协议如何确保可靠传输
2020-11-08 09:45:17 【osc_7vovprrl】
关于“tcp协议如何确保可靠传输”这个问题,网上的资料参差不齐。近期开始在图书馆读一些教材,带着问题读了以下书目的关于TCP的章节,总结记录了下来。
- 德国波茨坦大学《internetworking Technische Grundlagen und Anwendungen》/《网络技术基础与应用》(christoph meinel,harald sack)
- 《深入理解计算机网络》(王达)
- 《计算机网络教程自顶向下的方法》(Behrouz A.Forouzan Firouz Mosharraf)
- 《计算机网络》(张曾科、阳宪惠)
- 《计算机网络》第7版(谢希仁)
为什么TCP需要可靠传输呢
- 网络层是不可靠。网络层的任务仅仅是选择合适的网间路由和交换结点, 确保数据及时传送。
- 传输层性质所致,上层需要可靠性。因而传输层的主要任务是根据通信子网的特性最佳的利用网络资源,并以可靠和经济的方式,为会话层之间,提供建立、维护和取消传输连接的功能,负责可靠地传输数据。
- UDP通过牺牲可靠性,换取尽力交付、通信效率高、确保数据的实时性的特点。自然需要TCP的出现,来对使用需求互补完善。
因而以上3点,可靠传输的重担交予到了TCP之上。
TCP怎么做到可靠传输呢
为了实现可靠传输的目的,TCP使用4个解决方案:面向连接的传输机制、超时重传控制、可变滑动窗口流量控制、 拥塞控制。
面向连接的传输机制
使用了三次握手、四次挥手,这个比较常见,大家一般都熟悉了,就不冗余赘述了。
校验和,确认应答(ACK),序列号。
并对重复无效的ACK进行处理,收下后并丢弃,实现自动重传请求。
超时重传控制
当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传。每发送一个分组,就设置一个超时重传计时器,当收到对方返回的ack,就撤销已设置的超时计时器。为实现这一步,有三个注意点:
- 发送后保留副本,以备重传时使用,收到对方返回的ack后,才清除副本。
- 编号。
- 超时重传计时器的时间设置适考虑时延、拥塞的等不确定因素,因而重传时间设置会比数据分组的平均往返时间更长一些。
可变滑动窗口流量控制
窗口分为发送窗口和接收窗口。简单而言,接收方把能接受的数据大小(接受窗口大小),通过ACK反馈予发送方,从而设置协调发送内容大小。细节有以下几点:
- 当发送数据超出接收方窗口大小时,超出部分重传;
- 当发送数据小于接收方窗口大小时,发送方继续发送内容;
- 并不是对每一个报文段都有ACK的回复,可能时一至多个报文段,发送一个ACK;
- 当收到的报文段个数缺失,收到的报文段会存入缓存,等待发送方重传缺失的报文段;合并完整,再返回ACK;如果长时未收到缺失的报文段,则缓存中的报文段会被一并清空。
拥塞控制
拥赛控制的算法有四种:慢开始、拥塞避免、快重传和快恢复。
- 慢开始:由小到大逐步增加拥塞窗口数值。
拥塞窗口初始值 = 1至两个发送方最大报文段的数值;
拥塞窗口每次增加量 = min(新收到确认报文的字节数,发送方最大报文段的数值)。
- 拥塞避免:让拥塞窗口换慢增大。
每经过一个RTT就滑动窗口大小就只加1;
- 快重传:接收方收到的数据后立即确认,一个数据包回一个确认ACK, 以实现尽早知道当中个别报文的丢失。
例如,当发送过程中M3数据包丢失,接收方只收到了M2与M4数据包时,接收方连续返回3个M2的ACK予发送方(提示发送方漏了M3小兄弟);
发送方收到3个连续的M2的ACK后,立即重传M3数据包。
- 快恢复:遇到网络拥塞后,立马减小拥塞窗口。
设置一个ssthresh作为使用拥塞避免算法的起始点,通过这个ssthresh值为滑动窗口最大门限值的一半。
理解以上四个算法思路,看下面这个图就轻而易举了:
总结:TCP因为位于传输层,承上启下,解决下层网络层的不可靠问题,为会话层提供提供可靠连接;并实现对UDP使用的互为补充。
TCP可靠性主要通过面向连接的传输机制、超时重传控制、可变滑动窗口流量控制、 拥塞控制实现。
版权声明
本文为[osc_7vovprrl]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4342884/blog/4707936
边栏推荐
- C++ 数字、string和char*的转换
- C++学习——centos7上部署C++开发环境
- C++学习——一步步学会写Makefile
- C++学习——临时对象的产生与优化
- C++学习——对象的引用的用法
- C++编程经验(6):使用C++风格的类型转换
- Won the CKA + CKS certificate with the highest gold content in kubernetes in 31 days!
- C + + number, string and char * conversion
- C + + Learning -- capacity() and resize() in C + +
- C + + Learning -- about code performance optimization
猜你喜欢
-
C + + programming experience (6): using C + + style type conversion
-
Latest party and government work report ppt - Park ppt
-
在线身份证号码提取生日工具
-
Online ID number extraction birthday tool
-
️野指针?悬空指针?️ 一文带你搞懂!
-
Field pointer? Dangling pointer? This article will help you understand!
-
HCNA Routing&Switching之GVRP
-
GVRP of hcna Routing & Switching
-
Seq2Seq实现闲聊机器人
-
【闲聊机器人】seq2seq模型的原理
随机推荐
- LeetCode 91. 解码方法
- Seq2seq implements chat robot
- [chat robot] principle of seq2seq model
- Leetcode 91. Decoding method
- HCNA Routing&Switching之GVRP
- GVRP of hcna Routing & Switching
- HDU7016 Random Walk 2
- [Code+#1]Yazid 的新生舞会
- CF1548C The Three Little Pigs
- HDU7033 Typing Contest
- HDU7016 Random Walk 2
- [code + 1] Yazid's freshman ball
- CF1548C The Three Little Pigs
- HDU7033 Typing Contest
- Qt Creator 自动补齐变慢的解决
- HALCON 20.11:如何处理标定助手品质问题
- HALCON 20.11:标定助手使用注意事项
- Solution of QT creator's automatic replenishment slowing down
- Halcon 20.11: how to deal with the quality problem of calibration assistant
- Halcon 20.11: precautions for use of calibration assistant
- “十大科学技术问题”揭晓!|青年科学家50²论坛
- "Top ten scientific and technological issues" announced| Young scientists 50 ² forum
- 求反转链表
- Reverse linked list
- js的数据类型
- JS data type
- 记一次文件读写遇到的bug
- Remember the bug encountered in reading and writing a file
- 单例模式
- Singleton mode
- 在这个 N 多编程语言争霸的世界,C++ 究竟还有没有未来?
- In this world of N programming languages, is there a future for C + +?
- es6模板字符
- js Promise
- js 数组方法 回顾
- ES6 template characters
- js Promise
- JS array method review
- 【Golang】️走进 Go 语言️ 第一课 Hello World
- [golang] go into go language lesson 1 Hello World