文档章节

TCP可靠传输的实现

MrYx3en
 MrYx3en
发布于 2014/08/07 23:22
字数 1379
阅读 46
收藏 0

TCP的滑动窗口是以字节为单位的。为描述可靠传输原理的方便,现假定数据只在一个方向上传输。

假定A收到B发来的确认报文段,其窗口是20,确认号是31(B 期望 收到的下一个序号是31,而序号30为止的数据以及收到了),根据这两个数据,A构造出了自己的发送窗口,如下:


发送方A的  发送窗口表示:在没有收到B的确认的情况下,A可以连续的把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。

        发送窗口里面的序号表示允许发送的序号(31-50);

        发送窗口的后沿的后面部分表示“已发送并收到确认”的数据;发送窗口的前沿的前面部分表示“不允许发送”,因为此时B(接收方)还没有为这部分数据保留临时的缓存空间;发送窗口的大小由前沿和后沿的位置共同决定。前【前移或者不动(收到了确认但是对方通知的窗口变小了)】;后沿 【不动(没有收到新的确认)或前移(收到了新的确认)】                    虽然前沿也有可能会向后收缩,但是TCP标准强烈不赞成这样做

描述一个发送窗口需要三个指针(个人理解:P1指向此时的确认号   P3指向下一个确认号   P2指向已发送但未收到确认的最后一个序号  P3-P2即 允许发送但是尚未发送的称为可用窗口或者有效窗口)

B的接收窗口:

B的接收窗口大小是20。在接受窗口外,到30为止的数据是发送过确认并且已经交付主机使用了,因此B不在保留这些数据,接收窗口内的(31-50)是允许接收的,由于B只能对按序收到的数据给出确认号,所以图中接收到了32、33,但是由于31在传输的图中丢失或者其他原因导致数据没有按序到达,所以B发送的确认号任然是31(期望收到的序号)。

现在假设B收到了序号31的数据,而且已经把序号31 - 33 交付主机了,然后B删除了这些已经确认过的数据,接着把接收窗口向前移了3个序号,同时给A发出确认,其中窗口值仍为20,但确认号是34(期望接收到的序号),表明B已经接收到了到33为止的数据。图中B还接收到了 37 38 40序号的数据,但这些都没有按序到达,所以都只能暂存在接收窗口。            A收到B的确认后,就可以把发送窗口向前滑动3个序号,但是指针P2(P2指向允许发送但未发送的第一个序号)不动,此时A的有效窗口增大了,可以发送的范围  42 - 53.


A在继续发送完数据42 - 53之后,指针P2向前移动与P3重合。发送窗口的序号都用玩了,此时 有效窗口 的大小为零,因此必须停止发送,等待B的确认回复,但是如果A在一段时间内没有收到B的确认回复,由于要保证可靠传输,A只能认为B还没收到这些数据,所以A在经过一段时间之后(由超时计时器控制)就重传这部分数据,重设超时计数器,直到收到B的确认回复为止。如果A收到确认号落在发送窗口内,那么A就可以是发送窗口继续向前滑动,并发送新的数据。


发送发的应用程序把字节流写入TCP的发送缓存,接收方的应用程序从TCP的接受缓存中读取字节流。

缓存空间和序号空间都是循环使用的。

窗口和缓存的关系:

发送缓存暂时存放:

            发送应用程序传送给发送发TCP准备发送的数据;

            TCP已发送出但是尚未收到确认的数据。


接受缓存暂时存放:

        按序到达的但是尚未被应用程序读取的数据;

        未按序到达的数据。

强调内容:

    A的发送窗口并不总是和B的接收窗口一样大小;

    TCP通常对不按序到达的数据先临时存放在接收窗口中,等到字节流中所缺失的字节收到后,在交付给上层应用进程;

    TCP要求接收方必须有累计确认的功能,这样可以减小传输开销。


超时重传时间

    TCP每发送一个报文段,就会对这个报文段设置一个计时器,计时器设置的重传时间到了却还没有收到确认,就要重传该报文段。


选择确认(SACK)

    如果收到的报文段没有差错,只是没有按序,或者中间缺少了一些虚耗的数据,采用选择确认的方法来重传缺少的数据,而不重传已经正确传输的数据。


© 著作权归作者所有

共有 人打赏支持
MrYx3en
粉丝 9
博文 132
码字总数 30598
作品 0
宝鸡
系统管理员
使命必达: 深入剖析WCF的可靠会话[概念篇]

在《实例篇》中,我通过可靠会话成功地进行了美女图片的传输,相信大家在保了眼福之余,会对WCF的可靠会话的功用具有一个深刻的认识。实际上,这涉及到WS中一个重要的概念——可靠消息传输(...

长平狐
2012/09/04
96
0
ude协议—基于udp的全双工可靠传输协议

ude是一款基于udp的可靠传输协议,专门用于在数据传输方面对实时性要求较高的应用领域。 tcp协议虽然能保证数据的可靠传输,但它有以下几个缺点:1.tcp的数据确认机制会导致发送方重复发送一...

烟都大宗师
2017/10/24
0
0
Java Socket编程(理论)

socket chat: http://www.cn-java.com/download/data/book/socket_chat.pdf 一、网络编程中的两个问题: 1.找到指定主机:IP层负责网络主机的定位; 2.可靠高效的传输数据:TCP层提供面向应用...

YuanyuanL
2015/08/20
0
0
c#中关于udp实现可靠地传输(数据包的分组发送)

在做c#中面向无连接的传输时用到了UDP,虽然没有TCP稳定可靠。但是效率是要高些,优势也有,缺点也有 就是有的时候要丢包,有的时候不得不用UDP,但是如何才能比较稳定的实现可靠传输呢,这是...

zhujunxxxxx
2014/01/26
0
0
使命必达: 深入剖析WCF的可靠会话[协议篇](上)

在《实例篇》中,我通过可靠会话实现了对图片的可靠、有序的传输;在《概念篇》中,我们对可靠消息涉及到的可靠消息传输(RM)的相关概念进行了讲述。在WS-*大家庭中,WS-RM为可靠消息传输提...

长平狐
2012/09/04
46
0

没有更多内容

加载失败,请刷新页面

加载更多

Bytom资产发行与部署合约教程

比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 发行资产 在比原链上发行资产比较方便快捷,使用节点的dashboard图形界面...

比原链Bytom
27分钟前
1
0
Ext ComboBox 实现下拉多选,全选,反选

Ext ComboBox下拉选中-全选反选逻辑处理 Ext ComboBox 实现下拉多选,全选,反选 方法一: 代码 var me = this;var isMultiSelect = true;//是否设置为下拉多选me.selectValues = [];//保存...

javaART
30分钟前
1
0
Swoole Windows 版(4.2.1)

https://pan.baidu.com/s/1uTm77_cp4kn0_xMgO1DpIw Swoole Windows 版(内部版本,swoole-4.2.1,php-7.1,必须为64位系统,Win7或更高版本)。 解压后,将 $dir/bin 目录,设置到 系统的环境...

老查
33分钟前
1
0
美团点评上市受追捧,成中国第四大互联网企业

从建立到上市,蔚来用了不到4年,拼多多3年,趣头条更是仅用了2年3个月。在这波中概股上市浪潮中,等待了漫长8年的美团点评也终于迎来登陆资本市场的时刻。20日上午,美团创始人兼CEO王兴终于...

Mr_zebra
34分钟前
1
0
Mysql-mybatis批量插入

话不多说直接上代码吧 <insert id="batchSave" >insert into table_name (`name`,age)values<foreach collection="list" index="index" item="item" open="(" separator="," close=......

落叶清风
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部