라우터의 입력 포트와 출력 포트에는 모두 큐로 구현된 버퍼가 있어서, 패킷이 버퍼에 도착했을 때 먼저 도착한 패킷이 다음 단계로 넘어가지 못했다면, 버퍼에서 대기하며 자신의 차례를 기다려야 합니다. 이때 입/출력 포트들은 모두 버퍼에 대한 관리를 해 주어야 합니다.
1. 입/출력 포트에서의 버퍼 관리
입력 포트에서는 스위치를 통해 출력 포트로 패킷을 보내주는 과정이 모든 도착하는 패킷을 바로 전달해 줄 수 있을 정도로 빠르지 않기 때문에 관리가 필요합니다.
또한, 여러 입력 포트에서 하나의 출력 포트로 패킷을 보내려 한다면, 포트들은 한 번에 하나의 패킷만 받을 수 있기 때문에, 하나의 포트를 제외한 다른 포트들은 한 포트의 전송이 완료될 때까지 대기를 해야 합니다. 이렇게 버퍼의 가장 앞에 있는 패킷이 현재 전송이 될 수 없어 다른 패킷들의 이동을 방해하는 현상을 Head-of-the-Line (HOL) Blocking이라고 합니다.
입력 포트뿐만 아니라 출력 포트에서도 버퍼의 관리는 필수적입니다. 출력 포트에서 네트워크로 패킷을 내보낼 때도 시간이 소요되기 때문에, 내보내지는 패킷의 수보다 패브릭으로부터 도착하는 패킷이 더 많을 때 적절한 관리가 필요합니다. 만일 버퍼가 가득 차게 되면, 그 뒤에 도착하는 패킷들은 손실될 수 있기 때문에 (loss), 적절한 스케쥴링을 통해 버퍼를 넘치지 않게 패킷을 내보내어 주어야 합니다.
2. 스케쥴링
스케쥴링이란 버퍼에서 어떤 패킷을 선택하여 내보내어 줄지를 결정하는 작업입니다. 여러 가지 방법이 있지만 가장 대표적으로는 먼저 들어온 패킷부터 순서대로 내보내 주는 FIFO (First In First Out), 어떤 우선순위를 바탕으로 패킷을 선택하여주는 우선순위 스케쥴링(Priority Scheduling), 그리고 여러 개의 클래스가 존재할 때 각각의 클래스에서 돌아가면서 하나의 패킷을 전송해주는 Round Robin 등이 있습니다.
그리고 WFQ (Weighted Fair Queue)라는 방법도 존재합니다. 이 방법은 밑에서 조금 더 자세하게 알아보도록 하겠습니다.
만일 버퍼가 가득 차 있을 때 다른 패킷이 도착하게 되면 어떤 패킷을 손실시킬지를 선택하는 과정도 필요합니다. 가장 대표적인 방법들을 알아보자면, 가득 차 있는 버퍼에 도착한 패킷을 바로 없애버리는 Tail Drop, 어떤 우선순위에 기반하여 버퍼에 있는 하나의 패킷을 선택하여 없애주는 Priorty, 그리고 마지막으로 무작위로 버퍼에 있는 패킷을 하나 선택하여 없애주는 Random 방법이 있습니다.
3. WFQ
WFQ는 여러 클래스가 존재할 때 각각의 클래스에 가중치를 부여하여, 스케쥴링을 해주는 방식입니다. WFQ로는 우선순위 스케쥴링의 단점인 우선순위가 낮은 패킷이 처리를 받기 힘들다는 점을 개선할 수 있습니다. 일반적으로 우선순위를 이용한 스케쥴링에서는 사이즈가 큰 패킷이 낮은 우선순위를 부여받게 되는데, 이를 가중치를 부여하는 방법으로 해결하게 됩니다.
자세하게는 WFQ에는 4096개의 클래스가 존재하고, 각 클래스마다 가중치를 부여해줍니다. 실제 패킷의 크기를 가중치로 나눈 값을 가상 패킷 크기로 사용하여, 사이즈가 큰 패킷들을 작아 보이게 만들어 우선순위를 높여주는 방식을 사용합니다.
'전공공부 > 컴퓨터망 (Computer Network)' 카테고리의 다른 글
[컴퓨터망] Network Layer (5) - Subnet (3) | 2021.02.01 |
---|---|
[컴퓨터망] Network Layer (4) - IP Datagram Format (0) | 2021.01.31 |
[컴퓨터망] Network Layer (2) - Switching Fabric (0) | 2021.01.28 |
[컴퓨터망] Network Layer (1) - Routing & Forwarding (1) | 2021.01.26 |
[컴퓨터망] Link Layer (5) - Ethernet Switch (0) | 2021.01.25 |