9.2. 계층화된 프로토콜¶
카메라에서 다른 도시에 있는 서버로 프레임을 보낸다는 것은 여러 문제를 동시에 해결한다는 뜻입니다. 전기 신호는 첫 번째 전선을 건너야 합니다. 그 전선 위의 바이트들은 로컬 스위치를 통해 길을 찾아야 합니다. 로컬 네트워크는 그 메시지를 자신과 인터넷의 나머지 부분 사이에 있는 무엇인가에게 넘겨야 합니다. 여정에서 살아남은 패킷들은 순서대로 재조립되어야 합니다. 수신자는 자신의 프로그램들 중 어느 것에게 그것들을 줄지 알아야 합니다. 그리고 바이트 자체는 양쪽 끝이 합의하는 어떤 의미를 가져야 합니다.
그 모든 것을 하나의 코드 블록으로 해결하려고 하면 감당할 수 없게 됩니다. 표준적인 해답은 그 작업을 계층(layer) 으로 나누는 것입니다. 각 계층은 하나의 잘 정의된 문제를 해결하고 그 위의 계층에게 단순한 서비스를 노출합니다. 프로그램은 항상 바로 아래 계층하고만 대화합니다. 그 아래에 있는 계층들은 보이지 않습니다.
네트워크 스택의 각 계층은 하나의 문제를 해결하고 깔끔한 추상화를 다음 계층으로 넘겨줍니다.¶
9.2.1. 다섯 개의 계층¶
아래의 이름들은 이 절의 나머지 부분에서 사용하는 것들입니다. 이들은 네트워크가 설계의 기반으로 삼은 표준 모델에서 가져온 것입니다. 계층 간의 정확한 경계는 때때로 모호하지만, 각 계층이 하는 역할은 안정적입니다.
물리 계층(Physical layer). 같은 전선이나 무선상의 두 장치 사이에서 비트 를 이동시킵니다. 전압 레벨, 광 펄스, RF 변조 등입니다. 여기서 카메라의 역할은 대부분 올바른 케이블을 꽂거나 올바른 무선 네트워크에 접속하는 것이며, 나머지는 실리콘이 처리합니다.
링크 계층(Link layer). 로컬 세그먼트를 공유하는 두 장치 사이에서 프레임 (바이트의 작은 덩어리)을 이동시킵니다. 각 프레임이 특정한 하나의 이웃에게 향할 수 있도록 하드웨어 주소를 추가합니다. Ethernet과 Wi-Fi가 카메라가 실제로 만나는 두 가지 링크 기술입니다.
네트워크 계층(Network layer). 같은 로컬 세그먼트뿐 아니라 인터넷 상의 임의의 두 장치 사이에서 패킷 을 이동시킵니다. 호스트가 어떤 케이블에 연결되어 있는지와 무관하게 그것을 식별하는 소프트웨어 수준의 주소와, 패킷이 도착할 때까지 한 로컬 세그먼트에서 다음 세그먼트로 건너뛰게 하는 라우팅 메커니즘을 추가합니다. 이것은 카메라의 Python 코드가 무언가 할 말이 생기는 첫 번째 계층입니다.
전송 계층(Transport layer). 패킷 위에 자리 잡고 호스트 자체뿐 아니라 두 호스트상의 프로그램 들 사이의 전달을 제공합니다. 두 가지 방식이 흔합니다: 하나는 연결되고 순서가 있는 바이트 스트림을 전달하며(대부분의 트래픽을 담당하는 주역), 다른 하나는 서로 독립적으로 이동하는 자기 완결적 메시지를 전달합니다(보장보다 낮은 오버헤드가 더 중요할 때 사용). 같은 호스트상의 여러 프로그램이 병렬로 대화를 나눌 수 있도록 포트 번호 를 추가합니다.
애플리케이션 계층(Application layer). 전송 계층 위의 모든 것: 바이트에 의미를 부여하는 프로토콜들입니다. 웹 브라우저가 페이지를 로드하기 위해 사용하는 것들 – 그리고 독자가 이미 매일 사용하는 거의 모든 다른 인터넷 서비스의 뒤에 있는 것들 – 이 여기에 자리합니다. 이 튜토리얼은 전송 계층을 깊이 다루며, 이 계층은 별도의 후속 절로 다룹니다.
9.2.2. 런타임에 계층들이 어떻게 쌓이는가¶
카메라가 네트워크로 바이트를 보낼 때, 모든 계층은 봉투 안에 또 다른 봉투를 넣듯이 데이터 앞에 자신의 헤더를 추가합니다:
애플리케이션의 바이트가 먼저 들어갑니다.
전송 계층은 그것들이 어느 프로그램에 속하는지를 나타내는(포트 번호) 작은 헤더로 그것들을 감쌉니다.
네트워크 계층은 그것 을 그것들이 향하는 호스트가 어디인지를 나타내는(소프트웨어 수준의 주소) 헤더로 감쌉니다.
링크 계층은 그것 을 로컬 세그먼트상의 어느 장치에게 다음으로 넘겨줄지를 나타내는(하드웨어 주소) 헤더로 감쌉니다.
물리 계층은 그 전체 묶음을 전선 위의 비트로 바꿉니다.
반대쪽 끝에서는 각 계층이 자신의 헤더를 벗겨내고 나머지를 위로 넘깁니다. 수신하는 애플리케이션은 네트워크, 링크, 물리 계층이 존재했다는 것을 알지 못한 채 자신의 바이트를 되돌려 받습니다.
이 중첩이 바로 이 튜토리얼이 아래에서 위로 진행하는 이유입니다. 아래 계층이 무엇을 하는지 이해하면 위 계층이 필연적으로 느껴집니다. 아래의 두 계층은 Python에서 구성할 것이 거의 없기 때문에 각각 한 페이지로 다룹니다. 네트워크 계층부터 위로는 Python의 역할이 커지면서 진행 속도가 느려집니다.