TCP与UDP异同
时间:2022-07-24
本文章向大家介绍TCP与UDP异同,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
TCP与UDP异同
TCP/IP
模型的运输层有两个不同的协议:UDP
用户数据报协议与TCP
传输控制协议
相同点
-
TCP
与UDP
都是运行在运输层的协议 -
TCP
与UDP
的通信都需要开放端口
不同点
TCP
-
TCP
是面向连接的协议,提供全双工通信,需要建立链接之后再传输数据,数据传输负载相对较大。 -
TCP
提供可靠交付的服务,使用流量控制和拥塞控制等服务保证可靠通信。 -
TCP
首部最小20
字节,最大60
字节,包括源端口、目的端口、序号、确认号、数据偏移、控制标志、窗口、校验和、紧急指针、选项等信息。 -
TCP
只能是一对一通信。 -
TCP
面向字节流通信。 -
TCP
保证数据传输的顺序,通过给TCP
连接中传送数据流的每个字节都编上序号来确定传输顺序。 -
TCP
提供校验和、确认应答、序列号、超时重传、连接管理、流量控制、拥塞控制等功能。 -
TCP
适用于要求可靠传输的应用,如文件传输等
UDP
-
UDP
是无连接的,即发送数据之前不需要建立连接,数据传输负载相对较小。 -
UDP
使用尽最大努力交付,即不保证可靠交付,同时也不使用流量控制和拥塞控制。 -
UDP
首部8
字节,包括源端口、目的端口、长度、校验和信息。 -
UDP
具有单播、多播、广播的功能,支持一对一、一对多、多对多、多对一的数据传输方式。 -
UDP
是面向报文通信,对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,在添加首部后就向下交付IP
层。 -
UDP
不保证数据传输的顺序,需要应用层程序在数据段加入序号等方式控制顺序。 -
UDP
只在IP
的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。 -
UDP
适用于实时应用,如网络电话、视频会议、直播等
相关问题
UDP实现可靠性传输
运输层无法保证数据的可靠传输,只能通过应用层来实现了,实现的方式可以参照TCP
可靠性传输的方式,只是实现不在传输层,实现转移到了应用层,主要通过实现确认机制、重传机制、窗口确认等机制来实现可靠传输,有RUDP
、RTP
、UDT
等开源程序利用UDP
实现了可靠的数据传输,此外有结合TCP
的可靠与UDP
速度的权衡KCP
协议。
TCP短连接和长连接的区别
短连接:Client
向Server
发送消息,Server
回应Client
,然后一次读写就完成了,这时候双方任何一个都可以发起close
操作,不过一般都是Client
先发起close
操作。短连接一般只会在Client/Server
间传递一次读写操作。短链接管理起来比较简单,建立存在的连接都是有用的连接,不需要额外的控制手段,但是如果客户请求频繁,将在TCP
的建立和关闭操作上浪费时间和带宽。
长连接:Client
与Server
完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接,长连接可以省去较多的TCP
建立和关闭的操作,减少浪费,节约时间,对于频繁请求资源的客户来说,较适用长连接,但是随着客户端连接越来越多,Server
负载会越来越大,此时就需要采取一些策略减少负载,例如关闭长时间未读写的链接LRU
算法、限制客户端链接数量等。
TCP粘包拆包解决方案
由于TCP
本身是面向字节流的,无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决。
- 消息定长:发送端将每个数据包封装为固定长度(不够的可以通过补
0
填充),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。 - 设置消息边界:服务端从网络流中按消息边界分离出消息内容,在包尾增加回车换行符进行分割,例如
FTP
协议。 - 将消息分为消息头和消息体:消息头中包含表示消息总长度(或者消息体长度)的字段。
参考
https://zhuanlan.zhihu.com/p/108822858
https://www.cnblogs.com/liangyc/p/11628148.html
https://blog.csdn.net/m_xiaoer/article/details/72885418
https://blog.csdn.net/pangyemeng/article/details/50387078
https://blog.csdn.net/quiet_girl/article/details/50599777
https://blog.csdn.net/liuchenxia8/article/details/80428157
https://blog.csdn.net/qq_40732350/article/details/90902396
https://www.cnblogs.com/fundebug/p/differences-of-tcp-and-udp.html
- 关于Java你不知道的10件事
- 03-移动端开发教程-CSS3新特性(下)
- 大数据面试题整理
- 02-移动端开发教程-CSS3新特性(中)
- 强悍!Java 9 中的9个新特性
- 神经网络反向传播梯度计算数学原理
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- 从零开始写项目第三篇【在线聊天和个人收藏夹】
- TiDB 源码阅读系列文章(六)Select 语句概览
- 从零开始写项目第四篇【搭建Linux环境】
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
- 深入nDPI
- 44个Java代码性能优化总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 你该知道的Gradle配置知识总结
- Android布局之绝对布局AbsoluteLayout详解
- django实现模型字段动态choice的操作
- 详解ASP.NET Core 处理 404 Not Found
- Python AutoCAD 系统设置的实现方法
- Python如何操作office实现自动化及win32com.client的运用
- android Palette调色板使用详解
- python 穷举指定长度的密码例子
- Android 高仿微信朋友圈拍照上传功能
- android的ListView点击item使item展开的做法的实现代码
- Android NavigationView头部设置监听事件
- android如何取得本地通讯录的头像的原图的实现代码
- 取消Android Studio项目与SVN关联的方法
- Android编程实现获取当前系统语言及地区并更改语言的方法
- Android Studio绑定下拉框数据详解