패킷을 하나의 PC에서 다른 PC로 전송하는 상황을 생각해보자.
지금 애플리케이션 계층을 알아보고 트랜스포트 계층을 알아보고 있다.
하지만 이 그림은 아직 모르는 네트워크, 링크, 물리과 여러 라우터와 링크들이 보여서 복잡해보인다.
(그림처럼 애플리케이션, 트랜스포트 계층은 종단 간의 시스템에서 구현된다)
그림 3.1의 두 종단 시스템간의 통신을 단순화해봤다.
PC 1
의 프로세스 1
과 PC 2
의 프로세스 2
가 통신을 하는 상황이다.
(단순화를 위해 복잡한 네트워크를 빨간 화살표롤 바꿔버렸다.)
이렇게 단순하게 바라보면 이제는 두 가지 궁금증만 남게된다.
- 네트워크의 수 많은 PC중에 어떻게
PC 2
에게 정확하게 전송할 수 있을까?PC 2
의 수 많은 프로세스 중에 어떻게프로세스 2
에게 정확하게 전송할 수 있을까?
1번 궁금증은 이후 글에서 네트워크 계층을 알아보며 해소할 것이다.
지금은 "네트워크 계층에서 IP를 통해 식별한다." 정도로 넘어가고
2번 궁금증에 집중하자.
이 글은 2번 궁금증을 해소하기 위한 글이다.
2번 궁금증을 해소하기 위해서는 트랜스포트 계층을 알아야 한다.
트랜스포트 계층은 애플리케이션 메시지를 보낼 때 메시지를 작은 조각으로 분할하고 각각의 조각에 트랜스포트 계층 헤더를 추가하여 네트워크 계층으로 전달한다.
(이 글에서 트랜스포트 계층의 패킷을 UDP는 데이터그램 TCP는 세그먼트라 부르지만 세그먼트로 통일해서 부르겠다.)
트랜스포트 계층은 프로세스 간의 논리적 통신을 제공한다.
여기서 논리적 통신이란 직접 연결된 것처럼 보인다는 것을 의미한다.
(= 트랜스포트 계층은 프로세스 간에 직접 연결된 것처럼 보이게 해준다.)
트랜스포트 계층이 프로세스 간의 논리적 통신을 제공한다는 것은 알겠는데 어떻게 제공한다는 것일까?
일단 프로세스를 식별할 수 있어야 한다.
이 식별할 때 필요한 것이 포트 번호이다.
네트워크에서 포트는 네트워크 서비스나 특정 프로세스를 식별하는 논리 단위이다.
각 포트는 번호로 식별된다.
이 포트 번호를 통해서 프로세스를 식별하게 되는 것이다.
이제 프로세스는 식별을 했는데 프로세스 2
에서 패킷을 어떻게 받을 수 있을까?
이때 소켓이 사용된다.
소켓은 호스트의 애플리케이션 계층과 트랜스포트 계층 간의 인터페이스이다.
프로세스는 소켓을 통해 네트워크 메시지를 주고 받는다.
그래서 트랜스포트 계층은 데이터를 직접 프로세스로 전달하지 않고 중간 매개자인 소켓에게 전달한다.
소켓은 프로세스로와 네트워크간의 데이터를 전달하는 출입구 역할을 한다.
프로세스가 방이라면 소켓은 방의 문이라고 생각할 수 있다.
하나의 PC는 여러 프로세스가 있기 때문에 PC 1
에도 여러 소켓이 있을 수 있고, PC 2
에도 여러 소켓이 있을 수 있다.
근데 네트워크에서 PC 1
의 프로세스 1
에서 PC 2
의 프로세스 2
로 패킷을 전송하면
프로세스 1
의 소켓에서 보낸 패킷이 프로세스 2
의 소켓에서 뿅하고 튀어나온다.
프로세스 1
의 소켓에서 데이터를 보낼 때 다중화(멀티플렉싱)을 거치고,
프로세스 2
의 소켓에서 뿅하고 패킷이 튀어 나올 때 역다중화(디멀티플렉싱)를 거친다.
좀 더 다듬어서 말하면 다음과 같다.
PC 1
의 트랜스포트 계층은 애플리케이션 계층에서 메시지를 받으면
헤더를 붙혀 하나의 세그먼트(트랜스포트 계층의 패킷)를 만들고, 네트워크로 전송해준다.
이 과정을 다중화(멀티플렉싱)이라 한다.
PC 2
의 트랜스포트 계층은 네트워크 계층에서 온 세그먼트를 까본 후
여러 프로세스 소켓들 중 올바른 소켓으로 데이터를 전달된다.
이 과정을 역다중화(디멀티플렉싱)이라 한다.
소켓은 IP와 포트 번호의 조합으로 식별된다.
트랜스포트 계층의 다중화와 역다중화를 TCP와 UDP를 예시로 좀 더 자세히 살펴보자.
지금은 TCP는 신뢰적이고 연결지향형 서비스라는 점과
UDP는 비신뢰적이고 비연결형 서비스라는 점만 기억하면 된다.
TCP와 UDP에 대해서는 이후 글에서 자세히 다루기 때문에 다중화와 역다중화에만 집중하자.
예시에서 보여주는 헤더 그림들은 참고만하자.
(애플리케이션 개발자는 이 두가지 트랜스포트 프로토콜 중 하나를 명시해야 한다.)
지금은 그림의 TCP 헤더에 포트 정보들이 담기는 것을 확인만 하고 다른 헤더 필드들은 뒤에서 배울 것이다.
TCP는 신뢰적이고 연결 지향형 서비스이기 때문에
TCP 소켓은 {출발지 IP주소, 출발지 포트번호, 도착지 IP주소, 도착지 포트번호}
에 의해 식별된다.
다음 그림을 확인하면 같은 도착지 IP주소와 도착지 포트번호를 가져도
다른 출발지 IP를 갖거나, 다른 출발지 포트번호를 가진다면 다른 소켓으로 들어간다.
이렇기 때문에 연결 소켓과 프로세스는 항상 일대일 대응되는 것은 아니다.
하나의 같은 프로세스에 붙어있는 많은 연결 소켓들이 존재할 수 있다.(ex - 웹서버)
(그림에서도 도착지 포트번호와 IP 주소가 같지만, 출발지가 달라서 다른 포트로 역다중화되는 것을 확인할 수 있다.)
UDP는 비신뢰적이고 비연결형 서비스이기 때문에
UDP 소켓은 {도착지 IP주소, 도착지 포트번호}
에 의해 식별된다.
책 - 컴퓨터 네트워킹 하향식 접근
컴퓨터네트워크 - 한양대학교 | KOCW 공개 강의
https://ko.wikipedia.org/wiki/%ED%8F%AC%ED%8A%B8_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9)#%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8_%ED%8F%AC%ED%8A%B8_%EB%B2%88%ED%98%B8