CAN은 여러 ECU가 하나의 매체를 공유하는 멀티마스터 버스이므로, 둘 이상의 노드가 동시에 송신을 시작하면 버스 접근이 충돌한다. CAN은 이 충돌을 재전송이 필요한 파괴적 충돌로 다루는 대신, 프레임의 식별자(identifier) 필드를 비트 단위로 비교해 가장 우선순위가 높은 노드만 남기는 중재(arbitration)로 해소한다[1].
중재가 시작되는 조건
노드는 버스가 유휴(idle) 상태일 때만 새 프레임의 송신을 시작할 수 있다. 프레임 끝의 ACK 구분자(1비트)·EOF(7비트)·Intermission(3비트)이 모두 recessive로 전송되므로, 마지막 dominant 비트 이후 연속된 recessive 비트 11개가 지나야 버스가 유휴로 판정되고 새 전송이 허용된다[1].
두 노드의 송신 요청이 서로 다른 시점에 도착한 경우, 먼저 시작한 노드의 식별자 비트가 이미 버스에 실리고 있다면 나중에 도착한 요청은 우선순위와 무관하게 버스가 다시 유휴 상태가 될 때까지 기다려야 한다. 즉 식별자 기반 중재는 둘 이상의 노드가 같은 유휴 구간에서 동시에 송신을 시작했을 때만 일어난다[1].
비트 단위 중재 메커니즘
동시에 송신을 시작한 노드들은 식별자 비트를 한 개씩 내보내면서, 동시에 버스에 실제로 나타난 값을 읽어 자신이 보낸 값과 비교한다[2]. CAN 버스는 두 논리 레벨을 와이어드-AND로 결합한다 — dominant(논리 0)와 recessive(논리 1)이며, 어느 한 노드라도 dominant를 실으면 recessive를 실은 다른 노드를 덮어쓴다[1].
어떤 노드가 recessive 비트를 보냈는데 버스에서 dominant가 관측되면, 그 노드는 중재에서 진 것이므로 그 즉시(추가 비트를 내보내지 않고) 송신을 멈추고 수신 모드로 전환한다[1]. 진 노드는 버스가 다시 유휴 상태가 되면 같은 메시지의 송신을 재시도한다[2].
이 과정에서 이긴 노드는 다른 노드가 있었다는 사실조차 알아채지 못하며, 지연이나 데이터 손실 없이 전송을 계속한다. 그래서 이 방식을 무손실(lossless)·비파괴적(non-destructive) 중재라 부른다[1].
아래는 세 노드가 동시에 송신을 시작했을 때의 예시다. 식별자를 한 비트씩 비교하다가 recessive를 보냈지만 버스에서 dominant가 관측되는 시점에 해당 노드가 탈락한다.
식별자와 우선순위
식별자의 수치 값이 낮을수록 프레임의 우선순위가 높다. 표준(11비트) 식별자 형식에서는 0(0x000)이 가장 높은 우선순위를, 2047(0x7FF)이 가장 낮은 우선순위를 갖는다. 식별자 상위 비트가 0(dominant)일수록 버스를 더 오래 dominant로 점유하므로, 식별자가 전부 0인 프레임은 항상 다른 모든 프레임에 우선한다[2].
CAN은 이 중재 메커니즘 덕분에 별도의 중앙 조정자 없이도 결정론적으로 우선순위 높은 메시지를 지연 없이 전송할 수 있다.