Data Link Layer
상위 문서: 컴퓨터 네트워크
개요
Data-link layer[1]는 한 노드에서 물리적으로 인접한 노드로 데이터그램을 전송하는 계층이다. 이때 link layer는 각 링크에 따라 개별적으로 구현되므로, 데이터그램은 각기 다른 링크들에서 각기 다른 link layer의 프로토콜을 통해 전송된다. 예를 들어 첫 링크는 Ethernet 프로토콜을, 중간 링크들은 frame relay 프로토콜을, 마지막 링크는 802.11 프로토콜을 활용할 수 있다. 이때 각각의 링크 프로토콜들은 서로 다른 서비스를 제공한다. 예를 들어, 어떤 프로토콜은 reliable data transfer(RDT)를 지원할 수도 있고, 안 할 수도 있다.
용어 정리
노드(node)란 해당 문서와 그 하위 문서에서는 link layer을 실행하는 모든 장치를 의미한다. 노드에는 호스트, 라우터, 스위치, WiFi 액세스 포인트 등이 포함된다. 또한 링크(link): 통신 경로를 따라 인접한 노드들을 연결하는 통신 채널(channel)들을 의미한다. 따라서 데이터그램이 송신 호스트로부터 수신 호스트로 전달되기 위해서는, 그 종단 간(end-to-end) 경로를 구성하는 각 개별 링크들을 통해 이동되어야 한다. 이때 각 링크에서 송신 노드는 데이터그램을 link layer의 데이터 단위인 프레임으로 캡슐화하고 이를 링크로 전송한다.
The Services Provided by the Link Layer
Link layer의 기본적인 서비스는 하나의 통신 링크를 통해 데이터그램을 한 노드에서 인접한 다른 노드로 전송하는 것이다. 하지만 실제로 제공되는 서비스의 세부 사항은 각 link layer의 프로토콜마다 다를 수 있다. 이때, link layer가 제공할 수 있는 가능한 서비스들은 다음과 같다:
- Framing: 거의 모든 link layer의 프로토콜들은 각각의 데이터그램들을 link layer의 데이터 단위인 프레임(frame)으로 캡슐화한 후 이를 링크를 통해 전송한다.
- 프레임은 데이터 필드와 여러 헤더 필드로 구성된다. 이때, 프레임의 세부적인 구조는 해당 프레임을 전송하는 link layer 프로토콜에 의해서 결정된다.
- Link access: 네트워크에서 두 장치가 데이터를 주고 받을 때, 같은 통신 링크를 여러 장치가 공유할 수 있으며, 이 경우 충돌(collision)이 일어날 수 있고 그로 인해 통신이 실패할 수 있다.
- Reliable delivery: 어떤 링크 계층 프로토콜은 (RDT)reliable data transfer를 제공하는데, 이는 각 데이터그램을 오류 없이 링크를 통해 전송할 것을 보장한다.
- 이는 무선 링크(wireless link)와 같이 오류가 많이 일어나는 링크에서 주로 사용된다. 하지만 대부분의 유선 링크(wired link)와 같이 오류가 잘 일어나지 않는 링크에서는 해당 서비스가 불필요한 오버헤드로 간주될 수 있으므로 잘 사용되지 않는다.
- Error detection: 수신 노드의 link layer 하드웨어는 프레임 내의 비트가 원래는 1이었지만, 오류로 인해 0이라는 잘못된 비트를 수신할 수 있다. 이러한 비트 오류를 가지고 있는 데이터그램은 전송할 가치가 없으므로, 많은 link layer의 프로토콜은 비트 오류를 검출할 수 있는 메커니즘을 제공한다.
- 이는 송신 노드가 오류 검출용 비트(error-detection bits)를 프레임에 포함시키고, 수신 노드가 오류 검사를 수행하는 방식으로 이루어진다.
- Transport/Network layer도 internet checksum을 통해 제한적인 형태의 오류 검출을 제공하지만, link layer에서의 오류 검출은 더욱 정교하며, 하드웨어를 통해 구현된다.
- Error correction: Error correction은 error detection과 유사하지만, 비트 오류를 검출하는 것 뿐만 아니라, 프레임 내의 정확히 어떤 위치에서 오류가 발생했는지 식별하고, 이를 수정하기까지 한다.
- Half-duplex vs Full-duplex
- Half-duplex: 양 끝 노드가 서로에게 데이터그램을 전송할 수 있지만, 동시에는 전송할 수 없는 구조이다.
- Full-duplex: 양 끝 노드가 서로에게 동시에 데이터그램을 전송할 수 있는 구조이다.
Where is the link layer implemented?
Link layer는 라우터에서는 기본적으로, 입력 포트(input port) 내에 구현되어 있다. 하지만 이는 라우터 내에서의 구현 방식일 뿐, 호스트에서 구현된 방식과 일치하지는 않는다. Figure 1은 전형적인 호스트의 아키텍쳐를 보여준다. 대부분의 경우 link layer는 네트워크 어댑터(network adapter)[4]에 구현된다. 네트워크 어탭터에는 link-layer controller가 존재하며, 이는 특수 목적의 단일 칩으로, 프레이밍, 링크 접근, 오류 검출 등과 같은 많은 링크 계층 서비스를 구현한다. 즉, link-layer controller의 대부분의 기능은 하드웨어적으로 구현되어 있으며, 아래는 그 예시이다:
- 예를 들어, Intel의 710 어뎁터는 이더넷(Ethernet) 프로토콜을 구현
- Atheros AR5006 컨트롤러는 802.11 WiFi 프로토콜을 구현한다.
송신측에서 controller는 호스트 메모리에 저장된 데이터그램을 가져와, link layer 프레임으로 캡슐화하고, link access 프로토콜을 따르면서 프레임을 통신 링크로 전송한다. 수신 측에서 controller는 프레임을 수신하고, 그 안에서 데이터그램을 추출한다. 또한 해당 link layer의 프로토콜이 error detection 기능을 수행한다면, 송신 컨트롤러는 프레임 헤더에 오류 검출 비트를 설정하고, 수신 컨트롤러는 오류 검출을 수행한다.
또한 figure 1은 네트워크 어댑터가 호스트의 bus에 연결되어 있는 것을 보여주며, 이는 네트워크 어댑터가 다른 호스트의 구성 요소들에게 일반적인 I/O 장치처럼 보인다는 것을 의미한다. 그리고 figure 1은 대부분의 link layer가 하드웨어를 통해 구현되어 있지만, 그럼에도 일부는 호스트의 CPU에서 실행되는 소프트웨어로 구현되어 있음을 보여준다. Link layer의 소프트웨어 구성요소는 다음과 같은 고수준(high-level)의 link layer 기능을 구현한다:
- link-layer addressing information을 조합하기
- controller 하드웨어를 활성화
또한, 수신측에서는 link layer의 소프트웨어가 controller의 Interrupts (Asynchronous Exceptions)#인터럽트(interrupt)에 응답하고, 비트 오류가 존재하는지 검출하며, 데이터그램을 network layer로 넘긴다. 따라서 link layer는 하드웨어와 소프트웨어의 결합을 통해서 구현된다고 볼 수 있다.