앤디 블로그
  • 모두
  • 아키텍처
  • 기술
  • 자바
  • 스프링
  • 인프라
  • 카프카
  • 데이터베이스
  • 컨퍼런스
  • 개발 문화
책
짧은 글
  • 모두
  • ISOBUS
이력서
  • 모두
  • 아키텍처
  • 기술
  • 자바
  • 스프링
  • 인프라
  • 카프카
  • 데이터베이스
  • 컨퍼런스
  • 개발 문화
책
짧은 글
  • 모두
  • ISOBUS
이력서
  • 통신과 CAN 기초

    • 소개
    • CH1. 통신의 기초
    • CH2. CAN 통신 입문
    • CH3. CAN 물리 계층
    • CH4. CAN 데이터 프레임
    • CH5. CAN 중재와 우선순위
    • CH6. CAN 에러 처리
    • CH7. CAN FD
  • SAE J1939

    • CH8. J1939 입문
    • CH9. J1939 메시지 구조
    • CH10. J1939 주소 체계
    • CH11. J1939 Transport Protocol
      • 1. 왜 Transport Protocol이 필요한가
      • 2. BAM (Broadcast Announce Message)
        • BAM 흐름
        • TP.CM_BAM 메시지 구조 (8바이트)
        • 타이밍 규칙
      • 3. CMDT (Connection Mode Data Transfer)
        • CMDT 흐름
        • CMDT 제어 메시지 Control Byte 값
        • BAM vs CMDT 비교
      • 4. TP.CM과 TP.DT
        • TP.CM (PGN 60416, 0xEC00) — Connection Management
        • TP.DT (PGN 60160, 0xEB00) — Data Transfer
      • 5. ETP (Extended Transport Protocol)
        • ETP vs TP 비교
        • ETP CMDT 흐름
        • ISOBUS VT 오브젝트 풀 전송
      • 6. 시퀀스 다이어그램으로 보는 TP/ETP 흐름
        • BAM 전체 흐름과 타임아웃
        • CMDT 전체 흐름과 Abort 처리
        • 타임아웃 규칙 요약
      • 다음 챕터
  • ISOBUS (ISO 11783)

    • CH12. ISOBUS 개요
    • CH13. 네트워크 아키텍처
    • CH14. 네트워크 관리
  • Virtual Terminal (VT)

    • CH15. VT 기초
    • CH16. VT 오브젝트 풀
    • CH17. VT 명령어
  • Task Controller (TC)

    • CH18. TC 기초
    • CH19. TC 프로세스 데이터
    • CH20. TC DDOP
  • 심화 및 실습

    • CH21. 기타 기능
    • CH22. 종합 실습
  • 부록

    • 용어 사전
    • PGN/SPN 목록
    • DDI 목록
    • 트러블슈팅
    • 참고 자료

J1939 Transport Protocol

학습 목표

  • CAN 프레임의 8바이트 제한과 Transport Protocol의 필요성을 설명할 수 있다.
  • BAM 방식과 CMDT 방식의 차이점과 적용 시나리오를 이해한다.
  • TP.CM과 TP.DT 메시지의 역할과 PGN 번호를 안다.
  • ETP가 필요한 상황과 TP와의 차이를 설명할 수 있다.
  • 타임아웃 규칙을 이해하고 Abort 처리 흐름을 설명할 수 있다.

1. 왜 Transport Protocol이 필요한가

CAN 프레임의 데이터 필드는 최대 8바이트이다. 단순한 센서 값이나 제어 신호는 8바이트 안에 담을 수 있지만, 다음과 같은 데이터는 그렇지 않다.

데이터 유형일반 크기
DM1 (진단 코드 목록)수십~수백 바이트
VT 오브젝트 풀 (화면 정의)수십 KB ~ 수 MB
소프트웨어 업데이트 펌웨어수 KB ~ 수 MB
제품 식별 정보(Product ID)수십 바이트

이런 데이터는 여러 CAN 프레임으로 분할(segmentation) 하여 순서대로 전송해야 한다. 수신 측은 조각들을 모아 재조립(reassembly) 한다. 이 역할을 담당하는 것이 J1939 Transport Protocol(TP)이다.

graph TD
    A["큰 데이터 (예: 200 byte)"] --> B["TP 분할"]
    B --> F1["CAN Frame #1<br>Seq=1, 7 byte"]
    B --> F2["CAN Frame #2<br>Seq=2, 7 byte"]
    B --> F3["CAN Frame #3<br>Seq=3, 7 byte"]
    B --> FN["CAN Frame #N<br>Seq=N, 나머지"]
    F1 --> R["수신 측 재조립"]
    F2 --> R
    F3 --> R
    FN --> R
    R --> D["원본 데이터 복원"]

TP는 두 가지 모드를 제공한다.

  • BAM (Broadcast Announce Message): 1:N 브로드캐스트 전송
  • CMDT (Connection Mode Data Transfer): 1:1 연결 기반 전송 (흐름 제어 포함)

2. BAM (Broadcast Announce Message)

BAM은 특정 수신자를 지정하지 않고 버스 전체에 브로드캐스트하는 방식이다. 흐름 제어가 없으므로 수신자는 확인 응답(ACK)을 보내지 않다. 구현이 단순하지만 재전송이 불가능한다.

BAM 흐름

sequenceDiagram
    participant TX as 송신 ECU
    participant BUS as CAN Bus (Broadcast)

    TX->>BUS: TP.CM_BAM (PGN 60416)<br>총 크기=200byte, 패킷수=29, PGN=정보PGN

    Note over TX,BUS: 50ms 이상 대기

    TX->>BUS: TP.DT Packet #1 (Seq=1, 7byte)
    TX->>BUS: TP.DT Packet #2 (Seq=2, 7byte)
    TX->>BUS: TP.DT Packet #3 (Seq=3, 7byte)
    Note over TX,BUS: ...
    TX->>BUS: TP.DT Packet #N (Seq=N, 나머지)

    Note over BUS: 모든 수신 장치가 개별적으로 재조립

TP.CM_BAM 메시지 구조 (8바이트)

Byte 1 : Control Byte = 0x20 (BAM 식별자)
Byte 2~3: 총 데이터 크기 (Little-Endian, 최대 1785 byte)
Byte 4 : 총 패킷 수 (1~255)
Byte 5 : 0xFF (예약)
Byte 6~8: 전송할 PGN (24bit, Little-Endian)

타이밍 규칙

항목값
BAM 후 첫 TP.DT까지 대기50ms ~ 200ms
TP.DT 패킷 간 간격50ms ~ 200ms
수신 측 타임아웃750ms (패킷 미수신 시 재조립 포기)

3. CMDT (Connection Mode Data Transfer)

CMDT는 특정 수신자와 1:1 연결을 맺고 흐름 제어를 포함한 데이터 전송을 수행한다. 수신자가 처리 가능한 패킷 수를 제어(CTS)할 수 있어 버퍼 오버플로를 방지한다.

CMDT 흐름

sequenceDiagram
    participant TX as 송신 ECU (SA=0x23)
    participant RX as 수신 ECU (SA=0x82)

    TX->>RX: RTS (Request To Send)<br>총 크기=200byte, 패킷수=29, PGN=정보PGN

    RX->>TX: CTS (Clear To Send)<br>허용 패킷수=5, 시작 시퀀스=1

    TX->>RX: TP.DT Packet #1 (Seq=1)
    TX->>RX: TP.DT Packet #2 (Seq=2)
    TX->>RX: TP.DT Packet #3 (Seq=3)
    TX->>RX: TP.DT Packet #4 (Seq=4)
    TX->>RX: TP.DT Packet #5 (Seq=5)

    RX->>TX: CTS (Clear To Send)<br>허용 패킷수=5, 시작 시퀀스=6

    TX->>RX: TP.DT Packet #6 (Seq=6)
    Note over TX,RX: ... 계속 ...
    TX->>RX: TP.DT Packet #29 (Seq=29)

    RX->>TX: EndOfMsgACK (전송 완료 확인)

CMDT 제어 메시지 Control Byte 값

메시지Control Byte설명
RTS0x10전송 요청 (총 크기, 패킷 수, PGN 포함)
CTS0x11수신 준비 (허용 패킷 수, 시작 시퀀스 번호)
EndOfMsgACK0x13전체 전송 완료 확인
Abort0xFF연결 중단 (오류 코드 포함)

BAM vs CMDT 비교

항목BAMCMDT
수신 대상브로드캐스트 (전체)특정 장치 (1:1)
흐름 제어없음있음 (CTS)
완료 확인없음EndOfMsgACK
재전송불가가능 (Abort 후 재시도)
최대 크기1785 byte1785 byte

4. TP.CM과 TP.DT

Transport Protocol은 두 가지 PGN으로 동작한다.

TP.CM (PGN 60416, 0xEC00) — Connection Management

연결 관리를 담당한다. BAM 공지, RTS/CTS 흐름 제어, EndOfMsg, Abort 메시지가 모두 이 PGN을 사용하며, Control Byte(Byte 1)로 메시지 종류를 구분한다.

TP.CM 메시지 (8 byte):
┌────────────────────────────────────────────────────┐
│ Byte 1: Control Byte (0x20=BAM, 0x10=RTS, 0x11=CTS,│
│                        0x13=EndOfMsg, 0xFF=Abort)   │
│ Byte 2~8: 메시지 종류에 따라 해석 방식 다름         │
└────────────────────────────────────────────────────┘

TP.DT (PGN 60160, 0xEB00) — Data Transfer

실제 데이터를 7바이트씩 분할하여 전송한다. Byte 1은 시퀀스 번호(1~255), Byte 2~8이 페이로드이다. 마지막 패킷의 남는 바이트는 0xFF로 채운다.

TP.DT 메시지 (8 byte):
┌──────────────────────────────────────────┐
│ Byte 1: Sequence Number (1 ~ 255)        │
│ Byte 2: 페이로드 바이트 1                │
│ Byte 3: 페이로드 바이트 2                │
│ ...                                      │
│ Byte 8: 페이로드 바이트 7 (또는 0xFF)   │
└──────────────────────────────────────────┘

예시 — 16바이트 데이터 전송:

원본 데이터: [A1 A2 A3 A4 A5 A6 A7 | B1 B2 B3 B4 B5 B6 B7 | C1 C2]

TP.DT Packet #1: [01] A1 A2 A3 A4 A5 A6 A7
TP.DT Packet #2: [02] B1 B2 B3 B4 B5 B6 B7
TP.DT Packet #3: [03] C1 C2 FF FF FF FF FF  ← 남은 자리 0xFF 패딩

5. ETP (Extended Transport Protocol)

TP는 최대 1785 바이트(255 패킷 × 7 바이트)까지 전송할 수 있다. ISOBUS VT 오브젝트 풀처럼 더 큰 데이터를 전송하려면 ETP(Extended Transport Protocol)를 사용한다.

ETP vs TP 비교

항목TPETP
TP.CM PGN60416 (0xEC00)51712 (0xC900)
TP.DT PGN60160 (0xEB00)51456 (0xC800)
최대 데이터 크기1785 byte약 117 MB (2^24 - 1 byte)
패킷당 데이터7 byte7 byte
연결 방식BAM 또는 CMDTCMDT 전용

ETP CMDT 흐름

sequenceDiagram
    participant TX as 송신 ECU
    participant RX as 수신 ECU

    TX->>RX: ETP.CM_RTS (PGN 51712)<br>총 크기=50000byte, PGN=오브젝트풀PGN

    RX->>TX: ETP.CM_CTS (PGN 51712)<br>허용 패킷수=255, 시작 패킷=1

    loop 255 패킷씩 전송
        TX->>RX: ETP.DT Packet #1 (PGN 51456)
        TX->>RX: ETP.DT Packet #2 (PGN 51456)
        Note over TX,RX: ... (255 패킷) ...
        TX->>RX: ETP.DT Packet #255 (PGN 51456)
        RX->>TX: ETP.CM_CTS<br>허용 패킷수=255, 시작 패킷=256
    end

    RX->>TX: ETP.CM_EndOfMsgACK (PGN 51712)

ETP는 CMDT 전용이다. BAM 방식의 ETP는 존재하지 않다. 이는 대용량 데이터 전송 시 흐름 제어 없이는 수신 버퍼 오버플로가 발생할 수 있기 때문이다.

ISOBUS VT 오브젝트 풀 전송

VT(Virtual Terminal)에 화면을 표시하려면 오브젝트 풀을 전송해야 한다. 오브젝트 풀은 수십 KB를 초과하는 경우가 많으므로 ETP를 통해 전송된다.

작업기 ECU → VT:
  ETP.CM_RTS (오브젝트 풀 PGN, 총 크기)
  → ETP.CM_CTS
  → ETP.DT × N
  → ETP.CM_EndOfMsgACK
  → Load Version / Activate Object Pool 명령

6. 시퀀스 다이어그램으로 보는 TP/ETP 흐름

BAM 전체 흐름과 타임아웃

sequenceDiagram
    participant TX as 송신 ECU
    participant RX as 수신 ECU

    TX->>RX: TP.CM_BAM<br>(총 크기, 패킷수, PGN)
    Note over TX: 50ms ~ 200ms 대기

    TX->>RX: TP.DT #1
    Note over TX: 50ms ~ 200ms 대기
    TX->>RX: TP.DT #2
    Note over TX: 50ms ~ 200ms 대기
    TX->>RX: TP.DT #N (완료)

    Note over RX: 750ms 이내 다음 패킷 미수신<br>→ 재조립 포기 (타임아웃)

CMDT 전체 흐름과 Abort 처리

sequenceDiagram
    participant TX as 송신 ECU
    participant RX as 수신 ECU

    TX->>RX: RTS (총 크기, 패킷수, PGN)

    alt 정상 흐름
        RX->>TX: CTS (허용 패킷수=N, 시작 시퀀스=1)
        loop N 패킷씩
            TX->>RX: TP.DT #1 ~ #N
            RX->>TX: CTS (다음 배치)
        end
        RX->>TX: EndOfMsgACK

    else 수신 측 오류 (버퍼 부족 등)
        RX->>TX: Abort (오류 코드)
        Note over TX,RX: 연결 종료<br>송신 측은 재시도 여부 결정

    else 타임아웃 (RX가 CTS 미전송)
        Note over TX: 1250ms 이내 CTS 미수신<br>→ TX가 Abort 전송
        TX->>RX: Abort (타임아웃)
    end

타임아웃 규칙 요약

상황타임아웃 값처리
RTS 후 CTS 대기1250ms송신 측 Abort
CTS 후 첫 TP.DT 대기1250ms수신 측 Abort
TP.DT 패킷 간 간격750ms수신 측 Abort
EndOfMsg 대기1250ms송신 측 Abort
BAM TP.DT 패킷 간750ms수신 측 재조립 포기

핵심 정리

  • CAN 프레임은 최대 8바이트이므로, 큰 데이터는 Transport Protocol로 분할 전송한다.
  • BAM: 브로드캐스트, 흐름 제어 없음. TP.CM_BAM(PGN 60416) → TP.DT(PGN 60160).
  • CMDT: 1:1 연결, CTS로 흐름 제어. RTS → CTS → TP.DT → EndOfMsgACK.
  • TP.DT는 패킷당 7바이트 페이로드, Byte 1이 시퀀스 번호(1~255), 남는 바이트는 0xFF 패딩.
  • ETP: 1785 바이트 초과 시 사용. PGN 51712(ETP.CM), 51456(ETP.DT). CMDT 전용.
  • 타임아웃 초과 시 Abort(Control Byte=0xFF)를 전송하여 연결을 종료한다.

다음 챕터

  • 다음 : ISOBUS 개요
Prev
J1939 주소 체계
Next
ISOBUS (ISO 11783) 개요