TCP协议之可靠传输

TCP协议二

主要介绍TCP的核心部分–可靠传输,可靠传输是通过确认应答+超时重传来进行体现的


TCP协议一: TCP协议之特点和首部格式
TCP协议三: TCP的三次握手和四次挥手
TCP协议四: TCP协议中的几个机制



1.确认应答(ACK)

1.TCP的可靠传输,是怎么做到可靠的,首先来理解这个"可靠""可靠"并不意味着发送方100%能把消息发送给接方这里的"可靠"是指尽可能将数据传输过去,即使发送失败,也要知道发不出去

比如你物理断网(拔网线),不管TCP如何可靠,消息都发不出去,

在这里插入图片描述

2.实现可靠传输的最核心机制是确认应答机制,以发消息为例,来解释说明确认应答机制(ACK)

A给B发消息,请B吃饭,当A收到"好啊好啊"的时候,A就知道,我发的消息已经被B收到了,说明此时的消息没有丢包

1.这里的"好啊好啊",就被称为"应答报文",也叫做ack,是acknowledge的缩写(应答),如果隔半天,没有收到回应,则说明可能是丢包了(不考虑已读不回的情况)

在这里插入图片描述

上面这个发消息的案例,就简单描述了TCP如何进行可靠传输,TCP的可靠传输主要是靠这个确认应答机制。生活中这种应答机制随处可见,比如打电话,打电话就相当于可靠传输

2.再考虑复杂的情况,A可能一次不止发一条信息,可能连续发好几条消息,当网络正常时,这个消息是没有问题的

在这里插入图片描述

但是网络上会出现"后发先至",在这种情况下,数据就会出现变数,例如会出现以下情况

在这里插入图片描述

很显然在这个情况下,这里的应答出现了错误,此时表示的含义就出现了歧义。

3.在网络中后发先至这个情况是客观存在,并且是无法避免的,所以为了解决这个问题,从而提出了给传输数据和应答报文都进行编号的方法。

类似以下形式,1为序号,针对1为确认序号,这样即使顺序乱,也可以通过序号进行分类

在这里插入图片描述

但是以上只是一个举例,实际上TCP的序号并不是"一条两条"这样的方式来进行编号,TCP是面向字节流的,TCP的序号也是按照字节来编号的

在这里插入图片描述

当A向B发送数据,发送的第一条数据是1000字节,假设从1开始编号,此时第一个字节序号就是1,第二个字节序号就是2,以此类推,但是由于这1000个字节都属于同一个TCP报文,所以TCP报头里只需要记录当前第一个字节的序号,所以此处的报头的序号写的是1;

当发送第二条数据,此时第二个TCP数据报头第一个字节序号就是1001,长度依旧为1000,此时最后一个字节序号是2000,但是1001-2000都属于一个TCP数据报,报头只需要写1001即可;

在这里插入图片描述

这里需要说明的是,TCP的字节的序号是依次累加的,所以每个TCP数据报报头填写的序号只需要写TCP数据的第一个字节序号,TCP知道第一个字节序号,再根据TCP报文长度,就可知道每一个字节的序号。

4.总结:TCP可靠传输能力,最主要就是通过确认应答机制来保证的,通过应答报文,就可以让发送方清楚的知道传输是否成功,进一步的引入序号和确认序号,针对多组数据进行详细的区分。

2.超时重传

1.在确认应答中,只讨论了顺利传输的情况,但是在实际的情况下,会有传输失败的情况,从而产生了"丢包"。

2.这里的丢包涉及到两种情况1.发送的数据丢失 2.返回的ack丢失但是发送方能看到的是:没有收到ack,无法区别是那种情况,所以发送方会把这两种情况视为一种情况。

3.对于丢包问题,TCP并没有放弃,而是引入超时重传,即对在一定时间内没有收到确认应答(ack),发送端就可以认为数据已经丢失,并进行重发,这样即使发生了丢包,但仍然能够保证数据到达对端,实现可靠传输

4.对于超时重传一般会有两种情况:

1.数据丢包,在超过一定时间后,发送端进行重传数据

在这里插入图片描述

2.数据没有丢包,而是确认应答在传输中丢包,在超过一定时间后,发送端进行重传数据

在这里插入图片描述

在第二种情况中,数据(1-1000)发送了两遍,这个事情是比较恐怖,因为如果这个数据是一个支付请求,然后这个请求请求了两遍,后果可想而知,TCP对于这种重复传输的数据,还会特殊的处理 —去重

在TCP中存在一个"接受缓冲区"的存储空间(这个存储空间一般在接收方操作系统内核中),每一个TCP的socket对象中,都有一个"接收缓冲区"(也有一个"发送缓冲区")

当主机B收到主机A的数据,其实是B的网卡读到了数据,然后将这个数据写入到B主机中对应的socket的接收缓冲区,可以想象成一个阻塞队列,这个队列会根据数据的序号,去识别这两条数据是否重复,如果重复,则将后面的数据丢弃

前面也说了网络中存在"先发后至"的情况,为了解决这个问题,TCP引入重新排序机制,TCP在使用接受缓存区的时候,会对收到的数据进行重新排序,从而保证数据有序

5.去重和重新排序机制使得TCP协议具有很好的可靠性。发送方只要发现ACK没有按时到达,就会重传数据,即使数据重复或顺序乱,接收方都可以很好地处理

6.值得注意的是:超时重传是由一定次数限制的(至于具体重传几次,不用研究),所以当重传到一定次数时,就不会在继续重传,会认为网络出现故障,TCP会尝试重置连接即断开重连,如果仍然失败,就彻底断开连接

在重传还需要明白的是:第一次重传和第二次重传的超时时间间隔是不一样的,一般来说,重传的轮次越大,超时时间间隔就越大,因为重传次数越多,说明重传成功的概率就越小,即使重传太快也只是浪费系统资源


总结

可靠传输是TCP最核心的部分,TCP的可靠传输是通过确认应答+超时重传来进行体现的,确认应答描述的是传输顺利的情况,超时重传描述的是传输出现问题的情况,这两者相互配合,支撑TCP可靠性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值