ARQ(Automatic Repeat Request)는 수신 측이 오류 검출 부호로 찾아낸 오류를 되돌림 통로로 송신 측에 알리고, 송신 측이 그 데이터를 다시 보내게 하는 오류 정정 방식이다.[1][2] ITU-T X.141(11/88)은 ARQ의 오류 복구에서 정보 프레임에 보내는 차례대로 모듈러 순서 번호를 붙이고, 수신 측이 FCS(Frame Check Sequence)로 오류를 찾은 프레임과 유효하지 않은 프레임을 버리도록 정한다.[3] RFC 9293은 TCP가 체크섬 검사에 실패한 세그먼트처럼 잃은 세그먼트를 재전송으로 메우도록 정한다.[4]
확인 응답
ACK(positive acknowledgement)는 정보를 바르게 받았음을 알리는 메시지이고, NAK(negative acknowledgement)는 잘못 받았음을 알리는 메시지다.[5][6]
ITU-T X.141의 오류 복구 절차에서 수신 측은 오류 없이 차례대로 받은 프레임을 송신 측에 확인 응답하고, 오류 없는 프레임의 순서 번호가 기대와 다르면 복구 절차를 시작한다. 마지막 프레임을 잃으면 수신 측은 순서가 어긋난 것을 알 수 없으므로, 확인받지 못한 프레임이 남은 채 정해진 시간이 지나면 송신 측이 복구를 시작한다. 송신 측은 보냈지만 확인받지 못한 정보 프레임을 모두 저장해 두어야 한다.[3]
Stop-and-wait
RFC 3366에 따르면 stop-and-wait ARQ의 송신 측은 프레임 하나를 보내고 그 ACK를 기다린다. ACK가 오면 다음 프레임을 보내고, 앞의 프레임이 사라졌거나 깨졌다고 알려 오면 같은 프레임을 다시 보낸다. 구현이 간단하지만 효율이 낮아서, 링크 계층에서는 대역폭·지연 곱이 작은 링크에만 알맞다. 전송 계층에서 쓰는 예로는 TFTP(Trivial File Transfer Protocol)가 있다.[7]
RFC 1350은 TFTP의 데이터 패킷마다 확인 응답을 받아야 다음 패킷을 보낼 수 있도록 정한다. 패킷을 잃으면 그 패킷을 받을 쪽이 타임아웃 뒤 자기가 마지막으로 보낸 패킷을 다시 보낼 수 있고, 그러면 잃은 패킷을 보낸 쪽이 그 패킷을 다시 보낸다.[8]
슬라이딩 윈도
RFC 3366에 따르면 슬라이딩 윈도(sliding window) ARQ의 송신 측은 전송 윈도가 허락하는 만큼 프레임을 ACK를 기다리지 않고 잇달아 보낸다. 윈도가 작으면 타이머가 끝나거나 ACK 같은 제어 프레임이 올 때까지 새 프레임을 보내지 못한다. 프레임마다 모듈러 순서 번호를 붙여 전송 중인 프레임을 하나하나 가려내는데, 순서 번호 공간의 크기 와 윈도 크기 는 를 만족해야 하고, selective repeat에서는 를 만족해야 한다. TCP도 전송 계층의 슬라이딩 윈도 프로토콜이다. 슬라이딩 윈도를 쓰는 ARQ 기법에는 Go-back-N과 selective repeat이 있고, 각각 REJ(Reject), SREJ(Selective Reject)라고도 부른다.[7]
Go-back-N과 selective repeat
ITU-T X.141(11/88)은 오류 복구 절차로 REJ와 SREJ를 두고, 둘을 섞은 SREJ-REJ 절차를 제안한다. REJ 절차에서 수신 측은 지정한 순서 번호부터 다시 보내 달라고 요청하고, 그 프레임과 요청이 닿을 때 이미 보내고 있던 뒤의 정보 프레임이 모두 다시 보내진다. 수신 측은 잃은 프레임을 되찾을 때까지 들어오는 정보 프레임을 버리므로 수신 측의 프레임 저장 공간이 가장 적게 들지만, 오류 성능이 한계에 가까우면 왕복 지연에 따라 처리율이 떨어질 수 있다. SREJ 절차에서는 순서 번호로 지정한 정보 프레임 하나만 다시 보내고, 이미 보내고 있던 뒤의 프레임은 바르게 받았으면 다시 보내지 않는다. 그 대신 수신 측에 큰 프레임 저장 공간과 순서를 다시 맞추는 처리가 필요하다.[3]
ITU-T V.42(03/2002)는 모뎀용 링크 절차인 LAPM(Link Access Procedure for Modems)에 두 방식을 모두 정한다. 이 규격은 REJ 프레임을 받은 쪽이 REJ가 가리키는 정보 프레임부터 차례로 모두 다시 보내고, SREJ 프레임을 받은 쪽이 SREJ가 가리키는 정보 프레임만 다시 보내도록 정한다. V.42의 수신 측은 순서 번호가 맞지 않는 정보 프레임을 받으면, 선택적 재전송을 합의하지 않았을 때는 그 정보 필드를 버리고, 합의했을 때는 기대한 프레임이 올 때까지 쥐고 있다가 넘긴다.[9]
CCSDS 232.1-B-2는 우주 링크의 COP-1(Communications Operation Procedure-1)이 Go-back-N형 ARQ를 쓰도록 정한다. COP-1의 수신 측은 순서가 처음 어긋난 뒤로 기대한 순서 번호가 아닌 순서 제어 프레임을 모두 거부하고, 송신 측은 재전송 요청이나 타임아웃이 오면 확인받지 못한 순서 제어 프레임을 모두 다시 보낸다.[10]
CAN의 재전송
CAN 컨트롤러는 기본 설정에서 중재에서 졌거나 오류로 깨진 프레임을 자동으로 다시 보내고, 이 동작을 설정으로 끌 수 있다.[11][12] 오류를 알리고 다시 보내는 과정은 CAN 오류 프레임에서 다룬다.
오류 정정 부호와의 차이
ARQ는 되돌림 통로가 있어야 한다.[1][7] 반면 오류 정정 부호는 되돌림 통로 없이 오류를 고친다.[13]
IETF의 RFC 3819와 RFC 3366에 따르면 ARQ는 FEC(Forward Error Correction)와 달리 지연 변동을 키우고[2], 한 링크를 여러 흐름이 함께 쓸 때는 손실을 겪는 흐름 때문에 다른 TCP·UDP 흐름에도 지연 변동을 준다.[7]