Enterprise Just Builder

Solution for Enterprise Software Architecture

Internet

 SCTP (一) 概览和消息编码

SCTP 是传输层协议,它的功能和 TCP 协议类似,并有一些独特的补充。虽然 SCTP 在互联网世界中不是很常见,但是该协议在电信网络中扮演z着重要角色。它被用做各种 SIGTRAN 协议的传输层,而且还是 EPC 的默认传输协议。

Wikipedia 上的文章 简单地介绍了 SCTP 的功能。另外 Randal Stewart, Michael Tuxen 和 Peter Lei 等著的《SCTP: What is it, and how to use it?》 也是不错的参考。本文将从网络开发者的角度来简述 SCTP ,这意味着我们要深入了解规范的某些内容。接下来我们将过一遍我最感兴趣的部分,以及相关的SCTP 规范 — RFC4960的章节引用。1

SCTP 关键术语和缩写
SCTP 协议第1.3节 和第1.4节介绍了一些关键术语和缩写。对初学者来说,最重要的是:“关联 association”、 “流 stream”和“块 chunk”。

  • 关联(Association):和 TCP 类似, SCTP 是面向连接的协议。两个点(peer)之间的逻辑连接被称为“关联”。和 TCP 不同的,两点间的 SCTP 关联可以建立在多个 IP 地址之上。如图1-1 所示, 主机 A 有三个以太网接口及三个不同的 IP 地址,主机 B 也有三个接口,但只有两个被用于关联。接口及部分关联在图中以浅蓝色表示。在建立关联的期间,每个端点的地址集将被公布,并作为下一次 POST 的主题。很重要的一点:同一个端点的 IP 地址的 SCTP 端口号是相同的 — 称为 “多方持有 multi-homing”。
  • 流(stream): 流是关联间的逻辑单向通道。具体通道数目在建立关联时确定,且每个方向上可以不同。如图1-1,从主机 A 到主机 B 的流有 7个,而从主机 B 向主机 A 的流只有 3 个。流的目的是提供逻辑通道以便按顺序传输数据/邮件。这意味着,即时流 X 中的消息丢失需要重新发送,流 Y 中的消息也不会被延迟,因为它们逻辑上独立。不过流 X 中的(丢失的消息之后)其他消息将被推迟,直到重新发送结束。这种效应称为线路头阻塞(head-of-line blocking),是 TCP 协议的主要问题之一。
  • 块(Chunk):块是 SCTP 包内的信息单元。

SCTP 规范第 1.5 节介绍了该协议的功能概述。比如如何使用流,在流中如何Section 1.5 provides functional overview of the protocol. It describes how streams are used, how in-order delivery is achieved within a stream, how data messages are acknowledged and so on.

 

, ,

OpenWrt 教程 (一) 什么是 OpenWrt?

2002 年 12 月,Cisco/Linksys 发布了定义家用无线路由器产品形态的 WRT54G。出于成本考虑,Cisco/Linksys 使用了 Linux 作为固件而不是授权费用很高的 vXworks。根据 GPL 条款,哥伦比亚大学法学院教授 Eben Moglen 向 Cisco/Linksys 提出了开源要求,2003 年 3 月, Cisco 迫于压力公开了 WRT54G 的源代码。此后就有了一些基于 Cisco 源码的第三方路由器固件,OpenWrt 就是其中的一个,它诞生于 2004 年。

OpenWrt 最初的稳定版叫 White Russian,之后有陆续有 Kamikaze、Backfire、Attitude Adjustment等多个版本发布,而最新的 Barrier Breaker 也已经在持续开发中,据称将很快发布。在众多路由器 hack 固件中,为什么 OpenWrt 能脱颖而出呢?这是因为 OpenWrt 具有以下特点:

  • 可扩展性好。通过在线安装可以扩展所需要的功能,目前 OpenWrt 有 1000 多个可选功能包;
  • OpenWrt 是台完整的 Linux 工作站,文件系统可读可写,便于开发者学习和实践;

OpenWrt社区始终贯彻开源精神,在 OpenWrt.org 你可以找到“Wireless Freedom”的字样,其社区的组织者 Gregers Petersen 是位人类学家,专注于自由软件及相关社会学研究。因此 OpenWrt 社区聚集了大批各个方面的专家,从而使 OpenWrt 具备了如下与传统 NorFlash 嵌入式 Linux 截然不同的高级特征:

1. SquashFS 与 JFFS2 文件系统的整合形成的 overlayfs 机制
对用户而言,OpenWrt 的整个文件系统是完全动态可读写的,而其中的固件部分是用 SquashFS 实施的只读压缩文件系统,而用户所有的对文件系统的增删改都是用类似“差值”的形态存储在 JFFS2 文件系统中的,二者用 overlayfs 机制黏合,对用户完全透明。因此我们可以在文件系统中随意修改,出现问题则可像手机一样恢复出厂设置,并提供 fail-safe 模式帮助用户修复系统。

而在传统的嵌入式 Linux 里,固件是静态的,对系统做任何与可运行程序相关的变动,比如增加模块,删除应用程序,都要重新编译全部固件,并重新刷写。这种死板的传统文件系统完全阻挡了非专业爱好者进入嵌入式 Linux 这一领域。

>>> 阅读全文

 

, , , , ,

IE 10 开发者指南之索引数据库

Internet Explorer 10 支持索引数据库API(IndexedDB), 来存储结构化数据。不同于cookie 和 DOM 存储,IndexedDB 提供了组合(group)、 遍历、搜索、过滤 Javascript 对象的功能。

IndexedDB API 由多个对象组成,每个都为特定的任务而设计:

  • 数据被保存在对象存储(object stores)里,它是 Javascript 对象的集合,这些对象的属性包含独立的数值。
  • Javascript 对象被保存在对象存储中,也称为记录 (record),每个记录都有一个共同的属性 key path。该属性的值被称为键值(key value) 或者键(key)。键值 (Key values)用于标识对象存储里的单个记录。
  • 索引按照某一属性的值来组织对象,它返回键值的集合,通过键值可以从原来的对象存储中获得独立记录。
  • 游标 (cursor) 是值的集合。当索引定义了游标时,游标代表着索引返回的键值集合。当一个对象存储定义了游标的时候,游标代表着保存在游标中的记录集合。
  • Key Range为索引或对象存储中的记录集定义了值的范围。 Key Rang可以用来过滤游标的结果。
  • 一个请求意味着对数据库中对象采取的不同动作。例如打开数据库会产生一个请求对象,你可以为这个请求对象定义事件处理器来对请求的结果产生反应。
  • 事务管理着操作的上下文,并用于维护数据库活动的一致性。例如,你可以版本变更的事务上下文中创建对象存储。如果事务被放弃,在此事务中的所有操作都被取消。

索引数据库 API 规范定义了两套 API: 同步 API 和异步 API。IE10 支持异步 API。因此,对数据库的操作不会马上被执行,而是让返回对象的操作在后台执行。因此,IndexedDB 是事件驱动 API,你首先创建请求,然后定义事件处理器来响应请求的成功或者失败的结果。

很重要的一点,这些特性在 IE10 和使用 HTML 的 Metro 风格应用是一致的。

使用请求来打开数据库
因为索引数据库 API 规范还在发展中,大部分厂商都为自己的 IndexedDB 实现添加了一个前缀,比方说webkitIndexedDB 或者 mozIndexedDB。对 IE10 来说,则是 msIndexedDB。为了得到正确的结果,我们用一小段检测代码来访问 IndexedDB API ,如例子所示:

>>> 阅读全文

 

, , , , , , ,