【网络】TCP如何实现可靠传输

TCP协议特性

TCP协议(传输控制协议)三个特性:面向连接、可靠传输、面向字节流
面向连接:三次握手建立连接,四次挥手断开连接,双方状态管理;
可靠传输:在网络没有问题的情况下,保证每个数据都要到达对端;
面向字节流:区别于UDP面向数据报,TCP把应用程序看成是一连串的无结构的字节流,socket会维护发送缓冲区和接收缓冲区来存放这些数据,再根据协议要求打包分装发送。

可靠传输

TCP为了实现可靠传输,应用了很多机制

面向连接

面向连接是可靠传输的前提

确认应答(ACK)机制与序号及确认序号

TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号,序列号并不是数据的存储位置。

在这里插入图片描述seq起始序号(不一定是0),在三次握手是就会发送给对端
ack确认序号:告诉对方在这个确认序号之前的数据一定都收到了,这将是下一次对方发送数据的起始序号。

在这里插入图片描述确认序号的好处在于,即使之前收到数据后回复的ack确认信息丢失,只要后来的ack确认序号到达,也依旧可以判断接收方收到了多少字节信息,不需要再重传。

超时重传机制

发送方等待超时,没有收到发送数据的确认回复,则认为数据丢失,进行数据重传。

校验和字段

校验数据一致性,若不一致,则给对方发送重传请求。采用二进制反码求和算法来,验证确保发送数据与接收到的数据一致。
对方IP+我方IP+报文长度+信息长度+0x06(协议类型)+TCP各字段长度以及数据各字段和;
依次按每16位求和得出一个32位的数;
如果这个32位的数,高16位不为0,则高16位加低16位再得到一个32位的数;
重复上一步直到高16位为0,将低16位取反,得到校验和。

避免丢包的机制

避免丢包的机制:流量控制、拥塞控制
流量控制
滑动窗口:解决了ACK确认应答机制,只能逐条确认和发送,性能较差,数据往返时间过长的问题,以及发送数据过多接收方无法存放的丢包问题(流量控制)。
流量控制:发送方发送大量数据,接收方将收到的数据放入接收缓冲区中,等待recv读取处理,若接收方来不及处理,就会造成缓冲区存满,后续到达的数据被丢弃,导致大量丢包重传,消耗资源。
发送方和接收方都会各自维护一个发送窗口和一个接收窗口。
在三次握手时,双方通过TCP协议字段中的窗口大小字段告知对方,窗口大小不能大于接收方接收缓冲区剩余空间大小,窗口大小限制了发送方最多能发送多少数据,实现流量控制。三次握手时,双方还会通过选项字段,协商MSS(最大数据段大小)限制发送方一份报文中包含的最大数据长度,无论发送缓冲区中有多少数据,一次最多只能取出MSS长度的数据,进行封装发送,最终MSS协商的值,取双方MSS中的较小值。
在这里插入图片描述
在数据交互时,如上图所示,接收方的接收窗口大小为4096,所以发送方最多只能发送4096字节的数据,又因为双方协商MSS为1024字节,所以发送方会将4096字节的数据分为4份,单独进行发送,接收方收到数据报的顺序,不一定有序,若先收到了seq=1025的数据,而此时接收后沿在seq=1的位置,不匹配则先将该条数据接收到其对应的序列位置,继续等待,待对应 的seq=1的数据到来,并回复两条确认信息:ack=1025,窗口大小(剩余可接收空间)win=3072;ack=2049,win=2048。发送方收到确认信息,发送前沿移动至相应序列位置。
当接收方,读取了缓冲区的数据后,其接收窗口变大为4096,当再次收到数据并回复确认信息时,其win=4096 ,发送数据方接收到此消息,就会移动发送后沿,将其发送窗口调整为4096字节。

拥塞控制
TCP拥塞控制的目标是最大化利用网络上瓶颈链路的带宽,防止网络拥塞造成的丢包,发的越多,丢的越多。
阻塞控制分为四个阶段:慢启动、拥塞避免、快重传、快恢复。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值