传输层协议的可靠性

295 阅读2分钟

为什么说TCP的交互是可靠的,换个说法udp为什么是不可靠的?udp可以进行可靠传输吗?带着这个问题,查阅一些资料,我记录下这个问题的答案。


什么是TCP连接

  • 前面记述了tcp的三次握手和三次挥手。据我理解,TCP的连接是为了确定双方交互的可达性,但确认双方的唯一交互通道并不能保证数据的正确。在报文的传输中还是会发生各式各样的错误 连接本身并不保证数据的可靠性,那如何保证呢

数据可能会发生的错误

  • 乱序 数据在传输过程中由于网络的错综复杂,连续发送的字节流可能并不是按序到达
  • 数据异常 受环境影响,电信号可能会发生跳转从而让数据异常
  • 丢失 报文丢失
  • 重复 报文重复

ACK和超时重发机制

  • 数据乱序。接收方上一个收到的正确数据是seq + 4,它返回seq + 5作为ACK。这时候它收到了seq + 7,因为顺序错了,所以接收方会再次返回seq + 5给发送方
  • 数据错误。每一个TCP数据都会带着数据的校验和。接收方收到数据seq + 3以后会先对校验和进行验证。如果结果不对,则发送ACK seq + 3,让发送方重新发送数据
  • 数据丢失或延迟。发送方发送数据seq时会起一个定时器,如果在指定时间内没有接收到ACK seq + 1,就把数据seq再发一次
  • 数据重复。接收方直接丢弃重复的数据即可

ACK机制的优化

  • 滑动窗口
  • 延迟ACK
  • 拥塞控制

使用udp进行可靠传输

  • 在应用层重写tcp逻辑 UDP要想可靠,就要接收方收到UDP之后回复个确认包,发送方有个机制,收不到确认包就要重新发送,每个包有递增的序号,接收方发现中间丢了包就要发重传请求,当网络太差时候频繁丢包,防止越丢包越重传的恶性循环,要有个发送窗口的限制,发送窗口的大小根据网络传输情况调整,调整算法要有一定自适应性