44、网络新闻(Netnews)与C News的深入解析

网络新闻(Netnews)与C News的深入解析

1. 网络新闻(Netnews)概述

网络新闻,即Usenet新闻,至今仍是计算机网络上最重要且备受重视的服务之一。尽管有人认为它充斥着未经请求的商业邮件和色情内容,但它依然保留了一些高质量的讨论组,这些讨论组使其在网络时代之前成为重要的资源。即使在如今网页数量数以十亿计的时代,网络新闻仍然是许多主题的在线帮助和社区交流的来源。

2. Usenet的历史

2.1 起源

1979年,两名研究生Tom Truscott和Jim Ellis提出使用UUCP连接机器,以实现Unix用户之间的信息交换,从而诞生了网络新闻的概念。他们在北卡罗来纳州建立了一个由三台机器组成的小型网络。

2.2 新闻软件的发展

  • A News :最初的流量由一些shell脚本处理(后来用C语言重写),但这些脚本从未公开。它们很快被“A News”取代,这是新闻软件的首次公开版本。不过,A News设计上每天每个组只能处理几篇文章。
  • B News :随着文章数量的持续增长,Mark Horton和Matt Glickman对其进行了重写,称为“B”版本(即B News)。1982年,B News 2.1版本首次公开发布,并不断扩展,添加了多个新功能,当前版本是B News 2.11,但它正逐渐过时,其最后一位官方维护者已转向INN。
  • C News :1987年,Geoff Collyer和Henry Spencer重写了B News并发布了“C”版本,即C News。此后,C News有了许多补丁,其中最突出的是C News Performance Release。该版本为relaynews添加了一个选项,允许它以守护进程模式运行,从而将程序置于后台。目前,大多数Linux发行版中包含的就是这个性能版本的C News。

2.3 网络新闻传输协议(NNTP)的引入

此前的新闻版本主要针对UUCP网络,尽管也可用于其他环境,但在TCP/IP或DECNet等网络上实现高效的新闻传输需要新的方案。因此,1986年引入了网络新闻传输协议(NNTP)。它基于网络连接,指定了一系列用于交互式传输和检索文章的命令。

2.4 基于NNTP的应用

  • nntpd包 :Brian Barber和Phil Lapsley开发的nntpd包可用于为本地网络内的多个主机提供新闻阅读服务。它旨在补充B News或C News等新闻包,使其具备NNTP功能。
  • INN(Internet News) :它不仅仅是一个前端,本身就是一个新闻系统。它包含一个复杂的新闻中继守护进程,能够高效地维护多个并发的NNTP链接,因此是许多互联网站点首选的新闻服务器。

3. Usenet是什么

Usenet的一个惊人事实是,它不属于任何组织,也没有任何形式的集中式网络管理机构。实际上,除了技术描述外,很难定义它是什么。简单来说,Usenet可以被定义为各个独立站点交换Usenet新闻的协作体。要成为一个Usenet站点,只需找到另一个Usenet站点,并与该站点的所有者和维护者达成新闻交换协议。为其他站点提供新闻称为“feeding”,由此产生了Usenet哲学的另一个常见公理:“获得一个feed,你就加入了Usenet”。

3.1 Usenet新闻的基本单位

Usenet新闻的基本单位是文章。用户撰写并“发布”到网络的消息就是一篇文章。为了让新闻系统能够处理它,文章前面会添加管理信息,即所谓的文章头。文章头与互联网邮件标准RFC - 822中规定的邮件头格式非常相似,由几行文本组成,每行以一个字段名开头,后面跟着冒号和字段值。

3.2 新闻组(Newsgroup)

文章会提交到一个或多个新闻组。新闻组可以被视为与某个共同主题相关的文章的论坛。所有新闻组都按层次结构组织,每个组的名称表明了它在层次结构中的位置,这通常使人们很容易了解一个组的主题。例如,从新闻组名称comp.os.linux.announce可以看出,它用于发布有关名为Linux的计算机操作系统的公告。

3.3 新闻交换

这些文章会在所有愿意接收该组新闻的Usenet站点之间进行交换。当两个站点同意交换新闻时,它们可以自由交换任何喜欢的新闻组,甚至可以添加自己的本地新闻层次结构。例如,groucho.edu可能与barnyard.edu有新闻链接,barnyard.edu是一个主要的新闻源,groucho.edu还与几个小型站点有链接并为它们提供新闻。Barnyard College可能接收所有Usenet组,而GMU只希望接收一些主要的层次结构,如sci、comp或rec。一些下游站点,如名为brewhq的UUCP站点,由于网络或硬件资源有限,可能只希望接收更少的组。另一方面,brewhq可能希望接收GMU不提供的fj层次结构的新闻组,因此它与gargleblaster.com保持另一个链接,该站点提供所有fj组的新闻并将其提供给brewhq。

以下是一个简单的mermaid流程图,展示新闻从用户发布到传播的基本流程:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(用户发布文章):::process --> B(新闻阅读器格式化):::process
    B --> C(本地新闻服务器):::process
    C --> D{是否已存在于本地}:::process
    D -->|否| E(转发到其他站点):::process
    D -->|是| F(丢弃):::process

4. Usenet如何处理新闻

如今,Usenet已经发展到了巨大的规模。承载整个网络新闻的站点通常每天传输约60 MB的数据。下面来看看大多数Unix系统处理Usenet新闻的方式。

4.1 文章发布

新闻始于用户创建并发布文章。每个用户将消息输入到一个名为新闻阅读器的特殊应用程序中,该应用程序会对其进行适当的格式化,以便传输到本地新闻服务器。在Unix环境中,新闻阅读器通常使用inews命令,通过TCP/IP协议将文章传输到新闻服务器。也可以将文章直接写入一个名为新闻假脱机(news spool)的特殊目录中的文件。一旦文章发布到本地新闻服务器,服务器就负责将文章传递给其他新闻用户。

4.2 新闻分发

新闻通过各种传输方式在网络中分发。过去主要使用UUCP,如今主要流量由互联网站点承载。使用的路由算法称为泛洪(flooding)。每个站点维护与其他站点的多个链接(新闻源)。本地新闻系统生成或接收的任何文章都会转发到这些链接,除非该文章已经在该站点出现过,在这种情况下,文章将被丢弃。站点可以通过查看文章的Path:头字段来了解文章已经经过的所有其他站点,该头字段以bang路径表示法包含了文章转发所经过的所有系统的列表。

4.3 文章识别

为了区分文章并识别重复文章,Usenet文章必须携带消息ID(在Message - Id:头字段中指定),它将发布站点的名称和序列号组合成 serial@site 的形式。对于处理的每篇文章,新闻系统会将该ID记录到历史文件中,所有新到达的文章都会与该历史文件进行比对。

4.4 新闻流限制标准

任意两个站点之间的流量可能受到两个标准的限制:
- 文章分发范围 :文章会被分配一个分发范围(在Distribution:头字段中指定),可以用来将文章限制在特定的站点组内。
- 新闻组交换限制 :发送和接收系统都可能限制交换的新闻组。允许传输到一个站点的新闻组和分发范围通常保存在sys文件中。

4.5 优化技术

  • 批处理(Batching) :在UUCP网络上,系统会在一段时间内收集文章,并将它们组合成一个文件,压缩后发送到远程站点。
  • ihave/sendme协议 :该协议可以防止重复文章的传输,从而节省网络带宽。它不是将所有文章放入批处理文件中发送,而是将文章的消息ID组合成一个巨大的“ihave”消息发送到远程站点。远程站点读取该消息,与自己的历史文件进行比较,并在“sendme”消息中返回它想要的文章列表,然后只发送请求的文章。不过,该协议只适用于两个大型站点,它们各自从多个独立的新闻源接收新闻,并且相互之间频繁轮询以实现高效的新闻流。

4.6 基于TCP/IP的新闻传输

互联网上的站点通常依赖基于TCP/IP的软件,使用网络新闻传输协议(NNTP)。NNTP有三种不同的新闻传输方式:
- 推新闻(Pushing news) :这是ihave/sendme协议的实时版本。
- 拉新闻(Pulling news) :客户端请求指定新闻组或层次结构中在特定日期之后到达服务器站点的文章列表,并选择其历史文件中没有的文章。
- 交互式新闻阅读 :允许用户或新闻阅读器从指定的新闻组中检索文章,以及发布头信息不完整的文章。

4.7 新闻存储

在每个站点,新闻保存在/var/spool/news目录下的层次结构中,每篇文章保存在一个单独的文件中,每个新闻组保存在一个单独的目录中。目录名由新闻组名称组成,其组件作为路径组件。例如,comp.os.linux.misc的文章保存在/var/spool/news/comp/os/linux/misc目录中。新闻组中的文章按到达顺序分配编号,该编号作为文件的名称。当前在线文章的编号范围保存在一个名为active的文件中,该文件同时也是站点已知新闻组的列表。

4.8 文章过期处理

由于磁盘空间有限,一段时间后需要删除文章,这称为过期处理。通常,某些组和层次结构的文章会在到达后的固定天数后过期。不过,发布者可以在文章头的Expires:字段中指定过期日期来覆盖默认设置。

下面通过一个表格总结不同新闻处理技术的特点:
| 技术 | 特点 | 适用场景 |
| ---- | ---- | ---- |
| 批处理(Batching) | 一段时间收集文章,组合压缩后发送 | UUCP网络 |
| ihave/sendme协议 | 防止重复文章传输,节省带宽 | 两个大型且频繁交互的站点 |
| 推新闻(Pushing news) | ihave/sendme协议的实时版本 | 基于NNTP的新闻传输 |
| 拉新闻(Pulling news) | 客户端请求指定日期后的文章列表 | 基于NNTP的新闻传输 |
| 交互式新闻阅读 | 可检索文章和发布头信息不完整的文章 | 基于NNTP的新闻传输 |

5. C News的详细解析

5.1 C News概述

C News是网络新闻中最受欢迎的软件包之一,它专为通过UUCP链接传输新闻的站点而设计。下面将探讨C News的核心概念、基本安装和维护任务。

5.2 文件存储位置

C News将其配置文件存储在 /etc/news 目录中,大多数二进制文件保存在 /usr/lib/news/ 目录下,文章则存放在 /var/spool/news 目录。需要确保这些目录中的几乎所有文件都由用户 news 或组 news 拥有,因为C News无法访问文件是大多数问题的根源。在操作这些目录中的文件之前,建议使用 su 命令切换到 news 用户。唯一的例外是 setnewsids 命令,它用于设置某些新闻程序的真实用户ID,必须由 root 拥有并设置setuid位。

5.3 新闻传递流程

5.3.1 文章接收方式

文章可以通过多种方式提供给C News:
- 当本地用户发布文章时,新闻阅读器通常将其交给 inews 命令,该命令会完善文章的头信息。
- 来自远程站点的新闻,无论是单篇文章还是整批文章,都会交给 rnews 命令,该命令将其存储在 /var/spool/news/in.coming 目录中,稍后由 newsrun 处理。

无论采用哪种方式,文章最终都会交给 relaynews 命令。

5.3.2 relaynews命令处理流程

对于每篇文章, relaynews 命令会执行以下操作:
1. 检查重复文章 :通过在历史文件中查找消息ID,检查文章是否已经在本地站点出现过。如果是重复文章,则将其丢弃。
2. 检查新闻组需求 :查看文章的 Newsgroups: 头行,确定本地站点是否需要这些组的文章。如果需要,并且新闻组列在 active 文件中, relaynews 会尝试将文章存储在新闻假脱机区域的相应目录中。如果该目录不存在,则会创建它。然后,将文章的消息ID记录到历史文件中。否则,将文章丢弃。
3. 处理异常情况 :如果 relaynews 无法存储传入的文章,例如文章发布到的组未列在 active 文件中,文章将被移动到 junk 组。 relaynews 还会检查过时或日期错误的文章并拒绝它们。因其他原因失败的传入批次将被移动到 /var/spool/news/in.coming/bad 目录,并记录错误消息。
4. 转发文章 :之后,文章会被转发到所有请求这些组新闻的其他站点,使用为每个特定站点指定的传输方式。为确保文章不会被发送到已经接收过它的站点,会将每个目标站点与文章的 Path: 头字段进行比较,该字段包含文章到目前为止经过的站点列表,采用UUCP风格的bang路径源路由样式。

5.3.3 远程UUCP站点新闻传递

C News通常用于在UUCP站点之间中继新闻,也可用于NNTP环境。要将新闻传递到远程UUCP站点,无论是单篇文章还是整批文章,都会使用 uux 命令在远程站点执行 rnews 命令,并将文章或批次通过标准输入提供给它。

5.3.4 批处理(Batching)

批处理是指在一次传输中发送大量单个文章的过程。当为某个站点启用批处理时,C News不会立即发送任何传入文章,而是将其路径名追加到一个文件中,通常名为 out.going/site/togo 。定期, cron 程序会从 crontab 条目中执行一个程序,该程序读取此文件,并将所有列出的文章捆绑到一个或多个文件中,可选择对其进行压缩并发送到远程站点的 rnews

以下是一个mermaid流程图,展示C News中 relaynews 的新闻处理流程:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(文章到达):::process --> B{是否重复文章}:::process
    B -->|是| C(丢弃):::process
    B -->|否| D{本地是否需要该组文章}:::process
    D -->|否| E(丢弃):::process
    D -->|是| F{是否可存储}:::process
    F -->|否| G(移动到junk组):::process
    F -->|是| H(存储文章并记录ID):::process
    H --> I(转发到其他站点):::process

5.4 C News的安装

C News应该可以在任何现代Linux发行版中以预打包的格式获得,因此安装相对简单。如果没有,或者想从原始源代码发行版进行安装,也是可行的。无论采用哪种安装方式,都需要编辑C News的配置文件。以下是主要配置文件及其说明:
| 文件名 | 作用 | 编辑要求 |
| ---- | ---- | ---- |
| sys | 控制站点接收和转发的新闻组 | 需要详细编辑 |
| active | 包含站点处理的每个新闻组中文章的处理说明 | 通常无需管理员编辑 |
| organization | 包含组织名称 | 需要自定义 |
| newsgroups | 所有新闻组的列表,每个组有一行用途说明 | 无需特殊编辑 |
| mailname | 站点的邮件名称 | 需要设置 |

5.5 总结与选择建议

通过以上对网络新闻(Netnews)和C News的介绍,我们了解了网络新闻的发展历程、Usenet的工作原理以及C News的具体实现。对于不同需求的用户,可以根据自身情况做出选择:
- 如果使用UUCP网络,可以深入了解C News的配置和使用,以充分利用其在UUCP环境下的优势。
- 若使用TCP/IP网络,可进一步学习网络新闻传输协议(NNTP),根据新闻传输量的大小选择合适的服务器。如果需要传输中等数量的新闻,相关章节介绍的服务器可能就足够了;若要安装能够处理大量材料的重型新闻服务器,则可以考虑InterNet News(INN)。

希望这些信息能帮助你更好地理解和使用网络新闻服务。

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析仿真验证相结合。
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 本项目是本人参加BAT等其他公司电话、现场面试之后总结出来的针对Java面试的知识点或真题,每个点或题目都是在面试中被问过的。 除开知识点,一定要准备好以下套路: 个人介绍,需要准备一个1分钟的介绍,包括学习经历、工作经历、项目经历、个人优势、一句话总结。 一定要自己背得滚瓜烂熟,张口就来 抽象概念,当面试官问你是如何理解多线程的时候,你要知道从定义、来源、实现、问题、优化、应用方面系统性地回答 项目强化,至少知识点的比例是五五开,所以必须针对简历中的两个以上的项目,形成包括【架构和实现细节】,【正常流程和异常流程的处理】,【难点+坑+复盘优化】三位一体的组合拳 压力练习,面试的时候难免紧张,可能会严重影响发挥,通过平时多找机会参交流分享,或找人做压力面试来改善 表达练习,表达能力非常影响在面试中的表现,能否简练地将答案告诉面试官,可以通过给自己讲解的方式刻意练习 重点针对,面试官会针对简历提问,所以请针对简历上写的所有技术点进行重点准备 Java基础 JVM原理 集合 多线程 IO 问题排查 Web框架、数据库 Spring MySQL Redis 通用基础 操作系统 网络通信协议 排序算法 常用设计模式 从URL到看到网页的过程 分布式 CAP理论 锁 事务 消息队列 协调器 ID生成方式 一致性hash 限流 微服务 微服务介绍 服务发现 API网关 服务容错保护 服务配置中心 算法 数组-快速排序-第k大个数 数组-对撞指针-最大蓄水 数组-滑动窗口-最小连续子数组 数组-归并排序-合并有序数组 数组-顺时针打印矩形 数组-24点游戏 链表-链表反转-链表相加 链表-...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值