더북(TheBook)

2.6 전송 계층

 

네트워크 계층의 역할이 원격 네트워크상 서로 멀리 떨어진 호스트 사이의 통신을 촉진하는 것이라면, 전송 계층(transport layer)의 역할은 이들 호스트상 개별 프로세스 사이의 통신을 가능케 하는 것이다. 호스트 한 대에 여러 프로세스가 동시에 구동 가능하므로, 그저 호스트 A에서 호스트 B로 IP 패킷을 보냈다, 라는 정도로는 불충분하다. 호스트 B가 IP 패킷을 받았을 때 이를 어느 프로세스에 넘겨야 계속 처리할 수 있는지 알아야 한다. 전송 계층에선 이를 위해 포트(port)라는 개념을 도입한다. 포트는 16비트 부호 없는 숫자로서 특정 호스트의 통신 종단점을 나타낸다. IP 주소가 거리의 건물 주소라면, 포트는 건물 내 입주한 사무실 번호에 비유할 수 있다. 각 프로세스가 입주자라 생각하고 전송 계층 모듈이 이들 각자에게 택배를 전달하는 장면을 상상해 보자. 어떤 프로세스가 특정 포트를 바인딩(binding)해 두면, 전송 계층 모듈은 이후 그 포트로 전달되는 모든 택배를 그 프로세스에 전달해 준다.

미리 언급했듯 모든 포트는 16비트 숫자이다. 이론상 프로세스는 어떤 포트에든 바인딩하여 자신이 의도하는 어느 용도로든 사용할 수 있다. 그렇지만 같은 호스트의 두 프로세스가 서로 같은 포트에 바인딩하려 하면 문제가 야기된다. 웹 서버 프로그램과 이메일 프로그램이 동시에 20번 포트에 바인딩했다 치자. 전송 계층 모듈이 20번 포트로 들어온 데이터를 받았을 때, 둘 다에게 전달하면 어떤 일이 벌어질까. 웹 서버는 이메일 데이터를 웹 요청으로 착각하여 해석하려 들 것이고, 이메일은 반대로 웹 요청을 이메일로 착각할 터이다. 결과적으로 웹 브라우저도, 이메일 클라이언트도 혼란에 빠지게 된다. 이러한 이유로 대부분의 운영체제에서 여러 프로세스가 같은 포트에 바인딩하려 할 때 특별한 플래그를 설정해야만 이를 허용한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.