一、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协议如何保证可靠传输?的更多相关文章

  1. TCP协议如何保证可靠传输

    TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 重 流 拥) 校验和: 发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化.如果收到段的检 ...

  2. 转载:TCP协议如何保证可靠传输

    转载至:https://www.cnblogs.com/xiaokang01/p/10033267.html TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序  ...

  3. TCP 协议如何保证可靠传输

    一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层 ...

  4. TCP是如何保证可靠传输的

    TCP 协议如何保证可靠传输   一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...

  5. TCP如何保证可靠传输

    TCP 协议如何保证可靠传输   一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...

  6. TCP协议是如何保证可靠传输的【经典】

    参考:http://blog.csdn.net/cmm0401/article/details/77878998 从特点上我们已经知道,TCP 是可靠的但传输速度慢 ,UDP 是不可靠的但传输速度快. ...

  7. TCP协议-如何保证传输可靠性

    转自 https://blog.csdn.net/xuzhangze/article/details/80490362 TCP协议保证数据传输可靠性的方式主要有: (1)检验和 在发送数据时,为了计算 ...

  8. TCP如何保证可靠传输(转)

    TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式TCP协议保证数据传输可靠性的方式主要有: 校验和 序列 ...

  9. 网络编程应用:基于TCP协议【实现对象传输】--练习

    要求: 基于TCP协议实现,客服端向服务器发送一个对象 服务器接受并显示用户信息 ,同时返回给客户端 "数据已收到" 建一个Student类,属性:name age Student ...

随机推荐

  1. Springboot对SpringMVC如何扩展配置

    原文地址:http://www.javayihao.top/detail/171 概述 Springboot在web层的开发基本都是采用Springmvc框架技术,但是Springmvc中的某些配置在 ...

  2. PlayJava Day015

    今日所学: /* 2019.08.19开始学习,此为补档. */ StringBuffer 定义: 可变字符序列 - 线程安全的 作用:基本与String相同,也是用于描述字符串 与String的区别 ...

  3. 父子间的通信,以及ref

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. 应用InstallShield 2015打包软件打包C#程序

    大家都明白,程序员写出的程序与用户直接使用的程序之间还有一个简单的环节,就是打包.今天就简单介绍下用InstallShield 2015打包工具进行程序的打包, 有兴趣的可以看看! 首先前面安装打包工 ...

  5. OC-系统音效播放

      一.介绍 AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service).System Soun ...

  6. 剑指offer 23:从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 按照从左往右从上到下的顺序打印节点,需要我们维护一个队列,这个队列放入元素的顺序是访问队头节点(起始先放入根节点),则若当前 ...

  7. ABP入门教程2 - 体系架构

    点这里进入ABP入门教程目录 介绍 应用程序代码库的分层是一种广泛接受的技术,可帮助降低复杂性并提高代码可重用性.为了实现分层体系结构,ASP.NET Boilerplate遵循域驱动设计的原理. D ...

  8. MySQL 事务提交 --不良好的事务习惯。

    MySQL 事务提交 --不良好的事务习惯 我们知道"事务"是数据库区别于文件系统的重要特性之一.MySQL的InnoDB引擎中的事务也完全符合ACID(原子性 一致性 隔离性 持 ...

  9. Django出错提示TemplateDoesNotExist at /

    Issue: 打开login URL的时候报错如下: Action: 在setting.py中修改DIRS,模板文件目录 TEMPLATES = [ { 'BACKEND': 'django.temp ...

  10. 如何快速查看 group 对应的id

    最近需要获取group 对应的id 数字号码,突然想不起来怎么获得了,现在在这里进行备忘一下: $ cut -d: -f3 < <(getent group sudo) getent gr ...