9.2. 계층화된 프로토콜

카메라에서 다른 도시에 있는 서버로 프레임을 보낸다는 것은 여러 문제를 동시에 해결한다는 뜻입니다. 전기 신호는 첫 번째 전선을 건너야 합니다. 그 전선 위의 바이트들은 로컬 스위치를 통해 길을 찾아야 합니다. 로컬 네트워크는 그 메시지를 자신과 인터넷의 나머지 부분 사이에 있는 무엇인가에게 넘겨야 합니다. 여정에서 살아남은 패킷들은 순서대로 재조립되어야 합니다. 수신자는 자신의 프로그램들 중 어느 것에게 그것들을 줄지 알아야 합니다. 그리고 바이트 자체는 양쪽 끝이 합의하는 어떤 의미를 가져야 합니다.

그 모든 것을 하나의 코드 블록으로 해결하려고 하면 감당할 수 없게 됩니다. 표준적인 해답은 그 작업을 계층(layer) 으로 나누는 것입니다. 각 계층은 하나의 잘 정의된 문제를 해결하고 그 위의 계층에게 단순한 서비스를 노출합니다. 프로그램은 항상 바로 아래 계층하고만 대화합니다. 그 아래에 있는 계층들은 보이지 않습니다.

아래에서 위로 physical, link, network, transport, application이라고 표시된 다섯 개의 상자가 세로로 쌓여 있습니다. 오른쪽 화살표는 스택을 위로 가리키며 "우리가 만드는 것"이라고 표시되어 있습니다. 왼쪽 화살표는 스택을 아래로 가리키며 "제공되는 것"이라고 표시되어 있습니다.

네트워크 스택의 각 계층은 하나의 문제를 해결하고 깔끔한 추상화를 다음 계층으로 넘겨줍니다.

9.2.1. 다섯 개의 계층

아래의 이름들은 이 절의 나머지 부분에서 사용하는 것들입니다. 이들은 네트워크가 설계의 기반으로 삼은 표준 모델에서 가져온 것입니다. 계층 간의 정확한 경계는 때때로 모호하지만, 각 계층이 하는 역할은 안정적입니다.

물리 계층(Physical layer). 같은 전선이나 무선상의 두 장치 사이에서 비트 를 이동시킵니다. 전압 레벨, 광 펄스, RF 변조 등입니다. 여기서 카메라의 역할은 대부분 올바른 케이블을 꽂거나 올바른 무선 네트워크에 접속하는 것이며, 나머지는 실리콘이 처리합니다.

링크 계층(Link layer). 로컬 세그먼트를 공유하는 두 장치 사이에서 프레임 (바이트의 작은 덩어리)을 이동시킵니다. 각 프레임이 특정한 하나의 이웃에게 향할 수 있도록 하드웨어 주소를 추가합니다. Ethernet과 Wi-Fi가 카메라가 실제로 만나는 두 가지 링크 기술입니다.

네트워크 계층(Network layer). 같은 로컬 세그먼트뿐 아니라 인터넷 상의 임의의 두 장치 사이에서 패킷 을 이동시킵니다. 호스트가 어떤 케이블에 연결되어 있는지와 무관하게 그것을 식별하는 소프트웨어 수준의 주소와, 패킷이 도착할 때까지 한 로컬 세그먼트에서 다음 세그먼트로 건너뛰게 하는 라우팅 메커니즘을 추가합니다. 이것은 카메라의 Python 코드가 무언가 할 말이 생기는 첫 번째 계층입니다.

전송 계층(Transport layer). 패킷 위에 자리 잡고 호스트 자체뿐 아니라 두 호스트상의 프로그램 들 사이의 전달을 제공합니다. 두 가지 방식이 흔합니다: 하나는 연결되고 순서가 있는 바이트 스트림을 전달하며(대부분의 트래픽을 담당하는 주역), 다른 하나는 서로 독립적으로 이동하는 자기 완결적 메시지를 전달합니다(보장보다 낮은 오버헤드가 더 중요할 때 사용). 같은 호스트상의 여러 프로그램이 병렬로 대화를 나눌 수 있도록 포트 번호 를 추가합니다.

애플리케이션 계층(Application layer). 전송 계층 위의 모든 것: 바이트에 의미를 부여하는 프로토콜들입니다. 웹 브라우저가 페이지를 로드하기 위해 사용하는 것들 – 그리고 독자가 이미 매일 사용하는 거의 모든 다른 인터넷 서비스의 뒤에 있는 것들 – 이 여기에 자리합니다. 이 튜토리얼은 전송 계층을 깊이 다루며, 이 계층은 별도의 후속 절로 다룹니다.

9.2.2. 런타임에 계층들이 어떻게 쌓이는가

카메라가 네트워크로 바이트를 보낼 때, 모든 계층은 봉투 안에 또 다른 봉투를 넣듯이 데이터 앞에 자신의 헤더를 추가합니다:

  • 애플리케이션의 바이트가 먼저 들어갑니다.

  • 전송 계층은 그것들이 어느 프로그램에 속하는지를 나타내는(포트 번호) 작은 헤더로 그것들을 감쌉니다.

  • 네트워크 계층은 그것 을 그것들이 향하는 호스트가 어디인지를 나타내는(소프트웨어 수준의 주소) 헤더로 감쌉니다.

  • 링크 계층은 그것 을 로컬 세그먼트상의 어느 장치에게 다음으로 넘겨줄지를 나타내는(하드웨어 주소) 헤더로 감쌉니다.

  • 물리 계층은 그 전체 묶음을 전선 위의 비트로 바꿉니다.

반대쪽 끝에서는 각 계층이 자신의 헤더를 벗겨내고 나머지를 위로 넘깁니다. 수신하는 애플리케이션은 네트워크, 링크, 물리 계층이 존재했다는 것을 알지 못한 채 자신의 바이트를 되돌려 받습니다.

이 중첩이 바로 이 튜토리얼이 아래에서 위로 진행하는 이유입니다. 아래 계층이 무엇을 하는지 이해하면 위 계층이 필연적으로 느껴집니다. 아래의 두 계층은 Python에서 구성할 것이 거의 없기 때문에 각각 한 페이지로 다룹니다. 네트워크 계층부터 위로는 Python의 역할이 커지면서 진행 속도가 느려집니다.