1-2-2. Transport Layer Windows Networking2008. 11. 10. 21:02
1-2-2. Transport Layer ; 통신의 두 컴퓨터간의 연결성을 보장해 주는 계층
Transport Layer는 TCP/IP Protocol을 가진 두 호스트간의 통신을 위한 방법을 제공해 주는 계층이다. 이 계층에 해당하는 UDP와 TCP는 두 호스트를 연결해 주는 하나의 지점으로서 "Port"라고 부르는 “창구”를 통해서 통신을 한다.
웹서비스의 예를 들어보겠다. 웹서비스를 하기 위해서는 분명히 웹서비스가 동작하는 컴퓨터가 한대 있어야 한다. 하지만 이 컴퓨터는 웹서비스 뿐만이 아니라 추가로 FTP서비스, SMTP서비스 등 수많은 TCP/IP기반 서비스를 처리할 수 있다. 클라이언트가 웹서비스를 하고 있는 시스템에게 웹서비스를 요청하기 위해서는 자신이 원하는 서비스가 웹서비스임을 명확히 밝힐 필요가 있다. 그렇지 않으면 서버 입장에서는 클라이언트가 무슨 서비스를 원하는지 알 방법이 없기 때문이다.
이 방법으로써 TCP/IP에서는 "포트(Port)"라고 부르는 번호를 이용해서 서비스를 구분하고, 클라이언트 쪽에서 제공한 포트와 자신이 제공하고 있는 서비스의 포트를 연결시킴으로써 정상적인 서비스를 하게 되는 것이다. 그리고 이러한 서버측의 포트로 클라이언트가 접근할 수 있도록 하기 위해서 일반적으로 사용되는 서비스는 Well-Known port (잘 알려진 포트)라는 것으로 약속되어 있다. 예를 들면Web서비스는 80번, SMTP서비스는 25번, Telnet서비스는 23번등으로 되어 있다. 일반적으로 사용되는 이러한 서비스들과 포트들에 대해서는 다시 한번 다루도록 하겠다. 보안이라는 측면을 다루기 위해서는 이러한 포트를 이해하는 것은 필수적인 개념이다.
- TCP (Transmission Control Protocol)
TCP는 보통 큰 사이즈의 데이터를 전송하는 데 사용되며 3가지의 특징을 가지고 있다.
첫 번째, TCP는 Connection-Oriented Protocol이라고 불리운다. 이것은 실제 데이터를 전송하기 전에 먼저 TCP Session을 맺는 과정이 필요함을 의미한다. 이 과정을 "TCP 3-way handshake"라고 부른다.
두 번째, TCP는 Sequence Number (일련번호)와 Acknowledgements (확인신호)를 이용하여 신뢰성 있는 전송을 보장한다. Sequence Number는 여러개의 데이터를 한꺼번에 전송해도 뒤섞이지 않도록 해 주며, 또 수신측의 호스트에서는 그 순서대로 재조합을 할 수 있는 방법을 제공한다. Acknowledgements는 송신측의 호스트로부터 데이터를 잘 받았다는 수신측의 확인메시지를 의미한다. 보내는 모든 패킷마다 일련번호를 붙여서 보내고 또 수신측에서는 송신측이 보낸 패킷마다 확인메시지를 전송해 주게 되니 당연히 신뢰할만한 통신이 보장된다. 그런 이유로 TCP를 이용한 통신방법은 잘못된 전송을 허용하지 않는다.
세 번째, TCP는 Byte-stream Communication을 한다. Byte-Stream이라는 의미는 TCP가 데이터의 의미는 중요하게 따지지 않고, 단지 Byte단위로 데이터를 나눠서 전송하는 것을 말한다.
<그림1-4>는 한 컴퓨터가 다른 컴퓨터로 TCP/IP를 이용한 통신을 시도한 상황을 패킷캡처한 것이다. 갑자기 이게 왠 이해할 수 없는 그림? 그림의 제목을 보면 “네트워크 모니터”라는 이름을 달고 있다. 이 툴에 대한 사용법은 이번장의 마지막 부분에서 다룰 것이다. 지금부터 TCP/IP 부분을 설명하면서 계속 필자가 네트워크를 캡처해서 얻은 그림을 통해서 설명할 것이다. 보면서 이해하는 편이 가장 빠를 거라는 생각에서다. 그림의 가운데 부분을 보면 하이라이트된 부분에서 TCP로 시작되는 부분을 찾을 수 있다. 이 패킷은 TCP를 사용하는 패킷이다. 하이라이트된 부분 아래로 Source Port, Destination Port, Sequence Number, Acknowledgement Number.. 등이 출력되어 있는 것 보인다. 이것이 TCP프로토콜의 Header에 들어있는 내용들이다.
응용프로그램으로부터 상대방 컴퓨터에 전송해야 할 데이터를 넘겨받은 TCP는 헤더부분에 특별한 정보들을 추가하는 것으로 자신이 해야 할 일을 한다. 자신이 상대방으로부터 응답을 받아들이기 위한 준비를 위해 Source Port를 명시하고, 상대방 응용프로그램에 명확히 연결하기 위해서 Destination Port도 기록을 했다. 그리고 자신이 보내는 패킷의 순서를 매겨서 Sequence Number에 담고, 상대방이 이 패킷 전에 보냈던 것에 대한 응답으로써 Acknowledgement Number도 기록을 했다. Destination Port가 뭐라고 되어 있는지 그림을 보라. Hypertext Tranfer Protocol 이라고 되어 있는 것이 보인다. 즉 HTTP라는 것을 알 수 있다. 이 메시지를 통해서 <그림1-4>에서 보여지는 캡처한 패킷이 “웹서버”로 가는 트래픽이라는 것을 알 수 있겠다.
어렴풋이 네트워크 패킷에 대해 감이 잡힐 것이라는 생각이 드는데, 만일 이 부분이 흥미있게 생각되는 독자라면 아마 당신은 며칠밤을 잠 못자고 고생을 좀 해야 할 것이다. 아마도 언제 어디서나 네트워크 모니터를 실행해 놓고 잡히는 패킷들을 분석하느라고 한동안 시간을 보내야 할 테니까. 이 책에서는 TCP/IP에 대한 완전한 내용을 다루지는 못한다. 여러분들이 Windows Networking을 공부하는데 최소한의 내용을 다루고 있을 뿐이다. 별도로 TCP/IP 전문서적 한권 정도는 따로 공부하면 도움이 많이 될 것이다. 필자의 개인웹사이트에서 참고할 만한 서적들의 리스트를 찾을 수 있다.
흔히 볼수 있는 FTP, HTTP, DNS Zone transfer 등의 통신이 TCP를 이용하고 있다.
- UDP (User Datagram Protocol)
UDP는 보통 적은 양의 데이터를 전송하는 데 사용하며 2가지 특징을 가지고 있다.
첫 번째, UDP는 Connectionless Protocol이다. 이것은 실제 데이터를 전송하기 전에 먼저 어떤 연결도 맺지 않는다는 것을 의미한다. 그렇지만 UDP는 브로드캐스트를 이용하여 한꺼번에 많은 수의 호스트들에게 데이터를 전송할 수 있다.
두 번째, UDP는 메시지의 확실한 전송을 보장하지 않는다. 그래서 UDP데이터는 순서없이 도착할 수 있고, 중복될 수도 있다. UDP는 이러한 것들을 해결해 줄 수 없다. UDP가 처리해 주지 못하는 이러한 부분들은 보다 상위의 계층에서 해결해 줘야 한다. 즉, 어플리케이션이 확실한 전송을 보장해 주기 위한 부분까지 담당을 해야 한다는 것이다.
이상한 생각이 들 것이다. 위에서 설명한 TCP에 비해서 UDP는 상대적으로 뭔가 열악해 보인다는 생각이 들지 않는가? 그런데도 왜 UDP를 사용해야 할까? 그것은 UDP역시 나름대로 필요한 영역이 있기 때문인데, 주로 화상회의, 리얼오디오, 인터넷방송 등에서 사용이 되는 것을 보면 그 쓰임새를 짐작할 수 있다. 우리는 화상회의를 할 때 깨끗한 그림만을 제공받지는 못한다. 끊기기도 하고, 잠시동안 멈추기도 하지만, 계속 실시간으로 서비스를 받을 수 있게 된다. 만일 TCP를 사용한다면 이러한 일들은 어렵게 된다. TCP는 중간에 손상된 패킷을 받는다면 반드시 재전송을 요청해야 한다. 실시간 데이터를 받는다는 것과는 어째 어울리지 않는 통신방법이라는 생각이 들 것이다.
또, 서버의 문제를 관리자에게 알려주기 위한 긴급한 메시지의 경우를 생각해 보면, 이런 긴급한 상황에 TCP처럼 사전세션을 맺는 과정을 처리하고, 느긋한(?) 통신을 하는 것은 어울리지 않는다는 것을 알 수 있다. 당장 서버가 다운이 되는 상황이면 이 사실을 가장 빠르게 알릴수 있는 방법이 필요하다. UDP가 그러한 통신을 진행한다.
마지막으로 아주 소량의 데이터를 전송하는 경우를 예를 들 수 있다. 데이터를 전송해야 하는데 그 크기가 500byte 정도의 작은 크기의 데이터라고 해 보겠다. 이것은 패킷하나만 가지면 충분히 전송할 수 있는 크기이지만 TCP를 이용하면 상황은 달라진다. 먼저 사전연결인 TCP 3 way handshake를 위해서 패킷 3개, 실제 데이터 전송 1개, Ack패킷 1개, TCP세션을 종료하는 패킷 2개. 이렇게 총 7개의 패킷이 네트워크에 발생되어야 한다. 이럴 경우에는 역시 UDP가 보다 현명한 방법이라는 생각이 든다. UDP는 패킷 하나만으로 위의 상황을 처리해 줄 수 있기 때문이다.
이런 이유로 UDP도 분명히 필요한 protocol이다. 아래에 UDP패킷을 캡처한 그림이 있다.
<그림1-5. 네트워크 모니터로 캡처한 그림 – Transport Layer – UDP 패킷>
TCP패킷에 비해서 상대적으로 간소한 헤더로 구성되어 있음을 알 수 있을 것이다. 당연한 결과이다. 하지만 UDP역시 Source Port, Destination Port 등의 포트번호를 사용하고 있음을 기억할 필요가 있다. 이렇듯 TCP와 UDP는 포트번호라는 것을 통해서 상대방 응용프로그램과의 연결성을 명확히 해 주는 역할을 담당하고 있다. 이렇게 TCP와 UDP는 각각의 임무인 헤더를 추가하는 작업을 한 다음 이 패킷을 다른 호스트에게 배달하는 일을 담당하고 있는 IP프로토콜에게 넘겨주게 된다.