본문 바로가기

Network, Security

FEC(Forward Error Correction), BEC(Backward Error Correction)

FEC와 BEC는 TCP에서 에러제어를 할 때 사용되는 방식이다. TCP는 연결지향성, 신뢰성이 있는데 연결지향성은 TCP가 통신 시 서로 연결된 상태인지 확인 후 통신을 진행하는 것이다. 이때 3-Way-Handshaking이라는 과정을 통해 연결에 필요한 정보들을 주고 받는다. 이렇게 연결이 됐다고 하면 세션이 성립됐다고 한다. 그리고 신뢰성은 서로 통신 중 데이터가 바뀌거나 없어진 경우 즉, 연결 시 정해놓은 규칙이 깨지거나 여러 조각으로 나눠진 큰 데이터에 빠진 데이터가 있을 때 해당 세그먼트를 다시 전송하는 방식을 이용하여 누락되거나 변조되는 데이터 없이 신뢰성있게 전송이 가능하다.

 

TCP의 에러제어

네트워크 통신을 할 때 매우 다양한 이유로 에러가 발생한다. 무선 통신을 에로 들면 통신 중 무선 통신의 신호 끊김이나 감소로 인해 세션 연결이 끊겨버리거나 잡음이 생기는 등 여러 애러가 발생한다. TCP는 통신시 전송하는 세그먼트가 에러가 발생했는지 탐지하여 해당 에러를 수정한다. 에러의 종류를 크게 나누면 세그먼트가 누락되는 경우와 세그먼트가 변조, 수정 등 깨지는 경우이다. 이 두 애러를 FEC와 BEC 방식으로 처리한다.

 

FEC(Forward Error Correction)

FEC는 수신측에서 에러를 확인하고 재전송을 요청한다. 통신 중 세그먼트는 수신자에게 잘 도착했지만 해당 세그먼트가 여러 요인으로 인해 변조된 경우라면 정상적으로 데이터를 읽을 수 없을 것이다. 변조를 확인하는 여러 방법이 있는데 만약 악의적인 사용자가 통신중인 세션에 접근하여 거짓 세그먼트를 수신자에게 줬을 경우는 초기에 송수신자가 3-way-handshaking 과정을 통해 약속한 순서번호(sequence number)가 바뀌거나 순서가 맞지 않을 것이다. 이럴 경우 다른 사용자가 끼어 들었거나 순서 번호가 동기화가 되지 않았다고 판단하여 순서번호를 재설정하고 변조가 확인된 세그먼트부터 다시 재전송한다.

FEC의 에러 제어 종류 중 페리티 검사(Parity Check)가 있다. 패리티 검사는 전송한 세그먼트의 1의 개수가 짝수인지 홀수인지를 통해 오류를 판단한다. 이를 판단하기 위해서 패리티 비트가 붙게 되는데 패리티 비트를 통하여 해당 세그먼트가 원래 1의 개수가 짝수인 홀수인지를 나타낸다. 이때, 패리티를 짝수로 할 것인지 홀수로 할 것인지 정하고 만약 짝수 패리티를 사용한다면. 전송받은 세그먼트의 원래 1의 개수가 홀수일 때 패리티비트를 1로 설정하여 짝수로 맞춰준다. 이 세그먼트를 받은 수신자는 패리티비트를 확인하여 '1'로 설정되어있다면 전체 세그먼트가 홀수인지 확인하고 만약 패리티 비트를 제외한 세그먼트의 개수가 짝수라면 미리 정해놓은 짝수 페리티 규칙에 어긋나게 되어 해당 세그먼트는 변조되었다고 판단한다. 그리고 송신측에게 데이터를 다시 전송해줄 것을 요청한다.

위와 같은 패리티 검사의 경우 전체 세그먼트를 대상으로 하기 때문에 운이 안좋게 변조되어도 1의 개수가 설정한 규칙과 맞을 확률이 높다. 그래서 블록 단위로 검사하는 블록 합계 검사(Block Sum Check)가 생겼다. 블록 합계 검사는 전체 세그먼트를 블록단위로 나누어 각 블록에 페리티 검사를 실시하는 것이다. 이러한 검사 과정을 이용할 경우 기존 패리티 비트의 단점을 보완하여 더욱 정확하게 에러를 잡아낼 수 있다.

해밍코드(Hamming Code)도 FEC 방식 중 하나이다. 해밍코드는 오류 검출에서 끝나는 것이 아닌 오류를 수정까지 할 수 있다. 세그먼트의 사이사이에 패리티 비트를 채워 넣고 각각의 패리티 비트마다 검사 범위를 정하여 해당 범위에 패리티가 맞지 않으면 패리티 비트를 수정하여 오류를 수정하는 방식이다.

FEC 방식에서 가장 많이 상용되는 것은 CRC(Cyclie Redundancy Check)이다. CRC는 Checksum 비트를 전송하고 해당 비트로 수신자가 연산을 통해 오류 여부를 확인하는 것이다. 송신 측에서 CRC 값을 계산하여 수신측에 전송하면 수신측에서도 CRC 값을 계산한다. 그리고 계산한 서로의 값이 같은지 확인 후 다르면 변조가 발생한 것으로 판단하여 재전송하게 된다.

 

BEC(Backward Error Correction)

BEC는 수신측이 에러를 검출 후 송신측에서 해당 데이터 블록을 다시 전송하는 방식이다. 종류는 Stop-and-Wait, Go-Back-N, Selective Repeat ARQ, Adaptive ARQ가 있다.

Stop-and-Wait 방식은 데이터 블록 전송 후 수신자의 응답을 기다리는 형태이다. 기다리는 시간이 틈틈히 생겨서 전송효율이 떨어질 수 있다.

Go-Back-N 방식은 여러개의 데이터 블록을 송신자가 전송하고 그 중 에러가 발생한 블록이 있으면 해당 블록을 다시 전송한다. Stop-and-Wait 방식보다 전송효율이 좋다. 여러개의 데이터 블록에 대한 응답을 성공, 실패에 상관없이 다 한다.

Selective Repeat ARQ는 송신자가 데이터 블록을 지속적으로 전송하고 수신자는 그 중 오류가 있다고 판단되는 블록에 대해서만 재전송 요청을 한다. 만약 송신자가 지속적으로 전송하는 데이터 블록에서 받지 못한 블록이 있을 경우 수신자가 받은 순서번호가 틀어져서 재전송 요청을 할 수 있다.

Adaptive ARQ는 전송 효율을 극대화하기 위해 전송할 수 있는 데이터 블록의 채널을 유동적으로 조절하여 전송한다. 전송 효율은 가장 좋지만 비용이 많이 든다는 단점이 있다.

반응형