일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 유니티
- UI
- listen server
- map design
- CTF
- 게임개발
- Replication
- Unreal Engine
- 게임 개발
- 언리얼 엔진
- gameplay effect
- gas
- unity
- stride
- animation
- Multiplay
- os
- photon fusion2
- ability task
- local prediction
- rpc
- 보안
- network object pooling
- attribute
- nanite
- 언리얼엔진
- MAC
- gameplay ability system
- gameplay tag
- Aegis
- Today
- Total
Replicated
CAN (Controller Area Network) 본문
보쉬가 만든 효율적인 차량 통신 기술
버스 기반으로 두 개의 선 사용
장점
- 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 | |||||||
ECU2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | |
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를 각각 연결
'스마트카 소프트웨어 보안' 카테고리의 다른 글
CAN 버스 리버스 엔지니어링 (0) | 2025.04.13 |
---|---|
자율주행자동차 (0) | 2025.04.13 |
위협 모델링 - DFD, STRIDE, DREAD (0) | 2025.04.13 |
소프트웨어 개발 보안 방법론, MS-SDL (1) | 2025.04.12 |
사이버 킬 체인(Cyber-Kill Chain) (0) | 2025.04.12 |