一、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. ubuntu18.04 安装 搜狗输入法

    一.安装fcitx sudo apt-get install fcitx-bin 因为搜狗拼音依赖fcitx,相关的依赖库和框架都会自动安装上. sudo apt-get install fcitx- ...

  2. (五十一)c#Winform自定义控件-文字提示-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  3. 转:C# String为值类型还是引用类型

    关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确.希望能给大家带来点帮助,如果有错误请指出. 来看下面例子: //值类型 int a ...

  4. Set a One-to-Many Relationship设置一对多关系 (EF)

    In this lesson, you will learn how to set a one-to-many relationship between business objects. The C ...

  5. iOS常用算法之单链表查找倒数第n个节点(图解)

    拿到题目, 首先要先了解链表数据结构, 如下图: 常规思路: 利用数组, 遍历整个单链表, 将每个节点装入数组中, 最终拿到数组根据索引(数组长度-1-n)就得到了倒数第n个元素, 这里要注意从数组中 ...

  6. SSH agent 的使用 - 资料摘录

    下面是一些ssh agent的资料简要摘录,网路上的相关的文章已经很多了: ssh 推荐的登录方式是使用私钥登录.但是如果生成私钥的时候,设置了口令(passphrase),每次登录时需要输入口令也很 ...

  7. Python-判断回文

    # 回文单词是从左到右和从右到左读相同的单词. # 例如:"detartrated"和"evitative"是回文 str_in = input('Input: ...

  8. 201871010102-常龙龙《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  9. Java读写Excel文件,利用POI

    直接看工具类代码吧, package com.example.demo.util; import com.example.demo.entity.ExcelDataVO; import org.apa ...

  10. AcWing 803. 区间合并

    网址 https://www.acwing.com/solution/AcWing/content/1590/ 题目描述给定n个区间[l, r]. 合并所有有交集的区间. 输出合并完成后的区间个数. ...