当前位置: 首页 > news >正文

【协议开发系列】梳理关于TCP和UDP两种协议的区别和使用场景

起源

前二天项目上在核对外部对接服务的五元组列表的时候,有一位客户提问对于同样的服务同时支持tcp和udp二种方式,有什么优点和缺点,应该如何选择?这个问题突然让我愣了一下,确实好久没有“温故”了,相关的概念都有些模糊了,于是,我整理了一下相关的知识体系,秉承分享的精神,重新复习记录如下,供各位同学有需要的时候参考。

从RFC上来看

从RFC上截的图,UDP(RFC768 User Datagram Protocol)只有源端口和目的端口,长度和校验和,接下来就是数据部分。对比TCP(RFC 9293 Transmission Control Protocol),没有相关的面向连接管理的各种控制字段和标志位。所以,UDP的特点就是快,实时性好,但是不保证传输的可靠性和连接性。
在这里插入图片描述
RFC768只有3 pages, RFC9293有98 pages.

关键特性对比列表

这个表格对TCP和UDP协议进行了更详细的对比,包括可靠性、连接性、速度、数据包大小以及应用场景,及这两种协议的特点和差异。

TCP(传输控制协议)UDP(用户数据报协议)
可靠性TCP提供可靠的数据传输服务。它使用序列号对发送的数据包进行排序,确保数据按照正确的顺序到达接收端。同时,TCP还通过确认和重传机制确保每个数据包都被成功接收,如果数据包在传输过程中丢失或损坏,TCP会重新发送丢失的数据包。UDP不保证可靠传输。它仅仅将数据封装成数据报并发送出去,不会进行数据包的校验和重传。因此,UDP可能会出现数据包的丢失、乱序或重复等问题,适用于对数据传输可靠性要求不高的场景。
连接性TCP是面向连接的协议。在数据传输之前,发送方和接收方需要建立连接,包括三次握手过程,以建立可靠的通信通道。数据传输结束后,双方还需要通过四次挥手来释放连接。这种连接方式使得TCP能够控制数据传输的流量和速度,并提供更好的数据传输质量。UDP是无连接的协议。发送方在发送数据之前不需要与接收方建立连接,直接发送数据报即可。这种方式减少了建立连接的开销和延迟,使得UDP更适用于实时通信或广播通信等场景。然而,由于没有连接状态的管理,UDP无法提供流量控制和拥塞控制等功能。
速度由于TCP需要建立连接、进行数据包确认和重传等操作,相对于UDP来说,其传输速度可能会稍慢一些。尤其是在网络状况不佳或数据包丢失率较高的情况下,TCP的传输效率可能会受到较大影响。UDP的传输速度较快。由于不需要建立连接和进行复杂的控制操作,UDP的数据报可以直接发送到网络中,减少了传输延迟。这使得UDP适用于对实时性要求较高的应用场景,如视频流传输、实时游戏等。
数据包大小TCP在传输数据时,会根据网络状况动态调整数据包的大小,以适应不同的网络环境。TCP会将数据分割成较小的数据块进行传输,并在接收端进行组装,以确保数据的完整性和顺序性。UDP没有数据包大小的限制。发送方可以根据需要自由设置数据报的大小,并直接发送到网络中。然而,过大的数据包可能会导致网络拥塞或数据包丢失,因此在实际应用中需要根据网络状况和数据传输需求来合理选择数据包的大小。
应用场景TCP适用于需要可靠、有序的数据传输的场景。例如,文件传输、网页浏览、电子邮件等应用都依赖于TCP协议来确保数据的完整性和顺序性。UDP适用于对实时性要求较高,且对数据的完整性要求不高的场景。例如,实时视频流传输、在线游戏、VoIP(网络电话)等应用常使用UDP协议,因为它们更注重传输速度和实时性,而不是数据的完整性。

RFC协议原文本链接参考

UDP链接: RFC768
TCP链接: RFC9293

http://www.lryc.cn/news/359253.html

相关文章:

  • vue blob实现自定义多sheet数据导出到excel文件
  • Python—面向对象小解(3)
  • Nginx超时时间
  • Imgs,GT,Edge,Gradient_all,Gradient_Foreground
  • 自学成才Flutter 弹性布局、线性布局
  • Part 3.1 深度优先搜索
  • 前端Vue小兔鲜儿电商项目实战Day03
  • ORACLE 查询SQL优化
  • Ansible03-Ansible Playbook剧本详解
  • Qt-qrencode生成二维码
  • 长安链使用Golang编写智能合约教程(三)
  • Vercel deploy- Nextjs project error-URL link-env variable
  • Java | Leetcode Java题解之第123题买卖股票的最佳时机III
  • Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)
  • Redis实现延迟队列
  • 如何准确查找论文数据库?
  • 翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)
  • 【FPGA】Verilog语言从零到精通
  • unity打包的WebGL部署到IIS问题
  • GPT-4o:人工智能的新里程碑
  • 发现一个ai工具网站
  • 第二十五章新增H5基础(以及视频~兼容)
  • [英语单词] production quality
  • windows安装nodeJs,以及常用操作
  • MySql part1 安装和介绍
  • SpringBoot打war包并配置外部Tomcat运行
  • 2024.5.31每日一题
  • Oracle 数据库 varchar2 从 4000 扩展到 32k
  • postgressql——事务提交会通过delayChkpt阻塞checkpoint(9)
  • 开发者工具-sources(源代码选项)