정의
CAN 메시지 주소 지정은 프레임에 출발지·목적지 주소를 싣는 대신 내용을 가리키는 식별자(identifier)로 프레임을 구분하는 방식이다. 노드는 국번 같은 시스템 구성 정보를 쓰지 않으며, 모든 노드가 모든 프레임을 받아 그 데이터를 처리할지 스스로 판단한다.[1]
주소 지정을 어느 쪽으로 잡느냐는 버스 프로토콜의 성격을 크게 가른다. 노드에 주소를 붙이면 프레임은 “누구에게” 가는지를 실어야 하고, 내용에 이름을 붙이면 프레임은 “무엇인지”만 실으면 된다. CAN은 뒤쪽을 골랐고, 그 선택이 수신 측의 구조와 네트워크 설계 절차까지 결정한다. 두 모델의 일반적인 비교는 버스 네트워킹 과제에서 다룬다.
내용을 가리키는 식별자
식별자는 메시지의 목적지를 가리키지 않고 데이터의 의미를 가리킨다. 그래서 모든 노드가 그 데이터를 자기가 처리할 대상인지 판단할 수 있고, 하나의 프레임을 임의 개수의 노드가 동시에 받아 함께 동작할 수 있다.[1] 송신 노드는 자기 프레임을 누가 받는지 알 필요가 없다.
식별자는 네트워크 전체에서 유일한 것이 원칙이며, 내용을 나타내는 동시에 버스 접근 우선순위를 정한다.[2] 따라서 한 식별자를 송신하는 노드는 네트워크에 하나뿐이고, 반대로 한 노드가 여러 식별자를 송신하는 데에는 제약이 없다.[3] 식별자 수치가 우선순위로 쓰이는 방식은 CAN 중재에서 다룬다.
수용 필터
모든 프레임이 모든 노드에 도달한다는 것은, 자기와 무관한 프레임도 수신 노드에 처리 부담을 지운다는 뜻이다. 소프트웨어로만 걸러 내면 수신 인터럽트와 판별 코드가 그대로 프로세서 부하가 되므로, CAN 컨트롤러는 하드웨어 수용 필터(acceptance filter)를 갖춰 필요 없는 프레임을 응용에 닿기 전에 막는다.[3]
필터는 마스크와 코드 한 쌍으로 표현된다. 마스크가 식별자의 어느 비트를 비교할지 정하고, 코드가 그 비트들이 가져야 할 값을 정한다. 비교에서 제외된 비트는 임의 값이 허용되므로, 필터 하나로 식별자 한 무리를 한꺼번에 통과시킬 수 있다.[4] 컨트롤러의 수신 처리부는 들어온 프레임의 식별자를 필터 항목과 대조해 저장할지 버릴지를 정하고, 저장하기로 한 프레임만 수신 버퍼나 FIFO에 넣는다.[5]
필터가 관여하는 지점
통신 행렬
어느 노드가 어떤 메시지를 보내고 어떤 메시지를 받는지는 네트워크 설계 단계에서 정해진다. 개발 도구는 이 관계를 통신 행렬(communication matrix)로 나타내는데, 신호를 행에 노드를 열에 놓고 각 칸에 그 신호가 실리는 메시지와 송신·수신 구분을 적는 표다.[6]
이 표가 채워지면 각 노드에 대해 받아야 할 메시지 집합과 받을 필요가 없는 메시지 집합이 확정된다. 필터 구성은 여기서 도출되며, 필터 개수가 제한되어 있어 원하는 메시지를 모두 통과시키면서 나머지를 모두 막는 구성이 늘 존재하지는 않는다.[3]
노드 추가와 교체
노드가 시스템 구성 정보를 쓰지 않는다는 점은 확장성으로 돌아온다. 노드를 새로 붙여도 기존 노드의 하드웨어나 소프트웨어, 응용 계층을 고칠 필요가 없다.[1] 새 노드가 기존 메시지를 받는 일은 자기 필터를 여는 것으로 끝나고, 기존 노드는 그 사실을 알지도 못한다.
다만 식별자가 우선순위를 겸하기 때문에 배정은 자유롭지 않다. 실제 차량 네트워크에서는 기존 소프트웨어와 미리 정해진 식별자를 쓰는 노드 때문에 식별자가 고정되어 있는 경우가 많고, 그러면 각 노드가 주어진 조건에서 최선의 필터 구성을 찾는 문제만 남는다.[3]