Skip to content

Application protocol design

双方在进行通信之前,需要首先约定protocol,本文对application protocol design(应用层协议的设计)进行总结。protocol 有时候也被称为data exchange protocol。

How to design application protocol

在设计application protocol的时候,需要考虑的问题有:

底层传输层协议

network protocol model是层次化的结构,在设计一个application protocol的时候,需要考虑它的下一层所采用的protocol,目前主要有如下两种:

1、TCP

2、UDP

安全性

安全性是在进行协议设计的时候,需要考虑的一个重要问题。

性能

当考虑到性能的时候,需要思考的方面是非常多的:

一、fast to parse

NOTE:

这是在阅读Redis Protocol specification 时,其中给出的总结

二、便于实现high concurrent server

1、避免TIME_WAIT

这在下面文章中进行了讨论

stackoverflow When is TCP option SO_LINGER (0) required? # A

Instead, design your application protocol so the connection termination is always initiated from the client side. If the client always knows when it has read all remaining data it can initiate the termination sequence. As an example, a browser knows from the Content-Length HTTP header when it has read all data and can initiate the close. (I know that in HTTP 1.1 it will keep it open for a while for a possible reuse, and then close it.)

If the server needs to close the connection, design the application protocol so the server asks the client to call close().

三、playload要尽可能小

影响带宽。

Binary or textual

参见 Binary-VS-textual-protocol 章节

Implementation

NOTE: 这是在阅读Redis Protocol specification 时,其中给出的总结:

1、Simple to implement.

2、Fast to parse.

在设计protocol的时候,也是需要考虑implementation相关的问题:

1) 成本的、难易程度

TCP Message boundary

1、使用TCP的一个非常重要的内容是: 如何描述message boundary?

参见 TCP-message-boundary 章节。

Human readable

这是在阅读Redis Protocol specification 时,其中给出的总结:

Human readable

Language-neutral

是否语言中立,如果语言中立的话,那么跨语言就非常容易了。

NOTE: 本节标题源自 protobuf

Platform-neutral

是否平台中立。

NOTE: 本节标题源自 protobuf

Examples

下面结合一些具体的案例来进行分析。

国内企业的application protocol

恒生T2协议

T2SDK

华锐ATP交易数据接口规范

参见: http://developer.archforce.cn/topic/1738

开源软件的application protocol

Redis: RESP

参见 redis.io Redis Protocol specification