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

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

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

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

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

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

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

【Java八股面试系列】JVM-常见参数设置
目录 堆内存相关 显式指定堆内存–Xms和-Xmx 显式新生代内存(Young Generation) 显式指定永久代/元空间的大小 垃圾收集相关 垃圾回收器 GC 日志记录 处理 OOM JDK监控和故障处理工具总结 堆内存相关 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线…...

【Python--Web应用框架大比较】
🚀 作者 :“码上有前” 🚀 文章简介 :Python 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Django Django太重了,除了web框架,自带ORM和模板引擎,灵活和自由度不…...

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

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量
人工智能专栏文章汇总:人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec:skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…...

【教程】Kotlin语言学习笔记(一)——认识Kotlin(持续更新)
写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 文章目录 【Kotlin语言学习】系列文章一、Kotlin介绍二、学习路径 一、…...

MySQL性能分析1
1、查看执行频次 查看当前数据库的INSERT,UPDATE,DELETE,SELECT的访问频次,得到当前数据库是以插入,更新和删除为主还是以查询为主,如果是以插入,更新和删除为主的话,那么优化比重可以轻一点儿。 语法: …...

四、案例 - Oracle数据迁移至MySQL
Oracle数据迁移至MySQL 一、生成测试数据表和数据1.在Oracle创建数据表和数据2.在MySQL创建数据表 二、生成模板文件1.模板文件内容2.模板文件参数详解2.1 全局设置2.2 数据读取(Reader)2.3 数据写入(Writer)2.4 性能设置 三、案例…...

ABC340 A-F题解
文章目录 A题目AC Code: B题目AC Code: C题目AC Code: D题目AC Code: E题目思路做法时间复杂度AC Code: F题目思路AC Code: A 题目 模拟即可,会循环都能写。 AC Code: #include …...

微软 CMU - Tag-LLM:将通用大语言模型改用于专业领域
文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 论文地址:https://arxiv.org/abs/2402.05140 Github 地址:https://github.com/sjunhongshen/Tag-LLM 大语言模型(…...

Kafka集群安装与部署
集群规划 准备工作 安装 安装包下载:链接:https://pan.baidu.com/s/1BtSiaf1ptLKdJiA36CyxJg?pwd6666 Kafka安装与配置 1、上传并解压安装包 tar -zxvf kafka_2.12-3.3.1.tgz -C /opt/moudle/2、修改解压后的文件名称 mv kafka_2.12-3.3.1/ kafka…...

C++初阶(十一) list
一、list的介绍及使用 1.1 list的介绍 list的文档介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点…...

图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化
图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化 卷积神经网络的一些基本概念:图像卷积、步长、填充、特征图、多通道卷积、权重共享、感受野、池化 1.图像卷积、步长、填充 图像卷积:卷积核矩阵在一个原始图像矩阵上 “从上往下、…...

CMake进行C/C++与汇编混合编程
1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…...

缓存预热!真香
预热一般指缓存预热,一般用在高并发系统中,为了提升系统在高并发情况下的稳定性的一种手段。 缓存预热是指在系统启动之前或系统达到高峰期之前,通过预先将常用数据加载到缓存中,以提高缓存命中率和系统性能的过程。缓存预热的目…...