【网络篇】TCP vs UDP底层区别+网络编程概念

在这里插入图片描述

大家好呀
我是浪前

今天讲解的是网络篇的第三章:网络编程概念和TCP&UDP的区别

网络编程概念+TCP和UDP的区别

    • 跨主机通信:
    • 网络编程
      • 插座:
      • 网络编程的本质:
    • 网络编程的重要概念:
      • 客户端和服务器:
    • 客户端和服务器的交互模式
    • TCP 和UDP的区别

大家好呀,我们今天继续来学习网络篇

网络篇的前两篇博客主要是进行了网络初识,主要介绍了网络的基本概念和背景流程

接下来的章节会重点介绍网络编程:

也就是去实际地编写代码,通过代码来完成基于网络的跨主机通信

跨主机通信:

实现跨主机通信有很多的方式,如下所示:

  1. TCP/IP网络
  2. 蓝牙通信
  3. 近场通信(NFC)
  4. 毫米波通信
  5. 等等

而TCP/IP网络是我们日常编程中最容易涉及到的最通用的跨主机通信的方式
蓝牙通信的方式特点:功耗低,待机时间长,效率也低
近场通信(NFC): 需要在现实中贴的很近才可以
毫米波通信: 功率较高,带宽也高,抗干扰能力差

所以我们下面就直接来学习TCP/IP的跨主机通信方式吧~

网络编程

网络编程的定义就是:通过网络,让两个主机之间能够进行通信,基于这样的通信来完成一定的功能

插座:

注意:需要一组插座才可以完成网络编程:

插座的定义:

进行网络编程的时候,需要操作系统提供一组API,通过这些API才能完成网络编程
API就是应用层和传输层之间交互的路径

这一组API就称作“Socket API”,也就是叫做插座。

通过这一套Socket API 就可以解决不同主机之间,不同系统之间的网络通信了

在传输层这一层里面提供的网络协议,主要是TCP和UDP协议,
而TCP和UDP这两个协议的工作原理和特性差别很大,导致使用了这两个协议进行的网络编程也存在一定的差别,所以系统就提供了两套Socket API

TCP有一套Socket API ,UDP也有一套Socket API

网络编程的本质:

网络编程的本质就是学习传输层给应用层提供的API就可以写网络编程的代码,通过代码把数据交给传输层,进一步通过层层封装,就可以把数据通过网卡发送出去了

我们要学习的不仅仅是API,也要学习网络程序的基本工作流程

后端开发:就是服务器上的程序开发
而服务器就会涉及到大量的网络通信
虽然实际开发中使用的是一些框架,比如Spring
不会直接用到系统原生的API,但是框架的背后,也是封装了系统API来实现网络通信的

只要我们掌握了这些基础API,就可以更好地理解框架的工作流程,也可以拥有自己去实现框架/魔改框架的能力,然后搭配上数据结构和算法能力才是未来的核心竞争力,而不是学会了什么特别高大上的流行框架:

如下图所示,一图胜千言~

![[表情包.gif]]

网络编程的重要概念:

客户端和服务器:

客户端 vs 服务器

客户端的定义:

客户端就是在网络中,主动发起通信的一方,就是客户端

服务器的定义:

服务器就是被动接受的一方

客户端和服务器的角色不是固定不变的~

同一个程序在不同的场景中,可能是客户端,也可能是服务器

举一个大家都喜欢听的例子:

在少男少女谈恋爱的过程中:一般是男生追求女生,
但是如果一直是男生单方面努力,全靠男生主动,这个恋爱大概率不可能谈成,男生要么追不上,要么即使最后费尽千辛万苦才谈上,但是这个感情也难以长久

那么恋爱的正确打开方式是什么呢?
在这里插入图片描述

正常情况一般是男生主动了一段时间之后,女生也能够主动,也就是女生也有积极的回应男生的追求,这样后面感情才会长长久久

给大家支一个小妙招~
当你的女朋友给你发消息,说肚子疼,最近不舒服的时候,你千万不要回复“多喝热水/岩浆”这样的废话,记住这句话

Talk is cheaper, show me the action

你先不要急着回复消息,如果你们是同校,那么你立即去买好热好红糖水和布洛芬,然后走到她的宿舍楼下,叫她下来拿…

如果你们是异地,你可以立马在美团买药的购物车里面加满布洛芬+红糖水的商品,然后配送到她的地点,到了之后直接call她电话,告诉她去拿药…

切实的行动胜过千言万语~
好啦,今天的恋爱小课堂就结束啦,我们拉回正题

所以程序在网络中的角色是可以发生改变的,主动的时候就是客户端,被动的时候就是服务器

请求(request)

请求的定义:客户端给服务器发送的数据称为 “请求”

响应(response)

响应的定义:服务器给客户端返回的数据称为“响应”

客户端和服务器的交互模式

客户端和服务器一共有四种交互模式:

  1. 一问一答
  2. 一问多答
  3. 多问一答
  4. 多问多答

我们分别来介绍:

1: 一问一答:

一个请求对应一个响应,一对一

在后续的网站开发(web开发)中都是这种一问一答的交互形式
如下图所示;
在这里插入图片描述

2: 一问多答:

客户端的一个请求对应了服务器的多个响应

使用场景: 适用于下载的场景,当你要下载一个大的文件时,此时客户端发送这个下载任务请求的时候,服务器就分成了多个响应

3: 多问一答:

客户端的多个请求只对应了一个服务器的响应
使用场景:上传

4: 多问多答:

一个请求可能对应多个响应
一个响应也可能对应多个请求
这个场景主要涉及到“远程控制/远程桌面”
我们进行的鼠标键盘操作,都会作为一个个请求发送出去
我们看到的一个个画面都对应了一个个响应

想要进行网络编程,需要使用系统的API,这个API本质上是传输层提供的
传输层涉及到的协议主要有两种: 一个是TCP 一个是UDP
由于这两个协议之间的差异还是很大的,所以TCP和UDP的API各不相同
在这里插入图片描述

TCP 和UDP的区别

TCP和UDP这两种协议的特性(工作原理) 差异很大,导致使用这两种协议进行网络编程,也存在一定的差别,系统就分别提供了两套API

TCP和UDP的区别:

  1. TCP是有连接的,UDP是无连接的
  2. TCP是可靠传输的,UDP是不可靠传输的
  3. TCP是面向字节流的,UDP是面向数据报的
  4. TCP和UDP都是全双工的

TCP是有连接的,UDP是无连接的

这里的连接是抽象的概念:不是物理上的连接,而是彼此保留了对方的关键信息
计算机中这种抽象的连接是很常见的

此处的连接本质上就是建立连接的双方,各自保存对方的信息,连接的特点是双方都认同
只要通信的双方都记录了对方的关键信息,此时连接就建立好了

TCP要想通信必须先建立连接,即要先保留对方的关键信息,连接建立好了之后,才能进行后续的通信

但是:如果A想和B建立连接,但是B不愿意,那么连接就会失败

连接的本质就是各自保存对方的相关信息

举一个例子~

小坤同学给小纪同学打电话,小纪同学接通了,这个连接才成功,如果小纪同学没有接,那么连接失败

这个连接是如何实现的?
在客户端中,有一些数据结构记录了谁是小坤同学的服务器

在服务器中,有一些数据结构记录了谁是小坤同学的客户端

在这个数据结构中,可以保存很多的信息,所以一个客户端可以保存很多的服务器,一个服务器也可以保存很多的客户端

TCP是有连接的,UDP是无连接的

UDP不需要进行连接,UDP想要进行通信,就直接发送数据即可,不需要征得对方的同意,UDP自身也不会保存对方的信息
虽然UDP不知道对方的信息,但是写程序的人得知道,UDP自己不会保存,但是程序员调用UDP的socket api的时候要把对方的位置作为参数给传过去

TCP会先去保存对方的关键信息,然后再进行连接

UDP是不会去保存对方的信息,直接进行的通信

TCP是可靠传输,UDP是不可靠传输

在网络上存在的“异常情况“非常多,无论使用什么样的软硬件技术手段,都没有办法100%保证网络数据能够从A一定传输到B

网络上进行通信,A -> B 发送一个消息,这个消息也不可能做到百分之百送达的

再牛逼的技术也比不过挖掘机的一铲子
无线通信技术的手段,当然很厉害,但是传输的效率也比不过有线的
无线受到环境干扰的因素更加多了

TCP的可靠传输是退而求其次,可靠传输不是100%送达,

而是如果A给B发送消息,消息是否会真的送达到B ,
A是知道的,即A会知道消息是发送失败还是发送成功,
如果发送失败,那么A就可以在发送失败的时候采取一定的措施(尝试重传之类的)

所以可靠传输指的是: A在发送消息之后,A能够知道是发送成功还是发送失败

在TCP中就内置了可靠传输机制
在UDP中就没有内置可靠传输机制

为什么UDP不内置这个可靠传输机制呢?
因为这个可靠传输虽然很好,但是也还是要付出代价的
可靠传输是要去付出代价来交换的
做任何事情都是要付出代价的

如果内置了可靠传输机制,那么会导致:

  1. 机制更加复杂
  2. 传输效率会降低

TCP内置了可靠传输机制之后,在发送数据之后可以知道是否发送成功

UDP没有内置可靠传输机制,在发送数据之后不知道是否发送成功

TCP是面向字节流的,UDP是面向数据报的
此处的字节流和文件操作中的字节流是一个意思

TCP也是文件操作一样,以字节为单位来进行传输的

UDP则是按照数据报为单位来进行传输的,每次传输的基本单位是一个数据报

这个数据报是由一系列的字节构成的特定的结构

UDP数据报是有一个严格的格式的,一次只能传输一个完整的数据报,不可以只传输半个数据报

网络通信数据的基本单位,涉及到多种说法:

  1. 数据报(Datagram)
  2. 数据包(Packet)
  3. 数据帧(Frame)
  4. 数据段(Segment)

TCP和UDP都是全双工的

什么是全双工?

一个信道,允许双向通信,就是全双工
一个信道,只能单向通信,就是半双工

代码中使用一个Socket对象,就可以发送数据也能够接收数据,这个就是全双工

操作系统提供的网络编程的API 叫做“socket api”,意为插头,插座

相当于代码中使用一个Socket对象,就可以发送数据也能够接受数据:

一个网线里面是有8根线,这个8根线分为两组,4个一组,每一组都可以完成一个完成的通信过程)
分为两组就是为了防止万一其中的一根线坏了,那么另一组也可以正常地工作

这个一组中的4根线,有的负责上传,有的负责下载,这里的全双工就是靠着多根线来完成的
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EMIF详解

一、EMIF的基本定义 EMIF(External Memory Interface,外部存储器接口) 是嵌入式处理器(如DSP、FPGA、SoC)用于连接外部存储器的专用硬件接口模块,负责管理处理器与存储器之间的地址/数据总线、控制信号及时…

Keil MDK 编译问题:function “HAL_IncTick“ declared implicitly

问题与处理策略 问题描述 ..\..\User\stm32f1xx_it.c(141): warning: #223-D: function "HAL_IncTick" declared implicitlyHAL_IncTick(); ..\..\User\stm32f1xx_it.c: 1 warning, 0 errors问题原因 在 stm32f1xx_it.c 文件中调用了 HAL_IncTick(),但…

Java Web项目(一)

框架 java web项目总工分为两部分:客户端(前端)和服务端(后端) 客户端发起请求,服务端接受请求并进行处理 发起请求的方式:from表单、jQuery ajax from表单 造成全局的变化,在发…

Dify部署内网时遇到的代理问题及解决办法

大家知道,在公网环境下利用docker安装dify源码镜像比较容易,详见我之前的文章,基于dify开发agent、workflow等非常方便,本次想着在内部网络环境下也完成部署,以方便更多的人使用,但在部署到内网环境下&…

多节点监控的docker管理面板Portainer安装指南:家庭云计算专家

背景 Portainer 是一个轻量级且功能强大的容器管理面板,专为 Docker 和 Kubernetes 环境设计。它通过直观的 Web 界面简化了容器的部署、管理和监控,即使是非技术用户也能轻松上手。Portainer 支持多节点管理,允许用户从一个中央控制台管理多…

Linux内核哈希表学习笔记

前沿 近期项目中需要给自定义的驱动增加一个功能存储相关的数据信息。结合实际业务层面,最终决定采用哈希表的结构来存储。因为其具备快速查找,插入和删除。其实现原理通过散列函数映射到指定位置。时间复杂度O(1).而且运算速度也快,很适合处理大量的数据场景。但是其也有一…

对于在线教育或知识付费类网站视频处理方案

一、视频格式: 1. 推荐格式:HLS(HTTP Live Streaming) 优势‌: ‌自适应码率‌:根据用户网络状况自动切换清晰度,避免卡顿。‌广泛兼容性‌:iOS/macOS 原生支持,Android…

Deepseek输出的内容如何直接转化为word文件?

我们有时候会直接利用deepseek翻译别人的文章或者想将deepseek输出的内容直接复制到word文档里。但是文本格式和word是不对应的。这时候需要输入如下命令: 以上翻译内容的格式和排版要求如下: 1、一级标题 字体为黑体(三号)&…

【Vue】组件通信(Props/Emit、EventBus、Provide/Inject)

个人主页:Guiat 归属专栏:Vue 文章目录 1. Props/Emit 父子组件通信1.1 Props 向下传递数据1.2 Emit 向上传递事件 2. EventBus 跨组件通信2.1 创建事件总线2.2 使用事件总线2.3 EventBus 优缺点 3. Provide/Inject 深层组件通信3.1 基本使用3.2 响应式处…

vulnhub sunset系列靶机合集(部分)

描述:该合集包含sunset系列适合新手的四个靶机(sunset:1、dusk、sunrise、noontide)的渗透全过程。 靶机下载地址:Vulnerable By Design - Search: sunset ~ VulnHubhttps://www.vulnhub.com/?qsunset sunset:1 渗透过程 信息…

【MySQL】MySQL的基础语法及其语句的介绍

1、基础语法 mysql -h【主机名】 -u【用户名】 -p //登录MySQL exit或quit; //退出MySQL show database; //查看MySQL下的所有数据库 use 【数据库名】; //进入数据库 show tables; //查看数据库下的所有表名 *MySQL的启动和关闭 &am…

2025-4-20-C++ 学习 数组(1)

数组 2025-4-20-C++ 学习 数组(1)P1428 小鱼比可爱题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1说明/提示题解代码P1427 小鱼的数字游戏题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1说明/提示数据规模与约定题解代码P5727 【深基5.例3】冰雹猜想题目描…

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之LCD)

目录 ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之LCD)简介模块概述功能定义架构位置核心特性 LCD外设分析LCD外设概述LCD外设层次架构图 LCD外设API和数据结构外设层API公共API内部数据结构 LCD外设配置选…

面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?

目录 1.引言 2.原理 3.所有权模型与指针选择 4.复杂场景的决策策略 5.注意事项 6.总结 1.引言 当两个对象通过 shared_ptr 相互引用时,会产生循环引用问题,导致内存泄漏。因为这两个对象的引用计数永远不会变为 0,即使它们在程序的其他…

QT聊天项目DAY06

1.从git上同步项目 编译测试,编译通过 Post请求测试 测试成功 2. email is 打印有问题,检查 解析结果是存储在jsonResult中的,修改 3. 客户端实现Post验证码请求 3.1 同步Qt客户端项目 检查QT版本,由于我在公司用的还是QT5.12.9…

PHP腾讯云人脸核身获取FaceId

参考腾讯云官方文档: 人脸核身 合作方后台上传身份信息_腾讯云 前提:已经获取了SIGN Ticket。获取参考文档: PHP腾讯云人脸核身获取SIGN Ticket-CSDN博客 public function getTxFaceId($uid,$name,$idNo){$appId ;$userId $uid;$nonce …

用 Deepseek 写的uniapp油耗计算器

下面是一个基于 Uniapp 的油耗计算器实现&#xff0c;包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面&#xff1a; <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…

Redis ④-通用命令

Redis 是一个 客户端-服务器 结构的程序&#xff0c;这与 MySQL 是类似的&#xff0c;这点需要牢记&#xff01;&#xff01;&#xff01; Redis 固然好&#xff0c;但也不是任何场景都适合使用 Redis&#xff0c;一定要根据当前的业务需求来选择是否使用 Redis Redis 通用命令…

HarmonyOs学习 环境配置后 实验1:创建项目Hello World

HarmonyOS开发入门&#xff1a;环境配置与Hello World实验 实验目标 掌握HarmonyOS开发环境配置&#xff0c;创建首个HarmonyOS应用并实现"Hello World"界面展示 实验准备 已安装DevEco Studio开发环境已配置HarmonyOS开发依赖项熟悉基本TypeScript/ArkTS语法&am…

HTTP:十.cookie机制

Cookie概念及类型 HTTP cookie,简称cookie,又称数码存根、“网站/浏览+魔饼/魔片”等,是浏览网站时由网络服务器创建并由网页浏览器存放在用户计算机或其他设备的小文本文件。Cookie使Web服务器能在用户的设备存储状态信息(如添加到在线商店购物车中的商品)或跟踪用户…