TCP/IP 协议族—理论与实践(二) - 指南

news/2025/11/7 15:23:27/文章来源:https://www.cnblogs.com/gccbuaa/p/19199820

大家好!我是大聪明-PLUS

▍ DHCP 协议


要在 TCP/IP 网络上运行,必须配置主机。至少,您必须指定其 IP 地址和子网掩码。您可能还需要指定网关地址和 DNS 服务器地址。DHCP 协议允许主机自动从网络获取这些信息。

使用此协议的方法多种多样,但我们将考虑主机成功获取 IP 地址的基本场景,该场景包含四条消息的交换。

▍ 获取配置


1. 最初,主机没有 IP 地址,也不知道可以提供此信息的 DHCP 服务器的位置。因此,它会在其网段上广播 DHCP 发现消息。

2. 如果网络上存在 DHCP 服务器,它会以 DHCP 提供单播消息进行响应,其中包含建议的主机配置。

3. 主机发送 DHCP 请求单播消息,指示其已分配的 IP 地址。

4. 服务器以 DHCP 确认单播消息进行响应,指示配置已分配给主机。

序列图如下所示。


▍消息结构

该协议在RFC 2131 — 动态主机配置协议 中描述。DHCP 协议是早期 BOOTP 协议(​​RFC 951 引导协议)的扩展。因此,DHCP 消息头几乎与 BOOTP 消息完全相同。选项字段始终以幻数 0x62825363 开头,后跟RFC 2132 DHCP 选项和 BOOTP 供应商扩展中描述的 DHCP 选项。


每个选项都包含一个代码、一个长度以及一个或多个消息八位字节。代码为 0x00(填充符)和 0xff(选项结尾)的选项除外。DHCP 消息的大小(以八位字节为单位)必须是四的倍数,因此在代码为 0xff 的选项之后可能有一个或多个代码为 0x00 的选项。

DHCP消息如下所示:


▍ DNS 协议

DNS 协议受RFC 1035“域名——实现和规范”的约束。

您可能熟悉 DNS 服务,因为它用于将主机的域名解析为其 IP 地址。它看似简单,对于程序员来说,一切都隐藏在简单的 API 背后,但这也使得理解 DNS 变得困难。主机的 IP 地址只是 DNS 存储信息的一部分。


像 nslookup 这样的程序以及 Winsock 或 glibc 中的函数可能会令人困惑。我建议您先尝试使用 dig 实用程序并分析流量,然后再开始您的 DNS 研究。查看 DNS 时应忽略 IP 地址。DNS 是一个分布式的分层域数据库。

要确认它确实是一个数据库,您可以访问其网站并查看相关确认信息。

▍ 域名


什么是域名?域名可以定义为一个命名实体,它包含自身的元数据,由组织或个人管理。这些信息包括 IP 地址、使用的邮件服务器名称、支持该域名的域名服务器名称等等。为了简化域名管理,域名被组织成一个层次结构。

域名并非独立存在,它们由域名服务器存储。与域名相关的信息被分组到一个区域 (zone) 中,该区域由特定的域名服务器维护。

▍ 区域


区域是存储在 DNS 服务器上的域名信息。


▍ 资源记录


域名系统 (DNS) 支持结构化存储信息。域名被组织成树形结构,其叶子节点是资源记录 (RR)。每个 RR 都有一个类别和类型。通常,类别可以采用以下值:

  • IN(互联网);
  • CH(混沌);
  • HS(赫西奥德)。


虽然您可能会遇到 CH 和 HS 类,但它们的应用非常特殊,您可能永远不会遇到它们。

然而,还有更多 RR 类型,其中一些是必须了解的:

  • A(地址)——分配给域名的 IP 地址;
  • AAAA(IPv6 地址)— 分配给域名的 IPv6 地址;
  • CNAME(规范名称);
  • MX(邮件交换器);
  • NS(名称服务器);
  • PTR(指针);
  • SOA(授权开始);
  • TXT(文本);
  • SRV(服务)。

▍ 解析器


域名服务 (DNS) 允许您根据主机名获取 IP 地址。这是通过运行在多台主机上的分布式数据库实现的。主机通常与一个称为解析器的本地组件交互。解析器可以通过操作系统 API 或编程语言库访问。

执行 API 函数时,解析器会检查其本地缓存中是否存在该主机名的 IP 地址。如果未找到,它会尝试查询配置中指定的 DNS 服务器。为了简单起见,我们将省略后续步骤。最终,DNS 服务器返回该主机名的 IP 地址,如果主机不存在,则返回错误。解析器会缓存此信息,并将值返回给调用代码。在 Linux 上,解析器 API 位于 glibc 库中,在 Windows 上,位于 Winsock 库中。

网络编程示例通常侧重于如何使用解析器 API。在实践部分,我将展示如何通过构建包含 DNS 请求的 IP 数据包,在底层向 DNS 服务器发送请求。

▍ 包结构


一个简单的 DNS 查询如下所示:


DNS 响应示例如下所示:


通常,请求和响应使用 UDP 作为传输协议发送。但是,如果响应过大,服务器将返回 TC 标志。这意味着必须使用 TCP 作为传输协议才能接收完整的响应。

网络编程和网络流量分析

▍TCP/IP协议栈及编程接口


几乎所有现代操作系统都支持 TCP/IP 协议族。支持通过 TCP/IP 协议族进行通信的操作系统组件集合称为协议栈。不同的操作系统使用不同的编程接口访问协议栈。最常见的是套接字接口。

虽然此接口在不同操作系统中有所不同,但大多数功能相似。使用套接字需要使用 C 语言编程。然而,已经为各种语言编写了允许跨平台访问套接字的包装器。根据语言的不同,包装器可能提供更多或更少的功能。例如,Python 包装器比 Java 包装器更特定于平台。

▍ 网络数据包分析


网络相关文献通常涵盖计算机网络的基础知识,然后是套接字。然而,如何创建和发送具有详细结构的数据包却没有涉及。我想填补这一空白。

操作系统中的处理器指令可以在内核模式或用户模式下执行。程序员编写的大部分代码都是在用户模式下执行的处理器指令。驱动程序和操作系统内核代码在内核模式下执行。TCP

/IP 协议栈在内核模式下执行,而在用户模式下,通常只能通过 API 套接字调用来访问它。因此,程序员只能执行高级操作,例如打开 TCP 连接、通过 TCP 连接传输数据或以 UDP 数据报的形式传输数据。他们无法访问正在创建的数据包。

为了访问这些数据包,需要使用所谓的原始套接字。需要注意的是,在 Windows 中,原始套接字的功能有限。例如,无法创建允许处理以太网帧的原始套接字。因此,为了访问以太网帧的生成,需要使用特殊的 NDIS 驱动程序和 npcap 库。然而,在 Linux 中,只需创建一个 AF_PACKET Raw 套接字就足够了。

▍ libpcap


该库提供了一个用于形成、过滤和拦截数据包的高级 API,它隐藏了不同平台的实现细节。

▍ Scapy


有适用于 Windows 的 npcap 库,以及适用于类 Unix 系统的 libpcap。Scapy Python 库允许开发独立于平台的应用程序,而无需考虑平台无关性。它还支持多种网络协议,并包含用于从用户空间解析、生成和发送数据包的工具。例如,它可以计算 IP 数据包头的校验和,并在封装数据包时指定正确的以太网类型或协议。该库方便您实验和研究网络协议。

▍Wireshark


Wireshark 可以说是使用最广泛的网络流量分析程序。使用其图形界面,您可以将网络流量记录到磁盘、过滤数据包、检查数据包结构、监控 TCP 会话等等。与 Scapy 结合使用,它可能是学习网络协议基础知识和进行各种实验的最佳套件。

程序代码示例


接下来,我想提供我的应用程序中的摘录,以便更容易理解 TCP/IP 的基础知识。

▍ 创建 ARP 请求

def create_arp_request(ip):return Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip)

▍ 创建 ICMP 协议中使用的 Echo 消息

def create_ping_request(ip):return IP(dst=ip)/ICMP()

▍ 创建 DHCP Discover 和 DHCP Request 消息

def create_dhcp_discover(mac):return (Ether(src=mac, dst='ff:ff:ff:ff:ff:ff')/ IP(src='0.0.0.0', dst='255.255.255.255')/ UDP(dport=67, sport=68)/ BOOTP(op=1, chaddr=mac_to_bytes(mac))/ DHCP(options=[('message-type', 'discover'), 'end']))

def create_dhcp_request(mac, ip):return (Ether(src=mac, dst='ff:ff:ff:ff:ff:ff')/ IP(src='0.0.0.0', dst='255.255.255.255')/ UDP(dport=67, sport=68)/ BOOTP(op=1, chaddr=mac_to_bytes(mac), ciaddr=ip)/ DHCP(options=[('message-type', 'request'), 'end']))

▍ 创建 DNS 消息来接收 AA 类型的资源记录

    return IP(dst=dns_server)/UDP()/DNS(rd=1, qd=DNSQR(qname=host_name))

▍建立TCP连接

def create_tcp_syn(src, sport, dst, dport, seq):return IP(src=src, dst=dst)/TCP(seq=seq,sport=sport, dport=dport, flags="S")
def create_tcp_ack(src, sport, dst, dport, ack, seq):return IP(src=src, dst=dst)/TCP(ack=ack, seq=seq, sport=sport, dport=dport, flags="A")
def create_tcp_fin_ack(src, sport, dst, dport, ack, seq):return IP(src=src, dst=dst)/TCP(ack=ack, seq=seq, sport=sport, dport=dport, flags="F")
def create_and_close_tcp_connection(host, dport):dst = socket.gethostbyname(host)src = get_default_interface_ip()sport = 12360seq = 1000syn = packets.create_tcp_syn(src=src, sport=sport, dst=dst, dport=dport, seq=seq)response = send_receive_l3(syn)ack = packets.create_tcp_ack(src=src, sport=sport, dst=dst, dport=dport, seq=response[TCP].ack, ack=response[TCP].seq+1)send_l3(ack)fin_ack = packets.create_tcp_fin_ack(src=src, sport=sport, dst=dst, dport=dport, seq=response[TCP].ack, ack=response[TCP].seq+1)response = send_receive_l3(fin_ack)ack = packets.create_tcp_ack(src=src, sport=sport, dst=dst, dport=dport, seq=response[TCP].ack, ack=response[TCP].seq+1)send_l3(ack)


由于我们干扰了 TCP/IP 协议栈的标准操作,而协议栈无法感知到我们的干扰,它可能会向非预期的报文段发送 RST 报文段。为了防止这种情况发生,我们需要暂时禁用 RST 报文段的发送。在 MacOS 上,可以使用 pfctl 命令来实现。在 Linux 上,您可以使用 iptables。

echo "block drop out proto tcp from any to any flags R/R" | cat /etc/pf.conf - | sudo /sbin/pfctl -Ef -

结论


最初,我打算为初学者介绍网络流量拦截,但后来我觉得从程序员的角度介绍计算机网络的基础知识,以便提供一些基本的理解。结果发现这个主题非常广泛,遗憾的是,文章篇幅有限,无法涵盖所有​​内容。不过,我提供了足够的材料来理解基础知识和示例。

使用 Scapy,您可以尝试用最少的代码从用户空间发送自定义数据包,而无需深入研究驱动程序编程。Wireshark 可以方便地分析通过网络传输的数据包并检查其结构。

我写了一篇文章,讲述我在开始学习网络编程时所缺少的内容。

文章中提供的示例并不适合在实际应用中使用;它们只是提供了对网络协议基础知识的理解。您很可能不需要实现自己的 ARP 协议、编写 DHCP 客户端、DNS 客户端或实现 ping 命令。但是通过对它们进行实验,您可以加深对网络协议的理解,还可以了解网络协议的实现在各种不可预见的情况下的行为。

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

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

相关文章

2025 年热熔胶源头厂家最新推荐排行榜:聚焦五大优质品牌,助力企业选对稳定供应商阻燃热熔胶/无初粘热熔胶/汽车热熔胶公司推荐

引言 热熔胶作为工业粘接领域的关键材料,广泛应用于厨具家电、汽车制造、医疗器材、电子电气等行业。为帮助下游企业精准筛选优质源头厂家,行业协会联合专业测评机构开展了热熔胶源头厂家专项测评。测评采用多维度指…

维修厂家口碑排行榜单2025年:权威解析

摘要 2025年维修厂家行业正迎来技术革新与市场扩张,制冷服务需求持续增长,高效节能成为核心趋势。本文基于权威数据与用户反馈,推出2025年维修厂家推荐排行榜单,旨在为企业提供可靠选择参考。榜单综合技术实力、服…

【分析报告】金风科技如何培养新一代风电人才

金风科技如何培养新一代风电人才 行业深度分析报告 2024年4月 目录 一、引言 二、金风科技企业概述 三、风电行业人才培养面临的挑战 四、金风科技人才培养战略 五、系统化人才培养体系构建 六、典型案例分析 七、人才…

2025 年倾斜开关厂家最新推荐榜:盘点市场认可度高的源头厂家,涵盖多类型倾斜开关优质品牌广州倾斜开关/贴片倾斜开关/电子式倾斜开关公司推荐

引言 在传感控制领域,倾斜开关作为保障设备安全运行、实现精准控制的关键元件,市场需求持续攀升。但行业内部分厂家存在核心技术缺失、品控体系不完善、服务响应滞后等问题,给企业采购带来困扰。 本次 2025 年倾斜开…

金风科技如何培养新一代风电人才?深度解析金风科技的人才发展战略与实践

2024年行业分析报告 目录 一、项目背景与概述 二、金风科技公司简介 三、风电人才培养体系建设 3.1 人才发展路径设计 3.2 多元化培训计划 3.3 导师制与实践平台 3.4 激励机制与职业发展 四、成功案例分析 五、行业挑战…

2025年背封湿巾包装机生产厂家权威推荐榜单:棉片湿巾包装机/航空湿巾包装机/一次性湿巾包装源头厂家精选

在个人护理与卫生用品市场持续增长的背景下,背封湿巾包装机作为湿巾生产线的核心设备,其自动化程度与包装质量直接影响产品竞争力。行业数据显示,2024年中国湿巾包装设备市场规模增长率达12%,其中背封式包装机在湿…

C# 读取txt日志文件乱码

using System.Text; // 确保引入了这个命名空间namespace ConsoleApp12 {internal class Program{static void Main(string[] args){// 注册编码提供程序,以支持更多编码(如GB2312)Encoding.RegisterProvider(CodeP…

lua-zlib模块安装与使用

本文分享自天翼云开发者社区《lua-zlib模块安装与使用》.作者:lucky_lyw lua-zlib包用于nginx上对gzip数据进行解压缩,可将lua-zlib编译成一个动态链接库zlib.so,便于lua引用。 github:https://github.com/brimwork…

智能驱动,安全可控:国标GB28181算法算力平台EasyGBS如何构建企业生产智能监控新模式

智能驱动,安全可控:国标GB28181算法算力平台EasyGBS如何构建企业生产智能监控新模式在企业数字化转型的深水区,生产监控体系正面临视频数据孤岛、智能分析滞后与标准协议缺失三重挑战。本文深入探讨基于国家标准GB2…

2025年11月仿真花源头厂家推荐榜:五强工厂口碑与参数全解析

正在准备婚礼堂、软装陈设或商业美陈项目的你,如果正被“真花易萎、进口花材价格高、季节缺货”困扰,仿真花源头厂家就成为降本增效的关键。2025年国内仿真花市场规模已突破180亿元,婚礼与软装场景占比超过六成,政…

2025年河南排队返现公司权威推荐榜单:排队返现系统/排队返现模式/排队免单源头公司精选

在数字化营销浪潮的推动下,排队返现系统以其独特的用户激励与流量转化能力,已成为零售、餐饮、本地生活等服务行业重要的营销工具。行业数据显示,2024年中国互动营销系统市场规模预计突破80亿元,年均增长率保持在1…

2025 年密炼机厂家最新推荐排行榜:企业实力深度解析,含权威测评数据与选购指南 啮合型密炼机/实验用密炼机公司推荐

引言 密炼机作为橡胶塑料加工、实验室研发领域的核心混炼设备,其性能与质量直接决定生产效率、产品品质及研发数据准确性。为助力企业与科研机构精准选型,行业协会联合专业测评机构开展了 2025 年度密炼机品牌测评,…

2025 年 11 月河道流量雷达流量计,灌区水量计量雷达流量计,河道矩阵雷达流量计厂家最新推荐,实力品牌深度解析采购无忧之选!

引言 随着水环境监测与智慧水务领域的快速发展,河道流量雷达流量计、灌区水量计量雷达流量计、河道矩阵雷达流量计作为关键监测设备,市场需求持续攀升。为帮助用户精准筛选优质厂家,行业协会联合专业测评机构开展了…

2025 年 11 月水文站流量测量雷达流量计,多普勒雷达流速流量计,山洪监测雷达流量计,明渠雷达流量计厂家最新推荐,聚焦资质、案例、售后的五家机构深度解读!

引言 在水环境监测与智慧水务建设加速推进的背景下,水文站流量测量雷达流量计、多普勒雷达流速流量计、山洪监测雷达流量计、明渠雷达流量计作为精准获取水流数据的关键设备,市场需求持续攀升。为帮助用户筛选优质厂…

2025 年防静电地板源头厂家最新推荐榜单:权威品牌实力展现及选购指南生产防静电地板/防静电活动地板/抗静电地板公司推荐

引言 随着数字化与信息化高速发展,数据中心、医院、金融机构等场所对防静电地板的需求持续攀升,但行业产品质量参差不齐的问题凸显。为精准筛选优质源头厂家,行业协会联合专业测评机构开展权威测评,形成 2025 年防…

2025年11月抚州装修公司优选榜:五强对比与真实排名全解析

抚州城区新房交付进入集中期,毛坯房、旧改、精装升级三类需求叠加,业主在挑选装修公司时普遍面临“预算难控、工艺难懂、售后难找”三大痛点。市住建局公开数据显示,2022年以来抚州新增装饰企业年均增长12%,但同期…

艾体宝洞察 | 2025年代码扫描:重要性、实施方法及其在人工智能安全中的作用

代码扫描是通过自动分析源代码来识别潜在安全漏洞、缺陷和其他代码质量问题的过程。它是安全应用开发的关键环节,能够帮助团队在软件开发生命周期的早期阶段检测并修复问题。 代码扫描工具主要使用静态分析方法(在不…

大模型核心参数详解:从基础配置到高级调优指南

大模型核心参数详解:从基础配置到高级调优指南引言:参数调优的重要性 在大语言模型的应用中,仅仅提供一个好的提示词往往不足以获得理想的输出结果。模型参数的合理配置同样至关重要,它如同给模型调配合适的“工作…

2025 年 TM 芯片代理商最新推荐榜单:聚焦规模化采购与敏捷物流能力,前五权威测评解析广东 TM 芯片 / 深圳 TM 芯片推荐

引言 在全球数字经济与智能化变革的驱动下,TM 芯片作为电子元器件核心品类,已深度渗透消费电子、工业自动化、物联网等关键领域。但市场中 1.5 万余家相关企业资质参差不齐,据行业协会数据显示,2024 年中小批量采购…

吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(一)Mini-batch 梯度下降

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…