๐Ÿ“•TCP/UDP ๋„คํŠธ์›Œํฌ ์ž…์ถœ๋ ฅ

dev_itzel_02โœจยท2024๋…„ 9์›” 1์ผ
post-thumbnail

๐Ÿท๏ธTCP (Transmission Control Protocol)

์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

  • ์ธํ„ฐ๋„ท์˜ ํ•ต์‹ฌ ํ”„๋กœํ† ์ฝœ์ธ TCP/IP ํ”„๋กœํ† ์ฝœ์˜ ์ผ๋ถ€๋ฅผ ๊ตฌ์„ฑ
    • ์—ฐ๊ฒฐ ์„ค์ •, ๋ฐ์ดํ„ฐ ์ „์†ก, ์—ฐ๊ฒฐ ํ•ด์ œ ๋“ฑ์˜ ์„œ๋น„์Šค ์ œ๊ณต
    • ํŒจํ‚ท์˜ ์ˆœ์ฐจ ์ „๋‹ฌ, ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๋ฐ ๋ณต๊ตฌ ๋“ฑ์„ ์ง€์›ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•ํ•œ ์ „๋‹ฌ์„ ๋ณด์žฅ

BUT โ“
๐Ÿ‘‰๐Ÿผ ์ „์†ก ์†๋„๊ฐ€ ๋А๋ฆผ

>> img ref.

๐Ÿค 3-way handshake

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ SYN ํŒจํ‚ท์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•จ
  • ์„œ๋ฒ„๋Š” SYN ํŒจํ‚ท์„ ๋ฐ›๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ SYN๊ณผ ACK ํŒจํ‚ท์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ•จ
  • ํด๋ผ์ด์–ธํŠธ๋Š” ACK ํŒจํ‚ท์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ์„ ํ™•์ •ํ•จ

๐Ÿค 4-way handshake

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ„
  • ์„œ๋ฒ„๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•จ
  • ์„œ๋ฒ„๋Š” ์ฒ˜๋ฆฌํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋˜๋Œ๋ ค ๋ณด๋ƒ„
  • ํด๋ผ์ด์–ธํŠธ๋Š” ๋˜๋Œ๋ ค ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•จ
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ FIN ํŒจํ‚ท์„๋ณด๋‚ด ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ์š”์ฒญํ•จ
  • ์„œ๋ฒ„๋Š” ACK ํŒจํ‚ท์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•จ
  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ FIN ํŒจํ‚ท์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ์š”์ฒญํ•จ
  • ํด๋ผ์ด์–ธํŠธ๋Š” ACK ํŒจํ‚ท์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋ฅผ ํ™•์ •ํ•จ

๐Ÿท๏ธUDP (User Datagram Protocol)

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ

  • ์—ฐ๊ฒฐ ์„ค์ • ์—†์ดโ• ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•จ
    • TCP์™€๋Š” ๋‹ฌ๋ฆฌ ์ˆœ์„œ ๋ณด์žฅ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ณต๊ตฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ
    • ์‹ค์‹œ๊ฐ„์„ฑ์ด ์š”๊ตฌ๋˜๋Š” ์„œ๋น„์Šค์— ์ฃผ๋กœ ์‚ฌ์šฉ

BUT โ“
๐Ÿ‘‰๐Ÿผ ์ „์†ก ์†๋„๊ฐ€ ๋น ๋ฆ„

>> img ref.

  • ๋ฐœ์‹ ์ž๋Š” ๋ฐ์ดํ„ฐ๊ทธ๋žจ ํŒจํ‚ท์„ ๋งŒ๋“ค์–ด ์ˆ˜์‹ ์ž์—๊ฒŒ ๋ฐ”๋กœ ์ „์†กํ•จ
  • ์ˆ˜์‹ ์ž๋Š” ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•จ
  • ์ด ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ํŒจํ‚ท์€ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ๋„์ฐฉํ•˜๋ฉฐ, ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ์Œ
  • ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธก์—์„œ ๋‹ด๋‹นํ•จ

TCP ๐Ÿ†š UDP

ํ•ญ๋ชฉTCPUDP
์—ฐ๊ฒฐํ˜•/๋น„์—ฐ๊ฒฐํ˜•
์—ฐ๊ฒฐํ˜•
๋น„์—ฐ๊ฒฐํ˜•
๋ฐ์ดํ„ฐ ์ „์†ก ์‹ ๋ขฐ์„ฑ
๋†’์Œ(์ˆœ์ฐจ ์ „๋‹ฌ, ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์ง€์›)
๋‚ฎ์Œ(์ˆœ์ฐจ ์ „๋‹ฌ, ์˜ค๋ฅ˜ ๋ณต๊ตฌ ๋ฏธ์ง€์›)
์ „์†ก ์†๋„
๋А๋ฆผ
๋น ๋ฆ„
ํ—ค๋” ํฌ๊ธฐ
ํผ
์ž‘์Œ
์‚ฌ์šฉ ์‚ฌ๋ก€
์ด๋ฉ”์ผ, ์›น ์„œํ•‘ ๋“ฑ ์‹ ๋ขฐ์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค
์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, VoIP ๋“ฑ ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค

๐Ÿท๏ธ๋„คํŠธ์›Œํฌ ํด๋ž˜์Šค์™€ ๋ฉ”์†Œ๋“œ

  • InetAddress Class
    • getByName(String host) : ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ํ†ตํ•ด IP ์ฃผ์†Œ ์–ป๊ธฐ
    • getHostAddress() : IP ์ฃผ์†Œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜
  • Socket Class
    • Socket(String host, int port) : ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋กœ ์†Œ์ผ“ ์ƒ์„ฑ
    • getInputStream() : ์†Œ์ผ“์˜ InputStream ์–ป๊ธฐ
    • getOutputStream() : ์†Œ์ผ“์˜ OutputStream ์–ป๊ธฐ
  • ServerSocket Class
    • ServerSocket(int port) : ํŠน์ • ํฌํŠธ์— ๋Œ€ํ•ด ์„œ๋ฒ„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•จ
    • accept() : ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง€๋ฉด ์ƒˆ๋กœ์šด ์†Œ์ผ“ ๋ฐ˜ํ™˜
  • DatagramPacket Class
    • DatagramPacket(byte[] buf, int length, InetAddress address, int port) : ํŒจํ‚ท ์ƒ์„ฑ
    • getData() : ํŒจํ‚ท์˜ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜
  • DatagramSocket Class
    • DatagramSocket(int port) : ํŠน์ • ํฌํŠธ์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ๊ทธ๋žจ ์†Œ์ผ“ ์ƒ์„ฑ
    • send(DatagramPacket p) : ํŒจํ‚ท ์ „์†ก
    • receive(DatagramPacket p) : ํŒจํ‚ท ์ˆ˜์‹ 

๐Ÿท๏ธTCP/UDP ์‚ฌ์šฉ

e.g.

๐Ÿ“‘TCP - Server

import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocekt(8000);
            
            Socket clientSocket = serverSocket.accept();
            
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            
            String message = in.readLine();
            out.println("Hello, Client! You sent: " + message);
            
            clientSocket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ“‘TCP - Client

import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) {
        try {
            InetAddress serverAddr = InetAddress.getByName("localhost");
            Socket socket = new Socket(serverAddr, 8000);
            
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            
            out.println("Hello, Server!");
            
            String response = in.readLine();
            System.out.println("Server says: " + response);
            
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ“‘UDP - Receiver

import java.net.*;

public class UDPReceiver {
    public static void main(String[]  args) {
        try {
            DatagramStocket datagramSocket = new DatagramSocket(8000);
            byte[] buffer = new byte[1024];
            
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            datagramSocket.receive(packet);
            
            String message = new String(packet.getData(), 0, packet.getLength());
            System.out.println("Received message: " + message);
            
            datagreamSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ“‘UDP - Sender

import java.net.*;

public class UDPSender {
    public static void main(String[] args) {
        try {
            InetAddress receiverAddr = InetAddress.getByName("localhost");
            int port = 8000;
            
            String message = "Hello, Receiver!";
            byte[] buffer = message.getBytes();
            
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, receiverAddr, port);
            
            DatagramSocket datagramSocket = new DatagramSocket();
            datagramSocket.send(packet);
            datagramSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
profile
๐Ÿœ๐Ÿ‘ฃsteadiness๐Ÿœ๐Ÿ‘ฃ

0๊ฐœ์˜ ๋Œ“๊ธ€