当前位置: 首页 > news >正文

第13章 网络 Page738~741 13.8.3 TCP/UDP简述

libcurl是C语言写成的网络编程工具库,asio是C++写的网络编程的基础类型库

libcurl只用于客户端,asio既可以写客户端,也可以写服务端

libcurl实现了HTTP\FTP等应用层协议,但asio却只实现了传输层TCP/UDP等协议。

在学习http时介绍过“OSI网络七层”协议,但实际应用更多的是“TCP/IP五层协议”,在后者的分层中,HTTP和FTP均为在TCP均为在TCP之上实现的协议,如下图13-19所示

如图13-19所示,HTTP和FTP基于TCP实现,HTTP针对网页内容传输的应用,FTP针对文件数据传输的应用,分别定义非常不同的连接、交互方式以及报文格式。

假设我们想写一个下载新浪网页的客户端,使用libcurl,它已经帮我们实现并封装了HTTP客户端的相关工作,比如如何打包请求报文,如何解析服务端返回的报文等;但如果改为使用 asio,这一切都需要我们编写代码。

网络通信协议存在分层,和写程序时进行分层设计的原因相同,都是为了解决“通用”和“定制”之间的矛盾。

上层协议用于满足个性通信,下层协议用于满足共性通信

我们可以将TCP协议理解为是在马路行车需要的约定和技巧,比如靠右行驶,红灯停,绿灯行,夜间过十字路口打双闪……

那HTTP协议可以理解为在马路上驾驶自动档小轿车需要的约定和技巧,而FTP就是在马路上驾驶有挂斗的大货车需要的约定和技巧。

TCP和UDP都是传输层的协议,全称分别是“Transmission Control Protocol(传输控制协议)”和“User Datagram Protocol(用户数据报协议)”。二者重要的差别在于基于前者(TCP)的网络通信被称为“有连接”的通信,基于后者(UDP)的被称为“无连接”的通信。

可以用“电话”比喻“有连接”通信,用“信件”比喻“无连接”通信。

对于“有连接”通信,自然就有建立连接和断开连接的过程。TCP协议建立连接需要由客户端发起,服务端接受(当然也可以拒绝,从而无法建立连接)。为了在复杂的网络环境下保障建立连接的正确性,二者之间需要经过三次报文收发,俗称“三次握手”。

一旦连接建立,双方想痛快断开,则需要“四次握手”。当然会有意外情况造成连接硬生生断开,比如网线被拔了。不管怎样,所有未经四次交互确认的连接断开,都是“不优雅”的断开,相对的,正常断开的过程被称为“优雅的断开”。

不仅建立连接需要有确认,每一次上层应用数据的收发,

有连接的通信过程,都会有确认机制,在没有收到对端(peer)的确认之前,本地端(local)不会发新数据,最多是等到超时重发。

无连接的通信则不一样,发送方可以可劲儿地发,不管也管不了接收方有没有收到。

当然,如有需要,上层应用可以在无连接的传输层协议之上,尽量模拟有连接确认的重发等机制。但这真的是非常难喝繁琐的,所以当我们的应用确实很在意数据收发的可靠性,应该尽量使用TCP协议

【课堂作业】了解学习TCP/UDP的更多知识:

①TCP/UDP更多关于有连接、无连接的区别;

②二者的更多区别以及各自适用的场景;

③TCP建立和断开连接的过程;

④二者具体的报文格式;

⑤TCP之上的更多协议。

⑥什么叫IP地址,什么叫域名地址;

⑦网卡、路由器、防火墙等的作用和基本工作原理。

不管是UDP还是TCP通信,通信双方都可以分为客户端和服务端,其中客户端通常指通信的发起者。

对于TCP,它有明确的区分方法,即发起连接的一方。

对于UDP,客户端和服务端的区分并不明显,简单但不精确的理解是:将第一次发送报文的一方当做客户端。

区分客户和服务端的另一方法,服务端是可以以一对多的一方,典型的如TCP中服务端可以接受并同时处理多个连接。

注意,这里提的客户端和服务端都是指网络编程中的独立模块,而非对应到通信双方的进程。

一个进程可能既是通信的客户端,也是通信的服务端,一个进程也可以包含多个通信的客户端或服务端。

现实网络还存在另外一个复杂性,即网络和网络之间的可见性和连通性。

简单的两个结论:服务端必然要部署在客户端可以主动访问的地方,但客户端可以隐藏在服务端可能看不到摸不着的地方。理解这一事实的正确方法是上网查阅更多有关“互联网”“局域网”和“广域网”等知识。

TCP服务端必须可见,因此服务端必须有一个客户端可到达的地址通常是指一个主机地址和一个端口主机地址通常是一个域名或一个IP地址,用于指向一台主机。端口则是一个数字编号,有效范围1~65535,用于区分同一台主机内不同的服务端。

可以把服务器想象成一座楼(假设楼栋编号为女78号),有一面墙总共挖了65535个带着编号的窗(端)口,各个服务程序支着大大的耳朵贴近特定号码的端口上监听。

“监听”在此处的翻译是listen,和select一样是一个socket函数。服务端程序一开始监听,就算是准备就绪了。

客户端就是对面的一堆男生楼。开始有人在喊:“女78楼80号端口的王美丽,我是男25楼520号的张有钱,我要和你申请建立连接,请接收。”

女方心里暗自冷笑,“有钱就像连接美丽?”女方拒绝后,男方再三尝试后终于放弃。接着传来“女78楼80号端口的王美丽,我是男680楼52013号的付二袋,我要和你申请建立连接,请接收。”王美丽欣然接受连接。

“接受”在此处的翻译是accept,也是一个socket函数。

相关文章:

第13章 网络 Page738~741 13.8.3 TCP/UDP简述

libcurl是C语言写成的网络编程工具库,asio是C写的网络编程的基础类型库 libcurl只用于客户端,asio既可以写客户端,也可以写服务端 libcurl实现了HTTP\FTP等应用层协议,但asio却只实现了传输层TCP/UDP等协议。 在学习http时介绍…...

Tomcat要点总结

一、Tomcat 服务中部署 WEB 应用 1.什么是Web应用 (1) WEB 应用是多个 web 资源的集合。简单的说,可以把 web 应用理解为硬盘上的一个目录, 这个目录用于管理多个 web 资源。 (2)Web 应用通常也称之为…...

Ubuntu 20.04 安装RVM

RVM是管理Ruby版本的工具,使用RVM可以在单机上方便地管理多个Ruby版本。 下载安装脚本 首先使下载安装脚本 wget https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer 如果出现了 Connection refused 的情况, 可以考虑执行以下命令修改dns,再执…...

Ps:污点修复画笔工具

污点修复画笔工具 Spot Healing Brush Tool专门用于快速清除图像中的小瑕疵、污点、尘埃或其他不想要的小元素。 它通过分析被修复区域周围的内容,无需手动取样,自动选择最佳的修复区域来覆盖和融合这些不完美之处,从而实现无痕修复的效果。 …...

JAVA面试题17

什么是Java中的静态内部类?它与非静态内部类有什么区别? 答案:静态内部类是定义在另一个类中的类,并且被声明为静态。与非静态内部类不同,静态内部类不依赖于外部类的实例,可以直接访问外部类的静态成员。 …...

数据备份和恢复

数据备份和恢复 什么情况下会用到数据备份呢 数据丢失的场景 人为误操作造成的某些数据被误操作 软件BUG造成数据部分或者全部丢失 硬件故障造成数据库部分或全部丢失 安全漏洞被入侵数据恶意破坏 非数据丢失场景 基于某个时间点的数据恢复 开发测试环境数据库搭建 相同数据库的…...

核心篇 - 集成IS-IS配置实战

文章目录 一. 实验专题1.1. 实验1:配置单区域集成IS-IS1.1.1. 实验目的1.1.2. 实验拓扑1.1.3. 实验步骤(1)配置IP地址(2)配置IS-IS 1.1.4. 实验调试(1)查看邻接表(2)查看…...

【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅

这份技术报告主要关注两个方面:(1)我们的方法将各种类型的视觉数据转化为统一的表示形式,从而实现了大规模生成模型的训练;(2)对Sora的能力和局限性进行了定性评估。报告中不包含模型和实现细节…...

MVC 、DDD、中台、Java SPI(Service Provider Interface)

文章目录 引言I 单体架构DDD实现版本1.1 核心概念1.2 DDD四层架构规范1.3 案例1.4 请求转发流程II 领域服务调用2.1 菱形对称架构2.2 中台III Java SPI3.1 概念3.2 实现原理3.3 例子:本地SPI找服务see alsojava -cp</...

C++单例模式的实现

单例模式就是在整个程序运行期都只有一个实例。在代码实现方面&#xff0c;我们要限制new出多于一个对象这种情况的发生。而不是仅仅依靠无保障的约定。 目前大多数的编程语言的做法都是私有化构造函数&#xff0c;对外提供一个获取实例的接口。这样做的目的使实例的创建不能在…...

rust函数 stuct struct方法 关联函数

本文结合2个代码实例主要介绍了rust函数定义方法&#xff0c;struct结构体定义、struct方法及关联函数等相关基础知识。 代码1&#xff1a; main.rc #[derive(Debug)]//定义一个结构体 struct Ellipse {max_semi_axis: u32,min_semi_axis: u32, }fn main() {//椭圆&#xff0…...

浅谈基于中台模式的大数据生态体系的理解

这篇文章主要浅谈一下我对大数据生态体系建设的理解。 大数据生态系统为高并发&#xff0c;高吞吐&#xff0c;高峰值&#xff0c;高堆积等大规模数据的采集&#xff0c;处理&#xff0c;计算&#xff0c;存储&#xff0c;服务提供了完善的处理体系&#xff0c;致力于打造核心数…...

MySQL的锁机制

一&#xff1a;概述 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免争抢&#xff09;&#xff1b; 在数据库中&#xff0c;除传统的计算资源&#xff08;如CPU&#xff0c;RAM&#xff0c;I/O等&#xff09;的争用以外&#xff0c;数据也是一种供许多用…...

已解决ImportError: cannot import name ‘PILLOW_VERSION‘异常的正确解决方法,亲测有效!!!

已解决ImportError: cannot import name PILLOW_VERSION异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 报错原因 解决思路 解决方法 总结 在Python项目开发中&#xff0c;依赖管理是保证项目正常运行的关键环节。然而&…...

力扣:300. 最长递增子序列

动态规划: 1. 先定义dp数组来表示在下标为i时最长递增子序列&#xff0c;先初始化一下每个下标的值为dp【i】1。同时我们要判断在下标i之前的最长的递增子序列为多少&#xff0c;在判断当前的下标i是否满足递增的条件满足的话就进行dp【i】的重新赋值。之后要更新接受的最长递…...

Swing程序设计(10)列表框,文本框,文本域,密码框

文章目录 前言一、列表框二、文本框&#xff08;域&#xff09; 1.文本框2.文本域三、密码框总结 前言 该篇文章简单介绍了Java中Swing组件里的列表框、文本框、密码框。 一、列表框 列表框&#xff08;JList&#xff09;相比下拉框&#xff0c;自身只是在窗体上占据固定的大小…...

【Java八股面试系列】JVM-常见参数设置

目录 堆内存相关 显式指定堆内存–Xms和-Xmx 显式新生代内存(Young Generation) 显式指定永久代/元空间的大小 垃圾收集相关 垃圾回收器 GC 日志记录 处理 OOM JDK监控和故障处理工具总结 堆内存相关 Java 虚拟机所管理的内存中最大的一块&#xff0c;Java 堆是所有线…...

【Python--Web应用框架大比较】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Django Django太重了&#xff0c;除了web框架&#xff0c;自带ORM和模板引擎&#xff0c;灵活和自由度不…...

Effective Objective-C 学习第三周

理解引用计数 Objective-C 使用引用计数来管理内存&#xff1a;每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活&#xff0c;那就递增其引用计数&#xff1a;用完了之后&#xff0c;就递减其计数。计数变为 0时&#xff0c;就可以把它销毁。 在ARC中&#xf…...

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec&#xff1a;skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...