IRC(Internet Relay Chat)(因特网中继聊天)协议——RFC1459文档要点总结


前言

IRC(Internet Relay Chat)(因特网中继聊天)协议是由芬兰人Jarkko Oikarinen于1988年首创的一种网络聊天协议。文章对“RFC 1459 - Internet Relay Chat Protocol”文档要点进行总结。


特点

  • 基于文本

“文本”:因为应用的功能是“聊天”,传输的数据类型是“文本文字”

  • 最简单的客户机是任何能够连接到服务器的套接字程序
  • 使用TCP/IP网络协议
  • 依据客户机-服务器模型
  • 典型的设置包括单个进程(服务器)形成客户机(或其他服务器)连接的中心点,执行所需的消息传递/多路复用和其他功能。如图:

提示:类比树状网络

在这里插入图片描述


三种角色

  • 服务器
  • 客户机
  • 运营商(特殊类别的客户,类比管理员)

信道/频道

  • 信道是由一个或多个客户端组成的命名组,这些客户端将接收到发送给该信道的消息。当第一个客户端加入信道时,信道隐式地创建,当最后一个客户端离开信道时,信道停止存在。当信道存在时,任何客户端都可以使用信道名引用信道。

“信道是由一个或多个客户端组成的命名组,这些客户端将接收到发送给该信道的消息”:信道是一个或多个客户端的集合,即“聊天群”。在同一个“聊天群”内,客户端可接收到其他(0、1或多个)客户端的消息

  • 协议存在两种类型的信道。一种是分布式信道,所有的服务器都知道它(们)
  • 要创建新信道或成为现有信道的一部分,需要用户加入该信道。如果信道在加入之前不存在,则创建信道,创建信道的用户成为信道操作符。如果信道已经存在,那么加入请求是否被接受取决于该信道的当前模式。例如,如果该信道只接受邀请,则用户只能在被邀请时加入

“信道操作符”:即“信道标识符”、“聊天群群主/管理员”

  • 一个用户可能同时属于多个信道的一部分

字符编码

没有为文本的字符数据类型指定特定的字符集。协议基于一系列由8位组成的代码(八位组/字节)。每条消息可以由任意数量的字节构成。

“协议”:原文档内容是:“ The protocol is based on a …”。表意不太明确。在编程实现时,可以简化理解为“每字符”基于一个字节,而“char”数据类型大小刚好为一个字节


消息传递方式

  • 客户机-服务器和服务器-服务器之间的通信是异步的
  • 消息传递图类比网络拓扑图:
    在这里插入图片描述

一对一通信

  • 通常只在客户端间进行一对一通信,因为大多数服务器-服务器通信都不是服务器之间只进行通信的结果。理由见后面“一对所有通信”内容
  • 消息传递的路径是生成树上任意两点之间的最短路径

“最短路径”:即“最低开销”路径,在尽可能少的客户机、服务器间传递消息

示例1:
客户机1和客户机2之间的消息只被服务器A知道,服务器A将客户机1的消息直接发送给客户机2。

示例2:
客户机1和3之间的消息能够被服务器A和B知道。其他客户机、服务器不能知道该消息。

示例3:
客户机2和4之间的消息能够被服务器A、B、C和D知道。

一对多通信

  • 三种通信方式:消息列表、信道/群组和客户机、服务器掩码
  • 消息列表:客户机提供消息要传递到的目的地的列表,服务器分解列表,依据列表项,将消息的各单独副本分发到每个给定的目的地
  • 信道/群组:客户机的消息只发送到服务器一次,服务器将消息发送到信道中的每个客户机。然后对每个服务器-客户机对重复此操作,直到原始消息呈扇形传播并到达通道中的每个服务器、客户机

提示:类比网络传输的“多播”进行理解

  • 客户机、服务器掩码:通过“掩码消息”,将消息传递给指定的服务器、客户机

一对所有通信

  • 客户机到客户机:无
  • 客户机到服务器:客户机的大多数导致状态信息改变的命令(如信道成员、信道模式、用户状态等)在默认情况下必须发送到所有服务器
  • 服务器到服务器:几乎所有来自服务器的消息都会广播到所有其他连接的服务器

命令


当前实现内容

“当前实现内容”:原文档标题是:“Current implementations”。描述的是当前IRC协议的实现细节

基于TCP网络协议

TCP是可靠的网络协议,适合于IRC协议的“一定规模文本数据交互”内容。

支持Unix域套接字

鉴于Unix域套接字是监听/连接操作,可以将当前实现配置为:监听和接受Unix域套接字上的客户机和服务器连接。

“可以将当前实现配置为…”:即可使用套接字API(应用程序编程接口)进行网络编程实现IRC协议

命令解析

每个网络连接都有私有的“输入缓冲区”,其中保存最近的读取和解析命令结果。缓冲区设置的目的是为客户机和服务器提供有用的“非缓冲”网络IO。

“每个网络连接都有私有的“输入缓冲区”:原文档内容是“each connection is given its own private 'input buffer…”。结合上下文理解:一般是客户机给服务器发送“命令”消息,又是“输入”缓冲区,则该“缓冲区”应在每客户机-服务器连接对的客户机一端

“最近的”:缓冲区可能存储多个命令与解析结果

“非缓冲”:原文档内容是“ To provide useful ‘non-buffered’ network IO…”。描述上,其是具有缓冲区的,这里的意思可能是:“异步”网络IO:在缓冲区缓冲地存放命令和解析结果,由客户机、服务器异步地获取相应内容。编程实现时,可以考虑使用异步IO:“io_uring”技术

消息队列机制

  • 为缓解“网络连接饱和”,使用TCP窗口、内部缓冲区和消息队列机制

“TCP窗口”:原文档内容:“Although Unix typically handles this through the TCP window and internal buffers…”。这里指的是TCP流量控制而不是拥塞控制内容,即缓解“收发数据两端流量速率不匹配问题”

  • 消息队列机制:FIFO(先进先出)数据发送队列。服务器轮询它的连接时,首先读取并解析所有传入的数据,将所有要发送出去的数据排在队列中。处理完所有可用的输入后,发送排队的数据。能够减少write()系统调用的数量,并帮助TCP生成更大的包

“服务器轮询它的连接时”:一台服务器可能有多个“服务器-服务器”、“服务器-客户机”连接对,服务器需要依次处理消息

“能够减少write()系统调用的数量”:编程实现时,可以考虑使用“io_uring”技术,它的优势之一亦是减少系统调用的次数,降低系统开销


总结

IRC(Internet Relay Chat)(因特网中继聊天)协议是基于TCP/IP的应用层协议,工作原理简单,能够通过网络编程:使用套接字API+“客户机-服务器”模型+其他技术实现。


作者的话

  • 文章内容是作者为完成一项“基于C/C++语言、异步IO:‘io_uring’技术的IRC协议实现”的网络编程小程序,通篇翻译、阅读“RFC 1459 - Internet Relay Chat Protocol”文档进行的要点总结。选取的内容基于作者认为对编程实现重要的点,描述并不全面,具体请参阅其他资料
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

参考资料

RFC 1459 - Internet Relay Chat Protocol

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值