【网络协议】 TCP与UDP协议区别及应用场景深度分析

1. TCP与UDP简介


1.1 TCP


1.1 定义


        TCP(TransmissionControl Protocol)传输控制协议。

        是一种可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

1.2 特性

1.2.1.是面向连接的协议


        也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来。接收双方独占一个通道。

1.2.2.面向字节流


        TCP将应用程序看成是一连串的无结构的字节流。每个TCP套接口有一个发送缓冲区,如果字节流太长时,TCP会将其拆分进行发送。当字节流太短时,TCP会等待缓冲区中的字节流达到一定程度时再构成报文发送出去,TCP发给对方的数据,对方在收到数据时必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。

1.2.3.3次握手建立连接,4次握手释放连接

ACK:TCP报头的控制位之一,表示确认号是否有效。只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。

确认号:用它来告诉发送端发送过来的序列号之前的数据段都收到了。比如,确认号为X,则表示前X-1个数据段都收到了。

SYN:同步序列号,TCP建立连接时将这个位置1。

FIN:发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1。

1.2.4 TCP建立连接三次握手过程

1、主机A通过向主机B发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。

2、主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我。

3、主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:我已收到回复,我现在要开始传输实际数据了。

2、UDP


2.1 定义


UDP(User DatagramProtocol)用户数据报协议

不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

2.2 特性


2.2.1.无连接的服务


UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,双方没有专有的通信通道。当发送端想传送数据时就简单地把数据扔到网络上,并不能保证他们能到达目的地。接收端由于没有与发送端建立专用的通信通道,因此接收数据时并不能确定是有谁发来的数据。

2.2.2.面向报文


       发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界。也就是说应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。

不同于TCP有缓存机制。TCP是将发送的数据都看成字节流,根据字节流在缓冲区存储的大小来决定是否发送,一次发送的信息不一定是整个报文。

使用UDP发送信息,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。

3. TCP与UDP的对比


3.1、基本区别


1、TCP面向连接(如打电话要先拨号建立连接)。UDP是无连接的,即发送数据之前不需要建立连接。

2、对系统资源的要求(TCP较多,UDP少)。TCP需要建立专用的通信通道,还需要校验数据等,因此需求的系统资源较大。

3、TCP保证数据正确性,TCP丢包会自动重传,UDP可能丢包,丢包后不会自动重传。TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

4、TCP保证数据传输有序,UDP不保证。

    消息在传输过程中可能会乱序,后发送的消息可能会先到达,TCP会对其进行重排序,UDP不会。

4、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流。UDP是面向报文的

5、UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

6、每一条TCP连接只能是点到点的。UDP支持一对一,一对多,多对一和多对多的交互通信。

7、TCP首部开销20字节。UDP的首部开销小,只有8个字节

3.1 tcp、udp协议的设计区别是?列举所知道的使用TCP\UDP的上层协议。

1、连接方面区别

TCP面向连接,传输数据之前需要建立连接

UDP是无连接的,即发送数据之前不需要建立连接。

2、安全方面的区别

TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。

UDP尽最大努力交付,即不保证可靠交付。

3、传输效率的区别

TCP传输效率相对较低。

UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

4、连接对象数量的区别

TCP连接只能是点到点、一对一的。

UDP支持一对一,一对多,多对一和多对多的交互通信。

基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH

基于UDP的应用层协议:DNS、TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、NTP协议

3.2、编程中的区别

从程序实现的角度来看,可以用下图来进行描述。 

TCP编程的服务器端一般步骤是:

  1、创建一个socket,用函数socket()。

  2、设置socket属性。

  3、绑定本机的IP地址、端口等信息到socket上,用函数bind()。

  4、开启监听,用函数listen()。

      5、接收客户端上来的连接,用函数accept()。

      6、通过accept()返回相应客户端的socket建立专用的通信通道。

  7、收发数据,用函数send()和recv(),或者read()和write()。

  8、关闭网络连接。

  9、关闭监听。

TCP编程的客户端一般步骤是:

  1、创建一个socket,用函数socket()。

  2、设置socket属性。 

  3、设置要连接的对方的IP地址和端口等属性。

  4、连接服务器,用函数connect()。

  5、收发数据,用函数send()和recv(),或者read()和write()。

  6、关闭网络连接。  

  UDP编程的服务器端一般步骤是:

  1、创建一个socket,用函数socket()。

  2、设置socket属性。

  3、绑定IP地址、端口等信息到socket上,用函数bind()。

  4、循环接收数据,用函数recvfrom()。

  5、关闭网络连接。

UDP编程的客户端一般步骤是:

  1、创建一个socket,用函数socket()。

  2、设置socket属性。  

  4、设置对方的IP地址和端口等属性。

  5、发送数据,用函数sendto()。

  6、关闭网络连接。 

3.3、TCP/UDP应用场景
什么时候应该使用TCP:

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 
在日常生活中,常见使用TCP协议的应用如下:

浏览器,用的HTTP

FlashFXP,用的FTP

Outlook,用的POP、SMTP

Putty,用的Telnet、SSH

QQ文件传输

…………

那么什么时候应该使用UDP:

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 
比如,日常生活中,常见使用UDP协议的应用如下:

QQ语音

QQ视频

TFTP

DNS的传输层协议有TCP或者UDP,常用的应该是UDP。

DNS解析过程:

1、在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。

6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

4. 为什么tcp是可靠的传输,简述你理解的原因。

[1] 确认和重传机制

建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础。传输过程中,如果Checksum校验失败、丢包或延时,发送端重传

[2] 数据排序

TCP有专门的序列号SN字段,可提供数据re-order

[3] 流量控制

窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量

[4] 拥塞控制

TCP的拥塞控制由4个核心算法组成。

“慢启动”(Slow Start):在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。

“拥塞避免”(Congestion avoidance):从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。

“快速重传 ”(Fast Retransmit):快重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。

“快速恢复”(Fast Recovery):

1.当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3个重复的ACK,表明有3个“老”的数据包离开了网络。

2.再收到重复的ACK时,拥塞窗口增加1。

3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。

从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS1快速入门学习笔记 - 01Linux基础

目录 一、Linux极简基础 二、C与Python极简基础 1. for循环 2. while循环 3. 面向对象 一、Linux极简基础 终端快捷键:ctrlaltt 命令行的操作方式 查看当前终端所在路径:pwd切换路径cd;例如cd /home/ 进入home文件夹;cd …

【精】Devops实战学习CI/CD落地方案#CI篇#

目录 先有个大概了解 基本概念 CI/CD Devops 阿里云效 devops产品 K8s jenkins docker git maven 知行合一,上手操作 实操记录 安装VMware 安装并配置虚拟机 安装并配置docker docker安装 修改镜像源(关键且易出错) CentOS…

【数据结构-树和二叉树-森林-哈夫曼树】

目录 1 树1.1 树的描述(基本术语) 2 二叉树(树的度最大为2)2.1 注意事项-五种基本形态2.2 二叉树的抽象数据类型定义 3 二叉树的性质3.1 两种特殊形式的二叉树-重点会计算3.2 题目练习: 4 二叉树的存储结构4.1 顺序存储…

竞逐智能家居大模型:美的“蓄力”,海尔“疾行”

配图来自Canva可画 随着ChatGPT火热出圈,AI大模型便成为了各行各业必争的高地。“BAT”等互联网大厂、华为、小米等通讯巨头,以及一些垂直AI公司,都开始在大模型市场积极布局。众所周知,发展大模型的关键在于应用场景的落地&…

超星图书转成PDF格式

转为pdf 为避免浪费您的时间,本篇转载文章不值得花费您的宝贵时间阅读 方法一 感谢医学插画动画杜鹏 Roison An两位提供的方法,经试验后简化了一下,得出以下方法:1、使用超星打开你想要转换的图书2、依次打开本书的所有页面,不要…

Linux基础和常见命令速览

来源:Linux 基础知识总结 | JavaGuide 一、Linux文件系统 1. 文件系统 Linux 系统中的一个重要的概念:一切都是文件。 在 Linux 操作系统中,一切被操作系统管理的资源,如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件…

(避雷指引:管理页面超时问题)windows下载安装RabbitMQ

一、背景: 学习RabbitMQ过程中,由于个人电脑性能问题,直接装在windows去使用RabbitMQ,根据各大网友教程,去下载安装完之后,使用web端进行简单的入门操作时,总是一直提示超时,要么容…

Electron+Vue3整合-开发时整合-全部ts开发 + 一条命令启动vue3和electron两个服务

说明 本文介绍一下 Electron Vue3 的整合的中级操作。实现的效果是 : 1、一个正常的Vue3项目; 2、整合加入 Electron 框架 :开发时只执行一条命令,启动 vue 项目 后 再启动 electron;electron 的开发使用 typescript…

Office疑难杂症-Word页码重复无法修改

在现代办公环境中,Microsoft Office 套件扮演着不可或缺的角色,尤其是 Word 文档处理软件,在日常生活和工作中的应用广泛。然而,即使是这样成熟的软件,也不免有一些令人头疼的技术问题。本文将详细介绍如何解决Word中页…

深度学习之图像分割从入门到精通——基于unet++实现细胞分割

模型 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channels, …

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测; 2.输入7个特征&#xf…

互联网技术知识点总览——数据库知识点框架

简介 本文对数据库的知识点整体框架进行梳理和分享如下:

Vue3+TS版本Uniapp:封装uni.request请求配置

作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例(在create方法中写入请求…

Oracle中的视图

1- 什么是视图 视图是一个虚拟表 视图是由sql查询语句产生的 视图真实存在 但是不存储数据 视图中的数据 只是对 基表(源数据表) 中的数据的引用 总的来说 视图可以简化数据 用户,订单,物流 三个表进行关联 吧很复杂的sql查询语句存储成一个视图 …

【 AIGC 研究最新方向(下)】面向平面、视觉、时尚设计的高可用 AIGC 研究方向总结

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种: 透明图层生成可控生成图像定制化SVG 生成 本篇(下篇)介绍 3、4,上篇在:https://blog.csdn.net/weixin_44212848/article/details/138035279?spm…

CSS——高级选择器

层次的选择器&#xff1a; <1> 后代选择器&#xff1a; 格式&#xff1a; 标签1 标签2{} 解释&#xff1a; 标签1 不生效&#xff0c;被标签1 嵌套中的 标签2才生效 举例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charse…

JVM常见的垃圾回收器

1、回收方法区&#xff1a; 方法区回收价值很低&#xff0c;主要回收废弃的常量和无用的类。 方法区中的存储&#xff1a; 方法区中存储的是加载的类的信息&#xff0c;常量&#xff0c;静态变量&#xff0c;即时编译后的代码等数据&#xff0c;所以回收的对象也就是这些内…

go+react实现远程vCenter虚拟机管理终端

文章目录 React-VcenterDemoQuick Start React-Vcenter 基于go & react实现远程vSphere vcenter虚拟机终端console页面&#xff0c;提供与vcenter管理中的Launch Web Console相同的功能。 项目地址&#xff1a;react-vcenter Demo URL: http://localhost:3000 Quick St…

【leetcode面试经典150题】66. 分隔链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…