当前位置:网站首页>TCP协议如何确保可靠传输
TCP协议如何确保可靠传输
2020-11-08 09:45:00 【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
边栏推荐
- Littlest JupyterHub| 02 使用nbgitpuller分发共享文件
- Solve the problem of rabbitmq message loss and repeated consumption
- vivoy73s和荣耀30青春版的区别
- What details does C + + improve on the basis of C
- 比Python快20%,就问你兴不兴奋?
- 洞察——风格注意力网络(SANet)在任意风格迁移中的应用
- Cloud alibabab notes come out, the whole network detailed explanation only this one hand is slow
- 在Ubuntu上体验最新版本EROFS
- Game optimization performance (11) - Zhihu
- Application of bidirectional LSTM in outlier detection of time series
猜你喜欢
5g/4g工业无线路由器
An error occurred while starting the kernel was successfully resolved
Px4 adds new applications
[original] about the abnormal situation of high version poi autosizecolumn method
What details does C + + improve on the basis of C
FORTRAN77从文件中读入若干数据并用heron迭代公式开方
Solve the problem of rabbitmq message loss and repeated consumption
Oschina plays on Sunday - before that, I always thought I was a
将“光头”识别为“足球”,AI 摄像头如何犯的错?
M-end software product design considerations - Zhihu
随机推荐
print( 'Hello,NumPy!' )
IOS learning note 2 [problems and solutions encountered during the installation and use of cocopods] [update 20160725]
技术人员该如何接手一个复杂的系统?
临近双11,恶补了两个月成功拿下大厂offer,跳槽到阿里巴巴
Which is more worth starting with the difference between vivos7e and vivos7
Six key points of data science interview
5G+AR出圈,中国移动咪咕成第33届中国电影金鸡奖全程战略合作伙伴
Ulab 1.0.0 release
面部识别:攻击类型和反欺骗技术
Game mathematical derivation AC code (high precision and low precision multiplication and division comparison) + 60 code (long long) + 20 point code (Full Permutation + deep search DFS)
iOS上传App Store报错:this action cannot be completed -22421 解决方案
AMD Zen3首发评测:频率超5GHz,IPC提升不止19%,这次真的Yes了 - 知乎
盘点那些你没想到的云计算应用场景(上)
归纳一些比较好用的函数
VC++指定目录下文件按时间排序输出
Swiper window width changes, page width height changes lead to automatic sliding solution
“智能5G”引领世界,数位智能网优+5G能带来什么?
ulab 1.0.0发布
Simple use of future in Scala
【总结系列】互联网服务端技术体系:高性能之数据库索引