SOME/IP-SD는 소프트 스테이트(soft-state) 프로토콜이다 — 엔트리는 TTL이 붙은 채로 유효 기간이 있고, 계속 유효하게 유지하려면 주기적으로 갱신해야 한다(TTL을 최댓값으로 설정하면 이 갱신 요구를 끌 수 있다)[1]. 이 절은 서비스 인스턴스·이벤트그룹 하나가 이 유효 기간을 어떤 리듬으로 채워 넣는지 다룬다.
시작 단계
서버 쪽 서비스 인스턴스는 인터페이스 링크가 살아 있고 서비스 자체가 가용해지면, 클라이언트 쪽 서비스 인스턴스는 링크가 살아 있고 애플리케이션이 그 서비스를 요청하면 각각 Initial Wait Phase에 들어간다. 이후 서비스 인스턴스·이벤트그룹마다 다음 세 단계를 순서대로 거친다[1]:
| 단계 | 대기 시간 | 목적 |
|---|---|---|
| Initial Wait Phase | INITIAL_DELAY_MIN~_MAX 사이 무작위값 1회 | ECU들이 동시에 켜져 트래픽이 몰리는 상황을 흩뜨리고, 그 사이 도착한 여러 엔트리를 한 메시지로 묶을 시간을 준다 |
| Repetition Phase | REPETITIONS_BASE_DELAY × 2ⁿ(n=0,1,2,…), 최대 REPETITIONS_MAX회 전송 후 종료 | 재시도 간격을 지수적으로 늘려, 클라이언트·서버 중 늦게 켜진 쪽이 빠르게 상대를 찾게 하면서도 과부하로 이어지지 않게 한다. REPETITIONS_MAX가 0이면 이 단계를 건너뛴다 |
| Main Phase | CYCLIC_OFFER_DELAY 주기(설정된 경우) | 상태를 안정시키는 단계로, OfferService만 주기적으로 보내고 Find류 엔트리는 더 이상 반복 전송하지 않는다 |
Repetition Phase 중 FindService에 대응하는 OfferService가 도착하면 그 즉시 남은 Find 재시도를 멈춘다[1].
서버·클라이언트 상태
서버 쪽은 인터페이스 링크·서비스 가용 여부에 따라 Not Ready와 위 세 단계를 포함하는 Ready 사이를 오간다. 클라이언트 쪽은 이에 더해 원격 서비스를 아직 못 봤는지(Service Not Seen) 봤는지(Service Seen), 그리고 로컬 애플리케이션이 그 서비스를 요청했는지(Requested_but_not_Ready → Service Ready)까지 함께 추적해, 두 조건이 모두 맞아떨어질 때만 실제로 이벤트그룹을 구독한다[1].
인터페이스 링크가 끊기면 진행 단계와 무관하게 Initial Wait Phase로 되돌아가고, 링크가 복구되고 서비스가 여전히 가용·요청 상태면 그 시점부터 다시 시작한다[1].
종료 단계
서버가 Repetition·Main Phase 중 서비스 제공을 멈추면 StopOfferService를 내보내고, 이 서비스 인스턴스에 걸린 모든 구독을 서버 쪽에서 지운다. 클라이언트는 StopOfferService를 받으면 그 구독을 지우되, 곧바로 FindService를 재개하지 않고 새 OfferService나 상태 변화(애플리케이션 요청, 네트워크 관리, 링크 변화 등)를 기다린다. 클라이언트가 Main Phase에서 서비스를 더 이상 요청하지 않게 되면(구독 해제) 걸려 있던 이벤트그룹마다 StopSubscribeEventgroup을 내보내며, ECU 전체가 종료될 때는 이 둘을 모든 서비스·이벤트그룹에 대해 함께 내보낸다[1].
응답 지연
멀티캐스트로 받은 Find·Offer 엔트리(즉 유니캐스트가 아닌 요청)에 대한 응답은 REQUEST_RESPONSE_DELAY 범위 안에서 무작위로 지연시켜 보낸다 — 엔트리가 많은 멀티캐스트 SD 메시지 하나에 여러 ECU가 동시에 응답하면 수신 측에 트래픽이 몰리기 때문이다. 유니캐스트로 받은 요청에는 이 지연이 적용되지 않고 즉시 응답한다[1].
Publish/Subscribe 흐름
이벤트그룹 구독이 실제로 이벤트 수신까지 이어지는 과정은 SOME/IP Communication Patterns의 Notification 패턴과 맞물린다. 이벤트를 TCP로도 받아야 하면 클라이언트는 SubscribeEventgroup을 보내기 전에 서버와 TCP 연결부터 맺어야 한다[1].
서버는 OfferService에 참조한 엔드포인트를 이벤트·알림의 발신 주소로도 재사용한다. 클라이언트는 SubscribeEventgroup에 자신이 이벤트를 받을 엔드포인트를 실어 보내고, 구독이 받아들여지면 그 즉시 오는 초기 이벤트는 유니캐스트로 전달된다. 서버가 SubscribeEventgroupAck에 멀티캐스트 옵션을 함께 실었다면, 클라이언트는 이후 멀티캐스트 이벤트를 놓치지 않도록 그 멀티캐스트 그룹에 최대한 빨리 합류해야 한다[1].