TCP & UDP
MoMo Lv5

TCP

定义

  • 是一种传输层协议,允许数据包从一个位置发送到另一个位置
  • 是面向连接的协议,也就是说它在网络计算机单元之间的任何通信之前建立连接。由于我们把这个协议与 IP 协议结合使用,我们称其为 TCP/IP
  • TCP 的主要任务是从应用层收集数据。它将数据拆分成多个数据包,为每个数据包分配一个编号,然后将这些数据包发送到它们的目的地
  • 是一种可靠的协议。因为,接收方总是会给发送方提供一条关于数据包的确认消息,要么肯定要么否定,因此,发送方总是能知道数据包是否到达它的目的地,还是说需要被重新发送
  • TCP 支持全双工服务器,既可以当接收者,也可以当发送者。它以点对点的客户端/服务器方式运行

适用场景

HTTPS(安全超文本传输协议)、HTTP(超文本传输协议)、SMTP(简单邮件传输协议)、FTP(文件传输协议)

UDP

定义

  • 用户数据报协议(UDP)是 TCP/IP 协议套件的最基本的传输层通信协议。它使用最低限度的通信机制
  • 接收方不生成数据包的确认,发送方也不等待数据包的确认。正是这个不足,使得该协议虽不可靠但是易于处理
  • 它很适用于单向数据流的场景,最适合基于查询的通信。
  • UDP 不保证数据包的有序传递。它是无状态的,不提供任何拥塞控制机制。

适用场景

视频流、视频电话、IP 语音服务(互联网呼叫)、DNS(域名系统)、串流影片、线上游戏、现场直播

丢包

原因

  1. 接收端处理时间过长导致丢包
    调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续recv。
  1. 发送的包巨大丢包
    虽然send方法会帮你做大包切割成小包发送的事情,但包太大也不行。例如超过50K的一个udp包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。
  1. 发送的包较大,超过接受者缓存导致丢包
    包超过mtu size数倍,几个大的udp包可能会超过接收者的缓冲,导致丢包。这种情况可以设置socket接收缓冲。以前遇到过这种问题,我把接收缓冲设置成64K就解决了。
  1. 发送的包频率太快

    1. 虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况也有时可以通过设置socket接收缓冲解决

    2. UDP的SendTo不会造成线程阻塞,也就是说,UDP的SentTo不会像TCP中的SendTo那样,直到数据完全发送才会return回调用函数,它不保证当执行下一条语句时数据是否被发送。(SendTo方法是异步的)这样,如果要发送的数据过多或者过大,那么在缓冲区满的那个瞬间要发送的报文就很有可能被丢失

  1. 局域网内不丢包,公网上丢包
    这个问题我也是通过切割小包并sleep发送解决的。如果流量太大,这个办法也不灵了。总之udp丢包总是会有的,如果出现了还有这个几个方法: 要么减小流量,要么换tcp协议传输,要么做丢包重传的工作。

解决方法

  1. 从发送端解决
    1. 适用条件: ①发送端是可以控制的.②微秒数量级的延迟可以接受
    2. 解决方法:发送时使用usleep(1)延迟1微秒发送,即发送频率不要过快,延迟1微妙发送,可以很好的解决这个问题.。
  1. 从接收端解决

    1. 适用条件:①无法控制发送端发送数据的频率
    2. 解决方法: 用recvfrom函数收到数据之后尽快返回,进行下一次recvfrom,可以通过多线程+队列来解决.收到数据之后将数据放入队列中,另起一个线程去处理收到的数据;可以总结为服务器程序启动之出,接收端开辟两个线程,一个线程专门用于接收数据包,并存放在应用层的缓存区;另外一个线程用于专门处理和响应数据包请求,避免因为处理数据造成数据丢包。其本质上还是增大了缓冲区大小,只是将系统缓冲区转移到了自己的缓冲区。
  2. 在应用层实现丢包重发机制和超时机制,确保数据包不丢失

区别

  1. 连接

    • TCP 要求在发送方和接收方开始通信之前建立一个良好的连接,它是一个面向连接的协议。

    • UDP 是一种无连接协议。

  1. 保持数据传输的顺序
    • 在 TCP 中,由于事先建立了一个良好的连接,接收方以有序的方式接收数据包。
    • 而在 UDP 中,发送方与接收方之间并没有建立良好的连接,接收方将以无序的方式接收数据包。
  1. 可靠性
  • 每当通过 TCP 接收到数据包时,接收方都会向发送方发送一条确认。万一失败,它会请求重新传输。
  • 而使用 UDP,在这种情况下不会发送确认,它依赖于高层协议来确保可靠性。
  1. 错误检查
  • TCP 中有广泛的错误检查规则
  • UDP 中只有基本的错误检查技术,例如校验和。
  1. 传输方法
  • 在 TCP 中,数据以字节流的形式读取,消息被发送到段边界。
  • 而在 UDP 中,已定义限制的单个 UDP 数据包被发送,在到达接收方时验证其完整性。
Powered by Hexo & Theme Keep
Unique Visitor Page View