CS144 - Lecture 1 记录
CS144 - Lecture 1
由于没讲义,全看课了,系统性的总结有点难,记一些有趣的东西吧。
数据链路和网络层的传输
我们可以看见,对于发送方,我们的数据链路层为我们的网络层提供服务,在经过路由的时候,我们的路由的网络层会检查数据报的目的地址,然后根据目的地址决定下一跳的链路是怎么走的!直到到达目的地。而我们是如何决定的?我们的内核会维护一个路由表,它存在于内存之中,我们可以通过检索他来实现快速决定下一跳。而这一点,不仅对于主机,对于路由器也是一样的,路由器中实现了网络层和链路层,需要内存去维护路由表,也就是说,路由器甚至也是一个操作系统!
这里问了 gpt 一些子网的问题,如果国家不同,子网也会不同,经过的网关也会不同,数据的传输会经历什么?我们首先需要知道,网关分为很多层,子网也分为很多层,而计算机就是对应的叶子节点,一个网关对应了多个子节点,下面有子网关以及对应了多台计算机,全世界的计算机就相当于构成了一棵树,我们如果子网不同,在转发过程中就需要先转发到网关,如果依旧不在同一子网,就需要再转发到下一级网关,可以想象成 小区->城市->省份->国家 这几层结构。
同时,在看书的时候,我还看见过 ABC 类地址划分,后面又引出了 CIDR 类地址划分,更加灵活,可以按国家,然后国家按地区来分发这些 ip 。
引入另一个概念,局域网。
诸如云服务器,都是暴露在公网上面的,都独占一个公网 ip,所以可以直接访问,而比如学校,家庭,都是在局域网里面,通过网关与外部相连,这种情况下,外部请求没办法直接访问局域网,因为 NAT 就是这样,但是通过 NAT 我们可以直接访问外部,并且可以接受对方的返回信息,这里是通过 NAT 记录了映射实现的,当我们向外网发送请求,NAT 会将内网地址转换成公网地址作为源地址,然后发送出去,并且记录使用的公网的端口以及目的地址和端口,保证可以返回给正确的内网地址。
对于我们开在本地的虚拟机,如果使用 NAT 模式,就是在电脑内部又开了一个虚拟局域网,外部根本没办法访问你,除非你主动访问,所以还是这个没啥好担心的,我之前还怕 ip 直接写在 github 上面会被人攻击,专门去一个一个改。🤣
对于虚拟机另外两个常见的网络模式,桥接模式其实就是将你的虚拟机独立出去,去获取 ip,这样连着同一个 wifi,也就是你的同学也能够访问到你的虚拟机了。另一个仅主机模式,无法与外界通信,但是可以与主机通信,虽然完全隔离了,但是这种情况下没办法拉镜像,甚至 git push
都做不到,所以兼顾安全性和可用性,NAT 应该是最合适的。
另外一点,我们的 wifi 路由器的无线网络扮演了“线”的角色,我们局域网对应的 wifi 路由背后都会有 NAT,来实现与外部的通信,而我们连接 wifi 的时候,对应的 wifi 路由器会为你的主机分配 ip,也就是说,ip 仅仅是一个临时的 ip,并不具有持久性,随时都会变,但是对于局域网,我们并不需要持久的 ip,所以这是合理的,而我们的 wifi 路由器是如何分配的?我们的 wifi 路由器会实现 DCHP 动态主机配置协议,当你的主机没有 ip 的时候,会发送广播,而对应的路由器会为你分配一个临时的 ip 地址,当你断联,切换到另一个网络时,这个 ip 就会收回。而这个 DHCP 就相当于是你需要申请身份证,你有了身份证才可以进行通信。我们甚至可以通过 wireshark 去截取这段请求!!!比如我断开 wifi 再重连一次:
回到我们的终端,输入 ipconfig,我们会发现我们有一段地址和这个 10.20.144.46 一模一样!这表示我们申请到了一个私网 ip!
除此之外,针对于我们的数据链路层在内核中还需要对网卡进行编程,如何做到对硬件编程?其实就是将硬件的一部分数据映射到了内核态的内存之中,通过对这部分特定内存进行读写,就可以实现对硬件进行编程了,诸如键盘,鼠标等设备,都是这样实现的。
说实话,看课之前,我看过《图解 tcp/ip》 和《图解 http》,里面涉及到的概念感觉还是不够清楚,对我来说不是很友好,果然,不愧是斯坦福,引入一些可以让我进一步思考的知识,我带着这些问题去查资料,问 ai,感觉很多东西都清晰起来,而且以前看书的时候感觉这些子网, NAT, DHCP 都挺无聊的,现在感觉还挺有意思的。
应用层浅析
承接上文,对于操作系统而言,传输层,网络层,数据链路层(除了硬件)都处于操作系统的内核部分,而应用层都位于用户态,是我们自己去编写的,常见的,有 http, webrtc, websocket, sse 都是应用层协议,一般的 web 开发库都会实现这些协议,比如 go 语言官方自带的 net/http 包就是实现了 http 协议。
我们的应用层实现的协议都是基于网络层实现的,换而言之,我们应用层实现的协议都会去调用网络层,也就是操作系统提供的系统调用接口 socket 套接字的 API,通过它我们可以基于 tcp 进行编程,也可以去实现一个应用层协议,甚至是————自定义你自己的应用层协议。这就是所谓的网络层为上层提供服务,其实就是调用的关系。
其他
IP 被设计得很简单,他是不可靠,非连接的,但是他也有校验和机制,可以一定程度上进行检查,但是也只能检测 IP 头部,无法检验数据是否完整,但是他仍然会尽最大努力地传输数据。对于完整的数据监测,是传输层的任务了。
我们可以使用 wireshark 去抓包来分析我们 tcp 的三次握手,当然,现在的 wireshark 的界面并不像书里面那样古老,已经相当现代化了,通过设定 tcp.port 和 ip.addr 来抓取我们想要访问的界面的相关的网络请求,这里我们可以看见各种协议对应的报头,当然,对于更详细的访问这个页面会经过那些路由,我们可以在 linux 里面输入 traceroute
命令来实现追溯一个你发送的数据报会经过那些地方,虽然,但是我这里不知道怎么回事,只有一跳就结束了😭。
子网掩码,我看视频到一半,想起来了学长讲过的子网掩码,回去看了一下,发现与我们划分网络有关,单一的子网掩码只是一个 mask,将子网掩码和我们当前被分配的 IP 进行 AND 运算就可以得到我们当前所处的子网,通常来说,我们所处的子网也是一个私网地址,所以,如果你和你的朋友处于不同的局域网内,尽管你们的子网相同,也无法通信。而我们的子网经过更多的层级,最终才会对应一个公网 ip。什么意思?比如说,一个小区申请到了一个 ip 地址,他就具备了"联网"的能力,而它可以给许多儿子也赋予这个能力,它的儿子就又具备了这个能力,换句话说,具备了公网 ip 池的小区(这里只是类比),本质上也是一个 “wifi” 路由,它可以为许多 “wifi” 划分子网段,使得产生了更多的 “wifi” ,就是这样一个树的结构,最终对应到了我们所看见的一个办公室的 wifi,一个家庭里面的 wifi。(虽然现实里面是运营商在真正给你分配,但是这里仅仅是类比)
fi,一个家庭里面的 wifi。(虽然现实里面是运营商在真正给你分配,但是这里仅仅是类比)
对于 ARP 他是一个地址解析协议,我们网络中每个数据报需要跳到下一个节点都需要知道底层的物理地址,而我们报文仅仅包含目的地的 ip 地址,怎么办?进行下一跳,我们会从路由表中查询发给谁,从而拿到下一跳的 ip 地址,然后本地还会维护一个缓存,对应了 ip 到物理地址的映射,如果本地不存在我们需要的 ip,我们的这个节点就会向当前网络发送一个广播,问谁是这个 ip?然后对应这个 ip 的节点会返回响应,附带自己的物理地址,然后就可以进行下一跳,当然,如果当前网络这个 ip 不存在咋办?此时会返回 ICMP 不可到达消息。
相关文章:

CS144 - Lecture 1 记录
CS144 - Lecture 1 由于没讲义,全看课了,系统性的总结有点难,记一些有趣的东西吧。 数据链路和网络层的传输 我们可以看见,对于发送方,我们的数据链路层为我们的网络层提供服务,在经过路由的时候…...
【Redis】大key问题详解
目录 1、什么是大key2、大key的危害【1】阻塞风险【2】网络阻塞【3】内存不均【4】持久化问题 3、如何发现大key【1】使用内置命令【2】使用memory命令(Redis 4.0)【3】使用scan命令【4】监控工具 4、解决方案【1】拆分大key【2】使用合适的数据结构【3】…...

【数据结构】——二叉树--链式结构
一、实现链式结构二叉树 二叉树的链式结构,那么从名字上我们就知道我们这个二叉树的底层是使用链表来实现的,前面我们的二叉树是通过数组来实现的,那么在其是完全二叉树的情况下,此时我们使用数组来实现就会使得其空间浪费较少&a…...
TKernel模块--杂项
TKernel模块–杂项 1.DEFINE_HARRAY1 #define DEFINE_HARRAY1(HClassName, _Array1Type_) \ class HClassName : public _Array1Type_, public Standard_Transient { \public: …...

充电便捷,新能源汽车移动充电服务如何预约充电
随着新能源汽车的普及,充电便捷性成为影响用户体验的关键因素之一。传统的固定充电桩受限于地理位置和数量,难以完全满足用户需求,而移动充电服务的出现,为车主提供了更加灵活的补能方式。通过手机APP、小程序或在线平台ÿ…...
laya3的2d相机与2d区域
2d相机和2d区域都继承自Sprite。 2d相机必须作为2d区域的子节点,且2d相机必须勾选isMain才能正常使用。 2d区域下如果没有主相机,则他和Sprite无异,他的主要操作皆是针对主相机。 2d相机可以调整自己的移动范围,是否紧密跟随&a…...
2024 CKA模拟系统制作 | Step-By-Step | 19、题目搭建-升级集群
目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. Kubernetes 升级策略 2. 节点维护操作 3. 组件升级技术 4. 权限与访问控制 三、考点详细讲解 1. Kubernetes 升级流程 2. 组件版本兼容性 3. drain 操作深度解析 四、实验环境搭建步骤 五、总…...
47道ES67高频题整理(附答案背诵版)
1.ES5、ES6(ES2015)有什么区别? ES5(ECMAScript 5)和ES6(也称为ECMAScript 2015)是JavaScript语言的两个版本,它们之间有一些重要的区别和改进: let 和 const 关键字: …...
Lauterbach TRACE32专栏
官方培训视频 trace32使用技巧博文 系统崩溃分析 - vmcore 加载到 Trace32 Trace 32 离线 dump 分析环境搭建方法 内核trace分析工具入门 如何用Trace32分析内核死机 trace32调试攻略 TRACE32调试:基础调试技巧之SystemMode、SNOOPer https://cloud.tencent…...

基于 Chrome 浏览器扩展的Chroma简易图形化界面
简介 ChromaDB Manager 是基于 Chrome 浏览器扩展的一款 ChromaDB(一个流行的向量数据库)的数据查询工具。提供了一个用户友好的界面,可以直接从浏览器连接到本地 ChromaDB 实例、查看集合信息和分片数据。本工具特别适合开发人员快速查看和…...
python打卡day41
简单CNN 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 一、数据增强 在图像数据预处理环节,为提升数据多样性&#x…...

IM系统的负载均衡
1.IM场景的负载均衡 2.方案总览 SDK层想要连接一个TCP网关或者WebSocket网关的方案 SDK单地址:在SDK中写死某个网关的IP或者域名,缺点是更换地址需要重新打包SDK SDK多地址:防止某一个地址嗝屁了写上多个地址用足保持高可用 暴露接口给客户端:SDK层访问接口动态获得地址 注…...
前端八股 tcp 和 udp
都是传输层协议 udp 数据报协议 不可靠面向数据包对于应用层传递的报文加上UDP首部就传给网络层 tcp 传输控制协议 可靠 会将报文分段进行传输 区别: 1.tcp 可靠 udp 不可靠 2.tcp 面向连接 三握四挥 udp 无连接 3.tcp面向字节流 udp面向报文 4.效率低 效率高…...

使用 Zabbix 监控 MySQL 存储空间和性能指标的完整实践指南
目录 引言 一、最终目标支持功能 二、监控方案设计 2.1 技术选型 2.2 设计思路 三、实现步骤 3.1 准备工作 3.11 创建 MySQL 监控账号 3.12 配置 .my.cnf 文件 3.2 编写统一脚本 3.3 配置 Zabbix Agent UserParameter 3.4 Zabbix 前端配置建议 四、总结 引言 MySQL …...

【技能拾遗】——家庭宽带单线复用布线与配置(移动2025版)
📖 前言:在家庭网络拓扑中,客厅到弱电箱只预埋了一根网线,由于已将广电的有线电视取消并改用IPTV。现在需要解决在客厅布置路由器和观看IPTV问题,这里就用到单线复用技术。 目录 🕒 1. 拓扑规划ὕ…...

异步日志监控:FastAPI与MongoDB的高效整合之道
title: 异步日志监控:FastAPI与MongoDB的高效整合之道 date: 2025/05/27 17:49:39 updated: 2025/05/27 17:49:39 author: cmdragon excerpt: FastAPI与MongoDB整合实现日志监控系统的实战指南。首先配置MongoDB异步连接,定义日志数据模型。核心功能包括日志写入接口、聚合…...

在 Android 上备份短信:保护您的对话
尽管我们的Android手机有足够的存储空间来存储无数的短信,但由于设备故障、意外删除或其他意外原因,您可能会丢失重要的对话。幸运的是,我们找到了 5 种有效的 Android SMS 备份解决方案,确保您的数字聊天和信息保持安全且可访问。…...

标题:2025海外短剧爆发年:APP+H5双端系统开发,解锁全球流量与变现新大陆
描述: 2025年出海新风口!深度解析海外短剧系统开发核心(APPH5双端),揭秘高效开发策略与商业化路径,助您抢占万亿美元市场! 全球娱乐消费模式正在剧变。2025年,海外短剧市场已从蓝海…...

解决RAGFlow(v0.19.0)有部分PDF无法解析成功的问题。
ragflow版本为:v0.19.0 1.解析的时候报错:Internal server error while chunking: Coordinate lower is less than upper。 看报错怀疑是分片的问题,于是把文档的切片方法中的“建议文本块大小”数值(默认512)调小&…...

c#基础08(数组)
文章目录 数组数组概念声明数组初始化数组赋值给数组访问数组元素 集合动态数组(ArrayList)使用foreach循环C#数组细节多维数组传递数组给函数参数数组 数组 数组概念 数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一…...

嵌入式学习--江协stm32day3
这是我目前为止认为最重要的模块--TIM定时器,这里我们主要学习通用定时器 最小的计数计时单元为时基单元,包括PSC,ARR,CNT CK_PSC(Prescaler,预分频器):作用是对输入时钟信号进行分…...
docker-记录一次容器日志<container_id>-json.log超大问题的处理
文章目录 现象一、查找源头二、分析总结 现象 同事联系说部署在虚拟机里面的用docker启动xxl-job的服务不好使了,需要解决一下,我就登陆虚拟机检查,发现根目录满了,就一层一层的找,发现是<container_id>-json.l…...

4.8.1 利用Spark SQL实现词频统计
在利用Spark SQL实现词频统计的实战中,首先需要准备单词文件并上传至HDFS。接着,可以通过交互式方法或创建Spark项目来实现词频统计。交互式方法包括读取文本文件生成数据集,扁平化映射得到新数据集,然后将数据集转成数据帧&#…...
头歌java课程实验(Java面向对象 - 包装类)
第1关:基本数据类型和包装类之间的转换 任务描述 本关任务:实现基本数据类型与包装类之间的互相转换。 相关知识 为了完成本关任务,你需要掌握: 1.什么是包装类; 2.怎么使用包装类。 什么是包装类 在JAVA中&#x…...
经济法-7-上市公司首次发行、配股增发条件
一、首次公开发行股票条件 事项 条件存续时间,持续经营能力 持续经营3年以上的股份公司 具有持续经营能力 内部控制制度具备健全且运行良好的组织机构财务最近3年财务会计报告被出具无保留意见审计报告公司治理 1)最近3年内,发行人及…...

PyTorch中nn.Module详解
直接print(dir(nn.Module)),得到如下内容: 一、模型结构与参数 parameters() 用途:返回模块的所有可训练参数(如权重、偏置)。示例:for param in model.parameters():print(param.shape)named_parameters…...
Mac 每日磁盘写入量异常高
为什么你的 Mac 每日磁盘写入量异常高?深度分析与解决方案 文章目录 为什么你的 Mac 每日磁盘写入量异常高?深度分析与解决方案🔍 问题现象🕵️♂️ 六大罪魁祸首1. 系统日志疯狂输出典型场景: 2. 浏览器缓存3. Ti…...
《深入解析Go语言结构:简洁高效的工程化设计》
《深入解析Go语言结构:简洁高效的工程化设计》 引言 Go语言(Golang)由Google团队于2009年发布,专为现代分布式系统和云计算设计。其核心哲学是"简单性高于一切",通过精简的语法结构和创新的…...
[蓝桥杯]机器人塔
题目描述 X 星球的机器人表演拉拉队有两种服装,A 和 B。 他们这次表演的是搭机器人塔。 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上。 B 只能站在 AB 或 BA 的肩上。 你的…...
如何将vue2使用npm run build打包好的文件上传到服务器
要将 Vue 2 项目打包并部署到服务器上,并使用 Nginx 作为 Web 服务器,可以按照以下步骤操作: 1. 打包 Vue 2 项目 首先,确保你的 Vue 2 项目已经开发完成,并且可以在本地正常运行。然后使用以下命令进行打包…...