基于帧的网络连接跟踪器

Tendril的Python项目详细描述


卷须概念

卷须是基于在 数据。事实上,大多数网络协议都是基于 接收帧;例如,在用于发送 电子邮件,发件人将开始发送"邮件发件人" 电子邮件 @ 示例 com "后跟行终止序列(回车 返回,后跟换行符)。然后,SMTP服务器将用 另一帧确认"邮件发件人"帧,该帧将 也以线路终端序列结束。因此,即使smtp是 在TCP协议之上定义,它提供一个不可分割的流 对于客户机和服务器之间的数据,将设置一个框架边界 在它上面-在这种情况下,回车后是一个换行符 终止每一帧。

卷须包含 框架 的概念。立宪者不再是什么了 比framer的一个子类有一个提取 来自未分化数据流的单个帧,以及另一个 将帧转换为适当表示形式的方法。在 在上面的smtp协议交换的情况下, frameify() 方法查找以回车换行符对结尾的每一行, 去掉那些字符,只返回帧。在同一 方法,相应的 streamify() 方法获取帧并 追加回车换行符对。

对于基于文本的协议,比如smtp,这看起来有点过头了。 但是,对于基于二进制的协议,很多代码都是专门用于 确定框架之间的边界,在某些情况下甚至 解码帧。卷须的连接框架概念 使框架逻辑与 应用程序,甚至可以重用:卷须带有几个预先构建的 框架程序,包括设计用于基于文本的协议的框架程序 例如smtp。

框架概念的另一个重要优势是 根据需要在框架之间切换。再举一个例子 SMTP协议–实际电子邮件数据通过 客户端首先发送"数据"帧;服务器响应 表示已准备好开始接收消息数据,以及 然后客户端简单地发送消息数据,用一行结束 只包含一个句点(".")。在这种情况下,smtp服务器 基于卷须的应用程序可能希望将消息数据作为 单帧;它可以通过创建缓冲流的帧生成器来实现 数据直到它看到结束哨兵 然后将整个消息作为单个帧返回。一旦 服务器从客户端接收"数据"帧,它所要做的就是 暂时关闭用于 连接,然后将其切换回标准的基于行的框架程序一次 它已收到消息帧。

卷须允许在接收侧使用不同的框架。 以及连接的发送端。这个可以用在像 上面引用的smtp服务器示例,其中服务器仍然希望 向客户端发送面向行的帧,即使在缓冲 消息数据帧。此外,尽管所提供的立宪者 对于字节数据,卷须本身将帧视为不透明的; 应用程序可以使用它来构建有条件地解析 给定一个框架到一个类对象,然后应用程序的其余部分 根据需要进行处理。

连接跟踪

卷须也是基于跟踪连接状态的概念。 对于面向连接的协议,如tcp,显然,这不是 一个大问题;然而,卷须也是用来支撑 无连接协议,如udp,其中一些应用程序需要 管理与给定交换相关的状态信息。作为一个 无可否认,这是一个精心设计的例子,比如基于udp的dns。一 dns系统的客户端将通过udp向dns服务器发送请求; 当从该dns服务器接收到响应时,连接状态 卷须追踪的信息有助于将这种反应与 适当的请求,确保响应正确 地点:

此连接状态跟踪主要用于帮助 希望两者都可用的应用程序 面向连接的协议,如tcp和over connectionless 协议,如udp。尽管卷须不能解决可靠性问题 或者帧排序,它的连接状态跟踪可以简化 使用两种类型的应用程序的实现 协议。

可扩展性

细心的读者可能已经注意到了这些术语的用法,"比如tcp" 和"例如udp",尽管tendril只内置了对tcp的支持 和udp连接,可以扩展卷须来支持其他 协议。只需要创建 卷须 卷须管理器 任何必要的套接字数据流),并注册 tendrilmanager 子类as pkg_resources 下的入口点 卷须管理器名称空间。参见卷须的 设置.py 例如,如何做到这一点。

除了允许Tendril支持TCP以外的协议 和udp,也可以通过子类化来实现新的框架。 框架程序类。(注:卷须处理 定影器 对象,不必使用 pkg_resources 入口点。)这些类的对象可以 只需分配给 卷须 表示连接的实例。

高级接口

卷须还提供了一个高级接口,允许给定的原始 要"包装"的套接字。使用此功能,一个普通的TCP套接字 无法转换为SSL套接字。此接口的其他用途 是可能的,例如为套接字设置套接字选项。卷须 还提供了一个接口来允许这些包装器中的多个 按给定顺序调用的函数。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Spring引导应用程序中的java循环视图路径异常   java在PreferenceActivity中显示ProgressDialog   java RESTEasy如何将基本身份验证设置为ClientRequest   使用MongoDB进行java漏斗分析?   java JUnit系统日期   java创建一个集合,每个类有一个对象   java如何在子模块项目中测试Springbean   java Websocket服务器Android   javaitext:如何在新页面上重复表单元格内容?   java一旦spring mvc样板项目建立起来,python/RoR的开发速度会更快吗?   java为什么Maven Tycho不能在工具链中找到正确的JDK。xml?   Java Selenium获取用于单击的元素   java如何使用嵌套的if语句而不是系统阻止程序在blueprint类中运行。出口(0);?   java模板聚合匹配和投影一个没有id的字段   java您的内容必须有一个id属性为“安卓”的TabHost。安卓应用程序的R.id.tabhost错误   JavaEclipseLink 1.2和BatchFetch   java如何更改HttpClient中的超时值?   java在toString方法中将对象转换为特定数据类型   java正在跳过运行for循环