这篇文章的标准来自;
1. 前言
AOTOSAR – AUTomotive Open System ARchitecture,汽车开发系统结构; SOME/IP – Scalable service-Oriented MiddlewarE over IP,基于IP可扩展面向服务中间件; CM – Communication Management,通信管理/控制; E2E – End-to-end communication protection,端到端通信保护(发现这些错误干预导致的数据失效并发出警告); SoC – Service-Oriented Communication,服务通信标准化(即服务通信); SecOC – Secure Onboard Communication,安全车载通信(车载通信加密验证的安全方案); DTLS – Datagram Transport Layer Security,数据安全传输; DDS – Data Distribution Service,数据传输服务; RTPS – Real Time Publish Subscribe Proto,订阅协议实时发布; TTL – Time To Live,生存时间(或有效时间); TLV – Tag-Length-Value,每个子域由tag标签(T),子域值的长度(L)和子域取值(V)构成; RPC – Remote Procedure Call,远程调用; QoS – Quality of Service,服务质量; BOM – Byte Order Mark,字节序; SOA – Service-Oriented Architecture,服务框架;
2.简介
SOME/IP,基于IP可扩展面向服务中间件。
- AUTOSAR 4.0 – 对已存在的SOME/IP基本支持新闻。
- AUTOSAR 4.1 – 添加了对SOME/IP-SD支持发布/订阅。
- AUTOSAR 4.2 – 添加转换器进行序列化等优化。
- AUTOSAR 4.3 – 修复了一些转换器错误,增加了对带 SOME/IP-TP 的大型UDP支持新闻和 SOME/IP-SD优化。
3. SOME/IP协议规范
3.1 SOME/IP数据格式
3.1.1 Message ID
3.1.2 Length
长度值为自request ID之后的数据长度。
3.1.3 Request ID
- Request ID在响应位到达之前,客户端/订阅者不能重用Request ID;
- 如果会话处于未激活状态,Session ID = 0x而且订阅者会忽略这种反应;
- 若会话处于激活状态,Session ID = 0x0001 ~ 0xFFFF,并按用例增加;
- 若Session ID = 0xFFFF后,将从0x重新开始计数001;
3.1.4 Protocol Version
协议版本号,固定为1。
3.1.5 Interface Version
服务接口版本号。
3.1.6 Message Type
Number | Message Type | Des |
---|---|---|
0x00 | REQUEST | A request expecting a response (evenvoid). |
0x01 | REQUEST_NO_RETURN | A fire&forget request. |
0x02 | NOTIFICATION | A request of a notification/event callback expecting no response. |
0x80 | RESPONSE | The response message. |
0x81 | ERROR | The response containing an error. |
0x20 | TP_REQUEST | A TP request expecting a response (evenvoid). |
0x21 | TP_REQUEST_NO_RETURN | A TP fire&forget request. |
0x22 | TP_NOTIFICATIO | A TP request of a notification/event callback expecting no response. |
0xa0 | TP_RESPONSE | The TP response message. |
0xa1 | TP_ERROR | The TP response containing an error. |
注: 对于TP消息,Message Type的第三个
3.1.7 Return Code
事件返回码。
Message Type | Return Code |
---|---|
REQUEST | 0x00 |
REQUEST_NO_RETURN | 0x00 |
NOTIFICATION | 0x00 |
RESPONSE | Return Codes |
ERROR | Return Codes(No 0x00) |
Return Codes
ID | Value | Des |
---|---|---|
0x00 | E_OK | Success. |
0x01 | E_NOT_OK | An unspecified error occurred. |
0x02 | E_UNKNOWN_SERVICE | The requested Service ID is unknow. |
0x03 | E_UNKNOWN_METHOD | The requested Method ID is unknown. Service ID is known. |
0x04 | E_NOT_READY | Service ID and Method ID are known. But Applicationnot running。 |
0x05 | E_NOT_REACHABLE | System running the service is not reach. |
0x06 | E_TIMEOUT | A timeout occurred. |
0x07 | E_WRONG_PROTOCOL_VERSION | Version of SOME/IP protocol not supported. |
0x08 | E_WRONG_INTERFACE_VERSION | Interface version mismatch. |
0x09 | E_MALFORMED_MESSAGE | Deserialization err. |
0x0a | E_WRONG_MESSAGE_TYPE | An unexpected message type was received. |
0x0b | E_E2E_REPEATED | Repeated E2E calculation err. |
0x0c | E_E2E_WRONG_SEQUENCE | Wrong E2E sequence. |
0x0d | E_E2E | Not further specified E2E. |
0x0e | E_E2E_NOT_AVAILBLE | E2E not available. |
0x0f | E_E2E_NO_NEW_DATA | No new data for E2E calculation present. |
0x10 - 0x1f | RESERVED | Generic SOME/IP err. |
0x20 - 0x5e | RESERVED | Specific err. |
3.1.8 Payload
有效负载/数据段。
3.3 SOME/IP数据序列化
什么是序列化与反序列化?
在SOME/IP中使用序列化的目的和作用? 使数据按照固定格式进行编排成为字节序,实现数据在网络上的传输。
通信协议序列化是什么?
3.3.1 内存对齐与填充
通过在数据后插入填充元素来对齐数据的开头,以确保对齐的数据从特定的内存地址开始。对于有些处理器架构可以更高效地访问数据。 当可变元素不是序列化数据流中最后一个元素,应依据规则对可变元素进行位填充来实现数据对齐。
3.3.2 带有标识符合可选成员的结构体数据类型和参数
3.3.3 基础数据类型序列化(Basic Datatypes)
Type | DES | Size[bit] |
---|---|---|
Boolean | TRUE/FALSE | 8bit |
uint8 | unsigned | 8bit |
uint16 | unsigned | 16bit |
uint32 | unsigned | 32bit |
uint64 | unsigned | 64bit |
sint8 | signed | 8bit |
sint16 | signed | 16bit |
sint32 | signed | 32bit |
sint64 | signed | 64bit |
float32 | floating | 32bit |
float64 | floating | 64bit |
3.3.4 结构体序列化(Struct)
结构体序列化是依次按序进行的,如下图示例。 结构体序列化可按照TLV标准添加length和tag字段,如下图示例。 示例1.
示例2. 示例3. 结构体序列化也可以不配length参数,只配tag参数,如下图示例。 示例4.
3.3.5 字符串序列化(Strings)
传输ASCII、UTF-8、UTF-16字符的固定长度或动态长度字符串。对于动态长度字符串,字符串数据前有一个大端序的字符串长度参数。
3.3.6 数字序列化(Arrays)
包含相同参数类型。有固定长度和动态长度。对于具有动态长度的数组,使用长度字段。
3.3.7 枚举序列化(Enumeration)
枚举,具有命名不同值选项的uint。
3.3.8 位域序列化(Bitfield)
8、16、32位参数,每一位代表一个布尔值。每个布尔值可以有一个名称,也可以有一个真值和假值的名称。
3.3.9 联合体/变态类型序列化
可以携带预定义参数类型的参数,该参数在运行时确定。序列化使用长度字段、类型字段和参数数据。 variant是什么数据类型? 示例1.(uint8) 示例2.(uint32)
3.3.10 TLV序列化(Tag Length Value)
3.3 SOME/IP传输标准
将会介绍远程过程调用(RPC)、事件通知、错误处理。
1、SOME/IP支持TCP和UDP; 2、服务器运行同一服务的不同实例,则属于不同服务实例的消息应通过服务器的传输层端口映射到服务实例(通过不同的端口区分不同的实例); 3、传输层payload里允许有多个SOME/IP消息,不同的SOME/IP消息依据长度字段切分; 4、每个SOME/IP payload都有自己的SOME/IP头部结构; 5、一个服务实例可以有3种方法进行方法、事件、通知消息的传输: 最多一个TCP连接、最多一个UDP单播、最多一个UDP广播;
3.3.1 UDP绑定
UDP绑定即基于UDP协议实现的SOME/IP消息传输。 SOME/IP信息是UDP的Payload部分,若是UDP Payload数据过大,将会被网络层分片。 一个单播UDP可以处理配置为UDP单播通信的方法、事件、通知。 一个多播UDP可以处理配置为UDP多播通信的方法、事件、通知。
3.3.2 TCP绑定
TCP绑定即基于TCP协议实现的SOME/IP消息传输。 一个单播TCP可以处理配置为UDP单播通信的方法、事件、通知。
注:客户端通信前应负责建立TCP连接;客户端负责TCP的失败重连;客户端负责TCP连接关闭;客户端应在TCP所有连接服务不可用时断开连接(因为客户端需要事件处理数据,决定是否可以断开连接);客户端应在被服务端关闭TCP后被断重建连接;
3.3.3 多个服务实例
同一服务的服务实例通过不同的实例ID进行标识。应支持多个服务实例驻留在不同的ECU上,以及一个或多个服务的多个服务实例驻留在一个ECU上。 虽然不同服务的多个服务实例应能够共享所用传输层协议的相同端口号,但单个ECU上相同服务的多个服务实例应使用不同的服务实例端口。 虽然实例ID用于服务发现,但它们不包含在SOME/IP头中。服务实例可以通过服务ID与套接字(即IP地址、传输协议(UDP/TCP)和端口号)的组合来识别。建议实例对UDP和TCP使用相同的端口号。如果服务实例使用UDP端口x,则只有该服务的该实例,而不是同一服务的另一实例,应该为其服务使用TCP端口x。
3.3.4 SOME/IP TP
当基于UDP传输的SOME/IP消息太大,而需要分片时,应使用SOME/IP-TP。 使用SOME/IP-TP的SOME/IP消息应激活Session ID处理; 原始信息必须具有唯一的Session ID; 所有SOME/IP-TP分段应携带原始消息的Session ID,因此,它们都具有相同的Session ID; SOME/IP-TP分段应将Message类型的TP标志设置为1; 发送时应对More Segment Flag = 1的信息进行等长分段(为1392byte,除最后一片),且按顺序/升序发送,不可以重复发送分片报文; 接收时根据SOME/IP-TP包中的Message ID、Protocol Version、Interface Version、Message Type等标志进行数据重组; 可接收来自不同客户端(IP、port、ID)相同Message ID重新组合多条消息(良好的缓冲机制); 当接收数据大于设置重组缓冲区时,剩余的数据将会被舍弃; 当新分片数据来临,旧分片的重组任务未结束,则应抛弃旧分片开始新的分片任务; 当检测到分片数据丢失后,应取消该片所属的重组任务; 当检测到分片数据重复后,应可以将重复分片覆盖,使重组可以正常进行; 接收完每个分片之后都应该返回Return Code,但只用最后一个分片的Return Code; 数据重组后应该进行完整性校验,正确重组的数据才能传递给应用程序; 数据重组后,应将分段标志设置为0; 接收数据时,应该可以升序或者降序的对分片数据进行重组; 接收数据时,应一个缓冲区对应一个原始数据的分片的重组,避免相同事件(IP、port、Message ID、TP);
SOME/IP-TP分段应在SOME/IP头之后有一个TP头,SOME/IP TP头格式如下图所示:
3.4 SOME/IP通信模式
3.4.1 Request/Response
Request/Response模式为最常见的通信模式,一端(客户端)发送Request,另一端(服务端)回复Response。
3.4.2 Fire&Forget
Fire&Forget类型通信仅发出Request但不会收到Response。
3.4.3 Notification Events
Notification描述了发布/订阅机制的概念。 通常是服务端发布服务客户端订阅的服务; 服务端会向客户端发送事件信息,如更新的参数、发生的事件等; 服务端通过SOME/IP的Notification向客户端发布消息,客户端通过SOME/IP-SD订阅服务。
3.4.4 Fields
一个Fields表示一个状态的有效值,订阅该字段的订阅者将字段值作为初始事件; 一个Fields包含getter、setter、notification event; 一个Fields没有getter、setter、notification event是错误的,一个Fields至少要包含一个getter或setter或notification event; 一个Fields的getter运用于当request的payload为空时,对应的response的payload中将会有getter字段; 一个Fields的setter运用于当request的payload中有请求值字段时,对应的response的payload中有该字段的当前值; 当客户端订阅该Fields时,事件通知着应该发送一个事件消息,将字段值发送给客户端;
3.4.5 Error Handling
服务端应具备错误处理能力; 错误处理可以在应用程序或通信层中实现,即在response中携带Return Code或Message Type = 0x81类型消息;
3.4.6 Return Code
见3.1.7节。
3.4.7 Error Message
SOME/IP消息接收者不应对events/notifications回复错误消息; SOME/IP消息的接收者不应对fire&forget methods回复错误消息; 如果events/notifications和fire&forget methods的Message Type字段被错误地设置为Request或Response,SOME/IP消息的接收者不应回复错误消息;
3.4.8 Error Processing Overview
当SOME/IP消息基于UDP传输时,应做如下验证:1.UDP数据报大小应至少为16字节(SOME/IP最小长度);2.UDP首部中Length字段值应小于或等于UDP Payload字节数; 错误检测流程,如下图所示:
3.4.9 通信错误和通信错误处理
RPC消息传输时,对消息传递的可靠性做了定义,1.可能 :不能保证一定到达(基于超时的UDP实现);2.至少一次:至少被到达一次(基于UDP实现);3.仅一次 :仅到达一次(基于TCP实现);
3.4.10 Interface Version兼容处理
Interface Version标识了Payload的格式版本。 Payload格式和如下因素有关: 服务接口规范; 序列化配置(如可变大小数组、长度字段、填充、TLV、SOME/IP-TP); Interface Version和如下因素有关: Payload格式的不兼容; 服务行为的不兼容; 应用程序的设计要求; Interface Version不受Payload格式变换的影响;
4. SOME/IP SD
SOME/IP SD全称,SOME/IP Service Discovery,即服务发现。在client与server间进行
4.1 SOME/IP SD头部数据格式
SOME/IP SD 的传是基于SOME/IP的,只是部分字段给的是固定值,SOME/IP SD头部在SOME/IP的Payload部分; SOME/IP-SD 消息的Client ID = 0x0000,因为只存在一个SOME/IP-SD实例; SOME/IP-SD 消息可以配置Client ID前缀; SOME/IP-SD Session ID遵循SOME/IP的原则(不能设置为0,从1开始并依次递增); SOME/IP-SD 头部从falgs字段开始;
4.2 Entries
SOME/IP SD支持在Entries array中放置多个Entry; Entries 用于同步服务实例状态(提供服务、发现服务)和发布/订阅管理; Entries 有服务类型Entries和事件类型Entries;
4.2.1 Service Entries
格式如下图所示:
4.2.1.1 Find Service Entry
发现服务Entry用于查找当前服务状态未知的服务实例(没有接收到当前service offer但仍有效),即client查找服务; 发送方不可以在发现服务Entry中引用端口、多播选项; 接收方应该忽略Endpoint Options和Multicast Options,其他选项则应该仍被使用; 接收发现服务Entry时,通过Service ID、Instance ID、Major Version、Minor Version去匹配服务实例;
发现服务Entry格式规则,如下所示:
4.2.1.2 Offer Service Entry
用于Sever向Client提供服务; Offer Service Entry至少引用一个IPv4/IPv6端口Option,以表明服务如何可达; 对于服务所需的传输层协议(UDP/TCP),如果支持IPv4,则应添加IPv4端口Option,否则若支持IPv6,则应添加IPv6端口Option; 接收接收Offer Service Entry、或者后续Offer Service Entry、Stop Offer Service Entry时,都通过Service ID、Instance ID、Major Version、Minor Version参数去匹配服务实例,并且后续Entry与初始Entry参数应该保持一致;
提供服务Entry格式规则,如下所示:
4.2.1.3 Stop Offer Service Entry
用于Sever向Client提供服务; 规则与Offer Service Entry一致,但TTL应设置为0x000000;
4.2.1.4 Usage of Options in Entries
Entries中Option的使用,如下图所示;
4.2.2 Eventgroup Entries
Eventgroup Entries格式规则,如下图所示:
4.2.2.1 Subscribe Eventgroup Entry
用于订阅事件组; 客户端通过什么方式(单播端口/多播端口)订阅事件,就通过什么方式接收订阅的事件信息; Subscribe Eventgroup Entry最多支持两个IPv4或者两个IPv6端口,分别是一个UDP和一个TCP端口; Subscribe Eventgroup Entry支持一个IPv4多播或者一个IPv6多播配置,多播只可以基于UDP实现; 网络传输设置时,应该考虑如下问题: 1.若服务器仅使用IP多播进行事件信息传输,则Subscribe Eventgroup Entry不需要设置UDP Endpoint Option; 2.若服务器在传输某个事件组的初始事件时,则Subscribe Eventgroup Entry将会引用对应的Endpoint Option; 3.若客户端服务使用多播订阅事件,由服务器发送初始化;
Subscribe Eventgroup Entry按照如下规则设置:
4.2.2.2 Stop Subscribe Eventgroup Entry
用于取消订阅事件组; Stop Subscribe Eventgroup Entry规则与Subscribe Eventgroup Entry基本一致,除
4.2.2.3 Subscribe Eventgroup Acknowledgement (Subscribe Eventgroup Ack) Entry
用于表示Subscribe Eventgroup Entry已经被接受;
4.2.2.4 Subscribe Eventgroup Negative Acknowledgment(Subscribe Eventgroup Nack) Entry
用于表示Subscribe Eventgroup Entry没有被接受;
4.2.3 服务和事件的Endpoints处理
Endpoints将会在4.3.3-4.3.8节介绍,即端口。 如果静态配置的值与这些选项中的值不同,则服务发现应使用端点和多播选项中传输的IP地址和端口号覆盖这些IP地址和端口号; Endpoints Option的IP地址和端口号也用于传输事件和通知事件; 基于UDP传输时,Endpoints Option作为事件和通知事件的源IP和源Port,也是客户端发送方法和请求的地址; 基于TCP传输时,Endpoints Option用做客户端需要打开的IP和Port,用于客户端接收事件信息; SOME/IP允许同时使用UDP和TCP; 消息使用的传输协议由配置决定,Service可以同时支持UDP和TCP端口,前提是都做了配置; 不同的传输协议(TCP/UDP)不可以提供相同的服务;
4.2.3.1 Service Endpoints
Endpoints将会在4.3.3-4.3.8节介绍,即端口。 Offer Service Entries引用的Endpoints Option:1.服务实例在服务端可以访问的IP和Port;2.服务实例发送事件的源IP和源Port; 除了Offer Service Entries的Endpoints Option中给出的端口外,服务实例的事件不得从任何其他端口发送; 如果一个ECU提供多个服务实例,这些服务实例的SOME/IP消息应通过Offer Service Entries引用的Endpoints Option中传输的信息来区分;
4.2.3.2 Eventgroup Endpoints
Endpoints将会在4.3.3-4.3.8节介绍,即端口。 Subscribe Eventgroup Entries中引用的Endpoints Option也可以用于此服务实例发送单播UDP/TCP的SOME/IP事件; Subscribe Eventgroup Entries中引用的端口选项是客户端的IP和Port; Subscribe Eventgroup Ack Entries最多引用1个使用Internet协议(IPv4或IPv6)的多播选项; 初始事件应使用单播从服务器传输到客户端; Multicast Option设置UDP作为传输协议; 客户端应尽快打开Subscribe Eventgroup Ack Entry引用的Multicast Option中指定的端口,以免错过多播事件;
4.3 Options
Options用于将附加信息传输给Entries(例如,如何访问服务实例的信息(IP地址、传输协议、端口号));
4.3.1 Configuration Option
配置Option应指定一组基于DNS TXT和DNS SD格式的"Key=Value"对; Configuration String应该由长度字段开始,即Configuration string的有效字节长度(Configuration string = Configuration String length + Configuration String data);
4.3.2 Load Balancing Option
用于区分不同服务实例的
4.3.3 IPv4 Endpoint 口Option
IPv4端口Option用于SOME/IP SD实例向相关端口(本地IP地址、传输层协议、发送方端口)发送信号,也可用于事件和通知事件; IPv4端口Option的Type字段 = 0x04; IPv4端口Option应该指定使用的IPv4地址、传输层协议、端口; 服务器应使用带有Offer Service Entries的IPv4端口Option来向其提供服务的端口发出信号,即最多一个UDP端口和一个TCP端口; 服务器使用Offer Service Entry引用的端口也被用来作为事件源,即IPv4端口Option中传输协议的源IP和源Port; 客户端应使用带有Subscribe Eventgroup Entries的IPv4端口Option来通知IP地址和UDP/TCP端口号,在这些端口号上它已做好接收事件的准备;
IPv4端口Option应该按如下格式规则,如下图所示:
4.3.4 IPv6 Endpoint Option
IPv6端口Option被用于SOME/IP-SD实例向相关端口(本地IP地址、传输层协议(UDP/TCP)、送方的端口号)发出信号,这些端口也用于事件和通知事件; IPv6端口Option的Type字段 = 0x06; 服务器应使用带有Offer Service Entries的IPv6端口Option来向端口发出服务可用的信号,即最多一个UDP端口和一个TCP端口; 服务器使用一个Offer Service Entry引用的端口也被用来作为事件源,即IPv6端口Option中传输协议的源IP地址和源Port; 客户端应使用带有Subscribe Eventgroup Entries的IPv6端口Option来通知IP地址和UDP/TCP端口号,它已做好接收事件的准备;
IPv6端口Option格式规则,如下图所示:
4.3.5 IPv4 Multicast Option
IPv4多播Option用于
IPv4多播Option格式规则,如下图所示:
4.3.6 IPv6 Multicast Option
IPv6多播Option用于
IPv6多播Option格式规则,如下图所示:
4.3.7 IPv4 SD Endpoint Option
IPv4 SD端口Option用于传输发送方SD实现的端口(即IP地址和端口); IPv4 SD端口Option即使在无法使用IP地址/端口号的情况下,这也可用于识别SOME/IP-SD实例; IPv4 SD端口Option在任何SD消息中最多出现一次; IPv4 SD端口Option如何存在,应该是Option Array的第一个选项; IPv4 SD端口Option不应该被任何SD Entry使用; IPv4 SD端口Option如果存在于SD消息中,接收方应使用Option的内容而不是源IP和源Port对SD消息应答; IPv4 SD端口Option的Type = 0x24; IPv4 SD端口Option应该指定发送方的IPv4地址、传输层协议、端口号;
IPv4 SD端口Option格式规则,如下图所示:
4.3.8 IPv6 SD Endpoint Option
IPv6 SD端口Option用于传输发送方SD实现的端口(即IP地址和端口); IPv6 SD端口Option即使在无法使用IP地址/端口号的情况下,这也可用于识别SOME/IP-SD实例; IPv6 SD端口Option在任何SD消息中最多出现1次; IPv6 SD端口Option如何存在,应该在Option Array的第一个选项中; IPv6 SD端口Option不应该被任何SD Entry使用; IPv6 SD端口Option如果存在于SD消息中,接收方应使用Option的内容而不是源IP和源Port对SD消息应答; IPv6 SD端口Option的Type = 0x26; IPv6 SD端口Option应该指定发送方的IPv6地址、传输层协议、端口号;
IPv6 SD端口Option格式规则,如下图所示:
4.4 SD 报文/消息
所有的SD消息都应该发送到SD_PORT; SD_PORT用于SD单播/多播消息的源端口; 所有单播SD消息应将SD_PORT作为目标端口,除非还定义了其他端口; 所有多播SD消息应使用SD_MULTICAST_IP;
4.5 Service Discovery Communication Behavior
SOME/IP SD将Entries打包在一起而减少服务发现的消息数量,如1.不同服务实例多个Entries;2.不同类型的Entries;
4.5.1 Startup Behavior
开始发送SD消息的基础步骤: 初始化等待阶段:当该服务实例所需的接口上的链接启动后,若应用程序请求客户端服务,SD便进入初始化阶段;若服务器服务可用时,SD进入等待阶段; 重复阶段:发送第一条消息后,进入实例的重复阶段; 主要阶段:收到offer service entry后,进入主要阶段;或者当REPETITIONS_MAX = 0时,直接有初始等待进入主要阶段; 链路可能已接通,但服务器端尚未提供服务; 系统已启动意味着此处需要的应用程序以及可能的外部传感器和执行器。基本上,此服务实例所需的功能必须准备好提供服务,并且在某些应用程序需要后,查找服务是适用的; 服务发现应在进入初始等待阶段后,在发送服务实例的第一条消息之前,基于INITIAL_DELAY进行等待; INITIAL_DELAY应定义一个最小值和最大值,有效值随机在临界值之间进行选择; 若client服务和server服务分别引用相同的服务时间,并确保在同一时间点请求和释放引用的服务,则SD应该使用相同的随机值; 若client服务和server服务分别引用自己的服务时间,SD应该在不同的服务使用不同的随机值; 若client服务和server服务分别引用自己的服务时间,且client服务和server服务进入初始化等待阶段,他们将在等待阶段使用单独的随机值; 在重复阶段每发送一条消息后,延迟加倍; 在重复阶段SD最多只可以发送REPETITIONS_MAX个entries;
SD消息开始发送