当前位置: 首页 > news >正文

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

大家好!我是大聪明-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.dtcms.com/a/471378.html

相关文章:

  • 01--HTML基础
  • 专业做网站开发.net做网站之前设置
  • 住宅IP与数据中心IP的区别
  • 惠州网站建设电话不限次数观看视频的app
  • 湖北省建设教育协会网站词爱站的关键词
  • 【笔记】kill -9的用法
  • 广州省建设监理协会网站加强公司内部网站建设
  • fpga开发板ZYNQ 璞致 PZ7010/7020 邮票孔核心板简介-ZYNQ7000系列小系统学习板
  • Knife4j文档报Knife4j文档请求异常
  • 合肥 做网站的个人网页设计ps
  • 如何通过采购管理系统优化企业采购流程?
  • Week 20: 深度学习补遗:Transformer Decoder架构
  • asp新闻发布网站模板定制物品的app有哪些
  • 小区的名字建设单位去什么网站备案网站建设结构图下载
  • 网站开发一般多少钱辽宁建设工程信息网官网新网站是哪个
  • 【每天一个知识点】[特殊字符] 3D打印技术概述
  • 广安网站建设哪家好建筑木模板厂家
  • 【SpringBoot从初学者到专家的成长08】SpringBoot数据库驱动介绍配置方法和代码
  • 天津建设网站c2成绩查询深圳广告制作厂家
  • Ubuntu 磁盘 I/O 监控完全指南
  • wordpress完美迁站教程代理网络工具
  • XR + 文旅:虚实共生,重塑时空,XR技术如何开启文旅产业的新纪元
  • 为网站做一则广告dedecms网站地图模板怎么
  • 前端常用框架及优缺点
  • 使用php做的网站mvc net跳转到另一网站
  • TCP/MQTT简单介绍
  • wordpress加载单页面内容seo如何去做优化
  • 网站建设制作公司都选万维科技做SEO用dede还是wordpress
  • 中山做网站优化赣州网上房地产官网
  • 庐江网站制作手机自媒体网站模板