12. UDP

UDP(User Datagram Protocol)

  • 데이터를 전송하는 전송 계층 프로토콜

  • 빠른 전송 가능, 신뢰성 보장 X

  • 데이터가 도착했는지 확인 방법, 보낸 순서대로 도착 X (TCP의 경우에도 순서대로 도착X, 재정렬을 할 뿐)

  • JAVA에서 UDP구현은 (1)DatagramPacket, (2)DatagramSocket 두개로 나뉨

  • (1) DatagramPacket

    • 바이트로 된 데이터를 Datagram이라고 불리는 UDP 패킷에 채워넣고 수신받은 데이터그램을 꺼냄

  • (2) DatagramSocket

    • UDP 데이터그램을 수신할 뿐 아니라 전송도 함.

    • 전송하기 위해 DatagramPacket에 담아 DatagramSocket을 사용해 패킷을 전송.

    • 패킷에 데이터가 다 있어서 소켓은 간단,(대기 or 전송할 로컬 포트만 알고 있으면 됨)

    • TCP 소켓은 네트워크 연결을 스트림처럼 다룸. 소켓에서 가져온 입출력 스트림을 사용

      • UDP는 스트림이 아닌 항상 개별 데이터그램 패킷으로 작업해야함.

      • 단일 데이터그램에 채워 넣는 모든 패킷은 단일 패킷으로 전송(전송 or 유실, 패킷간 연관X)

      • (ex)두 패킷 간 우선 순위에 대한 근거X (스트림의 경우에는 Queue가 필요하지만 datagram은 그냥 패킷으로 보내기만 함)

UDP 클라이언트

  • UDP 에서는 패킷 전송 실패 사실을 알기가 어려움 → udp에서는 timeout이 중요

    (TCP에선 IOException 발생)

코드 링크 :https://github.com/young0264/java-network-programming/tree/main/src/main/java/org/example/ch12arrow-up-right

참고 try-with-resources 1 : https://codechacha.com/ko/java-try-with-resources/#google_vignettearrow-up-right try-with-resources 1 : https://www.baeldung.com/java-try-with-resourcesarrow-up-right

UDP 서버

코드 링크 : https://github.com/young0264/java-network-programming/blob/main/src/main/java/org/example/ch12/DaytimeUDPServer.javaarrow-up-right

  • 먼저 수신, 임의의 포트에 바인드하지 않는다는 것을 제외하면 UDP 클라이언트와 같은 패턴

  • TCP 서버와 달리 멀티스레드 구조로 만들 필요가 없음 (많은 일을 수행하지 않음)

  • 또한 패킷이 손실되었다고 에러를 던지지 않기 때문에 상대방이 응답을 보낼 때까지 기다리기 위해 블록될 수 없음

Last updated