TCP / UDP

TCP / UDP

TCP

TCP 소켓은 신뢰할 수 있는 프로토콜이다. 두 머신에서 데이터를 주고 받을 때, 파일에 쓰는 것처럼 한 쪽에서 쓰고 다른 쪽에서 읽을 수 있다.
연결은 신뢰할 수 있고 순차적이다.
즉, 한 쪽에서 보낸 데이터는 다른 쪽에서 안전하게 받을 수 있다.
TCP 소켓도 데이터 스트림이다. 데이터를 잘라 패킷에 담아 네트워크로 보낸다.

TCP가 단순할 수 있었던 기반에는 IP가 있다.
IP에는 커넥션과 관련된 컨셉은 없다. 대신 패킷이 한 컴퓨터에서 다른 컴퓨터로 전달되는 것과 관련이 있다.

교실에서 손편지를 써서 건너건너 친구에게 전달하는 걸 떠올려보자.
어떻게든 친구에게 편지가 도착하긴 하겠지만, 여러 사람을 거쳐 전달될 거다.
편지가 친구에게 정확하게 도착할 거란 보장은 없다.
단지, 잘 도착하기만 바라고 보낼 뿐이다.
편지가 잘 도착했는지 알 수 있는 방법이 없다.
물론, 실제론, 어떤 컴퓨터도 가장 빠르게 도달할 수 있는 방법을 알지 못하기 때문에 이보다 더 복잡하기도 하다.
가끔은 패킷을 복사해 여러 경로로 보낼 수도 있다. 이에 따라 각각 도착시간이 달라질 수도 있다.

UDP (user datagram protocol)

다른 방법으로, 여러 컴퓨터를 거치지 않고 데이터를 주고 받을 컴퓨터끼리 직접 연결하는 건 어떨까?
이 때 UDP를 사용할 수 있다.
UDP는 “user datagram protocol”의 약자인데, TCP와 같이 IP 기반 위에 구현되어 있다.
하지만, 다른 것과 달리 간단한 작업을 하는 아주 얇은 레이어만 올려져 있다.

UDP를 사용해서, 목적지의 IP(예: 112.140.20.10) 주소와 포트(예:52432)로 메시지를 보낼 수 있고,
컴퓨터를 거쳐 거쳐 목적지까지 도달할 수도 있고, 아님 도착하지 않을 수도 있다.

받는 곳에서는 포트(52432)를 열어두고, 패킷이 올 때까지 기다린다.
이 때, 어떤 컴퓨터에서 온 것이든 모두 받아들인다. (커넥션이 없다는 것을 기억한다)
받는 쪽에서는 패킷이 도착했을 때 이게 어느 IP의 어느 포트에서 왔고 크기가 얼마나 되는지 알 수 있다.
그리곤 패킷 데이터를 읽을 수 있다.

UDP는 안정적이지 않은 프로토콜이다.
일반적으로는 1~5% 정도의 데이터를 잃는 경우가 많고, 심지어는 전혀 받지 못할 수도 있다. 패킷이 전송된 순서 또한 보장되지 않는다.

UDP는 IP에서 많은 일을 하지 않는다.
데이터가 전송될 수도 안될 수도 있지만, UDP가 보장해주는 건 데이터의 ‘양’이다.
한 쪽에서 256바이트를 보냈으면, 받는 쪽에서도 무조건 256바이트를 받는다.
처음 100바이트를 받을 수는 없다.

정리

TCP

  • 커넥션 기반
  • 안정성과 순서를 보장한다
  • 패킷을 자동으로 쪼개준다
  • 적당한 속도로 보내준다. (회선이 처리할 수 있을 만큼)
  • 파일을 쓰는 것처럼 사용하기 쉽다

UDP

  • 커넥션 기반이 아니다. 직접 구현해야 한다
  • 안정적이지 않고 순서도 보장되지 않는다. 데이터를 잃을 수도, 중복될 수도 있다.
  • 데이터가 크다면, 보낼 때 직접 패킷 단위로 잘라야 한다.
  • 회선이 처리할 수 있을만큼 나눠서 보내야 한다.
  • 패킷을 잃었을 경우, 필요하다면 다양한 방법으로 이를 찾아내서 다시 보내야 한다.

참고링크

1.http://ohgyun.com/431