【网络基础】 校园网环境下VMware虚拟机联网底层机制与代理穿透实战
前言在校园网(如常见的网页认证、客户端认证)环境下配置 Linux 虚拟机网络,堪称每个工程专业学生的“必修课”。面对网关严格的多终端检测和 NAT 屏蔽,常规的配置往往无济于事。本文将从底层网络拓扑的角度,详细拆解 VMware 虚拟机是如何与物理宿主机进行网络交互的,并深入分析在常规 NAT 与桥接均失效的极端网络环境下,如何通过应用层代理(如 CCProxy)实现网络穿透。 虚拟机联网底层机制剖析VMware 为虚拟机提供了三种主要的网络连接模式,本质上是虚拟出了不同的网络交换机(vSwitch)和网卡(vNIC)。 1. 桥接模式 (Bridged - VMnet0)机制原理: 在桥接模式下,VMware 虚拟出了一个交换机(VMnet0),将虚拟机的网卡直接与宿主机的物理网卡(如以太网或 WLAN)进行桥接。此时,虚拟机在逻辑上与物理机处于同一个局域网层级。它会向局域网的 DHCP 服务器(即校园网的路由器)发送广播包,请求分配一个独立的 IP 地址和 MAC 地址。 比喻: 就像一个新生搬进了寝室,他需要亲自去宿管阿姨(DHCP 服务器)那里登记,申请一张属于自己的...
【Python】文件输入输出
1. 标准 I/O vs 文件 I/O平时你在电脑上自己运行代码时: 标准输入 (Standard Input):代码运行到 input() 时会停下来,等你用键盘敲字回车。 标准输出 (Standard Output):代码运行到 print() 时,结果会直接显示在**屏幕(控制台)**上。 但在算法竞赛或者学校的评测系统里,评测机要在几秒钟内测试成千上万份代码,不可能有人工坐在那里对着你的程序敲键盘输入测试数据。 所以,平台会提前把所有的测试用例写在一个文本文档里(比如题目要求的 input.txt)。评测要求你的程序: 不要等键盘输入,直接去读取 input.txt 里的数据。 不要打印在屏幕上,把算出来的结果直接写进 output.txt 里。 评测机最后只需要对比你的 output.txt 和标准答案文本文档是否完全一致,就能判断你对不对。 2. 那几行代码到底在干嘛?在 C 语言里,如果要解决这种文件重定向问题,通常会用到 freopen 函数。在 Python 里,原理非常相似,就是通过操作 sys 模块来实现流的替换。 1234imp...
【Python】列表
【Python】列表一、创建列表12listname = [element1,element2,element3,element4,element...]number = [1,2,3,4,5,6,7] 列表中的元素类型、个数没有限制,但必须是Python支持的数据类型 创建空列表 123number = []# 或者用list()函数创建空列表number = list() 有了list函数,我们可以在里面添加range函数 现在使用range函数创建一系列元素 1number = list(range(1,8)) del删除整个列表 123numbers = list(range(1,11))print(numbers)del numbers 二、访问列表和C语言数组一样 1num = number[0] 切片操作 123456numbers = list(range(1,11))print(numbers[1:5])print(numbers[1:11:2])#输出:#[2, 3, 4, 5]#[2, 4, 6, 8, 10] 三、遍历列表12345li...
【Python】判断,循环
【python】判断,循环一、判断1234567if <判断条件1>: <执行1>elif <判断条件2>: <执行2>.....else: <执行n> 二、循环1.while循环12while <循环条件>: <语句块> while循环使用else语句 1234while <循环条件>: <语句块>else: <语句块> else后面的语句在循环结束的时候执行 2.for循环12for <变量> in <对象> <语句块> range函数 函数内部一个参数,则从0到这个数字(不包含) 函数内部两个参数,从第一个(包含)到第二个(不包含) 函数内部三个参数,则第三个为步幅 for-else语句 1234for <变量> in <对象> <语句块n>else: <语句块1> else后面的内容在循环结束后执行 但是当循环被...
【C语言】打印二进制
在C语言里打印二进制标准的 C 语言(C23 之前)里没有类似 %b 这样的二进制格式化输出符。想要打印二进制,必须老老实实地利用右移 (>>) 和 按位与 (&),把数字里面的每一位剥离出来,逐个打印。 123456789101112131415#include <stdio.h>int main() { int n; scanf_s("%d", &n); for (int i = 0; i < (1 << n); i++) { for (int j = n - 1; j >= 0; j--) { printf("%d", (i >> j) & 1); } printf("\n"); } return 0;} 妈的,感觉C语言功力尽失。 下面是递归回溯法,现在我状态不是很好,所以不是我写的 12345678910111213141516171819202122232...
【Python】二进制序列生成与输出
题目要求: 给定一个正整数N,你需要输出所有长度为N的二进制序列(即只包含 0 和 1 的字符串)。 输出顺序:必须按照字典序(从小到大)排列。例如,当 $N=2$ 时,顺序应为 00, 01, 10, 11。 格式:每行输出一个二进制字符串。 解题方法限制 递归回溯法(Recursive search/backtracking)。 二进制加 1 法(通过模拟二进制加法从 $0$ 一直加到 $2^N-1$)。 输入 输出 2 00011011 我写的代码: 1234567haha = int(input())figure = [0,1]result = [f"{a}{b}{c}{d}{e}{f}{g}{h}{i}{j}{k}{l}{m}{n}...
【Python】Python中强大的数据结构和字典升级版
题目要求: No. Standard input Standard output 1 5Ivanov 5Petrov 4Ivanov 3Sidorov 5Petrov 5 Ivanov 4.00Petrov 4.50Sidorov 5.00 2 3Ivanov 5Ivanov 5Petrov 3 Ivanov 5.00Petrov 3.00 这是我写的代码: 1234567891011121314151617181920n = int(input())name_list = []child_list = {}child_frequency = {}for _ in range(n): name , grade = input().split() grade = int(grade) if name not in child_list: name_list.append(name) child_list[name] = grade child_frequency[...
【Python】输出与格式化
【Python】输出与格式化一、基础 print 输出1print(<对象1>, <对象2>, ...) 逗号拼接的隐形空格 当输出多个对象并用逗号隔开时,默认会在对象之间插入一个空格。 123name = "张三"print("我叫", name) # 实际输出: 我叫 张三 (注意中间的空格) 二、f-string 格式化(推荐)在字符串前加 f,直接用 {} 包裹变量,所见即所得,避免多余空格和强转类型。 1f"<文本> {<变量>} <文本>" 示例: 1234name = "张三"age = 18print(f"我叫{name},今年{age}岁")# 实际输出: 我叫张三,今年18岁 三、print 进阶参数1. sep 参数(分隔符)控制多个输出对象之间的连接字符(默认是空格 ' ')。 12print("...
【Python】告别C语言思维,用更 Pythonic 的方式解决字符串处理与字典映射
题目描述给定 n 个服务器的名称与 IP 地址映射,以及 m 条包含 IP 地址的 Nginx 配置命令。你需要根据命令中的 IP 地址,查找到对应的服务器名称,并将其作为注释追加到每条命令的末尾。 输入格式: 第一行包含两个整数 n 和 m(1 <= n, m <= 1000),分别表示服务器的数量和命令的数量。 接下来的 n 行,每行包含两个字符串 name 和 ip,用空格隔开,代表服务器名称和 IP 地址(保证所有 IP 唯一)。 接下来的 m 行,每行是一条配置命令,格式为 command ip;(注意 IP 末尾自带一个分号)。保证命令中的 IP 一定在前面的列表中存在。 输出格式: 依次输出处理后的 m 条命令。 每条命令按原样输出,并在末尾追加 #name,其中 name 是该 IP 对应的服务器名称。 样例输入: 123452 2main 192.168.0.2replica 192.168.0.1block 192.168.0.1;proxy 192.168.0.2; 1234567893 5google 8.8.8...
【Python】字典
在 Python 中,字典(Dictionary) 是最常用、也是最强大的数据结构之一。它和我们现实生活中使用的字典非常相似:在现实中的字典里,你通过“拼音或部首”查找到具体的“释义”;在 Python 字典中,你通过**“键(Key)”来查找对应的“值(Value)”**。 这被称为**“键值对(Key-Value pairs)”**映射。 下面我们从零开始,一步步拆解 Python 字典的用法。 1. 字典的四大核心特征 通过键来访问: 字典里的元素没有索引(不像列表用 [0]、[1] 访问),而是通过独一无二的“键”来获取“值”。 键必须是唯一的: 同一个字典里不能有两个相同的键。如果强行写入相同的键,后面的值会覆盖前面的值。 键必须是不可变类型: 字符串、数字、元组可以作为键;但列表、字典不能作为键。值(Value)则可以是任何数据类型。 有序性(Python 3.7+): 从 Python 3.7 开始,字典会记住你添加元素的顺序(在这之前的版本中,字典是无序的)。 2. 创建字典创建字典主要使用大括号 {},键和值之间用冒号 : 隔开,不同的键值对用逗号 , 隔...

