Skip to content

실습 목표#

  • 오류를 진단기가 감지하고 스스로 복구하게 만든다.
  • 타임아웃은 재전송, 지연 알림은 대기 연장, 세션 오류는 전환으로 푼다.
  • 각 복구가 캡처와 로그에 어떻게 남는지 확인한다.


실습 1. 정상 동작 기준 잡기#


오류 없는 상태에서 완성본 진단기를 실행하여 기준 동작을 확인한다.

라즈베리파이·터미널
make
./ecu_faulty normal
노트북·WSL
make
./tester_robust read
테스터 출력
[read attempt 1/3]
  -> success! VIN = TESTVIN0123456789

Wireshark 분석#

alt text

① 테스터가 DID 0xF190의 VIN 읽기를 요청하고, ECU가 정상 응답을 반환한다.

② UDS 응답 상세에서 서비스 0x22, DID 0xF190, VIN TESTVIN0123456789를 확인할 수 있다.

③ 원시 데이터의 62 F1 90은 VIN 읽기의 정상 응답을 의미하며, 이후 바이트는 VIN 문자열이다.


실습 2. 타임아웃 복구#


ECU가 응답하지 않으면 2초 기다린 후, 타임아웃으로 판단하고 다시 요청한다. 이는 최대 세 번까지 시도한다.

라즈베리파이·터미널
./ecu_faulty timeout
노트북·WSL
./tester_robust read
테스터 출력
[read attempt 1/3]  -> timeout; retransmitting
[read attempt 2/3]  -> timeout; retransmitting
[read attempt 3/3]  -> timeout; retransmitting
  -> gave up after 3 attempts


Wireshark 분석#

alt text

① 테스터가 새로운 TCP 연결을 생성하고 DID 0xF190의 VIN 읽기를 처음 요청한다.

② ECU의 UDS 응답이 없으면 약 2초 후 새로운 연결을 생성하여 같은 요청을 다시 보낸다.

③ 두 번째 요청에도 응답이 없으므로 약 2초 후 세 번째 요청을 보낸다.

④ 세 요청은 모두 서비스 0x22, DID 0xF190을 사용한 동일한 VIN 읽기 요청이다.

각 시도에서 ECU의 UDS 응답이나 0x78 responsePending이 나타나지 않는다. 따라서 테스터는 응답 타임아웃으로 판단하며, 최대 3번까지 요청한 뒤 복구를 중단한다.


분석 : 재전송은 안전한 요청에만#

이번 실습의 자동 재전송은 재시도 개념을 설명하기 위한 단순화된 구현이다. 실제로는 동일한 요청을 반복해도 결과가 달라지지 않는 경우에만 재전송을 적용해야 한다.

요청 다시 보내면 재시도 가능
0x22 읽기 값을 한 번 더 읽을 뿐 결과가 같음 안전함
0x2E 쓰기 같은 쓰기가 두 번 실행될 수 있음 위험함
0x11 리셋 ECU가 두 번 재시작할 수 있음 위험함


실습 3. 응답 지연 복구#


0x78은 실패가 아니라 기다리라는 뜻이다. 대기 시간을 P2에서 P2*로 늘리고 계속 기다리면 최종 응답을 받는다.

라즈베리파이·터미널
./ecu_faulty pending
노트북·WSL
./tester_robust read
테스터 출력
[read attempt 1/3]
    (0x78 responsePending -> extend to P2*=5s and keep waiting)
  -> success! VIN = TESTVIN0123456789


Wireshark 분석#

alt text

① 테스터가 서비스 0x22, DID 0xF190으로 VIN 읽기를 요청한다.

② ECU는 처리가 끝나지 않아 0x78 responsePending을 반환한다. 이는 오류가 아니라 계속 기다리라는 의미이다.

③ 테스터가 요청을 다시 보내지 않고 기다리면 약 1.5초 후 VIN 최종 응답이 도착한다.

④ UDS 상세 정보에서 요청 SID 0x22와 NRC 0x78을 확인할 수 있다.

⑤ 원시 데이터의 7F 22 780x22 요청에 대한 responsePending 응답을 의미한다.

0x78을 받은 테스터는 대기 시간을 P2에서 P2*로 연장한다. 이때 새로운 TCP 연결을 만들거나 요청을 재전송하지 않고, 같은 연결에서 최종 응답을 기다리는 것이 중요하다.

결과: P2P2*#

P2는 최초 응답 대기 시간이고, P2*0x78 수신 후 연장되는 대기 시간이다. 이 경우 요청을 재전송하지 않고 연결을 유지하며 응답을 계속 기다린다.


실습 4. 세션 불일치 복구#


거부 코드(NRC)가 0x7F이면 현재 세션에서는 허용되지 않는 요청임을 의미한다. 이 경우 확장 세션으로 전환한 후 동일한 요청을 재전송한다.

라즈베리파이·터미널
./ecu_faulty normal
노트북·WSL
./tester_robust write
테스터 출력
[write attempt in current session]
  -> rejected (wrong session). Switching to extended session...
[write retry in extended session]
  -> still negative NRC=0x33 (e.g. VIN protected 0x33)


Wireshark 분석#

alt text

① 기본 세션에서 서비스 0x2E로 VIN 쓰기를 요청하면 NRC 0x7F가 반환된다. 현재 세션에서는 해당 서비스를 사용할 수 없다는 의미이다.

② 테스터는 같은 TCP 연결에서 서비스 0x10으로 확장 진단 세션 전환을 요청한다. ECU의 정상 응답을 통해 세션 전환 성공을 확인할 수 있다.

③ 확장 세션에서 같은 쓰기 요청을 다시 보내면 NRC 0x33 Security Access Denied가 반환된다. 거부 코드가 0x7F에서 0x33으로 바뀐 것은 세션 관문을 통과한 뒤 보안 관문에서 거부되었다는 증거이다.

④ UDS 상세 정보에서 요청 서비스 0x2E와 NRC 0x33을 확인할 수 있다.

⑤ 원시 데이터의 7F 2E 330x2E 쓰기 요청이 보안 접근 문제로 거부되었다는 의미이다.

세션 전환과 쓰기 재시도는 새로운 연결을 만들지 않고 하나의 TCP 연결 안에서 연속으로 진행된다. 실제 쓰기를 완료하려면 별도의 Security Access 절차가 필요하다.