'TCP'에 해당되는 글 4건

  1. 2008.04.02 UDP Socket-1.TCP와 UDP

TCP UDP

개요

 

TCP/IP 네트워크를 통해서 읽고,쓰기를 하는 프로그램은 TCP의 서비스를 받거나 혹은

UDP의 서비스를 받아야만 합니다.

그리고 TCP의 서비스와 UDP의 서비스는 상당한 수준의 차이가 있으므로 TCP를 이용한

네트워크 프로그램과 UDP를 이용한 네트워크 프로그램은 그 구조와 목표하는 바가 완연히

다릅니다.

여기서는 TCP UDP의 특징을 살펴보겠습니다. 이제부터는 네트워크로부터 읽고,쓰기를

할 때 TCP를 선택 할 것인가 UDP를 선택할 것인가를 결정할 수 있을 것입니다.

 

Connection Oriented VS Connectionless

 

TCP를 이용한 네트워크 프로그램에서는 네트워크로부터 데이터를 읽고,쓰기 위해서는

TCP 연결을 데이터를 읽고,쓰기에 앞서 반드시 해야합니다.

네트워크에 참여하는 두개의 프로그램인 클라이언트와 서버가 네트워크로부터 읽고,쓸 수

있는 상황이 조금 다른데, 서버는 클라이언트가 TCP 연결을 하기만을 수동적으로

기다리다가, TCP 연결이 된후에야 비로소 Socket을 얻을 수 있습니다.

클라이언트는 Listen하고 있는 서버로 능동적으로 TCP 연결을 하고 Socket을 얻습니다.

 

어쨋거나 네트워크 프로그램에 참여하는 클라이언트,서버 모두 TCP 연결이 된후에,

Socket이 만들어진 후에 Socket으로부터 InputStream,OutputStream을 만들수 있고,

InputStream,OutputStream으로부터 데이터를 읽고,씁니다.

만약 TCP 연결이 되지 않은 상태라면 단, 한 비트라도 네트워크로 보낼 수 없습니다.

그리고 TCP 연결이 된 다음 읽고,쓰는 데이터들은 TCP 연결된 클라이언트와 서버간을

이동하는 데이터들이며, 이들은 TCP의 적절한 통제를 받습니다.

여러분의 대부분은 TCP를 이용한 네트워크 프로그램만을 경험해보았기 때문에 모든

네트워크 프로그램이 TCP를 이용한 네트워크 프로그램의 구조와 유사하다고 이해하기

쉽지만 TCP의 라이벌격인 UDP를 이용한 네트워크 프로그램은 TCP를 이용한 네트워크

프로그램과 많이 다릅니다.

 

UDP를 이용한 네트워크 프로그램은 네트워크로 데이터를 읽고,쓰고하는데 어떤 제약도

없습니다.

UDP를 이용한 네트워크 프로그램은 네트워크로 데이터를 읽고,쓰는데는 TCP 연결과 같은

사전 작업이 필요없습니다.

데이터를 네트워크로 쓸때는 그냥 네트워크로 씁니다. 그 데이터가 원하는 곳에 제대로

도착할 지는 보장할 수 없습니다. 운이 좋으면(네트워크 정보가 정확하고,네트워크 상태가

좋으면) 도착하고, 운이 나쁘면 도착 못합니다. 데이터를 네트워크에서 읽을때는 데이터를

기다리고 있다가 찾아오는 데이터를 그냥 읽습니다.

UDP 서비스는 네트워크 연결이라는 개념자체가 없는 서비스이기 때문에 네트워크

프로그램 한쪽에서 일방적으로 데이타를 네트워크로 보낼수 있습니다.

UDP기반의 DatagramSocket을 이용하는 클라이언트는 UDP 네트워크 서버가

실행중 인것과 아무 상관없이 네트워크로 데이터를 쓸 수 있습니다.

하지만 오해는 없어야합니다. UDP기반의 DatagramSocket을 이용하면 UDP 서버가

실행중이지 않아도 서버로부터 원하는 서비스를 받을 수 있다는 뜻은 아닙니다.

 

Stream VS Datagram

 

TCP를 이용한 네트워크 프로그램은 네트워크로부터 데이터를 읽고,쓸때 스트림으로 읽고,

씁니다. TCP를 이용하는 네트워크 객체 Socket InputStream,OutputStream을 얻어낼수

있고, 이 스트림으로 데이터를 읽고,쓸 수 있습니다.

반면에,UDP를 이용한 네트워크 프로그램은 스트림이 아닌 메시지단위로 읽고,쓰기를

합니다. 이 메시지를 데이터그램(Datagram) 혹은 데이터그램 패킷(DatagramPacket)

라고 합니다.

 

예를 들어 TCP를 이용한 네트워크 프로그램이 100 byte의 데이터를 두번 네트워크로

썼다고 해서 데이터를 읽는데 쪽에서 100 byte 2번 읽는다는 보장이 없습니다.

1 byte 200번 읽을 수도 있고 200 byte를 한 번에 읽을 수도 있습니다.

읽는 쪽에서는 쓰는 쪽에서 몇 byte를 몇번에 걸쳐서 썼었는지 알 수 없습니다.

그저 계속해서 읽다가 보면 언젠가는 200 byte 모두를 읽습니다.

스트림은 데이터를 메시지 단위로 나누지 않고 연속되게 읽고,씁니다.

 

반면 UDP를 이용한 네트워크 프로그램은 메시지 단위로 읽고,쓰기를 합니다.

쓰는 쪽에서 네트워크로 1개의 메시지를 데이터그램에 담아 데이터그램을 네트워크에

썻다면, 읽는 쪽에서는 1개의 데이터그램을 읽고, 그 읽은 데이터그램에는 1개의 메시지가

있습니다. 즉 네트워크로부터 읽은 메시지는 네트워크로 썼을 때의 메시지 크기와 완전히

동일합니다.

UDP를 이용한 네트워크 프로그램은 메시지 단위로 읽고,쓰기를 하기때문입니다.

 

Reliable VS Best-Try

 

TCP 서비스와 UDP 서비스의 가장 근본적인 차이점은 TCP 서비스는 믿을 수 있는

서비스를 제공하고, UDP는 그렇지 못하다는 겁니다.

TCP는 연결과 연결해제를 전제로 합니다. TCP TCP연결이 된후에 네트워크 프로그램들

이 네트워크에 읽고,쓰는 데이터를 한 비트도 잃어버리지 않고, 순서도 틀리지 않게 배달해

줍니다. 네트워크 한쪽에서 쓴 데이타는 네트워크 반대쪽에서 반드시 읽을 수 있습니다.

이를 두고 TCP는 믿을 수 있는 서비스라고 부릅니다.

TCP는 믿을 수 있는 서비스를 구현하기 위해서 Timeout-Retransmission, Flow Control

등의 기술을 이용합니다.

 

UDP기반의 DatagramSocket을 이용해서 데이터를 네트워크로 썼다면 그 데이터는

UDP 서버에 도착할 수 도 있고, 도착하지 못 할 수도 있습니다.

물론 UDP는 최선을 다하겠지만 네트워크에 씌여진 데이터그램이 서버에까지 도달하지

않을 수 도 있습니다.  UDP는 데이터그램을 잃어버릴 수도 있는데, 데이터그램을

잃어버려도 특별히 조치를 취하지 않습니다. 그래서 UDP는 믿을 수 없는 서비스라고

합니다.

 

UPD의 서비스는 TCP와 다르게 Best-Try 입니다.

클라이언트가 보낸 데이터그램이 서버에게 도착하도록 최선을 다해서 노력합니다.

하지만 그뿐입니다. 네트워크 사정에 따라 데이터그램이 서버에 도착하지 않을 수 있는데

이경우 TCP는 재전송을 하지만, UDP는 별도의 행동을 하지 않습니다.

 

UDP를 이용한 네트워크 프로그램은 데이터를 네트워크로 보낼 때 그 데이터를

DatagramPacket에 담아서 씁니다. 그리고 네트워크로부터 읽을때도 DatagramPacket

읽어,그 속에 담긴 데이터를 이용합니다.

클라이언트가 N개의 데이터그램을 서버로 보냈다면 N개의 데이터그램이 모두 서버에게

도착한다는 보장이 없고, N개의 데이터그램이 네트워크로 씌여진 순서대로 도착하는 것도

아닙니다. N개의 데이터그램은 각각 라우팅되어 다른 경로를 통해서 서버로 옮겨지는데

이런 이유로 네트워크에 늦게 씌여진 데이터그램이 서버에 먼저 도착할 수도 있습니다.

하지만 어찌 보면 무책임해 보이기까지 한 UDP TCP보다 훨씬 유용할 때가 많습니다.

 

 

One-To-One VS One-To-Many

 

TCP UDP의 큰 차이점 중 하나는 TCP 네트워크 프로그램은 항상 일대일로만 읽고,쓰기

를 합니다. TCP를 이용하면 당연히 그럴 수 밖에 없습니다. 네트워크로 읽고,쓰기를 하고자

한다면 우선 TCP 연결을 해야만하는데 TCP 연결에 참여하는 클라이언트 서버가 각각

하나이기 때문에 당연한 결과입니다.  채팅서버를 TCP기반으로 만든다면 채팅서버는

수십,수백개의 네트워크연결을 가지고 있어야 합니다. 하나의 클라이언트가 보낸 메시지를

읽어서 나머지 수십,수백개의 클라이언트에게 전달해 주어야 하는게 채팅서버의 의무인데다

TCP기반의 네트워크 프로그램을 했기 때문에 클라이언트 하나와 일대일로 TCP 연결을

맺어야 하기때문입니다.

 

UDP기반의 네트워크 프로그램은 네트워크 연결이라는 개념이 없습니다.

정보를 받을려면 받고 말라면 말고라는 심정으로 네트워크로 데이타를 쏟아 부어 넣을 수

있기 때문에 데이타를 받으려고 마음 먹은 수많은 네트워크 클라이언트는 네트워크에 돌아

다니는 데이터를 언제든 읽을 수 있습니다. , UDP는 일대다로의 읽고,쓰기가 가능합니다. 

서버는 데이터를 네트워크로 밀어넣고, 수많은 클라이언트는 네트워크에 흘러다니는

데이터를 읽을 수 있습니다.

이런 UDP기반의 네트워크 프로그램이 많이 사용되는 부분은 IP 멀티캐스팅을

이용한 동영상 서비스 부분이 될것입니다. 동영상 서비스를 일대일기반의 TCP 서비스로

구현하기에는 네트워크 대역폭이 모자라 부적절 합니다..

모든 TCP 클라이언트에게 동영상 데이터를 보내주어야 하기 때문에 100명의 동시사용자에

100개의 같은 분량의 데이터를 보내야합니다.

반면 UDP 1개 분량의 데이터를 네트워크에 밀어넣으면, 그 데이터를 읽고자하는

클라이언트는 네트워크에 떠돌아 다니는 데이터를 읽으면 그만입니다.

Posted by
,