写在开篇·蓉儿继续挖坑上回说到郭靖搞清楚了Offer Service的基本原理——服务端广播“我会啥我在这”TTL告诉客户端有效期。郭靖合上笔记本突然皱起眉头“蓉儿我有个问题——如果每个ECU都每隔1.5秒发一次Offer那车上几十个ECU网络岂不是要炸”黄蓉咬了口糖葫芦“问得好实际上SD根本不是一直高频发的。今天就把SD的发送策略讲透——启动时快稍后慢断断续续哥还在。”一、不是“一直发”是“启动时多发稳定后少发”黄蓉在白板上画了一条时间线┌─────────────────────────────────────────────────────────────────────┐ │ SD的“三段式”发送策略 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 上电瞬间 │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 第一阶段Initial Repetition Phase快速重复期 │ │ │ │ ┌─────┬─────┬─────┬─────┬─────┐ │ │ │ │ │ 0ms │100ms│200ms│400ms│800ms│ → 间隔越来越长 │ │ │ │ └─────┴─────┴─────┴─────┴─────┘ │ │ │ │ 目的让客户端快速发现不用等很久 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 第二阶段Repetition Phase重复期 │ │ │ │ ┌──────┬──────┬──────┐ │ │ │ │ │ 1.5s │ 1.5s │ 1.5s │ → 每隔固定时间发 │ │ │ │ └──────┴──────┴──────┘ │ │ │ │ 目的稳定客户端缓存确认服务还活着 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 第三阶段Main Phase稳定期 │ │ │ │ ┌──────┬──────┬──────┬──────┐ │ │ │ │ │ 3s │ 3s │ 3s │ ... │ → 稀疏发送 │ │ │ │ └──────┴──────┴──────┴──────┘ │ │ │ │ 目的维持存在感减少网络负载 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖恍然大悟“哦原来不是一直高频发是启动时多发几次让客户端快速知道稳定后就少发了”二、为什么不能一直高频发黄蓉反问“你想啊车上几十个ECU如果每个都每隔1.5秒发一次Offer网络会怎样”车辆规模每个ECU频率每秒总消息数带宽占用约100字节/条30个ECU1.5秒/次20条/秒约16Kbps50个ECU1.5秒/次33条/秒约26Kbps100个ECU1.5秒/次67条/秒约53Kbps“虽然53Kbps对于100Mbps以太网来说很小0.05%但没必要。稳定后完全可以把频率降到3秒甚至10秒一次。”三、三段式参数详解黄蓉列了一张典型配置表参数典型值说明Initial Repetition Base Delay100ms初始重试基时Initial Repetition Count5次启动时快速发5次Repetition Base Delay1.5s重复期间隔Repetition Count3次重复期发3次Main Phase Delay3s稳定期间隔TTL3s有效期必须大于Main Phase Delay否则有空窗期重点Main Phase Delay 必须 ≤ TTL最好 ≤ TTL/2否则客户端会认为服务过期。四、郭靖的追问那TTL到底是啥郭靖盯着TTL字段“TTL3秒意思是3秒后服务就下线了那3秒后还没发新Offer客户端怎么办”黄蓉画了一个时序图时间线 0.0秒车窗ECU发OfferTTL3→ 座舱记“服务活到3.0秒” 0.5秒没收到新Offer 1.0秒没收到新Offer 1.5秒车窗ECU发新Offer续约→ 座舱刷新“服务活到4.5秒” ... 3.0秒如果车窗ECU挂了没发新Offer → 座舱“3.0秒到了服务下线删掉”“TTL是客户端用来判断服务是否过期的不是服务端自己倒计时。服务端要定时续约告诉客户端‘我还活着’。”五、那为什么还要TTL不能靠心跳吗郭靖又问“那直接用心跳不就行了TTL是不是多余”黄蓉摇头“心跳只能告诉客户端‘我还在’但TTL还能告诉客户端‘我如果不在了你多久能知道’。**没有TTL有TTL客户端不知道服务什么时候会过期客户端明确知道“有效期X秒”服务端挂了客户端永远不知道服务端挂了TTL超时后客户端自动清理“TTL给了客户端一个‘确定性’——最长等X秒没消息就可以认为服务没了。”六、黄蓉的小本本郭靖翻开她的笔记本上面写着SD的三段式发送策略阶段频率目的快速重复期密集几十到几百毫秒让客户端快速发现重复期中等1-2秒稳定缓存稳定期稀疏几秒到几十秒维持存在感省带宽TTL不是发送间隔是“有效期”Main Phase Delay 必须 ≤ TTL否则有空窗期一句口诀启动时快稍后慢断断续续哥还在写在最后郭靖合上笔记本“原来SD不是一直高频发是启动时多发几次让客户端快速发现稳定后就稀疏发了。TTL是有效期不是发送间隔。Main Phase Delay必须小于TTL否则客户端会以为服务下线。”黄蓉咬了口糖葫芦“那如果客户端启动晚了没听到启动时那几次Offer怎么办”郭靖摇头。“下篇预告客户端主动问Find谁会啥快出现——Find Service详解。”打完收工886。
车载以太网之要火系列 - 第46篇:郭大侠学SOME/IP (offer Service):启动时快稍后慢,断断续续哥还在
写在开篇·蓉儿继续挖坑上回说到郭靖搞清楚了Offer Service的基本原理——服务端广播“我会啥我在这”TTL告诉客户端有效期。郭靖合上笔记本突然皱起眉头“蓉儿我有个问题——如果每个ECU都每隔1.5秒发一次Offer那车上几十个ECU网络岂不是要炸”黄蓉咬了口糖葫芦“问得好实际上SD根本不是一直高频发的。今天就把SD的发送策略讲透——启动时快稍后慢断断续续哥还在。”一、不是“一直发”是“启动时多发稳定后少发”黄蓉在白板上画了一条时间线┌─────────────────────────────────────────────────────────────────────┐ │ SD的“三段式”发送策略 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 上电瞬间 │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 第一阶段Initial Repetition Phase快速重复期 │ │ │ │ ┌─────┬─────┬─────┬─────┬─────┐ │ │ │ │ │ 0ms │100ms│200ms│400ms│800ms│ → 间隔越来越长 │ │ │ │ └─────┴─────┴─────┴─────┴─────┘ │ │ │ │ 目的让客户端快速发现不用等很久 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 第二阶段Repetition Phase重复期 │ │ │ │ ┌──────┬──────┬──────┐ │ │ │ │ │ 1.5s │ 1.5s │ 1.5s │ → 每隔固定时间发 │ │ │ │ └──────┴──────┴──────┘ │ │ │ │ 目的稳定客户端缓存确认服务还活着 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 第三阶段Main Phase稳定期 │ │ │ │ ┌──────┬──────┬──────┬──────┐ │ │ │ │ │ 3s │ 3s │ 3s │ ... │ → 稀疏发送 │ │ │ │ └──────┴──────┴──────┴──────┘ │ │ │ │ 目的维持存在感减少网络负载 │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖恍然大悟“哦原来不是一直高频发是启动时多发几次让客户端快速知道稳定后就少发了”二、为什么不能一直高频发黄蓉反问“你想啊车上几十个ECU如果每个都每隔1.5秒发一次Offer网络会怎样”车辆规模每个ECU频率每秒总消息数带宽占用约100字节/条30个ECU1.5秒/次20条/秒约16Kbps50个ECU1.5秒/次33条/秒约26Kbps100个ECU1.5秒/次67条/秒约53Kbps“虽然53Kbps对于100Mbps以太网来说很小0.05%但没必要。稳定后完全可以把频率降到3秒甚至10秒一次。”三、三段式参数详解黄蓉列了一张典型配置表参数典型值说明Initial Repetition Base Delay100ms初始重试基时Initial Repetition Count5次启动时快速发5次Repetition Base Delay1.5s重复期间隔Repetition Count3次重复期发3次Main Phase Delay3s稳定期间隔TTL3s有效期必须大于Main Phase Delay否则有空窗期重点Main Phase Delay 必须 ≤ TTL最好 ≤ TTL/2否则客户端会认为服务过期。四、郭靖的追问那TTL到底是啥郭靖盯着TTL字段“TTL3秒意思是3秒后服务就下线了那3秒后还没发新Offer客户端怎么办”黄蓉画了一个时序图时间线 0.0秒车窗ECU发OfferTTL3→ 座舱记“服务活到3.0秒” 0.5秒没收到新Offer 1.0秒没收到新Offer 1.5秒车窗ECU发新Offer续约→ 座舱刷新“服务活到4.5秒” ... 3.0秒如果车窗ECU挂了没发新Offer → 座舱“3.0秒到了服务下线删掉”“TTL是客户端用来判断服务是否过期的不是服务端自己倒计时。服务端要定时续约告诉客户端‘我还活着’。”五、那为什么还要TTL不能靠心跳吗郭靖又问“那直接用心跳不就行了TTL是不是多余”黄蓉摇头“心跳只能告诉客户端‘我还在’但TTL还能告诉客户端‘我如果不在了你多久能知道’。**没有TTL有TTL客户端不知道服务什么时候会过期客户端明确知道“有效期X秒”服务端挂了客户端永远不知道服务端挂了TTL超时后客户端自动清理“TTL给了客户端一个‘确定性’——最长等X秒没消息就可以认为服务没了。”六、黄蓉的小本本郭靖翻开她的笔记本上面写着SD的三段式发送策略阶段频率目的快速重复期密集几十到几百毫秒让客户端快速发现重复期中等1-2秒稳定缓存稳定期稀疏几秒到几十秒维持存在感省带宽TTL不是发送间隔是“有效期”Main Phase Delay 必须 ≤ TTL否则有空窗期一句口诀启动时快稍后慢断断续续哥还在写在最后郭靖合上笔记本“原来SD不是一直高频发是启动时多发几次让客户端快速发现稳定后就稀疏发了。TTL是有效期不是发送间隔。Main Phase Delay必须小于TTL否则客户端会以为服务下线。”黄蓉咬了口糖葫芦“那如果客户端启动晚了没听到启动时那几次Offer怎么办”郭靖摇头。“下篇预告客户端主动问Find谁会啥快出现——Find Service详解。”打完收工886。