Electronic Joint Business

Solution for E-Business

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 ,如例子所示:

>>> 阅读全文

 

, , , , , , ,