SOME/IP (Scalable service-Oriented MiddlewarE over IP) — 차량 내 ECU 간 서비스 기반 통신을 구현하는 미들웨어 프로토콜. SOA의 자동차 구현체로, OS·HW에 독립적으로 IP 위에서 RPC와 Publish/Subscribe를 제공한다. 2011년 BMW에 의해 제안되었으며 Classic AUTOSAR·Adaptive AUTOSAR·GENIVI 등 다양한 환경을 지원한다.
설계 목표
- 임베디드 시스템에 맞게 자원 사용이 적어야 함.
- 다양한 use-case·통신 파트너와 호환 가능.
- AUTOSAR PDU와 표준 변경 없이 통신 가능.
- 작은 시스템부터 큰 시스템까지 확장 가능(scalable).
- AUTOSAR / GENIVI / OSEK 등 다양한 OS에서 구현 가능.
- Classic AUTOSAR ECU는 파일 시스템을 지원하지 않기 때문에 XML/JSON에 의존하지 않고 서비스 기반 통신을 지원하도록 설계.
Transport Protocol Binding
SOME/IP는 전송 계층으로 UDP·TCP를 모두 지원한다.
- UDP 페이로드: 0 ~ 1400 Byte (단일 패킷 한계).
- TCP 페이로드: Segmentation 지원으로 더 큰 메시지 허용.
- 동일 서비스의 여러 인스턴스를 실행하는 서버는 인스턴스마다 다른 Port로 매핑.
- 한 번에 전송 가능한 UDP 패킷 / TCP 세그먼트 이상을 SOME/IP가 처리하지 않음.
포트 번호 관례
- Interface Specification (예: FIBEX, ARXML)에 차량에서 사용되는 포트를 명시해야 함.
- 동적 포트 필요 시 IETF·IANA의 임시 포트 범위 49152 ~ 65535 사용.
- 명시가 없는 경우 관례:
- 30491 — SOME/IP 동적 클라이언트 포트
- 30501 — 첫 번째 SOME/IP 서버 포트
- 30502, 30503, … — 추가 서버 인스턴스
Magic Cookie (TCP 전용)
TCP는 Segment 경계가 없어 메시지 시작을 구분하기 어렵다. 따라서 SOME/IP는 Magic Cookie라는 고정 패턴 메시지를 삽입해 Segment 시작을 표시한다.
| 필드 | 값 |
|---|---|
| Service ID | 0xFFFF |
| Method ID | 0x0000 (C→S) / 0x8000 (S→C) |
| Length | 0x0000 0008 |
| Client ID | 0xDEAD |
| Session ID | 0xBEEF |
| Protocol Version | 0x01 |
| Interface Version | 0x01 |
| Message Type | 0x01 (C→S) / 0x02 (S→C) |
| Return Code | 0x00 |
Endianness
- RPC 헤더는 네트워크 바이트 순서(Big-endian)로 인코딩 (RFC 791).
- Payload 내부 파라미터는 Interface 정의(FIBEX/ARXML)를 따르며, 미지정 시 Big-endian.
- Length 및 Type 필드는 항상 Big-endian이어야 함.
Header Format
SOME/IP Header는 모든 구현에서 동일해야 한다 (상호운용성).
| 필드 | 크기 | 설명 |
|---|---|---|
| Message ID | 32 bit | Service ID (16b) + Method/Event ID (15b) + Reserved 1 |
| Length | 32 bit | Request ID부터 메시지 끝까지 Byte 길이 |
| Request ID | 32 bit | Client ID (16b) + Session ID (16b) |
| Protocol Version | 8 bit | 현재 0x01 |
| Interface Version | 8 bit | Service Interface Major Version |
| Message Type | 8 bit | 메시지 종류 (아래 표 참조) |
| Return Code | 8 bit | 결과/에러 코드 |
| Payload | 가변 | 파라미터 (Serialization 규칙 적용) |
Message ID
서비스의 메서드 또는 이벤트를 고유하게 식별. 전체 차량 시스템에서 유일해야 함 (CAN ID와 유사).
- 상위 16 bit = Service ID (예: Navigation)
- 하위 15 bit = Method ID 또는 Event ID (예: findPath, cancelPath)
Request ID
- Client ID — 클라이언트 ECU마다 고유 할당.
- Session ID — 서비스 요청마다 새로운 ID 부여 → 동일 서비스에 대한 여러 요청 구분.
Message Type
| 값 | 이름 | 설명 |
|---|---|---|
| 0x00 | REQUEST | 응답(void 포함)을 기대하는 요청 |
| 0x01 | REQUEST_NO_RETURN | Fire & Forget 요청 |
| 0x02 | NOTIFICATION | 알림/이벤트 콜백 요청, 응답 기대 없음 |
| 0x40 | REQUEST_ACK | REQUEST에 대한 ACK (optional) |
| 0x41 | REQUEST_NO_RETURN_ACK | REQUEST_NO_RETURN에 대한 ACK (informational) |
| 0x42 | NOTIFICATION_ACK | NOTIFICATION에 대한 ACK (informational) |
| 0x80 | RESPONSE | 응답 메시지 |
| 0x81 | ERROR | 에러를 포함한 응답 |
| 0xC0 | RESPONSE_ACK | RESPONSE에 대한 ACK (informational) |
| 0xC1 | ERROR_ACK | ERROR에 대한 ACK (informational) |
Return Code
요청 성공 여부를 표시. 모든 메시지가 필드를 포함하되, RESPONSE/ERROR가 아닐 때는 0x00(E_OK)으로 설정.
| 코드 | 이름 | 설명 |
|---|---|---|
| 0x00 | E_OK | 에러 없음 |
| 0x01 | E_NOT_OK | 명시되지 않은 에러 |
| 0x02 | E_UNKNOWN_SERVICE | Service ID를 알 수 없음 |
| 0x03 | E_UNKNOWN_METHOD | Method ID를 알 수 없음 (Service ID는 유효) |
| 0x04 | E_NOT_READY | 애플리케이션 미실행 |
| 0x05 | E_NOT_REACHABLE | 서비스 실행 시스템 도달 불가 (내부 전용) |
| 0x06 | E_TIMEOUT | 타임아웃 (내부 전용) |
| 0x07 | E_WRONG_PROTOCOL_VERSION | SOME/IP 프로토콜 버전 미지원 |
| 0x08 | E_WRONG_INTERFACE_VERSION | Interface 버전 불일치 |
| 0x09 | E_MALFORMED_MESSAGE | Deserialization 실패 |
| 0x0a | E_WRONG_MESSAGE_TYPE | 예상치 못한 Message Type |
| 0x0b-0x1f | RESERVED | SOME/IP 일반 에러용 예약 |
| 0x20-0x3f | RESERVED | 서비스·메서드별 에러용 예약 |
Payload
- UDP 사용 시 0 ~ 1400 Byte.
- TCP 사용 시 Segmentation으로 더 큰 메시지 가능.
Serialization
RPC 호출 시 매개변수를 직렬(serial)하게 전송하는 절차.
- Interface Specification에 정의된 파라미터 리스트 기준으로 수행.
- 사양에 없는 파라미터는 Deserialization 결과에서 무시.
- 모든 파라미터의 정확한 위치와 메모리 정렬을 사양이 정의.
Basic Datatype
| Type | 설명 | Size | 비고 |
|---|---|---|---|
| boolean | TRUE/FALSE | 8 bit | FALSE=0, TRUE=1 |
| uint8 | unsigned integer | 8 bit | |
| uint16 | unsigned integer | 16 bit | |
| uint32 | unsigned integer | 32 bit | |
| sint8 | signed integer | 8 bit | |
| sint16 | signed integer | 16 bit | |
| sint32 | signed integer | 32 bit | |
| float32 | floating point | 32 bit | IEEE 754 binary32 (Single Precision) |
| float64 | floating point | 64 bit | IEEE 754 binary64 (Double Precision) |
복합 타입
- Structs — 선언 순서로 직렬화, 정렬·패딩은 사양 정의.
- Strings (fixed length) —
'\0'으로 끝나는 유니코드 지원. - Strings (dynamic length) — Length 필드가 먼저 오고 문자열 저장.
- Arrays (fixed length) — 1차원·다차원 모두 가능, 크기는 사양 정의.
- Dynamic Length Array, Enumeration, Bitfield, Union 지원.
직렬화 예시
uint8 → Length=4B, Type=1(uint8), value, Padding 0x00 × 3
uint16 → Length=4B, Type=2(uint16), value(2B), Padding 0x00 × 2
Map → 배열의 key-value 쌍으로 표현 (예: Length=12B)통신 패턴
1. Request / Response
가장 기본적 패턴. 클라이언트가 요청하고 서버가 응답.
- Message Type: REQUEST (0x00) → RESPONSE (0x80)(에러 시 ERROR (0x81)).
2. Fire & Forget
응답을 기다리지 않는 단방향 호출. Req/Res와 구현 동일하되 응답 없음.
- Message Type: REQUEST_NO_RETURN (0x01).
3. Notification Events
Publish / Subscribe 방식. 서버는 클라이언트가 구독한 이벤트를 Publish.
- 값 업데이트·이벤트 발생 시 서버가 클라이언트로 전송.
- 업데이트된 값 전송은 SOME/IP, 구독/발행 관리는 SOME/IP-SD 가 담당.
- 여러 클라이언트가 구독 시 Multicast로 알림 복제(Replication).
- Message Type: NOTIFICATION (0x02).
4. Field
setter·getter·event 알림의 조합. 세 가지 중 하나 이상은 포함해야 함.
- Getter — 빈 payload request → response payload에 현재 값.
- Setter — request payload에 설정 값 → response payload에 적용된 값.
- Event — 값이 변경될 때 자동 알림 (Notification과 동일 메커니즘).
AUTOSAR Com. Stack 통합
SOME/IP는 AUTOSAR 통신 스택과 직접 연동된다.
Socket Adapter (SoAd)
- TCP/IP 소켓과 AUTOSAR PDU를 연결.
- SoAd 상위 계층은 통신과 무관하게 PDU 기반 처리.
- PDU Router가 PDU를 SoAd로 전달하면 설정에 따라 해당 소켓으로 전송.
PDU Header Mode
| 모드 | 동작 | 특성 |
|---|---|---|
| Disabled | 하나의 소켓이 한 개의 PDU 전송 | 작은 PDU 다수 전송 시 오버헤드 큼 |
| Enabled | PDU Header(ID·크기 명시) 추가 → 여러 PDU를 하나의 소켓에 묶음 | 오버헤드 감소 |
Serialization 위치
SOME/IP 메시지는 COM / RTE 내 Serializer/Deserializer, Proxy SWS를 통해 처리된다.
Proxy Server
SOME/IP가 차용한 중간자 패턴.
- 클라이언트의 자원 요청과 서버의 자원 제공 사이에서 중개 역할을 수행하는 서버 애플리케이션.
- RPC 호출의 위치 투명성을 실현하는 기반.
Remote Procedure Call (RPC)
SOME/IP가 구현하는 핵심 기능.
- OS·HW에 독립적으로 원격 컴퓨터의 Process(함수)를 호출.
- 필요 정보:
- 제공되는 함수 목록 (서비스 정의).
- 호출 시 필요한 파라미터 타입·순서.
- 네트워크로 요청·결과를 주고받는 통신 프로토콜이 필요 → SOME/IP가 담당.
예시:
Interface: sum(int a, int b) → int
Client → Message(Service=sum, a=5, b=4) → Server
Server → int result = 9 (Deserialize, invoke, Serialize)
Client ← Response(result=9)Error Handling
Application Error
- Error Message (Message Type 0x81) — 일반 Response 대신 사용.
- Response message는
Return Code필드만 있지만, Error Message는 Exception String 등 별도 필드 전송 가능. - 그 외 메시지의 Return Code는 0x00으로 전송.
Communication Reliability
전송 계층 선택에 따라 다른 신뢰성 의미가 존재.
| 의미 | 설명 | 전송 |
|---|---|---|
| Maybe | 메시지가 상대에게 도달할 수도 있음 | UDP |
| At least once | 적어도 한 번은 도달 | — |
| Exactly once | 정확히 한 번 도달 | TCP |
SOME/IP-SD (Service Discovery)
SOME/IP 위에서 서비스 인스턴스를 찾고, 실행 중인지 감지하고, Publish/Subscribe 기능을 제공하는 프로토콜.
차량 내 서비스의 위치는 일반적으로 알려져 있기 때문에, 주로 서비스 인스턴스의 상태 파악에 사용된다.
서비스 상태
ECU-internal interface 상태 정의:
- Up / Down — 서비스 인스턴스 사용 가능 / 사용 불가.
- Required / Released — SW 컴포넌트가 해당 인스턴스 요청 중 / 요청 해제.
- Event Group 상태도 동일하게 관리.
- SD는 Events를 on/off, 알림 기능, logical/virtual/physical 인터페이스의 link-up/down 통지 가능.
Message Format
SD 메시지는 SOME/IP 헤더로 시작하며 특정 값을 사용한다. SD 고유의 4가지 구조:
Service Entry Type
| 필드 | 내용 |
|---|---|
| Type | 0x00 FindService, 0x01 OfferService / StopOfferService |
| Service ID | 대상 서비스 ID |
| Instance ID | 0xFFFF = 모든 인스턴스, 값 = 특정 인스턴스 |
| Major / Minor Ver | 버전 필터 |
| TTL | Entry의 생존 시간 (초) |
Event Entry Type
| 필드 | 내용 |
|---|---|
| Type | 0x06 SubscribeEventgroup / StopSubscribeEventgroup, 0x07 SubscribeEventgroupAck / StopSubscribeEventgroupNack |
| Eventgroup ID | 대상 이벤트 그룹 ID |
| Counter | 동일 Eventgroup entry 구분 (미사용 시 0) |
IPv4 Endpoint Option
- SOME/IP 통신용 Endpoint 정보 (IP · Port).
- TCP인 경우 해당 IP/Port에 연결 후 사용.
- SOME/IP-SD 전용 IPv4 SD Endpoint Option도 존재.
Configuration Option
- Zero-terminated String으로 구성 정보 전달.
주요 Entry 동작 규칙
Find Service (Type 0x00)
- Service ID = 찾을 서비스.
- Instance ID = 0xFFFF (모든 인스턴스) 또는 특정 값.
- Major Version = 0xFF (모든 버전).
- Minor Version = 0xFFFF FFFF (모든 버전).
- TTL: Entry 유효 시간.
0xFFFFFF= 재부팅까지.0x000000은 사용 금지 (= Stop entry).
Offer Service (Type 0x01)
- 제공 중인 서비스 인스턴스의 Service/Instance ID, Major/Minor Version, TTL 명시.
0xFFFFFFTTL = 재부팅까지 유효.0x000000금지.
Subscribe Eventgroup (Type 0x06)
- Service/Instance/Major Version으로 대상 특정.
- TTL = 구독 기간(s),
0xFFFFFFF= 재부팅까지 구독,0x0= 구독 중지. - Counter: 동일 Eventgroup을 동시에 다중 구독 시 구분용.
Subscribe Eventgroup Ack / Nack (Type 0x07)
- Ack: Subscribe와 동일한 Service/Instance/Major/Eventgroup/TTL/Counter.
- Nack: 동일 필드 + TTL = 0x000000.
State Machine 및 Phase 동작
Server / Client 각각 상태 기계가 정의되어 있으며, 주요 Phase:
- Initial Wait Phase —
[INITIAL_DELAY_MIN, INITIAL_DELAY_MAX]범위 랜덤 지연 후 Find Service / Offer Service 전송. - Repetition Phase —
REPETITIONS_BASE_DELAY × 2^n간격으로 최대REPETITIONS_MAX번 반복 전송 (예: 100 ms, 200 ms, 400 ms). - Main Phase
- Server:
CYCLIC_OFFER_DELAY주기로 Offer Service 전송. - Client: Offer를 수신하는 동안 Subscribe Eventgroup 전송.
- Server: