TCP vs UDP 차이 (difference of TCP, UDP)

TCP와 UDP에 대해서 알아보자.

TCP, UDP의 각 특성을 비교하면서 알아보도록 하고, Java로 TCP, UDP를 사용하여 간단한 어플리케이션을 만들어 보도록하겠습니다.

TCP(Transmission Control Protocol)란?

TCP는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 
실행되는 프로그램 간에 일련의 옥텟을 안정적으로,순서대로, 
에러없이 교환할 수 있게 해주는 프로토콜이다.
  • 연결 지향적이다.
  • 신뢰성 있는 데이터 전송(reliable data transfer -> rdt)를 보장한다.
  • Ordering. (순서를 보장한다.)
  • Flow control 기능이 있다.(sender가 데이터를 너무 빨리 보내는 것을 제어)
  • Congestion control 기능이 있다.(네트워크 상황에 따라 윈도우 크기를 조정)
    1. AIMD 방식으로 윈도우의 크기를 조절하여 WAN으로 나가는 패킷의 양을 조절한다.
    2. 종류로는 tahoe, reno, cubic 등이 있다.
  • timing, throughput, 보안을 보장해주지는 않는다.
public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket (5101);
        Socket client = serverSocket.accept();

        BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line.toUpperCase());
            if (line.equals("quit")) break;
            bw.write(line.toUpperCase() + "\n");
            bw.flush();
        }
        br.close();
        bw.close();
        serverSocket.close();
        client.close();
    }
}
public class TCPClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1") , 5101);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        String line;
        while (true) {
            line = br2.readLine();

            bw.write(line + "\n");
            bw.flush();
            if(line.equals("quit")) break;
            System.out.println(line);
            String answer;
            while ((answer = br.readLine()) != null) {
                System.out.println(answer);
            }
        }
        bw.close();
        br.close();
        socket.close();
    }
}

UDP(User Datagram Protocol)란?

 TCP와 함께 데이터그램으로 알려진 단문 메시지를 교환하기 위해서 사용된다.
  • 신뢰성 없는 데이터 전송 프로토콜이다.
  • Datagram을 전송하는데에만 신경을 쓴다.
  • Flow, Congestion, Ordering 어떤 것도 Control해주지 않는다.
  • 그렇다면 UDP는 언제 사용하는가?
    1. 재전송이 필요없는 VoIP, 동영상 같은 경우에 사용이 가능하다. (잡음이 들렸다고 해서 다시 들어야하는 경우는 없다.)
    2. DNS, DHCP, UDP heartbeat 등에 사용한다.
public class UDPServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(5001);

        while (true) {
            byte[] buffer = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);
            datagramSocket.receive(datagramPacket);
            String line = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
            System.out.println(line);
            if (line.equals("quit")) break;

            DatagramPacket sendDatagramPacket = new DatagramPacket(datagramPacket.getData(),
                    datagramPacket.getLength(), datagramPacket.getAddress(), datagramPacket.getPort());
            datagramSocket.send(sendDatagramPacket);
        }
        datagramSocket.close();
    }
}
public class UDPClient {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(5002);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String line;
        while ((line = br.readLine()) != null) {
            DatagramPacket sendPacket =
                    new DatagramPacket(line.getBytes(), line.getBytes().length,
                            InetAddress.getByName("127.0.0.1"), 5001);
            datagramSocket.send(sendPacket);
            if(line.equals("quit")) break;

            byte[] buffer = new byte[line.getBytes().length];

            DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
            datagramSocket.receive(receivePacket);
            String msg = new String(receivePacket.getData(), 0, receivePacket.getData().length);

            System.out.println("전송받은 문자열 : "+ msg);
        }
        bw.close();
        br.close();
        datagramSocket.close();
    }
}