TCP如何保证可靠传输???

(1)校验和
TCP校验和的计算和UDP一样,在计算时要加上12字节的伪首部,检验范围包括tcp首部以及数据部分,但是udp的检验和字段为可选的,而tcp中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中为0是正确),否则存在错误。
(2)序列号
TCP将每个字节的数据都进行了编号,这就是序列号(seq)。
序列号的作用:
保证可靠性(当接收到的数据少了某个序号时,能马上知道)
保证数据按时到达
提高效率,实现多次发送,一次确认
去除重复数据
**
(3)确认应答机制(ACK)
TCP通过确认应答机制实现可靠地数据传输。在TCP首部中有一个标志位———ACK,此标志位表示确认号有效,接收方对于按序到达的数据会进行确认,当ACK=1时确认首部的确认字段有效,进行确认时,确认字段
值表示这个值之前的数据已经按需到达了,而发送方如果收到了确认,则继续发送下一段报文;如果一定的时间内还没有收到回复,就启动重传机制,重新发送。
在这里插入图片描述
(4)超时重传机制
当报文发出一定时间内还没有收到接收方的确认,发送方就会进行重传(通常是在发送方设置一个闹钟,到点了还没收到确认就进行重传)

在这里插入图片描述
也有可能是确认丢失,发送方重传报文,接收方收到后会丢掉重复的报文,重新发送确认。而要识别重复的数据,就要用到序列号了,利用序列号很容易识别出重复的数据。

在这里插入图片描述
超时重传时间的确认报文段发出到收到应答中间有一个报文段的往返时间RTT,显然超时重传时间RTO会略大于这个RTT,TCP会根据网络情况动态的计算RTT,即RTO是不断变化的。在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。其规律为:如果重发一次仍得不到应答,就等待2500ms后再进行重传,如果仍然得不到应答就等待4500ms后重传,依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。
(5)连接管理机制即三次握手四次挥手。
(6)拥塞控制
**所拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不知过载。**流量控制解决了两台主机之间因传送效率而可能引起的丢包问题,在一方面保证了TCP的可靠性。然而如果网络非常拥塞,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。
为此TCP引入了慢开始算法,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。
此处引入一个拥塞窗口
发送开始定义拥塞窗口大小为1,每次收到一个ACK应答,拥塞窗口加1;而每次发送数据时,发送窗口取拥塞窗口与接收窗口最小者。
慢开始:在启动初期以指数方式增长;设置一个慢开始的阈值,当以指数增长到阈值时就停止指数增长,按照线性增长方式增加;线性增长到网络拥塞时立即乘法减小,拥塞窗口置为1,同时阈值变为原来拥塞窗口的一半。
在这里插入图片描述
(7)流量控制
接受端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁问题。
因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫流量控制。
在TCP报文段有一个十六位的窗口长度,当接收方收到发送方的数据后,在应答报文ACK中将自身剩余缓冲区大小放入16位窗口大小中,这个大小随数据传输而变,窗口越大,网络吞吐量越高,而一旦接收方发现自己的缓冲区快满了,就将窗口值设置为更小的值通知发送方。如果缓冲区满,就将窗口设为零,发送方收到后就不再发送数据,但是需要定期发送一个窗口探测数据段,使接收方把窗口大小告诉发送方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值