博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP协议如何保证可靠传输
阅读量:3927 次
发布时间:2019-05-23

本文共 1427 字,大约阅读时间需要 4 分钟。

TCP协议如何保证可靠传输

  • 校验和
  • 确认应答和序列号
  • 超时重传
  • 连接管理
  • 流量控制
  • 拥塞控制
  • 滑动窗口

校验和:

发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。

确认应答+序列号(累计确认+seq):

确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。

这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。

序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据

在这里插入图片描述

超时重传:

如果发送方发送完数据后,迟迟没有等到接收方的ACK报文,发送方没有接收到响应的ACK报文原因可能有两点:

  • a、数据在传输过程中由于网络原因等直接全体丢包,接收方没有接收到。
  • b、接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。

TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。

简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。

  • 如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。

  • 如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

注意:

超时以500ms(0.5秒)为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。

重发一次后,仍未响应,那么等待2500ms的时间后,再次重传。等待4500ms的时间继续重传。以一个指数的形式增长。

累计到一定的重传次数,TCP就认为网络或者对端出现异常,强制关闭连接

连接管理

三次握手、四次挥手:

流量控制:

TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制

TCP使用的流量控制协议是可变大小的滑动窗口协议,接收方有即时窗口(滑动窗口),随ACK报文发送

拥塞控制:

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。

这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

在这里插入图片描述

滑动窗口

实际中的传输方式:

需要说明一下,如果你不了解TCP的滑动窗口这个事,你等于不了解TCP协议。

我们都知道,TCP必需要解决的可靠传输以及包乱序(reordering)的问题,
所以,TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包
在这里插入图片描述
在这里插入图片描述
发送方滑动窗口示意图:
在这里插入图片描述
上图中分成了四个部分,分别是:(其中那个黑模型就是滑动窗口)

#1已收到ack确认的数据。

#2已发出但还没收到ack的。

#3在窗口中还没有发出的(接收方还有空间)。

#4窗口以外的数据(接收方没空间)

注意:

滑动窗口里是 已发出但未收到ACk、还未发出的 数据

下面是个滑动后的示意图(收到36的ack,并发出了46-51的字节):

在这里插入图片描述

参考资料:

转载地址:http://zdugn.baihongyu.com/

你可能感兴趣的文章
zoj 3626 Treasure Hunt I(树形DP+分组背包)
查看>>
poj 3107 Godfather(树形DP,点的个数较多, 删点使得剩余部分结点最多的最小值)
查看>>
poj 2378 Tree Cutting(树形DP,删点使得独立的部分结点数不超过n/2)
查看>>
poj 1655 Balancing Act(树形DP,删点)
查看>>
hdu 4276 The Ghost Blows Light(树形DP+最短路+分组背包)好题。。。
查看>>
zoj 3537 Cake(区间DP+最优三角形剖分)待续
查看>>
poj 2955 Brackets(区间DP,经典问题)求有规律的括号的最大长度
查看>>
hdu 1754 I Hate It(线段树,单点替换,求区间最值)
查看>>
poj 2828 Buy Tickets(线段树中单点更新较难的题目)
查看>>
codeforces 395 B1. iwiwi(待续)
查看>>
hdu 4283 You Are the One(区间DP)题目转换难,状态难,。。。
查看>>
codeforces 397B. On Corruption and Numbers
查看>>
SqlMapConfig.xml中的setting属性设置
查看>>
hdu 3172 Virtual Friends(简单并查集)
查看>>
find the most comfortable road(并查集加贪心)
查看>>
Junk-Mail Filter(并查集,删除结点,虚父节点)
查看>>
A Bug's Life (并查集,同性恋问题,注意处理性别)
查看>>
选美大赛(线段树)
查看>>
超级玛丽(简单模拟超时)
查看>>
obex_io.c
查看>>