详细讲解网络协议:TCP和UDP什么区别?

news/2024/5/17 15:30:36 标签: TCP, UDP

该文章是学习了 B 站 up 主的视频做的总结,讲的很通俗易懂,首先感谢博主的分享。视频地址:https://www.bilibili.com/video/BV1kV411j7hA/?spm_id_from=333.337.search-card.all.click&vd_source=0a3d4c746a63d737330e738fa043eaf6

重新认知了一下 TCPUDP 的原理以及区别,做一个简单的总结。

一、作用

首先:tcp 和 udp 都是工作再传输层,用于程序之间传输数据的。数据一般包含:文件类型,视频类型,jpg 图片等。

img

二、区别

  • TCP 是基于连接的,而 UDP 是基于非连接的。

  • tcp 传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方。比如,传输文件,发送邮件,浏览网页等等

  • udp 的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视屏直播等。udp 还有一个非常重要的应用场景就是隧道网络,比如:vpn,VXLAN.

举个例子 ------ 以人与人之间的通信为例:

  • UDP 协议就相当于是写信给对方,寄出去信件之后不能知道对方是否收到信件,信件内容是否完整,也不能得到及时反馈。
  • TCP 协议就像是打电话通信,在这一系列流程都能得到及时反馈,并能确保对方及时接收到。如下图:

img

TCP__45">三、TCP 通信的过程:

TCP 是如何保证以上过程的? 分为三个步骤,三次握手,传输确认,四次挥手。三次握手是建立连接的过程。

四、三次握手:

当客户端向服务端发起连接时,会先发一包连接请求数据,过去询问一下,能否与你建立连接?这包数据称之为 SYN 包,如果对端同意连接,则回复一包 SYN+ACK 包,客户端收到之后,发送一包 ACK 包,连接建立,因为这个过程中互相发送了三包数据,所以称之为三次握手。

img

为什么要三次握手而不是两次握手?

这是为了防止,因为已失效的请求报文,突然又传到服务器,引起错误,这是什么意思?
假设采用两次握手建立连接,客户端向服务端发送一个 syn 包请求建立连接,因为某些未知的原因,并没有到达服务器,在中间某个网络节点产生了滞留,为了建立连接,客户端会重发 syn 包,这次的数据包正常送达,服务端发送 syn+ack 之后就建立起了连接,但是第一包数据阻塞的网络突然恢复,第一包 syn 包又送达到服务端,这是服务端会认为客户端又发起了一个新的连接,从而在两次握手之后进入等待数据状态,服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致,如果在三次握手的情况下,服务端收不到最后的 ack 包,自然不会认为连接建立成功,所以三次握手本质上来说就是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立起可靠的连接,经过三次握手之后,客户端和服务端都进入了数据传输状态。

五、数据传输:

数据传输:

一包数据可能会被拆成多包发送, 如何处理丢包问题,这些数据包到达的先后顺序不同,如何处理乱序问题?针对这些问题,tcp 协议为每一个连接建立了发送缓冲区,从建立链接后的第一个字节的序列号为 0,后面每个字节的序列号就会增加 1,发送数据时,从数据缓冲区取一部分数据组成发送报文,在 tcp 协议头中会附带序列号和长度,接收端在收到数据后需要回复确认报文,确认报文中的ack 等于接受序列号加长度,也就是下包数据发送的起始序列号,这样一问一答的发送方式,能够使发送端确认发送的数据已经被对方收到,发送端也可以发送一次的连续的多包数据,接受端只需要回复一次 ack 就可以了如图:

img

六、四次挥手:

img

处于连接状态的客户端和服务端,都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭,假设客户端主动发起连接关闭请求,他给服务端发起一包 FIN 包,标识要关闭连接,自己进入终止等待 1 状态,服务端收到 FIN 包发送一包 ACK 包,标识自己进入了关闭等待状态,客户端进入终止等待 2 状态。这是第二次挥手,服务端此时还可以发送未发送的数据,而客户端还可以接受数据,待服务端发送完数据之后,发送一包 FIN 包,最后进入确认状态,这是第 3 次挥手,客户端收到之后回复 ACK 包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到 ACK 包后,立即关闭连接,这是第四次挥手。

为什么客户端要等待超时时间这是为了保证对方已经收到 ACK 包。因为假设客户端发送完最后一包 ACK 包后释放了连接,一旦 ACK 包在网络中丢失,服务端将一直停留在 最后确认状态,如果等待一段时间,这时服务端会因为没有收到 ack 包重发 FIN 包,客户端会响应 这个 FIN 包进行重发 ack 包,并刷新超时时间,这个机制跟第三次握手一样。也是为了保证在不可靠的网络链路中进行可靠的连接断开确认

UDP__100">七、UDP 协议:

udp: 首先 udp 协议是非连接的,发送数据就是把简单的数据包封装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系,正因为 udp 这种简单的处理方式,导致他的性能损耗非常少,对于 cpu, 内存资源的占用也远小于 tcp, 但是对于网络传输过程中产生的丢包,udp 并不能保证,所以 udp 在 传输稳定性上要弱于 tcp

所以,tcp 和 udp 的主要区别:

tcp 传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等,

udp 的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视屏直播等。udp 还有一个非常重要的应用场景就是隧道网络,比如:vpn,VXLAN.

img


http://www.niftyadmin.cn/n/5719.html

相关文章

一站式工业边缘数据采集处理与设备反控实践

对接繁杂多样的工业协议、对海量设备产生的生产数据进行采集和处理一直是工业领域智能化推进的难点。EMQ 通过提供边缘工业协议网关软件 Neuron 和边缘流式处理引擎 eKuiper,分别解决了边缘侧设备数据的采集与处理。 之前,要想实现两个产品的协同工作&a…

零入门容器云网络-3:基于SNAT技术使得veth-pair链接的网络可以访问本局域网的其他节点

已发表的技术专栏(订阅即可观看所有专栏) 0  grpc-go、protobuf、multus-cni 技术专栏 总入口 1  grpc-go 源码剖析与实战  文章目录 2  Protobuf介绍与实战 图文专栏  文章目录 3  multus-cni   文章目录(k8s多网络实现方案) 4  gr…

js 对象深拷贝递归实现

const obj {name:changjk,family:{father:zs,mother:shh},hobby:[打游戏,喝茶,打羽毛球]} //深拷贝 const cloneObj(obj)>{ const newObj{} for(const key in obj){ if(Object.prototype.toString.call(obj[key]) [Object,Array]){ cloneObj(obj[key]) }else if(Object.pr…

原来我们一直写的是违反面向对象编程风格的代码

众所周知,很多业务系统都是基于 MVC 三层架构来开发的,虽然这种开发模式已经成为标准的 Web 项目的开发模式,但它却违反了面向对象编程风格,是一种彻彻底底的面向过程的编程风格,因此被有些人称为反模式(an…

对象的比较(下)

作者:~小明学编程 文章专栏:Java数据结构 格言:目之所及皆为回忆,心之所想皆为过往 目录 比较器的比较 equals的比较 三种方式的比较 比较器的比较 class Card {public int rank; // 数值public String suit; // 花色public…

04 C++循环控制-课后巩固实训

第1关:(控制计数器)打印钻石 任务描述 本关任务:输入为一个3~19之间的一个奇数n, 输出钻石图案,如下图所示,若输入不符合要求,则退出。 编程要求 根据提示,在右侧编辑器补充代码,在输入不符合要求时输出 wrong input!。 测试说明 平台会对你编写的代码进行测试。 …

3、传统的Synchronized锁

传统的Synchronized锁 首先提一个观点,线程就是一个单独资源类,是没有任何的附属操作的(我们直接用就ok了(线程其中包含两个东西:1、属性2、方法))也就是说我们去使用线程不再是之前的那种impl…

【C/C++】自定义类型 枚举联合

学习导航 写在前面 枚举 枚举类型的定义 枚举的使用 枚举的大小计算 枚举的优点 联合(共用体) 联合类型的定义 联合的内存分配 联合大小的计算 写在前面 我们知道的C语言中的自定义类型有: 结构 位段 枚举 联合 其中结构和位…