TCP协议如何保证可靠传输?
一、TCP的可靠传输如何保证?
在TCP连接中,数据流必须以正确的顺序传送给对方。TCP的可靠性是通过顺序编号和确认(ACK)实现的。TCP在开始传送一个段时,为准备重传而首先将该段插入到发送队列中,同时启动时钟。然后,如果收到了接收端对该段的ACK信息,就将该段从队列中删去。如果在时钟规定的时间内,ACK未返回,那么就从发送队列中再次送出这个段。TCP在协议中就对数据可靠传输做了保障,握手与断开都需要通讯双方确认,数据传输也需要双方确认成功,在协议中还规定了:分包、重组、重传等规则;而UDP主要是面向不可靠连接的,不能保证数据正确到达目的地。
二、TCP还提供了以下方式保证可靠传输:
1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。
TCP是怎么保证错误重传的?
1)接收方受到错误的分组,就直接丢弃,而不做任何操作;
2)发送方在规定的时间(比平均往返时延大一些)没有收到分组的确认分组,就会自动重传;
3)为了让对方知道哪个分组出现了问题,就为分组也编了序号。
2.数据校验
3.数据合理分片和排序
UDP:IP数据报大于1500字节,大于MTU。这个时候发送方IP层就需要分片(fragmentation)把数据报分成若干片,使每一片都小于MTU,而接受方IP层则需要进行数据报的重组。这样就会多做许多事情而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报,将导致丢弃整个UDP数据报。
TCP会按MTU合理分片,接收方会缓存未按序到达的数据,重新排序后再交给应用层。
4.流量控制
利用滑动窗口实现流量控制,如果发送方把数据发送的过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方降低发送速率,让接收方来得及接收。
时机:目的主机缓冲区变小而不能接收源主机更多的数据时,就要流量控制。
改变接收窗口:可随时改变窗口大小。目的主机在确认时,还向源主机告知目的主机接收缓冲区的大小。
滑动窗口机制:TCP协议里窗口机制有2种,一种是固定的窗口大小、一种是滑动的窗口。这个窗口大小就是我们一次传输几个数据。
思想:允许发送方不必等确认到来就可以继续发送下面的分组,但规定一个上限。若多个分组的确认未到时,则暂停发送。
1)数据流的各字节被编上序号。
2)TCP的滑动窗口按字节操作而不是按报文段或分组操作。
3)TCP窗口大小为字节数。最大为65535字节。
4)通信双方都没有发送和接收缓冲区(相当于发送窗口和接收窗口)。默认大小各系统有差异,如4096、8192、16384等。发送缓冲区大小为默认窗口大小。
5)TCP连接两端各有两个窗口(发送窗口和接收窗口)。
这里我们可以看到假设窗口的大小是1,也就是每次只能发送一个数据,只有接受方对这个数据进行确认了以后才能发送第2个数据。我们可以看到发送方每发送一个数据接受方就要给发送方一个ACK对这个数据进行确认。只有接收到了这个确认数据以后发送方才能传输下个数据。
这样我们考虑一下如果说窗口过小,那么当传输比较大的数据时需要不停的对数据进行确认,这个时候就会造成很大的延迟。如果说窗口的大小定义的过大。我们假设发送方一次发送100个数据,但是接受方还是只能处理50个数据。这样每次都会只对这50个数据进行确认。发送方下一次还是发送100个数据,但是接受方还是只能处理50个数据。这样就避免了不必要的数据来拥塞我们的链路。所以我们就引入了滑动窗口机制,窗口的大小并不是固定的而是根据我们之间的链路的带宽的大小,这个时候链路是否拥塞。接受方是否能处理这么多数据了。
Nagle算法:若发送应用进程要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。当发送方接收对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段再发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢时,用这样的方法可明显地减少所用的网络带宽。Nagle算法还规定:当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。
5.拥塞控制:当网络拥塞时,减少数据的发送。
1)原理:在某段时间,若对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫做拥塞。
2)方法:因特网建议标准RFC2581定义了进行拥塞控制的四种算法,即慢开始(Slow-start)、拥塞避免(CongestionAvoidance)、快重传(Fast Restrangsmit)和快恢复(Fast Recovery)。
慢开始:一开始先将阻塞窗口的cwnd设置为一个最大报文值(目的是试探一下网络的拥塞情况)。每次收到一个对新报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
为了防止拥塞窗口cwnd增长过大引起网络阻塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下:
当cwnd < ssthresh时,使用上述的满开始算法。
当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法。
当cwnd = ssthresh时,即可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免:让拥塞窗口cwnd缓慢地增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢的多。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。
3)拥塞:交换节点(如路由器)数据报负载国中的现象。ICMP源站抑制报文,是一种被动机制。
4)必要性:在TCP层,拥塞造成时延增加,这又会造成超时重传,控制不当会进一步加重拥塞。TCP采用了一种主动控制机制。
5)拥塞控制技术
a. 拥塞窗口 cwnd
每个连接都有一个拥塞窗口,该窗口大小以字节为单位,但是增加和减少以MSS为单位;
初始大小:1个MSS;临界值:64KB;
发送方维护一个拥塞窗口(cwnd),拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞。
拥塞窗口的原则:只要网络没有出现拥塞,拥塞窗口就在增大一些,一边把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减少一些,以减少注入到网络中的分组数。
b. 加速递减技术
指数级递减:出现超时重传时,将临界值设为当前拥塞窗口的1/2,拥塞窗口恢复为1个MSS大小;
指数退避:对保留在发送窗口中的报文段,将重传时限加倍;
c. 慢启动技术
指数递增:每次成功发送一个MSS长度的报文段(成功发送是收到对应的确认),则发送方拥塞窗口加倍;
线性递增:增长到临界值后,每次增加一个MSS;
发送窗口=min(接受方窗口通告,cwnd)
TCP协议如何保证可靠传输?的更多相关文章
- TCP协议如何保证可靠传输
TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 重 流 拥) 校验和: 发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化.如果收到段的检 ...
- 转载:TCP协议如何保证可靠传输
转载至:https://www.cnblogs.com/xiaokang01/p/10033267.html TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 ...
- TCP 协议如何保证可靠传输
一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层 ...
- TCP是如何保证可靠传输的
TCP 协议如何保证可靠传输 一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...
- TCP如何保证可靠传输
TCP 协议如何保证可靠传输 一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...
- TCP协议是如何保证可靠传输的【经典】
参考:http://blog.csdn.net/cmm0401/article/details/77878998 从特点上我们已经知道,TCP 是可靠的但传输速度慢 ,UDP 是不可靠的但传输速度快. ...
- TCP协议-如何保证传输可靠性
转自 https://blog.csdn.net/xuzhangze/article/details/80490362 TCP协议保证数据传输可靠性的方式主要有: (1)检验和 在发送数据时,为了计算 ...
- TCP如何保证可靠传输(转)
TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式TCP协议保证数据传输可靠性的方式主要有: 校验和 序列 ...
- 网络编程应用:基于TCP协议【实现对象传输】--练习
要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ...
随机推荐
- ubuntu 默认python版本切换
电脑上面有些脚本是python2的,有些是python3的,但是系统默认是python2,需要设置环境变量来进行切换. python2切换到python3: echo alias python=pyt ...
- Java入门系列之类继承、抽象类、接口(五)
前言 C#和Java关于类.抽象类.接口使用方式基本相似,只是对应关键字使用不同罢了,本节呢,我们只是对照C#和Java中关于这三个概念在具体使用时,看看有哪些不一样的地方. 类继承 C#和Java在 ...
- java高并发系列【共34篇,强力建议观看】
第1天:必须知道的几个概念 第2天:并发级别 第3天:有关并行的两个重要定律 第4天:JMM相关的一些概念 第5天:深入理解进程和线程 第6天:线程的基本操作 第7天:volatile与Java内存模 ...
- 在Asp.Net Core中配置使用MarkDown富文本编辑器实现图片上传和截图上传(开源代码.net core3.0)
我们的富文本编辑器不能没有图片上传尤其是截图上传,下面我来教大家怎么实现MarkDown富文本编辑器截图上传和图片上传. 1.配置编辑器到html页 <div id="test-edi ...
- JS中的call,apply和bind及记忆方式
总结 call().apply()和bind()都是用来改变函数执行时的上下文,可借助它们实现继承:call()和apply()唯一区别是参数不一样,call()是apply()的语法糖:bind() ...
- WGS84、WebMercator、GCJ02和BD09坐标系简介与转换
WGS84(GPS): 地心坐标系,空间直角坐标系,原点与地球质心重合,为GPS采用的坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系. 通过GPS可以直接获取WGS84下的坐标(B,L, ...
- java最全的获取某个接口或者某个类所有对应的所有实现类和继承类的工具类--反射动态获取、非动态获取、按照路径获取等总结
我们直接上代码吧,代码中有注释说明. //直接看代码吧 import java.io.File; import java.lang.reflect.Field; import java.net.URL ...
- tornado跨域解决方法
代码 class BaseHandler(tornado.web.RequestHandler): # 允许跨域访问的地址 def allowMyOrigin(self): allow_list = ...
- Python对MySql增删改查
pip install pymysql import pymysql db_config = { 'host': '127.0.0.1(ip)', 'port': 3306, 'user': '账号' ...
- PyCharm多行同时输入
按住ALT,用鼠标在需要的位置点击添加光标,然后输入内容即可