CS144 - Lecture 1 记录

news2025/6/3 0:38:23

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 不可到达消息。

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

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

相关文章

【数据结构】——二叉树--链式结构

一、实现链式结构二叉树 二叉树的链式结构,那么从名字上我们就知道我们这个二叉树的底层是使用链表来实现的,前面我们的二叉树是通过数组来实现的,那么在其是完全二叉树的情况下,此时我们使用数组来实现就会使得其空间浪费较少&a…

充电便捷,新能源汽车移动充电服务如何预约充电

随着新能源汽车的普及,充电便捷性成为影响用户体验的关键因素之一。传统的固定充电桩受限于地理位置和数量,难以完全满足用户需求,而移动充电服务的出现,为车主提供了更加灵活的补能方式。通过手机APP、小程序或在线平台&#xff…

基于 Chrome 浏览器扩展的Chroma简易图形化界面

简介 ChromaDB Manager 是基于 Chrome 浏览器扩展的一款 ChromaDB(一个流行的向量数据库)的数据查询工具。提供了一个用户友好的界面,可以直接从浏览器连接到本地 ChromaDB 实例、查看集合信息和分片数据。本工具特别适合开发人员快速查看和…

IM系统的负载均衡

1.IM场景的负载均衡 2.方案总览 SDK层想要连接一个TCP网关或者WebSocket网关的方案 SDK单地址:在SDK中写死某个网关的IP或者域名,缺点是更换地址需要重新打包SDK SDK多地址:防止某一个地址嗝屁了写上多个地址用足保持高可用 暴露接口给客户端:SDK层访问接口动态获得地址 注…

使用 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. 拓扑规划&#x1f55…

异步日志监控: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,预分频器):作用是对输入时钟信号进行分…

4.8.1 利用Spark SQL实现词频统计

在利用Spark SQL实现词频统计的实战中,首先需要准备单词文件并上传至HDFS。接着,可以通过交互式方法或创建Spark项目来实现词频统计。交互式方法包括读取文本文件生成数据集,扁平化映射得到新数据集,然后将数据集转成数据帧&#…

PyTorch中nn.Module详解

直接print(dir(nn.Module)),得到如下内容: 一、模型结构与参数 parameters() 用途:返回模块的所有可训练参数(如权重、偏置)。示例:for param in model.parameters():print(param.shape)named_parameters…

动态表单开发避坑:改变input的值不会触发change事件即时修复策略-WdatePicker ——仙盟创梦IDE

原始传统模式 onchange <input onchange"未来之窗东方仙盟change(this)" oni > <script>function 未来之窗东方仙盟change(onj){console.log("未来之窗东方仙盟change",onj.value)} </script> 测试 原始传统模式 oninput <input …

10.安卓逆向2-frida hook技术-frida基本使用-frida指令(用于hook)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

动态设置微信小程序页面标题(navigationBarTitleText属性)

前言&#xff1a; 最近在公司进行小程序研发的时候&#xff0c;产品给出了一个动态加载页面标题的需求&#xff0c;经过调研之后将结果在这里与各位伙伴进行分享。 代码展示&#xff1a; 在.json文件中进行初始配置&#xff1a; { "usingComponents": {}, &q…

Flutter下的一点实践

目录 1、背景2、refena创世纪代码3、localsend里refena的刷新3.1 初始状态3.2 发起设备扫描流程3.3 扫描过程3.3 刷新界面 4.localsend的设备扫描流程4.1 UDP广播设备注册流程4.2 TCP/HTTP设备注册流程4.3 localsend的服务器初始化工作4.4总结 1、背景 在很久以前&#xff0c;…

VScode ios 模拟器安装cocoapods

使用 Homebrew 安装&#xff08;推荐&#xff09; 如果你有 Homebrew&#xff0c;直接用它安装更稳定&#xff1a; brew install cocoapods

Redis最佳实践——安全与稳定性保障之数据持久化详解

Redis 在电商应用的安全与稳定性保障之数据持久化全面详解 一、持久化机制深度解析 1. 持久化策略矩阵 策略触发方式数据完整性恢复速度适用场景RDB定时快照分钟级快容灾备份/快速恢复AOF实时追加日志秒级慢金融交易/订单关键操作混合模式RDBAOF同时启用秒级中等高安全要求场…