理解计算机系统_网络编程(2)

前言
       

        以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定

引入

        接续上一篇理解计算机系统_网络编程(1)-CSDN博客

国际互联网

        Internet的硬件与软件组织

        本书原话如下(黑体字):

        全球IP因特网是最著名和最成功的互联网络实现.以下是一个客户端--服务器应用程序的基本硬件和软件组织

         每台因特网主机都运行实现TCP/IP协议,几乎每个现代计算机系统都支持这个协议 

        ----解读:从图中可以看出,TCP/IP协议由操作系统内核支持,并对外提供套接字接口.程序员是面向套接字接口编程的.用户代码将由系统调用转化成机器代码控制硬件(网络适配器)完成数据传送.

        程序员怎样看待网络

        从程序员的角度,我们可以把因特网看做一个世界范围的主机集合,满足以下特性:

                1.主机集合被映射为一组32位的IP地址

                2.这组IP地址被映射为一组称为因特网域名的标识符

                3.因特网主机上的进程能够通过连接和任何其他因特网主机上的进程通信  ---黑体字是原话

        ----解读:不管主机是客户端还是服务器,都以IP地址在网络上标识其身份.对于服务器而言,IP地址被映射成因特网域名.客户端与服务器之间通过连接进行通信

====================内容分割线↓============================================

        IPv4和IPv6       

        理论上IPv4已经够用了

        问题:互联网上主机拥有自己的IP地址,IP地址是32位,最大数是40多亿,意味着超过这个数字的主机设备将不能联网,但事实真的如此吗?

        答案是否定的.之前笔者提到过以多个数据来建立"层级"或者更大数据的例子.例如:8位机理论上可以寻址个数也可以是无限的,原理是通过"指针"来延展.单个8位能表达256个数,而当8位数据放的是指针,用2个8位数据就能表达65536个数,即达到16位数的效果.

        IP地址的延展基于相同的思想.一个IP地址本来用作映射一台主机,当用一个IP地址映射一个网关的时候,这个IP地址可以表示一个子网络里的n台主机,如果n台主机仍觉得不够,那么在子网络中的某个IP地址再次用作网关,这时最初的那个IP地址可以表示(n-1)*(n-1)台主机,依此类推.当然这是一种简化的表达,其中可能牵涉到带宽分配,路由算法等细节,笔者不知道具体实现,但有这样的技术.

        这种思想也可以放入数据结构中,建立层级的数据类型,笔者以前帖子中有所提及,可翻看

====================内容分割线↑============================================

接下来部分内容逐一分析IP地址,域名映射,主机通信

IP地址

        本书原话:一个IP地址就是一个32位无符号整数,网络程序将IP地址存放在以下结构中

struct in_addr{uint32_t s_addr;
}

        ----解读:一个标量地址被放入一个结构中,有些令人费解,用个全局变量就可以表达的.而本书对此表示承认,说"是套接字接口早期实现的不幸产物",目前体会不到,不作解读.

大端法和小端法

        本书原话:在IP地址结构中存放的地址总是以(大端法)网络字节顺序存放的,即使主机字节顺序是小端法.

        ----解读:大端法和小端法没有多难,但可以加深对数据存储和访问的理解,所以值得一说.

        假设有个32位地址0x12345678,里面的数字是0x11223344.用C语言表示如下:

int *p= 0x12345678;   //指针指向该地址
*p=0x11223344;        //赋值
p+=4;                 //往下偏移4,指向0x1234567c

        有一个问题:每次指针偏移4,指向下一个地址,那中间地址数据在哪里?0x12345679,0x1234567a,0x1234567b?

        实际上*p=0x11223344这个32位数包含了这三个字节的值.一个字节是8位,最大表示0xff(十进制255) .*p把这四个字节的值一起表达了,0x12345678这个地址里的数是0x44,地址79里的数是0x33,地址7a里的数是0x22,地址7b里的值是0x11.图示如下:

        大小端法在字节顺序上有所不同,图示如下:

        注意:笔者查了某度,说法似乎不一致.细想是一样的,把左边定义成小端或者右边定义成小端,不影响结果.

        相比较,小端法适合思维习惯(当然也可能是先入为主,先学主机表示再学网络).

        对于程序员来说,大端法和小端法不会影响代码,不必去纠结.那么为什么要作区别呢?笔者估计在机器层面,把数据从网络上取下来的时候,位置不同数据不同.程序员只需要记住某种情况下需要调用这个api.

IP地址和点分十进制串之间的转换

        具体不知道在什么情况下能用得上,所以不做过多解读.

        记住一个例子:十进制串0xffffffff对应的IP地址是255.255.255.255

因特网域名

        因特网客户端和服务器互相通信时使用的是IP地址.然而,对于人们而言,大整数是很难记住的,所以因特网也定义了一组更加人性化的域名,以及一种将域名映射到IP地址的机制.---黑体字是原话

        ---解读:域名的由来

        域名集合形成一个层次结构

        一旦一个组织得到一个二级域名,那么他可以在这个子域中创建任何新的域名.如cs.cmu.edu

         ---解读:创建一个网站至少需要二级域名.

DNS数据库

        因特网定义了域名集合和IP地址集合之间的映射.直到1988年,这个映射都是通过一个叫做HOSTS.TXT的文本文件来手工维护.从那以后,这个映射通过分布世界范围内的数据库DNS(Domain Name System,域名系统)来维护.

        DNS数据库由上百万的主机条目结构组成,其中每条定义了一组域名和一组IP地址之间的映射.从数学意义来讲,可以认为每条主机条目就是一个域名和IP地址的等价类.

        ---解读:条目类设计

//不太可能设计
struct Entry{vector<string> domain_name;vector<string> IP_address;
}

        域名系统包含有上百万个Entry对象,可对其进行添加,查找和修改等操作.试试看着不太可能,同样应选择"层级"的数据结构---笔者前面帖子有阐述        

//有可能设计
struct Com{string next_name;vector<string> IP_address;vector<Com> com;
}

        查找算法:将域名按照"."隔开的字符串取出,每个字符串交给next_name做匹配,如果匹配成功,则IP_address是所需要的字符串集合---即上面的点分十进制串,再将其转化成IP地址,可访问对应服务器.

        如果按照这个思路,需要确定一级域名的所有形式,即第一层域名必须只有com,edu,gov,org和net.然后分别写出struct Edu,struct Gov,struct Org和struct Net

        注意:能不能写到一起设计个类?因为至少两层域名才得到IP地址,比如csdn.net可以但是net不可以.所以类型设计的时候分开比较好.

域名和IP地址的对应

        1>一一对应

        一个域名对应一个IP地址

        2>一对多

        一个域名对应多个IP地址.这种场景比如一个大型网站,流量非常大,需要在全球范围内多个国家架设多个服务器来应对,或者应对其他复杂情形.

        3>多对一

        多个域名对应一个IP地址

        ---解读:按照前面条目类型的说法:主机条目就是一个域名和IP地址的等价类(黑体字是原话),也不用考虑那么多,几百万的数据量不是很大,搜索和添加的影响都不大,他的类型设计仍然按照一一对应关系.

因特网连接

       本书原话: 因特网客户端和服务器通过连接发送和接收字节流来通信.连接是点对点的,全双工的,可靠的.

        连接由"地址:端口"表示.客户端套接字地址由内核自动分配,服务器套接字地址中的端口通常是某个知名端口.

        如图,客户端和服务器之间的连接由下列套接字对唯一确定了.

        (128.2.194.242:51213,208.216.181.15:80)

        ---解读:因特网连接的规定,套接字对确定连接,也没说怎么实现的,留待后面内容解读. 

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

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

相关文章

【盈达科技】GEO(生成式引擎优化)底层逻辑

​​一、GEO的现状​​ ​​技术快速迭代​​ 生成式AI&#xff08;如ChatGPT、Claude、Google SGE&#xff09;正在成为用户获取信息的核心入口&#xff0c;传统搜索引擎的流量被分流。主流平台如Google推出“生成式搜索体验&#xff08;SGE&#xff09;”&#xff0c;Bing整合…

VS Code 智能代理模式:重塑开发体验

在编程领域&#xff0c;效率与精准度无疑是开发者们永恒的追求。而如今&#xff0c;VS Code 推出的智能代理模式&#xff08;Agent Mode&#xff09;&#xff0c;正以前所未有的方式&#xff0c;彻底颠覆了传统开发流程&#xff0c;为程序员们带来了一场前所未有的效率革命。本…

【回眸】Aurix TC397 IST 以太网 UDP 相关开发

前言 关于移植IST功能至 Infineon TC397上主要涉及到UDP发送报文及接收。IST是安全诊断相关的工作 Nvidia IST介绍 Orin系列芯片会提供一种机制来检测由系统内测&#xff08;IST&#xff09;所产生的永久的故障&#xff0c;IST 应该在 Orin-x 功能安全系统中使用期间被启动。…

Mediamtx与FFmpeg远程与本地推拉流使用

1.本地推拉流 启服 推流 ffmpeg -re -stream_loop -1 -i ./DJI_0463.MP4 -s 1280x720 -an -c:v h264 -b:v 2000k -maxrate 2500k -minrate 1500k -bufsize 3000k -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 拉流 ffplay -rtsp_transport tcp rtsp://43.136.…

使用QML Tumbler 实现时间日期选择器

目录 引言相关阅读项目结构示例实现与代码解析示例一&#xff1a;时间选择器&#xff08;TimePicker&#xff09;示例二&#xff1a;日期时间选择器&#xff08;DateTimePicker&#xff09; 主窗口整合运行效果总结下载链接 引言 在现代应用程序开发中&#xff0c;时间与日期选…

R语言中的常用内置函数

常用的数值函数 常用的字符函数 与概率分布相关的函数 有用的统计函数 数据来源:《数据挖掘与数据分析&#xff1a;基于R语言》王阳 2024年1月出版

org.springframework.core.env.PropertiesPropertySource 类详解

org.springframework.core.env.PropertiesPropertySource 类详解 1. 基本概述 类路径: org.springframework.core.env.PropertiesPropertySource继承关系: 继承自 PropertySource<Properties>&#xff0c;实现 PropertySource 接口。作用: 将 Java Properties 对象&…

2025-04-22 李沐深度学习5 —— 线性回归

文章目录 1 案例介绍1.1 应用场景&#xff1a;美国房价预测1.2 核心假设1.3 线性回归与神经网络的关系1.4 平方损失&#xff08;L2 Loss&#xff09;1.5 训练模型&#xff1a;最小化损失 2 基础优化算法2.1 梯度下降2.2 小批量随机梯度下降&#xff08;Mini-batch SGD&#xff…

你的大模型服务如何压测:首 Token 延迟、并发与 QPS

写在前面 大型语言模型(LLM)API,特别是遵循 OpenAI 规范的接口(无论是 OpenAI 官方、Azure OpenAI,还是 DeepSeek、Moonshot 等众多兼容服务),已成为驱动下一代 AI 应用的核心引擎。然而,随着应用规模的扩大和用户量的增长,仅仅关注模型的功能是不够的,API 的性能表…

数字化转型避坑指南:中钧科技如何用“四个锚点”破解转型深水区

数字化转型浪潮下&#xff0c;企业常陷入四大典型陷阱&#xff1a;跟风式投入、数据沼泽化、流程伪在线、安全裸奔化。中钧科技旗下产品以“经营帮”平台为核心&#xff0c;通过针对性方案帮助企业绕开深坑。 陷阱一&#xff1a;盲目跟风&#xff0c;为数字化而数字化 许…

时分复用、频分复用和码分复用简要比较分析

时分复用&#xff08;TDM&#xff09;、频分复用&#xff08;FDM&#xff09;和码分复用&#xff08;CDM&#xff09;是经典的多路复用技术&#xff0c;它们通过不同的方式共享信道资源。以下是两者的详细比较及其优缺点&#xff1a; 1. 原理对比 时分复用&#xff08;TDM&…

MCP认证难题破解:常见技术难题实战分析与解决方案

MCP认证难题破解:常见技术难题实战分析与解决方案 一、引言:MCP认证——智能协作领域的“技术试金石” MCP(Multi-agent Communication Protocol)认证作为多智能体系统领域的权威认证,旨在考察考生对MCP协议设计、智能体协作架构、分布式系统优化等核心技术的掌握程度。…

最新iOS性能测试方法与教程

一、工具instrument介绍 使用Xcode的instrument进行测试&#xff0c;instrument自带了很多性能方面的测试工具&#xff0c;如图所示&#xff1a; 二、常见性能测试内容 不管是安卓还是iOS的性能测试&#xff0c;常见的性能测试都要包含这五个方面&#xff1a; 1、内存&#xff…

Vue el-checkbox 虚拟滚动解决多选框全选卡顿问题 - 高性能处理大数据量选项列表

一、背景 在我们开发项目中&#xff0c;经常会遇到需要展示大量选项的多选框场景&#xff0c;比如权限配置、数据筛选等。当选项数量达到几百甚至上千条时&#xff0c;传统的渲染方式全选时会非常卡顿&#xff0c;导致性能问题。本篇文章&#xff0c;记录我使用通过虚拟滚动实现…

JWT的token泄露要如何应对

文章目录 前言✅ 一、预防措施&#xff08;防泄露&#xff09;&#x1f6a8; 二、应急响应机制&#xff08;发现已泄露&#xff09;&#x1f512; 1. **启用 Token 黑名单机制**&#x1f501; 2. **启用 Refresh Token 机制 旋转令牌**&#x1f4cd; 3. **强制下线机制**&…

24.中医知识问答删除历史对话功能前端代码实现

前端实现对话删除功能的完整指南 功能概述 前篇文章介绍了删除历史对话的后端开发&#xff0c;本篇将介绍如何在前端实现一个完整的对话删除功能&#xff0c;包括用户确认、API调用、状态管理和错误处理等关键环节。 功能拆解 1. 用户确认机制 javascript const confirmDe…

如何在 Python 项目中引入 Rust 函数

目录 1. 初始化 Python 项目2. 添加 Rust 开发工具3. 初始化 Rust 项目4. 开发模式构建5. 验证模块是否成功安装6. 测试 Rust 函数总结 (封面pid: 129416070) Python 是一门非常流行的编程语言&#xff0c;具有易于使用和开发的特点。然而&#xff0c;随着项目需求的增长和性能…

Java基础系列-HashMap源码解析2-AVL树

文章目录 AVL树左旋右旋左旋右旋的4种情况LL 型RR 型LR 型RL 型 实际插入时怎么判断是那种类型&#xff1f;插入时注意事项删除节点 AVL树 为避免BST树退化成链表的极端情况&#xff0c; AVL 树应运而生。 平衡因子取值&#xff08;-1&#xff0c;0&#xff0c;1&#xff09;…

新书速览|Hadoop与Spark大数据全景解析(视频教学版)

《Hadoop与Spark大数据全景解析:视频教学版》 01 本书内容 《Hadoop与Spark大数据全景解析:视频教学版》结合作者多年在大数据领域的开发实践经验&#xff0c;采用“理论实战”的形式&#xff0c;以大量实例全面介绍Hadoop和Spark的基础知识及其高级应用。作者将丰富的教学经…

TapData × 梦加速计划 | 与 AI 共舞,TapData 携 AI Ready 实时数据平台亮相加速营,企业数据基础设施现代化

在实时跃动的数据节拍中&#xff0c;TapData 与 AI 共舞&#xff0c;踏出智能未来的新一步。 4月10日&#xff0c;由前海产业发展集团、深圳市前海梦工场、斑马星球科创加速平台等联合发起的「梦加速计划下一位独角兽营」正式启航。 本次加速营以“打造下一位独角兽企业”为目…