被问到TCP的可靠传输和提高网络利用率?

前面讲到的TCP和UDP,在TCP的特性里面知道,他是有连接的,连接管理也是和可靠性是有一定关系的,那么他是如何建立连接,又是如何断开连接的呢?

1. 确认应答(ACK)机制

在这里插入图片描述

因为我TCP是面向字节流的,一次发的数据单位不是一个完整的数据包,而是若干个字节,因此TCP将每个字节的数据都进行了编号,即为序列号
在这里插入图片描述

2. 超时重传

上面的确认应答是理想状态,因为发的消息都能够确认收到答复,但是也存在发的消息没有收到,也就是没有发出去,这时候该怎么办呢?

主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发;
在这里插入图片描述
但是, 主机A未收到B发来的确认应答, 也可能是因为ACK丢失了;
(因此主机B会收到很多重复数据. 那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉. 这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果.)
在这里插入图片描述
**注意:**如果是主机B的确认应答包丢了,这时候主机A是不知道的,所以可能会发送多条1–1000的数据,但是尽管主机B接收了很多条消息,但是也是会自动按照消息的序号进行去重,所以最终当主机A成功接收到主机B的消息的时候,那也是1001,不会读到重复的消息。

那么问题来了

1)如果丢包了,那么需要等多久然后去第二次发送数据呢?

其实操作系统里面有一个专门的参数,来描述超时等待的时间(可以修改)

2)如果第二条消息也丢了,要不要接着发第三条消息呢?

其实重传的次数越多,从概率角度来看,后面的数据包丢包的概率就越小(假设每个包的丢包概率为10%,第一个包丢掉的概率就为10%,而第二个包丢包的概率为1%(10%*10%))

3)如果发送第二个包的间隔时间为t1,发送第三个包的间隔时间为t2,那么t1和t2有什么关系呢?

其实态度不同,那么对待问题也就不同
①t1比t2断:悲观的态度,就是第一个包都没有传过去,第二个包能发送过去的概率也会很小……(第一次等待5分钟,第二次等待十分钟…)
②t1比t2长:乐观态度,想着第二次发送能够接收的概率很大(第一次等10分钟,第二次等5分钟)
③ti和t2一样长:这样也可以,就是平常心喽

最理想的情况下, 找到一个最小的时间, 保证 “确认应答一定能在这个时间内返回”.但是这个时间的长短, 随着网络环境的不同, 是有差异的.
如果超时时间设的太长, 会影响整体的重传效率;
如果超时时间设的太短, 有可能会频繁发送重复的包;

	TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间.

Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍.
如果重发一次之后, 仍然得不到应答, 等待 2500ms 后再进行重传.
如果仍然得不到应答, 等待 4
500ms 进行重传. 依次类推, 以指数形式递增.
累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值