Replicated

CAN (Controller Area Network) 본문

스마트카 소프트웨어 보안

CAN (Controller Area Network)

라구넹 2025. 4. 13. 19:20

보쉬가 만든 효율적인 차량 통신 기술

버스 기반으로 두 개의 선 사용

 

장점

- Reliability: 에러 및 잡음에 견고

- Economy: 싸다 (1:1 연결보다 당연히 버스가 구리가 덜 듦)

- Availiability: CAN 지원하는 칩이 많음

- Scalability: 쉬운 확장성

 

단점

- Broadcast : 누구나 통신 내용 확인 가능한 환경

- 접근제어 x : 누구나 통신에 참여 가능한 환경

- 기밀성 x : 누구나 패킷의 의미 분석이 가능한 환경

- 인증 x : 누구나 패킷을 위조 가능한 환경

 

과거의 폐쇄망 시절 약점이 네트워크 연결되면서 취약점이 된 것

 

 

CAN 네트워크 구성

- 여러 개의 ECU + 구리선 2줄(CAN_Hign, CAN_Low)

- ECU 내부엔 MCU(CPU Core, CAN Controller) + Can Transceiver

 

CPU Core: C 프로그램 수행 모듈

 

CAN Controller: CAN 프로토콜에 대한 기능 수행 (통신 데이터를 데이터 프레임(패킷)으로 만듦)

- Basic CAN Controller: 별도 공간 없음 -> 받은 정보를 바로 CPU Core로 전달하여 수신 여부 판단

- Full CAN Controller: 별도 공간 있어서 CPU 부하율 감소

 

CAN Transceiver: CAN Controller와 구리선을 연결 (패킷을 통신 회선에 보내고 받고)

- TX: CAN Controller의 Logical한 값 -> 구리선의 Physical한 전압 - D to A

- RX: 구리선의 Physical한 전압 -> CAN Controller의 Logical한 값 - A to D

 

 

CAN 물리 계층

High Speed CAN(500Kbps)

- ECU들이 있고, CAN_High와 CAN_Low 종단에 120옴짜리 저항이 걸쳐있음

 

Low Speed CAN(125Kbps)

- ECU들의 트랜시버 TX, RX에 저항 달려있음'

 

Single Wire CAN(33.3Kbps)

- 선 하나 써서 싸다. 하나의 구리선과 차체 전압차 이용

 

CAN 버스에서 우성, 열성 판단 방법

- high speed can 기준

- 기본적으로 CAN_High, CAN_Low 둘 다 2.5V => 1 (Recessive Bit)

- CAN_High 3.5V, CAN_Low 1.5V => 0 (Dominant)

 

 

통신 원리

https://lagooneng.tistory.com/154

 

Multiple access protocols/ Random access

노드들이 패킷을 보낼 때- 각 노드는 독점하고자 함- 노드 간 조정이 없음=> 충돌 충돌의 감지, 회복, 회피 등이 필요(pure, unslotted)ALOHA net모든 패킷(프레임)은 같은 길이로 보내짐충돌 발생 시 재

lagooneng.tistory.com

CSMA/CD + AMP

CS(Carrier Sense) : 구리선의 데이터의 유무 확인

- Free bus: 구리선에 아무 정보 없음 (전기적으로 조용, 전원이 꺼졌거나 연결 안됨)

- Idle bus: 구리 선에 CAN Frame 정보 없음 (논리적으로 버스가 비어 있음, 전기적으론 신호가 있음 - CAN_High == CAN_Low)

- Busy bus: 구리선에 정보 or CAN Frame이 존재

 

MA(Multiple Access)

- CAN 버스가 Idle 상태가 되면 ECU는 정보 전송, 이미 구리선에 존재하던 정보와 충돌 가능

 

CD(Collision Detection)

- 충돌 있어나면 감지

 

AMP(Arbitation on Message Priority)

- 캔 프레임의 Identifier 크기가 작은 ECU가 우선순위

 

두 개 이상의 ECU가 통신을 하려고 일단 센싱하고

그러다 동시에 보내면 디텍션하고

우선 순위가 높은애가 전달됨

 


 

정보 수신 및 수신 방식

브로드캐스트

송신 ECU
- CAN Controller(TX Buffer -> Send Module) -> CAN Transceiver -> 구리선에 던짐

수신 ECU

- CAN Transceiver -> CAN Controller(Acceptance Filering -> Receive Module -> RX Buffer)

Acceptance Filering를 통해 받고 싶은 ECU에 대한 정보만 받을 수 있음

 


 

CAN Frame

  Data Frame  
Bus Idle SOF Arbitation Field Control Field Data Field CRC Field Ack Field EOF Bus Idle
    Identifier RTR r1 r0 DLC   CRC Sequnce CRC Del ACK
Slot
ACK
Del
   

SOF(Start Of Frame, 1bit)

- CAN 프레임 전송 시작

- SOF 이전 구리선은 bus idle 상태, 로지컬한 값이 1.. SOF 이후 0이 됨

 

Arbitation Field(12bit)

- 충돌 해소용. Identifier(11bit) + RTR(1bit)

- Identidier: 값이 낮을 수록 우선 순위 높음

- RTR: 해당 프레임이 데이터 프레임인지(0) 리모트 프레임인지(1), 이것도 0이면 우선순위 높음

 

Arbitation Field 예시

ECU1 0 0 1            
ECU2 0 0 0 1 0 0 0 0 RTR = 1
ECU3 0 0 0 1 0 0 0 0 RTR = 0

중간 비트 생략

 

EOF(7bit)

- 캔 프레임 전송 끝

- 로지컬한 값 모두 1

 

 Control Field(6bit)

- r1, r0 각각 1비트, Identifier 29비트로 늘릴 때 사용

- DLC(4bit : DLC3~0): CAN 프레임이 싣고 가는 Data의 길이를 결정(최대 8byte)

    - DLC3 = 0, DLC3 = 0, DLC3 = 0, DLC3 = 1 => 1byte

    - 근데 1000이 최대임

 

Data Field(8Byte)

- 데이터

 

CRC Field(16bit)

- 에러 발생 시 수신 ECU가 에러 검출할 수 있는 부분, 존재만 알 수 있고 어느 부분인진 모름

- CRC Sequence(15bit): Hamming Distance가 6이고, 최대 6비트 에러까지 검출 가능 (15비트 CRC 다항식에 따름)

- CRC Delimeter(1bit): ECU가 CRC 계산을 할 수 있는 시간 또는 공간 제공, 에러 발생 시 0 아니면 1

 

에러 검출 방법

https://lagooneng.tistory.com/152

 

Link layer - error detection, correction

프레임 구조Ethernet IIPreambleDst addrSrc addrTypeDataFCS IEEE 802.3PreambleSFDDst addrSrc addrLengthDSAPSSAPCtrl.DataFCS 링크 레이어는 프로토콜이 많고, 각 구조마다 가지는게 다름그래도 비슷하게 가지는 속성들은

lagooneng.tistory.com

- 송/수신 ECU에서 사전에 Divisor 공유

예시)

Divisor: 100000111

송신 ECU

- 데이터워드: 01101011

- 코드워드 계산: 0110101100000000 / 100000111 = 0110101 .. 00010110 -> CRC

-> 01101011 + 00010110

- 전송 데이터: 0110101100010110

 

수신 ECU

- 수신 데이터: 0110101100010110

- 에러 검증: 0110101100010110 / 100000111 = 0110101 .. 0

-> 에러 없음

 

검증 결과

- 나머지가 0 -> 에러 x

- 아니면 데이터 버리고 재전송 요청

 

ACK Field(2bit)

ACK Slot(1bit)

- 데이터를 받는 ECU가 에러 없으면 Logical한 값 0 전송, 송신 ECU는 확인

- 에러 시 1응답

- A ECU 0응답, B ECU 1응답 시, 우성인 0이 존재하여 A ECU 데이터 받음을 확인 가능

- 송신 ECU가 전부 받았는데도 아크 슬럿이 1이면 에러 프레임 전송

 

ACK delimeter

- 아크 슬럿이 0으로 전송 시 에러 없다고 판단, 1 전송
- 일단 그냥 얘는 항상 1임

 

 

아두이노로 CAN 패킷 송수신 가능

CAN_High와 CAN_Low를 각각 연결