TCP和UDP的区别(简单明了)

article/2025/10/5 0:51:38

目录

1 前言

2 TCP

2.1 TCP如何保证可靠传输

3 UDP

1 前言

        你知道什么是TCP和UDP吗?你知道TCP和UDP有什么区别吗?可能大家平时总是听说过TCP和UDP,但是一直不知道它们是怎么回事。今天就给大家介绍一下。我们常用的网络通讯、软件聊天、以及大家平时所看的视屏都是通过这两种协议来进行数据传输的,那它们又是如何工作呢,又有什么区别呢。

注:本篇文章也是在B占看别的博主视频总结写的

2 TCP

2.1 基础介绍

1、TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。
2、客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
3、TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)

TCP和UDP都是在传输层,在程序之间传输数据,TCP是基于连接的,UDP是基于非连接的。

如果将进程与进程之间的通信看做是人与人之间的通信,那么假使人与人之间的通信方式有两种写信和打电话,那么写信大家都知道我们信件写完寄出去之后,我们无法知道对方是否收到,也无法知道对方收到的内容是否完整,知道对方信件收到的顺序是否正确,而打电话就不一样了,当电话接通之后,我们肯定要确认对方有没有接通然后互相通话,最后挂断的时候也会通知对方。根据上述例子就可看出写信的方式就和UDP的传输方式很像,而打电话的方式就和TCP的方式很像。那么TCP是如何保证上述过程呢?

URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:建立一个新连接。
FIN:断开一个连接。

2.2 TCP如何保证可靠传输

TCP保证上述过程有3个步骤:三次握手传输确认四次挥手

1)三次握手

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

问题1:为什么是3次握手而不是2次握手。

为了防止已经失效的请求报完。突然又传到服务器引起错误。

如果采用了两次连接,客户端向服务端发送了一个SYN包来请求建立连接,因为一些原因并没有到达服务器在中间某个网络节点产生了滞留,为了建立连接客户端重新发送SYN包,这次数据包正常送达,服务端回复SYN+ACK后建立了连接,但是第一包数据阻塞的网络节点突然恢复,又达到服务端。此时服务端认为是客户端重新发起了一个新的连接,从而在两次握手之后进入等待数据状态。服务端认为是两个连接,客户端认为是一个连接,造成了状态不一致,如果在三次握手情况下,服务端在收不到ACK情况下,连接自然不会建立成功。

所以3次握手本质上说就是解决网络信道不可靠的问题,为了能够在不可靠的信道上建立起可靠的连接。

问题2:如何处理丢包问题和乱序问题

        TCP协议为每一个连接建立了一个发送缓冲区,从建立连接的第一个字节号为0,后面每个字节的序列好就会增加1,发送数据时,从发送缓冲区取一部分数据组成发送报文,在其tcp头中会附带序列号和长度,接收端在收到数据后需要回复确认报文,确认报文中的ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号,这样一问一答的发送方式,能够使发送端确认发送的数据,已经被对方收到,发送端也可以一次性发送多包数据,接收端只需要回复一次ACK就行了这样发送端可以将待发送的数据分割成一系列的数据发送到对端,对端根据序列号和长度在接收后重构出完整的数据。

如果丢失了某些数据,可以要求发送端重传,比如丢失了100~199这100个字节接收端向发送端发送ACK等于100的报文,发送端发送后重传这包数据,接收端进行补齐,以上过程不区分客户端和服务端,TCP连接是全双工的,对于两端连接均采用上述机制

2)四次挥手

 处于连接状态下客户端和服务端,都可以发起关闭连接请求,此时需要4次挥手来进行连接关闭,假使客户端主动发起连接关闭请求它需要将服务端发送一包FIN包,表示要关闭连接,自己进入终止等待1状态(第一次挥手),服务端收到FIN包,发送一个ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态(第二次挥手),服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送完一包FIN包进入最后确认状态(第3次状态),客户端收到之后回复ACK包,进入超时等待状态,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包,立即关闭连接(第4次挥手

问题3:为什么客户端需要等待超时时间

为了保证对方已经收到ACK,因为假设客户端发送最后一包ACK后就释放了连接,一旦ACK包在网路中丢失,服务端将一直停留在最后确认状态,如果客户端发送发送最后一包ACK后等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间,这个机制和3次握手一样保证不可靠的信道上建立起可靠的连接。

问题四:为什么建立连接是三次握手、断开连接是四次

1)当Server端收到Client端的SYN连接请求报文时,会同时发送FYN+ACK报文。其中FYN报文是用来同步的,ACK报文是用来应答的。

2)但关闭连接时,Server端收到Client端的FIN报文时,可能并不会立即关闭Socket,所以只能先发送一个ACK报文,响应Client的应答。

3)当Server端所有的消息发送完毕之后,才能发送FIN报文。所以并不会一起发送。所以需要四次挥手

3 UDP

udp协议是基于非连接的,发送数据就是简单将数据包封装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系所以udp的性能损耗非常小,对于CPU,内存资源的占用也远小于tcp,但是对于网络传输过程中产生的丢包,udp协议并不能保证,所以udp在传输稳定性上要弱于tcp。

想要了解更多java小知识,可关注公众号:爪哇开发


http://chatgpt.dhexx.cn/article/bS2mLPIE.shtml

相关文章

AndroidStudio清理C盘下AVD模拟器的空间

刚刚打开了Explorer,他奶奶的,少了那么多G。【强迫症不能忍】 于是我查找了一下,发现AndroidStudio官方的模拟器占用很大空间。 就我的来说,一个模拟器.avd占用了我10G。草 在这个目录下可以看到.avd文件和.ini文件。.avd占了我…

AVD配置和使用

android 虚拟设备管理Android Virtual Device Manager以下为直接复制粘贴内容:AVD的全称为:Android Virtual Device,就是Android运行的虚拟设备,他是Android的模拟器识别。建立的Android要运行,必须创建AVD&#xff0c…

IDEA使用AVD Manager创建AVD

1、打开AVDManager 2、 3、 4、选择镜像 5、点击Finish 6、 启动报错: 16:51 Emulator: emulator: ERROR: This AVDs configuration is missing a kernel file! Please ensure the file "kernel-qemu" is in the same location as your system image.16:…

Android studio 创建avd失败

1.问题描述 第一次创建虚拟机,显示 consider using a system image with Google APIs to enable testing with Google Play Services,avd创建失败。 2.原因 sdk文件夹下的 .\sources\system-images 路径变更为 .\system-images。 💡sdk文件夹…

avd模拟器快捷键

正看到一个activity在屏幕朝向改变时有可能会泄漏的帖子,因为activity会重新create http://blog.csdn.net/tu_bingbing/article/details/10395129 结果发现还是自己测试一下的好,于是发现对avd的快捷键还是一无所知 重新google了下 国外版 http://w…

Appium基础 — Android模拟器(AVD)安装

当前市面上Android版本的模拟器还是挺多的,我们主要说明三款Android模拟器。 分别是:Android Virtual Devices、Genymotion、国内安卓模拟器。 Android Virtual Devices是Android SDK自带的模拟器,根据Android SDK不同平台版本,可…

android studio找不到avd,修改android studio中的avd sdk路径、avd sdk找不到的解决方案

类型:编程工具大小:1.53G语言:英文 评分:6.2 标签: 立即下载 很多人都遇到安装android studio之后需要下载gradle和重新下载avd sdk的问题 首先,设置环境变量,ANDROID_SDK_HOME值为sdk所在目录,GRADLE_HOME值为gradle所在目录,在path中添加%ANDROID_SDK_HOME%\bin;%GR…

android avd

avd 记录~ 一、avd 创建1.1、选择创建自己的设备1.2、自定义设备的参数配置1.3、选择自己创建的设备,next,再选择api即可。 二、avd 默认位置安装位置2.1、.android/avd 下2.1.1、.android/avd/xxxx.ini 文件2.1.2、.android/avd/.avd 下 config.ini 三、…

模拟器之AVD模拟器

以下内容全部或部分转自或参考于网络。 注:AVD模拟器运行很慢,第一次启动后可以不用再关闭。 现在新版的AVD模拟器也很快(如果CPU支持会更快),而且是免费的。 AVD模拟器上的按键和电脑物理键盘的对应关系 1.menu键…

Android Studio修改Avd虚拟机位置

一、Android Studio修改Avd虚拟机位置 创建虚拟机后默认位置 Android虚拟机一个版本解禁10个g, c盘往往不够用。 这样就需要修改 第一步:.ini文件和对应的虚拟机avd文件夹 第二步:将avd剪切到其他的盘中 第三步:修改.ini文件的path路径为新的目录

Could not start AVD

Could not start AVD 环境 linux下的Android Studio 问题描述 在启动模拟器时需要先下载Andriod 10.0 (google),我使用over the wall 下载起来比较快,下载之后选择已下载的手机类型之后弹出来“Could not start AVD”,或者在第二次开机使用时下拉选择AVD Manage…

Android AVD 存放路径修改

1、在D盘或者任何你想要的地方建立一个文件夹 AndroidAVD用于存放虚拟机。 2、右击“我的电脑”->"属性"->“高级系统设置"->"环境变量"->"系统变量"->"新建",新建一个环境变量,变量名为ANDROID_SDK_H…

IntelliJ IDEA修改AVD目录

IDEA中Android AVD目录默认是用户目录的 .android 目录下,占用C盘空间,修改AVD下载目录,只需在环境变量中添加 ANDROID_AVD_HOME 为变更的目录即可。 如: PS: 原用户目录的 .android可以直接删除,创建AVD时会重新在用户…

android avd 使用方法,【Android】Android Studio中创建和启动AVD

作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc。 本文选自书客创作平台第143篇文章。阅读原文 。 书客创作 使用Android Studio开发Android项目是很多程序员的首选,那么如何利用Android Studio创建模拟器进行开发呢…

linux avd 界面,Android Studio创建AVD

Android Studio是专门为Android开发设计的IDE,比Eclipse开发Android更加方便、快捷。 安装Android Studio以后,想运行AVD,出现了下面的错误: 提示没有安装HAXM,HAXM即Hardware Accelerated Execution Manager。HAXM使用…

android avd特别慢,android AVD 运行缓慢 解决办法

在PC上运行android虚拟机AVD,打开任务管理器我们会发现AVD进程(emulator-arm.exe)对CPU和内存的占用非常高,这直接导致AVD加载app时速度异常的慢,表现在启动AVD时,界面一直停留在android窗口,没有呈现出桌面。或者是在…

AndroidStudio AVD目录位置修改

文章目录 AVD目录修改小记 AVD目录修改小记 原来默认的AVD目录一般是C:\Users\XXX\.android\avd目录下面的,如果遇到C盘紧张,那么需要改到其他目录下面。 修改步骤: 首先用"ANDROID_SDK_ROOT"字段,字段的值就是你的And…

Android 模拟器AVD下载与使用

AVD的全称为:Android Virtual Device,是Android的虚拟设备(模拟器),使用模拟器进行调试,不用实时连到物理设备上测试,方便调试。 可以通过命令行创建和启动AVD,也可以运行AVD Manager.exe来创建和启动AVD。 1环境准备 1.1JDK安装与环境配置 JDK(JavaDevelopment Kit…

android 虚拟设备(AVD)的创建和使用

Android开发过程中使用虚拟设备(AVD)进行调试,不用实时连到物理设备上测试,方便了开发调试工作。下面将介绍eclipse中如何创建和使用虚拟设备。 一、创建AVD 1、在eclipse的window菜单下有个Android Virtual Device Manager菜单&…

hsf

hsf 参考文章: 1.HSF源码剖析 2.Http和RPC区别 3.分布式服务框架HSF 4.高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架 5.HSF的原理分析 6.阿里云 https://help.aliyun.com/video_detail/45223.html?spma2c4g.11174359.2.10.1ff848b3nhLYVX https…