Wednesday, January 26, 2011

chapter 6 (UDP에 대한 이해)

-UDP에 대한 이해-
앞에서 보았듯이  TCP/IP 프로토콜 스택에 4가지 계층이 있고 상위 3번째 계층인 IP 프로토콜이 신뢰성이 없기 때문에 TCP 프로토콜은 신뢰성 있는 데이터 송수신을 위해 흐름제어 (Flow Control)을 한다. UDP는 안한다. 그렇기에  TCP 보다 빠르다.

UDP의 내부 동작 원리
송신하는 호스트 A에서 나온 UDP 패킷은 IP 프로토콜에 의해 수신자인 호스트 B까지 전달된다. UDP 역할 중 가장 중요한 것은 호스트로 수신된 패킷을 PORT 정보를 참조하여 최종 목적지인 UDP 소켓에 전달하는 것


UDP의 효율적 사용
대부분이 TCP기반. 그럼 언제 UDP가 유용할까? 압축파일의 경우 거의 반드시 TCP 기반. 그러나 멀티미디어 데이터는 속도가 중요하지 약간의 잡음이나 끊김이 중요하지 않기때문에 UDP 기반이 좋다. 특히 데이터의 양은 작으면서 잦은 연결이 필요한 경우 UDP가 좋다. 왜냐? 패킷을 보낼때마다 TCP는 확인(흐름 제어)을 하지만 UDP는 안하니까


-UDP 기반 서버/클라이언트의 구현-


UDP에서의 서버와 클라이언트는 연결되어 있지 않습니다.
UDP 서버, 클라이언트는 연결된 상태로 데이터를 송수신 하지 않는다. 따라서 연결과정 필요 없음. 곧 listen, accept 함수 불필요. 오직 데이터 송수신 과정만 필요

UDP에서는 서버건 클라이언트건 하나의 소켓만 있으면 됩니다.
TCP는 소켓과 소켓의 관계가 일대일 따라서 문지기 소켓을 제외하고 클라이언트 소켓 만큼 서버 소켓이 필요. 그러나 UDP는 서버, 클라이언트 둘다 소켓하나만 있으면 된다. 왜? 연결 상태에서 데이터를 송수신 하는 것이 아니기 때문에. 하나의 UDP 소켓만 있으면 둘 이상의 호스트와 통신 가능.


UDP 기반의 데이터 입출력 함수
TCP는 연결 상태에서 패킷을 주고 받기 때문에 소켓 자체에 목적지의 주소 정보가 있기 때문에 데이터를 보낼 때 수신하는 곳의 주소 정보를 함수에 인자로 넘길필요가 없다(write를 이용해서 접속된 socket에 쓰기만 했다). 그러나 UDP 같은 경우에는 접속한 상태에서 패킷을 주고 받는것이 아니기 때문에 송신 함수에의 인자에 수신지의 주소 정보를 같이 넣어야 한다. 이렇기 때문에 UDP에서는 소켓을 하나 만들면 그 소켓 하나 가지고 여러 다른 주소지에 패킷을 전송할 수 있다.
이때 사용하는 함수가 sendto와 recvfrom 이 있다.




-UDP의 뎅터 송수신 특성과 UDP에서의 connect 함수 호출-


데이터의 경계가 존재하는 UDP 소켓
경계가 존재한다는 것은 송신하는 호스트에서 3번에 걸쳐서 패킷을 보냈다면 수신하는 호스트 역시 3 번에 걸쳐서 수신해야 한다는 것. 그러니까 송수신의 횟수가 동일해야 한다는 것이다.

connected UDP 소켓과 unconnected UDP 소켓
UDP 소켓에서 패킷을 보낼때 sendto 함수는 사용하게 되는데 그 과정을 보면 3단계로 되어 있다. 1. UDP 소켓에 목적지의 IP와 PORT 번호 등록. 2. 데이터 전송. 3. UDP 소켓에 등록된 목적지 정보 삭제
UDP 소켓에서는 접속하지 않은채 패킷을 송수신 하기때문에 클라이언트에서 connect 함수를 사용하지 않는다. 그러나 동일한 수신지에 데이터를 여러번 송수신 할 경우 위의 과정이 반복되는데 위의 스텝중 1과 3의 시간이 상당하기에(전체 시간의 1/3정도)  connect 함수를 사용해서 접속을 유지할수 있다. 이렇게 되면 스텝1,3은 거치지 않으며 또한 이때 sendto, recvfrom이 아닌 write,read 함수를 사용할 수 있다.