Post date: Nov 30, 2016 3:39:46 AM
네트워크 프로그래밍의 가장 기초적인 개념 중 하나는 연결지향(connection-oriented) 프로토콜과 비연결(connectioniess) 프로토콜의 차이점이다. 이 둘은 본질적인 차이가 없음에도 불구하고, 네트워크를 처음 공부하는 사람은 많은 혼동을 느낀다. 사실, 이런 표현 자체도 혼동을 가져오는데 한몫을 한다. 통신을 하기 위해서는 분명 두 대의 컴퓨터가 “연결되어” 있어야 하는데, 그렇다면 “비연결 통신”이 뜻하는 것은 무엇인가?
이에 대한 답은, 연결지향과 비연결이란 프로토콜과 관련된 것이다. 말하자면, 이는 물리적인 매체 자체를 뜻하는 것이 아니라, 물리적인 매체를 통한 데이터의 전송 방식을 뜻하는 용어인 것이다. 연결지향 프로토콜과 비연결 프로토콜은 같은 매체에 동시에 사용될 수도 있고, 흔히 그렇게 사용되기도 한다.
이러한 구분이 데이터를 전송하는 물리적인 매체와 아무런 관련이 없다면, 무엇과 관련이 있는 것일까? 중요한 차이점은, 비연결 프로토콜의 경우 각각의 패킷들이 독립적으로 다루어지는 반면, 연결지향 프로토콜의 경우는 프로토콜에 의해 연속적인 패킷으로 상태 정보가 유지된다는 것이다.
비연결 프로토콜의 경우, 데이터그램(datagram)이라고 불리는 각각의 패킷이 애플리케이션에 의해 개별적으로 주소가 할당되고 전송된다. 프로토콜의 관점에서, 각 데이터그램은 같은 기기들 사이에서 전송되는 다른 데이터그램들과 어떤 관련도 없는 독립적인 존재이다.
이것은 데이터그램들이 애플리케이션의 관점에서 독립적이라는 말이 아니다. 만약 애플리케이션이, 클라이언트가 하나의 요청을 보내면 서버가 하나의 응답을 보내는 식의 단순한 요청/응답 프로토콜보다 복잡한 무엇인가를 구현한다면, 데이터그램 간의 상태를 유지할 필요가 없는 것이다. 여기서 핵심은, 프로토콜이 아닌 애플리케이션이 상태를 유지한다는 것이다.
일반적으로, 이는 클라이언트와 서버 사이에 확장된 대화가 오고가지 않고, 단순히 클라이언트가 요청을 하면 서버가 응답을 한다는 뜻이다. 클라이언트가 이후에 다른 요청을 보내면, 프로토콜은 이를 이전에 요청한 것과는 다른 독립적인 것으로 인식한다.
이는 프로토콜에 신뢰성이 없다는 것을 뜻하기도 한다. 다시 말하면, 프로토콜은 각 데이터그램을 최대한 빠르게 전달하려 하지만, 이 패킷들이 손실, 지연되고 순서가 바뀌지 않는다고 보증할 수는 없는 것이다.
한편, 연결지향 프로토콜은 패킷들 간의 상태를 유지하고, 애플리케이션들은 확장된 대화를 일반적으로 주고받는데, 이는 신뢰성 있는 전송을 보증한다. 예를 들면, 송신자는 전송되었지만 승인 받지 못한 데이터가 어떤 것인지와 그 데이터가 언제 전송되었는지를 기억한다. 일정한 시간이 흘러도 그 데이터가 승인 받지 못하면, 송신자는 이 데이터를 다시 전송한다. 수신자는 어떤 데이터를 받았는지를 알고 있기 때문에 데이터의 중복을 방지할 수 있다. 패킷의 순서가 뒤바뀌었을 경우, 수신자는 순서가 빠른 패킷이 도달할 때까지 먼저 온 패킷을 보관하고 있다.
전형적인 연결지향 프로토콜은 세 단계를 갖는다. 첫 번째 단계는 두 지점 간의 연결을 설정한다. 두 번째 단계는 두 지점 간에 데이터가 전송되는 데이터 전송 단계이다. 마지막 단계는 지점들끼리의 전송이 끝났을 때 연결이 종료되는 단계이다.
유사한 예를 들면, 연결지향 프로토콜은 전화 통신과 같은 반면, 비연결 프로토콜은 편지를 보내는 것과 같다. 친구에게 편지를 보낼 때, 각 친구마다 주소를 적는다. 그리고 붙이려 하는 편지 외에는 따로 추가되는 것 없이 우체국에서 편지를 취급한다. 우체국은 이런 편지 배송의 정보를 유지하지 않는다. 말하자면, 편지들 간의 정보를 유지하지 않는다는 것이다. 또한 우체국은 이 편지가 도중에 분실되거나, 지연되거나, 배달 순서가 바뀌어서 전달되지 않는다는 보증은 하지 않는다. 이는 비연결 프로토콜에서 데이터그램을 전송하는 것과 유사한 원리이다.