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, … — 추가 서버 인스턴스

TCP는 Segment 경계가 없어 메시지 시작을 구분하기 어렵다. 따라서 SOME/IP는 Magic Cookie라는 고정 패턴 메시지를 삽입해 Segment 시작을 표시한다.

필드
Service ID0xFFFF
Method ID0x0000 (C→S) / 0x8000 (S→C)
Length0x0000 0008
Client ID0xDEAD
Session ID0xBEEF
Protocol Version0x01
Interface Version0x01
Message Type0x01 (C→S) / 0x02 (S→C)
Return Code0x00

Endianness

  • RPC 헤더는 네트워크 바이트 순서(Big-endian)로 인코딩 (RFC 791).
  • Payload 내부 파라미터는 Interface 정의(FIBEX/ARXML)를 따르며, 미지정 시 Big-endian.
  • Length 및 Type 필드는 항상 Big-endian이어야 함.

Header Format

SOME/IP Header는 모든 구현에서 동일해야 한다 (상호운용성).

필드크기설명
Message ID32 bitService ID (16b) + Method/Event ID (15b) + Reserved 1
Length32 bitRequest ID부터 메시지 끝까지 Byte 길이
Request ID32 bitClient ID (16b) + Session ID (16b)
Protocol Version8 bit현재 0x01
Interface Version8 bitService Interface Major Version
Message Type8 bit메시지 종류 (아래 표 참조)
Return Code8 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

이름설명
0x00REQUEST응답(void 포함)을 기대하는 요청
0x01REQUEST_NO_RETURNFire & Forget 요청
0x02NOTIFICATION알림/이벤트 콜백 요청, 응답 기대 없음
0x40REQUEST_ACKREQUEST에 대한 ACK (optional)
0x41REQUEST_NO_RETURN_ACKREQUEST_NO_RETURN에 대한 ACK (informational)
0x42NOTIFICATION_ACKNOTIFICATION에 대한 ACK (informational)
0x80RESPONSE응답 메시지
0x81ERROR에러를 포함한 응답
0xC0RESPONSE_ACKRESPONSE에 대한 ACK (informational)
0xC1ERROR_ACKERROR에 대한 ACK (informational)

Return Code

요청 성공 여부를 표시. 모든 메시지가 필드를 포함하되, RESPONSE/ERROR가 아닐 때는 0x00(E_OK)으로 설정.

코드이름설명
0x00E_OK에러 없음
0x01E_NOT_OK명시되지 않은 에러
0x02E_UNKNOWN_SERVICEService ID를 알 수 없음
0x03E_UNKNOWN_METHODMethod ID를 알 수 없음 (Service ID는 유효)
0x04E_NOT_READY애플리케이션 미실행
0x05E_NOT_REACHABLE서비스 실행 시스템 도달 불가 (내부 전용)
0x06E_TIMEOUT타임아웃 (내부 전용)
0x07E_WRONG_PROTOCOL_VERSIONSOME/IP 프로토콜 버전 미지원
0x08E_WRONG_INTERFACE_VERSIONInterface 버전 불일치
0x09E_MALFORMED_MESSAGEDeserialization 실패
0x0aE_WRONG_MESSAGE_TYPE예상치 못한 Message Type
0x0b-0x1fRESERVEDSOME/IP 일반 에러용 예약
0x20-0x3fRESERVED서비스·메서드별 에러용 예약

Payload

  • UDP 사용 시 0 ~ 1400 Byte.
  • TCP 사용 시 Segmentation으로 더 큰 메시지 가능.

Serialization

RPC 호출 시 매개변수를 직렬(serial)하게 전송하는 절차.

  • Interface Specification에 정의된 파라미터 리스트 기준으로 수행.
  • 사양에 없는 파라미터는 Deserialization 결과에서 무시.
  • 모든 파라미터의 정확한 위치와 메모리 정렬을 사양이 정의.

Basic Datatype

Type설명Size비고
booleanTRUE/FALSE8 bitFALSE=0, TRUE=1
uint8unsigned integer8 bit
uint16unsigned integer16 bit
uint32unsigned integer32 bit
sint8signed integer8 bit
sint16signed integer16 bit
sint32signed integer32 bit
float32floating point32 bitIEEE 754 binary32 (Single Precision)
float64floating point64 bitIEEE 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 통신 스택과 직접 연동된다.

SOME/IP AUTOSAR 스택: Application/RTE → COM/PduR → SoAd → TCP/UDP/IP/Ethernet

Socket Adapter (SoAd)

  • TCP/IP 소켓과 AUTOSAR PDU를 연결.
  • SoAd 상위 계층은 통신과 무관하게 PDU 기반 처리.
  • PDU Router가 PDU를 SoAd로 전달하면 설정에 따라 해당 소켓으로 전송.

PDU Header Mode

모드동작특성
Disabled하나의 소켓이 한 개의 PDU 전송작은 PDU 다수 전송 시 오버헤드 큼
EnabledPDU 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

필드내용
Type0x00 FindService, 0x01 OfferService / StopOfferService
Service ID대상 서비스 ID
Instance ID0xFFFF = 모든 인스턴스, 값 = 특정 인스턴스
Major / Minor Ver버전 필터
TTLEntry의 생존 시간 (초)

Event Entry Type

필드내용
Type0x06 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 명시.
  • 0xFFFFFF TTL = 재부팅까지 유효. 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 PhaseREPETITIONS_BASE_DELAY × 2^n 간격으로 최대 REPETITIONS_MAX번 반복 전송 (예: 100 ms, 200 ms, 400 ms).
  • Main Phase
    • Server: CYCLIC_OFFER_DELAY 주기로 Offer Service 전송.
    • Client: Offer를 수신하는 동안 Subscribe Eventgroup 전송.

같이 보기