第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函数。

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

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

相关文章

深入探讨Lambda表达式转换为委托类型的编译过程

了解了,如果要深入探讨Lambda表达式转换为委托类型的编译过程,我们需要关注C#编译器如何处理这个转换。这个过程涉及到编译时的类型推断、匿名方法的创建,以及生成对应的委托实例。我们来更详细地分析这个过程: 编译阶段 1. 解…

猫头虎分享:一文带你搞懂什么是SaaS、PaaS、LaaS、CaaS、FaaS、MBaaS

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

NodeLocal DNS介绍及部署应用

1 NodeLocal DNS是什么? NodeLocal DNSCache 通过在集群节点上运行一个 DaemonSet 来提高 clusterDNS 性能和可靠性。处于 ClusterFirst 的 DNS 模式下的 Pod 可以连接到 kube-dns 的 serviceIP 进行 DNS 查询。通过 kube-proxy 组件添加的 iptables 规则将其转换为…

463. Island Perimeter(岛屿的周长)

问题描述 给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] 1 表示陆地, grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有…

肆拾玖坊泰斗酒,春节佳节送礼首选

眼看着童年春节就要到来了,作为一家人难得团团圆圆的日子,除了和家人一同吃团圆饭看春晚以外,很多人还会在正月里开始走亲访友,这时候也是礼尚往来的好时机,选择一瓶上好的美酒,带着和家人美好的祝福,去拜访难得一见的亲朋好友,共度佳节,这样才有着浓浓的年味。 很多人不知道肆…

Unity类银河恶魔城学习记录7-6 P72 Bouncy sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

[AIGC] 利用 chatgpt 深入理解 Java 虚拟机(JVM)

Java 虚拟机(JVM)是 Java 编程语言的核心运行环境,它负责解释和执行 Java 字节码。它是 Java 程序能够跨平台运行的关键,因为不同的操作系统和硬件平台都有自己的指令集和体系结构,而 JVM 则提供了一个统一的运行环境&…

梵宁教育:虚假宣传不实控诉,真相公布于众

近期,网络上出现了一些关于梵宁教育虚假宣传的言论,给梵宁教育及广大消费者带来了困扰和误解。作为负责任的教育机构,梵宁教育有必要站出来澄清这些不实言论,还原事实真相。 一、梵宁教育的基本情况 梵宁教育是一家致力于为学生…

多线程---创建线程

1.概述 多线程是指从软件或者硬件上实现多个线程并发执行的技术。线程是程序中独立运行的程序片段,每个线程都有独立的执行流程,可以在同一时间内执行不同的任务。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提…

接口和抽象类的区别

不同点: 1、接口只能定义抽象方法不能实现方法,抽象类既可以定义抽象方法,也可以实现方法。 2、单继承,多实现。接口可以实现多个,只能继承一个抽象类。 3、接口强调的是功能,具有什么能力。抽象类强调的是…

怎样让MCU/SFU视频会议ovmedia 接入GB28281监控视频参会互动

在国内视频应用对GB监控接入是常规操作,很多系统需要接入监控视频交互处理。我们以ovmedia视频会议为例做一个接入互动。 GB28181协议在流媒体系统较为普及,我们以开源SRS系统对接监控端再接入会议(也可以用商用GB流平台,操作基本…

idea突然出现错误: “找不到或无法加载主类 @C:\Users\happ“解决方案

在公司敲代码时,编译器突然出现了以下报错,之前一直能正常运行 可以使用以下方法解决 找到启动类相关配置 找到Shorten command line,选择如下配置即可 进行到这里项目就能正常运行了,仅以此贴记录问题解决方案