阅读前言
本文以QNX系统官方的文档英文原版资料为参考,翻译和逐句校对后,对QNX操作系统的相关概念进行了深度整理,旨在帮助想要了解QNX的读者及开发者可以快速阅读,而不必查看晦涩难懂的英文原文,这些文章将会作为一个或多个系列进行发布,从遵从原文的翻译,到针对某些重要概念的穿插引入,以及再到各个重要专题的梳理,大致分为这三个层次部分,分不同的文章进行发布,依据这样的原则进行组织,读者可以更好的查找和理解。
1. TCP/IP 网络
随着互联网在我们日常生活中的影响力日益显著,其所依托的协议 IP(Internet Protocol,互联网协议)也变得愈发重要。IP 协议及其相关工具无处不在,这使得 IP 成为众多专用网络事实上的首选协议。
IP 被用于从简单任务(例如远程登录)到更复杂任务(例如提供实时股票报价)等诸多方面。大多数企业都在借助通常基于 IP 协议栈运行的万维网来与客户进行沟通、开展广告宣传以及实现其他业务连接。QNX Neutrino 实时操作系统(RTOS)非常适合在这个全球网络中扮演各种各样的角色,从被连接到互联网的嵌入式设备,到用于构建互联网本身的路由器,都能胜任。
鉴于这些以及许多其他用户需求,我们打造了相对节省资源的 TCP/IP 协议栈(包含在 io-pkt * 中),同时采用了通用的 BSD 应用程序编程接口(API)。
@>>阅读扩展:
Q:这里的BSD是什么单词的缩写?是什么意思?
BSD 是指伯克利软件套件(Berkeley Software Distribution)。
历史背景
- BSD 起源于加州大学伯克利分校(University of California, Berkeley)。在 20 世纪 70 年代末,伯克利的计算机系统研究组(Computer Systems Research Group,CSRG)在 AT&T 公司的 Unix Version 6 和 Version 7 的基础上进行开发。他们对 Unix 系统进行了大量的修改和扩展,添加了许多新的功能和工具,最终形成了自己的 Unix 版本,这就是 BSD。
- BSD 在 Unix 的发展历程中起到了关键的作用,它推动了 Unix 系统在学术和商业领域的广泛应用。许多现代操作系统的技术和理念都源于 BSD。
技术特点
- 网络功能强大:BSD 包含了 TCP/IP 协议栈的早期实现,这使得它在网络方面具有先天的优势。例如,它能够高效地处理网络连接、数据包传输等任务,为互联网的发展奠定了基础。许多网络服务器软件最初都是基于 BSD 开发的。
- 高度可定制性:BSD 允许用户根据自己的需求灵活配置系统。用户可以选择安装不同的软件包,调整系统参数,甚至修改内核源代码来满足特定的应用场景。比如,对于一个高性能计算中心,可以通过定制 BSD 系统来优化计算资源的分配和利用。
- 稳定性和安全性高:BSD 以其稳定性和安全性闻名。它经过了多年的实践检验,在关键系统和网络服务中被广泛应用。其安全机制包括访问控制、用户认证等多种手段,可以有效防止系统被非法访问和攻击。
主要版本和应用场景
- FreeBSD:这是最知名的 BSD 衍生版本之一。它被广泛应用于服务器领域,尤其是网络服务器,如 Web 服务器、邮件服务器、文件服务器等。许多互联网服务提供商(ISP)使用 FreeBSD 来构建稳定可靠的服务器环境。
- NetBSD:NetBSD 的设计目标是能够在尽可能多的硬件平台上运行,具有良好的移植性。它可以用于嵌入式系统、小型网络设备以及对硬件兼容性要求较高的场景。
- OpenBSD:OpenBSD 注重系统安全,在安全审计、加密技术等方面投入了大量精力。它常用于对安全要求极高的环境,如防火墙系统、安全研究机构的实验平台等。
我们提供以下几种协议栈配置:
NetBSD TCP/IP 协议栈
基于最新的请求注解(RFC)文档,涵盖用户数据报协议(UDP)、IP 协议以及传输控制协议(TCP)。还支持转发、广播和多播,具备硬件校验和支持、路由套接字、Unix 域套接字、多链路点到点协议(PPP)、以太网上的点到点协议(PPoE)、无类别域间路由(CIDR,即超网划分)、网络地址转换 / IP 过滤、地址解析协议(ARP)、互联网控制消息协议(ICMP)以及互联网组管理协议(IGMP),此外还支持通用互联网文件系统(CIFS)、动态主机配置协议(DHCP)、自动 IP 配置(AutoIP)、域名系统(DNS)、网络文件系统(NFS,包含第 2 版和第 3 版的服务器 / 客户端功能)、网络时间协议(NTP)、路由信息协议(RIP)、路由信息协议第 2 版(RIPv2)以及一个嵌入式网络服务器。
要为该协议栈创建应用程序,需使用行业标准的 BSD 套接字 API。当该协议栈作为网络网关运行时,它还包含经过优化的转发代码,以实现更出色的性能以及高效的数据包路由。
@>> 补充概念:
“RFC” 全称为 “Request for Comments”,在网络技术领域通常为 “请求注解”,它实际上是一系列以编号排定的文件,内容涵盖了互联网相关的技术规范、协议、过程等诸多方面,用于记录互联网通信协议的相关标准以及对这些标准的修改、补充说明等信息。
互联网工程任务组(IETF)等相关组织会通过发布 RFC 文档来对网络协议等进行定义和规范,众多网络协议(比如文中提到的 TCP、IP 等相关协议)的具体内容、实现细节、运作规则等都是依据对应的 RFC 文档来确定的,网络技术领域的专业人员会参考这些 RFC 文档去进行相应的系统开发、网络构建等工作,使其符合标准规范。例如,开发某个遵循 IP 协议的应用时,开发者就要参照涉及 IP 协议的最新 RFC 文档中规定的各项要求和细节来进行编码等操作。
带有 IPsec(互联网协议安全)和 IPv6(互联网协议第 6 版)的增强型 NetBSD 协议栈
包含标准协议栈中的所有功能,再加上针对新一代移动和安全通信的功能特性。该协议栈通过 KAME 扩展提供对 IPv6 和 IPsec(涵盖 IPv4 和 IPv6)的全面支持,以及对基于 IPsec 隧道的虚拟专用网络(VPN)的支持。
这种双模协议栈可同时支持 IPv4 和 IPv6,并且包含针对自动配置的 IPv6 支持,这使得设备能在即插即用的网络环境中进行配置。IPv6 支持还包括支持 IPv6 的实用工具以及支持动态路由的路由信息协议 / 路由信息协议下一代(RIP/RIPng)。此外,还提供了一个高级套接字 API,用以补充标准套接字 API,以便充分利用 IPv6 扩展开发能力。
对 IPsec 的支持,能够实现主机之间或网络之间的安全通信,通过强大的加密算法提供数据保密性以及数据认证功能。对 IPsec 的支持还包括用于建立安全主机关联的互联网密钥交换(IKE,即 ISAKMP/Oakley)密钥管理协议。
QNX Neutrino TCP/IP 套件也是模块化的。例如,它将网络文件系统(NFS)作为独立模块提供。凭借这种模块化特性以及小巧的模块设计,嵌入式系统开发人员能够更轻松、更快速地构建具备 TCP/IP 功能的小型系统。
1.1. TCP/IP管理器的结构
作为资源管理器,io-pkt-*
得益于精简的代码以及所有本地资源管理器都具备的标准接口。由于 QNX Neutrino 进程间通信(IPC)具有天然的优先级继承特性,客户端将按照优先级和时间顺序得到处理,这使得 CPU 资源能得到更合理的分配。
点到点协议(PPP)是作为io-pkt的一部分来实现的。由于 io-pkt负责处理 PPP 数据包的传输,因此无需对数据包数据进行内存拷贝。这种方式可实现高性能的以太网上的点到点协议(PPoE)连接。
TCP/IP 协议套件的其他组件(例如网络文件系统等)是在io-pkt* 之外实现的。这样能实现更好的模块化以及具备更强的容错能力。
1.2. Socket API
伯克利软件套件(BSD)套接字应用程序编程接口(API)显然是 QNX Neutrino 实时操作系统(RTOS)的不二之选。该 API 是 UNIX 领域中进行 TCP/IP 编程的标准接口。在 Windows 领域,Windows 套接字(Winsock)API 基于 BSD 套接字 API 构建,并且与之有诸多共通之处,这使得在两者之间进行转换相当容易。
应用程序开发人员所期望的所有例程均可供使用,包括(但不限于)以下这些:
accept()
(用于接受连接请求)bind()
(用于绑定地址和端口)bindresvport()
(用于绑定保留端口)connect()
(用于建立连接)dn_comp()
(域名压缩相关函数)dn_expand()
(展开域名相关函数)endprotoent()
(关闭协议数据库相关操作)endservent()
(关闭服务数据库相关操作)gethostbyaddr()
(通过网络地址获取主机信息)gethostbyname()
(通过主机名获取主机信息)getpeername()
(获取连接端的地址信息)getprotobyname()
(通过协议名获取协议信息)getprotobynumber()
(通过协议编号获取协议信息)getprotoent()
(获取协议数据库入口)getservbyname()
(通过服务名获取服务信息)getservent()
(获取服务数据库入口)getsockname()
(获取套接字的本地地址信息)getsockopt()
(获取套接字选项)herror()
(处理主机相关错误信息)hstrerror()
(将主机错误码转换为字符串描述)htonl()
(将主机字节序转换为网络字节序,长整型)htons()
(将主机字节序转换为网络字节序,短整型)h_errlist
(主机错误信息列表)h_errno
(主机错误编号)h_nerr
(主机错误信息数量)inet_addr()
(将点分十进制 IP 地址转换为网络字节序的整型表示)inet_aton()
(将点分十进制 IP 地址转换为网络字节序的二进制表示)inet_lnaof()
(获取 IP 地址的本地网络地址部分)inet_makeaddr()
(组合网络地址和本地地址部分生成 IP 地址)inet_netof()
(获取 IP 地址的网络地址部分)inet_network()
(将点分十进制 IP 地址转换为网络字节序的网络地址表示)inet_ntoa()
(将网络字节序的 IP 地址转换为点分十进制表示)ioctl()
(输入 / 输出控制操作)listen()
(监听端口,等待连接请求)ntohl()
(将网络字节序转换为主机字节序,长整型)ntohs()
(将网络字节序转换为主机字节序,短整型)recv()
(接收数据)recvfrom()
(从指定地址接收数据)res_init()
(初始化域名解析相关资源)res_mkquery()
(构建域名解析查询)res_query()
(执行域名解析查询)res_querydomain()
(在指定域名下执行域名解析查询)res_search()
(搜索域名解析信息)res_send()
(发送域名解析请求)poll()
(轮询 I/O 事件)send()
(发送数据)sendto()
(向指定地址发送数据)setprotoent()
(设置协议数据库相关操作)setservent()
(设置服务数据库相关操作)setsockopt()
(设置套接字选项)shutdown()
(关闭连接)socket()
(创建套接字)
如需更多信息,请参阅《QNX Neutrino C 语言库参考手册》。
互联网中常见的守护进程和实用工具可以很容易地在这个环境中进行移植或者直接编译。这使得在开发应用程序时能够轻松利用已有的相关资源。
1.2.1. 数据库例程(Database routines)
以下列出的数据库例程已经过修改,以便能更好地适配嵌入式系统。
文件节点 /etc/resolv.conf
你可以使用配置字符串(通过confstr()
函数)来覆盖通常包含在 “/etc/resolv.conf” 文件中的数据。你也可以使用 “RESCONF” 环境变量来执行此操作。这两种方法中的任意一种都能让你在不使用 “/etc/resolv.conf” 文件的情况下使用域名服务器。这会对gethostbyname()
以及其他域名解析例程产生影响。
文件节点 /etc/protocols
getprotobyname()
和getprotobynumber()
函数已经过修改,使其包含少量内置协议,包括 IP 协议、互联网控制消息协议(ICNP)、用户数据报协议(UDP)以及传输控制协议(TCP)。对于许多应用程序来说,这意味着 “/etc/protocols” 文件并非必须存在。
文件节点 /etc/services
getservbyname()
函数已经过修改,使其包含少量内置服务,包括文件传输协议(ftp)、远程登录协议(telnet)、简单邮件传输协议(smtp)、域名系统(domain)、网络新闻传输协议(nntp)、网络基本输入输出系统名称服务(netbios-ns)、网络基本输入输出系统会话服务(netbios-ssn)、太阳微系统远程过程调用(sunrpc)以及网络文件系统守护进程(nfsd)。对于许多应用程序而言,这意味着 “/etc/services” 文件并非一定要存在。
1.3. 多个协议栈(Multiple stacks)
QNX Neutrino 网络管理器(io-pkt)允许你加载多个协议共享对象。你甚至可以运行网络管理器(io-pkt*)本身的多个独立实例。与所有 QNX Neutrino 系统组件一样,得益于微内核架构,每个 io-pkt * 都能自然而然地从完备的内存保护中获益。
1.4. IP 过滤和网络地址转换(NAT)
进行 IP 过滤与 NAT(网络地址转换)的 io-pkt*
模块是一个可动态加载的 TCP/IP 协议栈模块。
lsm-pf-*.so
模块提供了高效的防火墙服务,具备以下功能特性:
- 规则分组:可对不同的数据包应用不同的规则组;
- 有状态过滤:一种可选配置,允许与已授权连接相关的数据包绕过过滤规则;
- NAT:用于将多个内部地址映射到单个公网地址,使多个内部系统能够共享同一个公网 IP 地址;
- 代理服务:允许文件传输协议(ftp)、网络基本输入输出系统(netbios)以及 H.323 协议使用 NAT;
- 端口重定向:用于将传入流量重定向到内部服务器或服务器池。
IP 过滤和 NAT 规则可以在运行的系统中动态地添加或删除。该工具套件还提供了日志记录服务,以便对这个模块进行监控和管理。
1.5. NTP(Network Time Protocol)
网络时间协议(NTP,Network Time Protocol)能够让你将网络中各设备的时间与互联网标准时间服务器保持同步。QNX Neutrino 的网络时间协议守护进程同时支持服务器模式和客户端模式。
在服务器模式下,本地网络中的一个守护进程会与标准时间服务器进行同步。随后,它会将获取到的时间信息通过广播或多播的方式发送给本地网络中的客户端,或者等待客户端发起请求。之后,客户端的网络时间协议系统就会与服务器端的网络时间协议系统实现同步。网络时间协议套件实现了网络时间协议第 4 版,同时还保持了与第 3 版、第 2 版以及第 1 版的兼容性。
1.6. 动态主机配置
我们支持动态主机配置协议(DHCP),该协议用于获取 TCP/IP 配置参数。
我们的动态主机配置协议客户端(dhclient)会从动态主机配置协议服务器获取其配置参数,并为用户配置 TCP/IP 主机。这使得用户在不清楚主机需要哪些参数(如 IP 地址、网关等)的情况下,就能将主机添加到网络中。动态主机配置协议还允许系统管理员控制主机添加到网络中的方式。我们也提供了动态主机配置协议服务器守护进程(dhcpd)和中继代理(dhcrelay)来管理这些客户端。
如需更多信息,请查阅《实用工具参考手册》中关于 dhclient、dhcrelay 和 dhcpd 的条目内容。
1.6.1. 自动 IP
自动 IP(AutoIP)功能由零配置网络(Zeroconf)互联网工程任务组(IETF)草案发展而来,自动 IP 守护进程(autoipd)是一个 io-pkt*
模块,它能通过与网络中的对等节点进行协商,在无需服务器(与动态主机配置协议(DHCP)不同,DHCP 需要服务器)的情况下自动配置接口的 IPv4 地址。该模块还能与动态主机配置协议(DHCP,通过其客户端 dhclient 体现)共存,使得你的接口能够同时被分配一个链路本地 IP 地址以及一个由动态主机配置协议分配的 IP 地址。
@ >> 补充扩展:
Q:什么是自动IP?什么是DHCP?两者的区别?
自动 IP(Auto - IP)
- 定义:
- 自动 IP 是一种在网络中自动配置设备 IPv4 地址的机制。它基于 Zeroconf(零配置网络)IETF 草案,通过设备与网络中的对等节点进行协商来确定自身的 IP 地址。这种方式不需要专门的服务器来分配地址,适用于小型的、临时的或没有 DHCP 服务器的网络环境。例如,在一个小型的家庭网络或临时搭建的办公网络中,如果没有配置 DHCP 服务器,设备可以利用自动 IP 来快速获得一个可用的链路本地 IP 地址,使设备能够在本地网络段内进行通信。
- 工作原理:
- 设备在启动时,会在本地网络中发送探测消息,检查是否有其他设备正在使用特定范围内的 IP 地址。如果发现某个 IP 地址没有被使用,就会将该地址分配给自己。这个过程是通过与同一网络中的其他设备进行通信和协商来完成的,设备之间会交换信息以避免 IP 地址冲突。
动态主机配置协议(DHCP)
- 定义:
- DHCP 是一种网络管理协议,用于集中分配和管理 IP 地址以及其他 TCP/IP 配置参数(如子网掩码、默认网关、DNS 服务器地址等)。它依赖于 DHCP 服务器来为网络中的客户端设备动态地分配 IP 地址。在大多数企业网络、校园网络以及家庭网络(如果有路由器作为 DHCP 服务器)中广泛使用。例如,当你将新的笔记本电脑接入公司的办公网络时,DHCP 服务器会自动为你的笔记本电脑分配一个在该网络中可用的 IP 地址,使你能够访问网络资源。
- 工作原理:
- DHCP 的工作过程主要包括四个阶段:发现(Discover)、提供(Offer)、请求(Request)和确认(Acknowledge)。首先,客户端设备在网络中广播一个 DHCP 发现消息,寻找 DHCP 服务器。DHCP 服务器收到发现消息后,会从其可用的 IP 地址池中选择一个 IP 地址,并将该地址以及其他配置信息(如子网掩码、默认网关等)通过 DHCP 提供消息发送给客户端。客户端收到提供消息后,会发送一个 DHCP 请求消息,请求使用该 IP 地址。最后,DHCP 服务器发送一个 DHCP 确认消息,将 IP 地址正式分配给客户端,同时客户端将配置信息应用到自己的网络接口。
两者的区别
- 配置方式:
- 自动 IP 是设备之间通过自主协商来配置 IP 地址,没有专门的服务器参与。而 DHCP 是由专门的 DHCP 服务器来集中管理和分配 IP 地址。
- 适用场景:
- 自动 IP 适用于小型、临时或没有服务器支持的网络环境,如小型的家庭物联网设备网络或临时的对等网络。DHCP 适用于需要集中管理 IP 地址的网络环境,如企业网络、校园网络等,能够更有效地管理和分配 IP 地址资源,方便网络管理员进行网络规划和控制。
- 功能丰富程度:
- DHCP 除了分配 IP 地址外,还可以为客户端提供子网掩码、默认网关、DNS 服务器地址等其他重要的 TCP/IP 配置参数。自动 IP 主要侧重于自动分配一个本地链路可用的 IP 地址,一般不涉及其他复杂的网络配置参数的分配。
1.7. PPP over Ethernet
QNX RTOS 支持以太网上点到点协议(PPPoE),它常被宽带服务提供商所采用。
QNX 对 PPPoE 的支持包含 io-pkt-* 协议栈以及 pppoectl 实用工具,pppoectl 实用工具可用于协商 PPPoE 会话。一旦 PPPoE 会话建立起来,pppd 守护进程就会创建一个点到点协议(PPP)连接。
当你使用 PPPoE 时,无需指定任何配置参数 —— 我们的模块会自动从你的互联网服务提供商(ISP)那里获取相应的配置数据,并为你完成所有设置工作。
如需更多信息,请查阅《实用工具参考手册》中的以下内容:
- io-pkt:网络管理器。
- pppoectl:用于显示或设置 PPPoE 接口的参数。
1.8. /etc/autoconnect
自动连接功能会在任何 TCP/IP 应用程序启动时,自动建立与互联网服务提供商(ISP)的连接。例如,假设你想要启动一个拨号上网连接。当你启动网络浏览器时,它会暂停运行,而“/etc/autoconnect”脚本将会自动拨打你的互联网服务提供商的号码进行拨号连接。当点到点协议(PPP)会话建立起来后,浏览器就会恢复运行。
如需更多信息,请查阅《实用工具参考手册》中关于 “/etc/autoconnect” 的条目内容。