《计算机网络简易速速上手小册》第2章:计算机网络协议和标准(2024 最新版)

在这里插入图片描述

文章目录

  • 2.1 IPv4 与 IPv6 - 网络世界的地址簿
    • 2.1.1 基础知识
    • 2.1.2 重点案例:使用 Python 查询本机 IPv4 和 IPv6 地址
    • 2.1.3 拓展案例1:使用 Python 创建简单的 IP 地址转换工具
    • 2.1.4 拓展案例2:使用 Python 检测本地网络的 IP 版本支持
  • 2.2 DNS工作机制 - 互联网的导航系统
    • 2.2.1 基础知识
    • 2.2.2 重点案例:使用 Python 进行 DNS 查询
    • 2.2.3 拓展案例1:使用 Python 实现简单的 DNS 缓存机制
    • 2.2.4 拓展案例2:使用 Python 探索 DNS 记录类型
  • 2.3 DHCP 与网络自动配置 - 自动化的网络管家
    • 2.3.1 基础知识
    • 2.3.2 重点案例:模拟 DHCP 客户端请求
    • 2.3.3 拓展案例1:使用 Python 监听网络上的 DHCP 消息
    • 2.3.4 拓展案例2:使用 Python 和 Scapy 构造并发送 DHCP 发现包

2.1 IPv4 与 IPv6 - 网络世界的地址簿

2.1.1 基础知识

在数字通信的世界里,每个设备连接到互联网都需要一个独一无二的地址,这就是IP地址。IPv4和IPv6是这些地址的两种格式,它们使得设备能够找到并与其他设备通信。

  • IPv4:是第四版的互联网协议,提供约43亿个独特的地址。它使用32位地址系统,通常表示为四个数字序列,每个数字范围从0到255,例如192.168.1.1。尽管IPv4仍广泛使用,但地址的有限性导致了IPv6的引入。
  • IPv6:作为IPv4的后继者,使用128位地址长度,极大扩展了地址空间。IPv6地址表示为八组四个十六进制数,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334。这种格式支持几乎无限数量的设备直接连接到互联网。

2.1.2 重点案例:使用 Python 查询本机 IPv4 和 IPv6 地址

让我们用Python编写一个脚本来查询并显示本机的IPv4和IPv6地址,这是理解和操作IP地址的基础。

import socketdef get_ip_addresses():hostname = socket.gethostname()ipv4 = socket.gethostbyname(hostname)print(f"IPv4 Address: {ipv4}")try:ipv6_info = socket.getaddrinfo(hostname, None, socket.AF_INET6)for item in ipv6_info:if item[4][0]:ipv6 = item[4][0]print(f"IPv6 Address: {ipv6}")breakexcept socket.gaierror:print("IPv6 Address: Not available")get_ip_addresses()

这段代码首先获取本机的主机名,然后查询并打印出IPv4地址。对于IPv6,它尝试找到与主机名关联的任何IPv6地址,并打印出第一个找到的地址。

2.1.3 拓展案例1:使用 Python 创建简单的 IP 地址转换工具

了解 IPv4 和 IPv6 之间的差异是一回事,但在实际工作中,我们有时需要将 IPv4 地址映射到 IPv6 地址,或者进行格式转换。以下是一个简单的 IP 地址转换工具,将 IPv4 地址转换为 IPv6 格式。

def ipv4_to_ipv6(ipv4):ipv6_part = "::ffff:"ipv4_parts = ipv4.split(".")ipv4_as_hex = "{:02x}{:02x}:{:02x}{:02x}".format(*map(int, ipv4_parts))ipv6 = ipv6_part + ipv4_as_hexprint(f"Converted IPv6 Address: {ipv6}")ipv4_to_ipv6("192.168.1.1")

这个脚本将 IPv4 地址转换为 IPv6 的一种特殊格式,称为 IPv4 映射的 IPv6 地址,这对于在支持 IPv6 的网络中兼容 IPv4 设备非常有用。

2.1.4 拓展案例2:使用 Python 检测本地网络的 IP 版本支持

在一个多样化的网络环境中,了解你的网络支持哪种IP版本是非常重要的。以下Python脚本可以帮助你检测本地网络对IPv4和IPv6的支持情况。

def check_ip_support():ipv4_supported = socket.has_ipv6ipv6_supported = socket.has_ipv6print(f"IPv4 Supported: {ipv4_supported}")print(f"IPv6 Supported: {ipv6_supported}")check_ip_support()

这个简单的脚本使用了socket库中的has_ipv4has_ipv6属性来检测系统对IPv4和IPv6的支持情况。

通过这三个案例,你不仅加深了对 IPv4 和 IPv6 的理解,还学会了如何使用 Python 进行基本的 IP 地址操作和网络环境检测,这些技能在处理网络配置和故障排除时非常有用。

在这里插入图片描述


2.2 DNS工作机制 - 互联网的导航系统

2.2.1 基础知识

DNS(域名系统)是互联网的一项核心服务,它将人类可读的域名(如 www.example.com)转换为机器可读的IP地址(如 192.0.2.1)。这个过程称为域名解析,是网络通信的关键步骤,允许用户通过简单的域名访问网站,而不需要记住复杂的数字地址。

DNS 工作机制包括几个主要步骤:

  1. 查询启动:当你尝试访问一个域名时,你的设备首先检查本地DNS缓存是否有该域名的记录。
  2. 递归查询:如果本地缓存没有记录,你的设备的DNS客户端会向配置的DNS服务器发送一个递归查询请求。
  3. 迭代查询:DNS服务器进行一系列迭代查询,从根DNS服务器开始,逐步向下查询直到找到负责该域名的权威DNS服务器。
  4. 响应:一旦找到,权威DNS服务器会向原始请求的DNS服务器提供域名对应的IP地址,然后此信息被返回给用户的设备,并被临时存储在本地缓存以加速未来的访问。

2.2.2 重点案例:使用 Python 进行 DNS 查询

让我们使用Python的socket库来执行基本的DNS查询,获取一个域名的IP地址。

import socketdef dns_query(domain):try:ip_address = socket.gethostbyname(domain)print(f"The IP address of {domain} is {ip_address}")except socket.gaierror:print(f"Failed to get the IP address for {domain}")dns_query("www.example.com")

这个简单的函数使用gethostbyname方法查询指定域名的IP地址,并打印结果。

2.2.3 拓展案例1:使用 Python 实现简单的 DNS 缓存机制

在实际应用中,减少对外部DNS服务的查询可以显著提高应用性能。以下是使用Python实现的简单DNS缓存机制的例子。

dns_cache = {}def cached_dns_query(domain):if domain in dns_cache:print(f"Cached: The IP address of {domain} is {dns_cache[domain]}")else:try:ip_address = socket.gethostbyname(domain)dns_cache[domain] = ip_addressprint(f"The IP address of {domain} is {ip_address}")except socket.gaierror:print(f"Failed to get the IP address for {domain}")cached_dns_query("www.example.com")
cached_dns_query("www.example.com")  # This should hit the cache

通过使用一个简单的字典作为缓存,我们可以存储域名解析的结果,避免重复查询。

2.2.4 拓展案例2:使用 Python 探索 DNS 记录类型

DNS系统支持多种类型的记录,例如A记录(地址记录),MX记录(邮件交换记录),等等。以下Python脚本使用dnspython库来查询和展示一个域名的不同类型的DNS记录。

首先,确保安装dnspython库:

pip install dnspython

然后,运行以下脚本:

import dns.resolverdef query_dns_records(domain):for record_type in ['A', 'MX', 'TXT']:try:answers = dns.resolver.resolve(domain, record_type)for record in answers:print(f"{record_type} Record for {domain}: {record}")except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN):print(f"No {record_type} Record found for {domain}")query_dns_records("example.com")

这个脚本为指定的域名查询A、MX和TXT类型的DNS记录,并展示查询结果。

通过这三个案例,你不仅了解了DNS工作机制

的基础知识,还学会了如何使用Python进行实际的DNS查询、实现DNS缓存以提高性能,以及探索不同类型的DNS记录。这些技能对于网络编程和系统管理来说是极其有用的。

在这里插入图片描述


2.3 DHCP 与网络自动配置 - 自动化的网络管家

2.3.1 基础知识

DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于自动化地分配网络参数给设备,允许它们加入网络并进行通信。这些参数包括IP地址、子网掩码、默认网关和 DNS 服务器地址等。DHCP 极大简化了网络配置流程,特别是在大型网络中,减少了手动配置的错误和工作量。

DHCP 工作流程可以分为四个步骤:

  1. 发现(Discovery):客户端在网络上广播一个 DHCP 发现消息(DHCPDISCOVER)来查找可用的 DHCP 服务器。
  2. 提供(Offer):DHCP 服务器响应发现消息,向客户端提供一个 IP 地址租约(DHCPOFFER)。
  3. 请求(Request):客户端选择一个提供的租约,并通过广播发送 DHCP 请求消息(DHCPREQUEST),请求使用该 IP 地址。
  4. 确认(Acknowledgement):DHCP 服务器确认这一请求,并发送 DHCP 确认消息(DHCPACK)给客户端,其中包含了网络配置参数。

2.3.2 重点案例:模拟 DHCP 客户端请求

虽然 Python 标准库中没有直接支持发送真正的 DHCP 请求的功能,我们可以模拟一个简单的 DHCP 客户端请求过程,以理解 DHCP 协议的工作原理。

# 注意:这只是一个模拟示例,不会实际发送DHCP请求到网络中。
def simulate_dhcp_request():print("Sending DHCPDISCOVER to find available DHCP servers...")print("Received DHCPOFFER with IP address offer from DHCP server.")print("Sending DHCPREQUEST to request the offered IP address...")print("Received DHCPACK from DHCP server. IP address has been successfully assigned.")simulate_dhcp_request()

2.3.3 拓展案例1:使用 Python 监听网络上的 DHCP 消息

监听网络上的 DHCP 消息需要捕获和分析网络上的数据包,这可以使用scapy库来实现。以下是如何使用scapy来监听 DHCP 消息的例子。

首先,安装scapy

pip install scapy

然后,运行以下脚本来监听 DHCP 消息:

from scapy.all import sniff, DHCPdef dhcp_packet(packet):if DHCP in packet:print(packet.show())print("Listening for DHCP packets...")
sniff(filter="udp and (port 67 or 68)", prn=dhcp_packet, store=0)

这个脚本使用scapy监听UDP端口67和68上的流量,这是 DHCP 通信使用的端口,并打印捕获到的 DHCP 相关的数据包。

2.3.4 拓展案例2:使用 Python 和 Scapy 构造并发送 DHCP 发现包

在一些高级网络测试场景中,可能需要构造并发送自定义的DHCP包以测试网络的响应。以下是使用scapy构造并发送一个DHCP发现包的例子:

from scapy.all import Ether, IP, UDP, BOOTP, DHCP, sendpdef send_dhcp_discover():discover_packet = Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0", dst="255.255.255.255")/UDP(sport=68, dport=67)/BOOTP(op=1)/DHCP(options=[("message-type", "discover"), "end"])print("Sending DHCPDISCOVER packet...")sendp(discover_packet, iface="YourNetworkInterfaceHere")send_dhcp_discover()

在使用这个脚本之前,需要将"YourNetworkInterfaceHere"替换为你的网络接口名称,例如eth0。这个脚本构造一个广播的以太网帧,内含一个 IP 和 UDP 头部,指向 DHCP 服务器的标准端口,以及一个 BOOTP 消息,带有一个 DHCP 发现类型的选项。

通过这些案例,你不仅加深了对 DHCP 工作机制的理解,还学会了如何使用 Python 进行基本的网络编程,包括模拟 DHCP 客户端行为、监听和分析网络上的 DHCP 消息,以及构造和发送自定义的 DHCP 包。这些技能在网络管理、测试和安全分析领域非常有用。

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

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

相关文章

ES6-对象的解构赋值

一、区别一下数组的解构赋值 - 对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值二、说明 - 对象的解构赋值的内部机制&#…

【Vitis】Vitis HLS学习系列笔记 :第一个例程

在学习vitis的过程中一定要跑几个例程试试看,这中间遇到了几个小问题,记录下 有干货,请注意查收:作为新手,跑例程大概率会遇到问题,这里记录几个问题,如果刚好你也遇到,一定会帮到你…

XML详解

文章目录 XML简介语法约束DTDSchema 解析Jsoup使用对象详解JsoupDocumentElementsElementNode XML 简介 概述:Extensible Markup Language 可扩展标记语言 可扩展:标签都是自定义的。 功能 数据存储:XML 可以用来存储结构化数据&#xff0c…

HSRP配置指南

实验大纲 第 1 部分:验证连通性 步骤 1:追踪从 PC-A 到 Web 服务器的路径 步骤 2:追踪从 PC-B 到 Web 服务器的路径 步骤 3:观察当 R3 不可用时,网络的行为 第 2 部分:配置 HSRP 主用和 备用路由器 步…

rasa3.X 自定义action的注册问题

rasa3.X 自定义action的注册问题 文章目录 rasa3.X 自定义action的注册问题前言一、问题重述二、问题解决 前言 幸好在这之前抽时间稍微看了一点django源码,让我对于python的导入机制有了一个概念。虽然还不是很确切的知道python import机制,不过在看到…

QT学习日记 | 初始QT

目录 一、创建QT文件 二、目录结构讲解 1、.pro文件 2、源文件与头文件 3、编译运行 4、界面文件 三、梦开始的地方(Hello World!) 1、代码方式 2、拖拽方式 四、Qt中的“容器” 五、Qt的对象树机制 1、对象树的引入 2、对象树…

MySQL进阶之锁(全局锁以及备份报错解决)

锁 全局锁 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语 句,已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定&#xff…

030-安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

030-安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计 #知识点: 1、NodeJS-开发环境&功能实现 2、NodeJS-安全漏洞&案例分析 3、NodeJS-开发指南&特有漏洞 演示案例: ➢环境搭建-NodeJS-解析安装&…

MySQL知识点总结(三)——事务

MySQL知识点总结(三)——事务 事务事务的四大特性ACID原子性一致性隔离性持久性 脏读、幻读、不可重复读脏读不可重复读幻读 隔离级别读未提交读已提交可重复读串行化 事务的原理InnoDB如何实现事务的ACID事务的两阶段提交redo log与binlog的区别事务两阶…

【DevOps】产品需求文档(PRD)与常见原型软件

文章目录 1、PRD介绍1.1、概述1.2、前提条件1.3、主要目的1.4、关键内容1.5、表述方式1.6、需求评审人员1.7、一般内容结构 2、需求流程3、常见原型软件3.1、Word3.2、Axure3.2.1、详细介绍3.2.2、应用分类3.2.3、优缺点 3.3、摹客RP3.4、蓝湖3.5、GUI Design Studio 1、PRD介绍…

业务流程自动化平台在制造业应用案例,助力业务自动化、智能化

捷昌驱动成立于2000年,并于2018年9月在上海证券交易所上市,是一家专注于线性驱动产品研发、生产及销售的科技集团。 公司整合全球资源,为智慧办公、医疗康护、智能家居、工业自动化等关联产业提供驱动及智能控制解决方案,以科技驱…

荣耀手机如何录屏?在线分享3个录屏方法

荣耀手机如何录屏?荣耀手机录屏是一项非常实用的功能,它可以帮助我们轻松记录手机屏幕上的内容,无论是游戏攻略、教育学习还是工作演示,都能够方便地进行录制。通过录屏,我们可以随时随地记录和分享自己的操作和见解。…

探究Steam爆款游戏”幻兽帕鲁“:玩家评价揭秘

探究Steam爆款游戏”幻兽帕鲁“:玩家评价揭秘 文章目录 探究Steam爆款游戏”幻兽帕鲁“:玩家评价揭秘1 背景描述2 数据说明3 数据来源4 问题描述5 数据探索与预处理5.1 数据加载5.2 数据清洗 6 数据分析6.1 评论分布分析6.2 评论内容情感分析6.3 地理分布…

力扣热门100题刷题笔记 - 2.两数相加

力扣热门100题 - 2.两数相加 题目链接:2.两数相加 题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返…

图书|基于Springboot的图书管理系统设计与实现(源码+数据库+文档)

图书管理系统目录 目录 基于Springboot的图书管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、个人中心 2、管理员管理 3、用户管理 4、图书出版社管理 5、公告类型管理 6、所在书架管理 7、图书类型管理 8、论坛管理 9、公告信息管理 10、图书信…

【数据结构】(分治策略)中位数的查询和最接近点对问题

中位数查询: 寻找一组字符串中第k小的数,返回其值和下标。 不可以有重复值(在缩小规模的时候,会导致程序死循环) 相对位置的转换体现了分治策略的思想。> 划分函数 int partition(int *nums,int left, int rig…

Jmeter 自动化性能测试常见问题汇总

一、request 请求超时设置 timeout 超时时间是可以手动设置的,新建一个 http 请求,在“高级”设置中找到“超时”设置,设置连接、响应时间为2000ms。 1. 请求连接超时,连不上服务器。 现象: Jmeter表现形式为&…

SQL sever2008中创建用户并赋权

一、创建数据库dream CREATE DATABASE dream; 二、创建登录用户XZS 法一:使用SSMS创建 通过查询 sys.syslogins 系统视图来确定当前登录是否具有系统管理员权限。执行以下查询语句: SELECT name, isntname FROM sys.syslogins WHERE sysadmin 1;选…

初始mach-o文件及在项目中应用

本文字数:2250字 预计阅读时间:15分钟 01 认识mach-o的必要性 了解mach-o的结构可以帮助认识系统加载二进制文件的动态链接和静态链接。应用层面,使用initialize的c函数计算启动时间耗时也需要以mach-o的结构知识为铺垫。还可以用在使用clang…

2、排列重要性 Permutation Importance

您认为模型哪些特性是重要的? 文章目录 1、简介2、工作原理3、代码示例4、解释排列重要性1、简介 对于模型来说,我们可能会问的最基本的一个问题是:哪些特征对预测影响最大? 这个概念被称为特征重要性。 有多种方法可以衡量特征重要性。一些方法回答了上面提到的问题的微…