ss__jae2
타닥타닥 IT
ss__jae2
전체 방문자
오늘
어제

Github

  • 타닥타닥 IT (179)
    • 웹개발 (86)
      • JAVA (23)
      • DBMS (6)
      • HTML (9)
      • CSS (7)
      • JavaScript (12)
      • JSP (14)
      • Spring (15)
    • FrontEnd (63)
      • HTML (5)
      • CSS (12)
      • JavaScript (16)
      • React.js (14)
      • Node.js (16)
    • API (5)
    • SQLD (21)
      • SQLD (1)
      • 1과목 데이터 모델링의 이해 (11)
      • 2과목 SQL 기본 및 활용 (9)
    • CS Study (4)
      • 네트워크 (4)

공지사항

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.
ss__jae2

타닥타닥 IT

[네트워크] TCP 통신
CS Study/네트워크

[네트워크] TCP 통신

2024. 10. 1. 21:56
반응형

1. TCP/IP 프로토콜

  • TCP/IP는 인터넷 통신 시 실제로 사용하는 표준 모델
  • 전송 계층으로 응용 계층으로부터 메시지를 받아 패킷으로 캡슐화하여 전송
  • 패킷 : 네트워크를 통해 전송되는 형식화된 데이터 덩어리
OSI 7계층
- Open Systems Interconnection, 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명하기 위해 개발한 모델

TCP/IP 4계층
- 현재의 인터넷에서 컴퓨터들이 서로 정보를 주고받는데 쓰이는 프로토콜의 모음OSI 모델을 기반으로 실제 사용될 수 있도록 단순화된 모델 

2. TCP(Transmission Control Protocol)

  • 3-way, 4-way handshake 과정을 통해 데이터를 신뢰성 있게 전송할 수 있도록 하는 프로토콜
  • TCP 통신는 밑에 순서를 따라서 작동
    • Connection setup (TCP 연결 초기화) : 3-way handshaking
    • Data transfer (데이터 전송)
    • Connection termination (TCP 연결 종료) : 4-way handshaking
  • socket 통신 기반 → 연결지향적인 양방향 통신
  • 신뢰성 있는 서비스를 제공하기 위해 오류/혼잡/흐름제어 등을 실행 → header가 비교적 크고 속도가 느리다는 단점
    • 흐름제어 : 데이터를 보내는 속도와 받는 속도의 균형을 조율
    • 오류제어 : 훼손된, 손실된 segment를 감지 및 재전송하고 순서가 맞지 않거나 중복된 segment를 정렬 및 폐기
    • 위의 과정은 TCP header의 checksum, 확인응답, 타임-아웃 등을 통해 수행

TCP 통신 과정

네트워크에서 데이터를 통째로 통신하는 경우는 거의 없고 분할해서 전송 후 합치는 방식

  1. 데이터 스트림에서 받은 데이터를 일정 단위로 분할
  2. 분할된 데이터 단위에 TCP 헤더를 붙여서 TCP 세그먼트 생성
  3. TCP 세그먼트를 IP 데이터그램으로 변환 IP 데이터그램은 인터넷 통신에 사용되는 데이터 패킷
  4. IP 데이터그램을 수신 애플리케이션에 보냄

TCP 세그먼트

  • TCP 세그먼트는 헤더와 데이터 필드가 나뉨
  • Source Port: 데이터를 발송하는 애플리케이션의 포트 번호
  • Destination Port: 데이터를 수신하는 애플리케이션의 포트 번호
  • Sequence Number(SYN): TCP 통신 과정에서 데이터를 일정 단위로 분할, 분할된 데이터의 순서
  • Acknowledgment Number(ACK): 데이터를 수신하는 애플리케이션 입장에서, 다음으로 받고 싶은 TCP 세그먼트의 Sequence Number

3 way handshake

  • TCP/IP 프로토콜로 통신하기 전, 정확한 정보 전송을 위해 상대방 컴퓨터와 세션을 연결하는 과정**(TCP 연결 초기화)**
  • 즉 서로를 확인하기 위한 절차(connection을 위한 절차)
    1. 클라이언트가 서버에게 SYN패킷(연결 요청)을 보냄
    2. 서버가 클라이언트에게 ACK패킷(연결 인지) + SYN패킷(연결 요청)을 보냄 → 서버도 클라이언트한테 연결 요청
    3. 클라이언트가 서버에게 ACK패킷(연결 인지)을 보냄
    • SYN : synchronize, ACK : acknowledge

4-way handshake

  • TCP 연결을 종료하는 Connection termination이 이루어지는 과정 (TCP 연결 종료)
  • 양방향으로 2개의 연결이 독립적으로 닫히기 때문에 4-way 단계를 거침
    (——— 서버 프로세스가 종료될 때까지 기다림———)
    1. 클라이언트가 서버에게 FIN패킷(종료 알림)을 보냄
    2. 서버가 클라이언트에게 ACK패킷(종료 인지)을 보냄
    3. 서버가 클라이언트에게 FIN패킷(종료 알림)을 보냄
    4. 클라이언트가 서버에게 ACK패킷(종료 인지)을 보냄
    • FIN : finish

3. TCP Socket 통신

socket 통신

  • 네트워크에서 프로세스 간 데이터를 주고받기 위한 양방향 통신 메커니즘
  • 소켓은 컴퓨터 간 네트워크 연결을 설정하고 유지하는 데 사용, 클라이언트와 서버 간의 통신
  • 소켓은 네트워크 상에서 데이터 송수신을 위한 끝점을 의미
  • 클라이언트와 서버는 각각 소켓을 생성하여 서로 데이터를 주고받음
  • 소켓은 IP 주소와 포트 번호로 식별
  • IP 주소는 장치를 식별, 포트 번호는 해당 장치에서 실행 중인 특정 애플리케이션을 식별

TCP/IP 소켓 프로그래밍

  • 소켓 프로그래밍에서는 클라이언트 소켓과 서버 소켓의 역할이 중요
  • 데이터를 주고 받기 위해서는 소켓의 연결 과정이 선행되어야 하고, 그 과정에서의 연결 요청과 수신이 각각 클라이언트 소켓과 서버 소켓의 역할이기 때문
  • 클라이언트 소켓이 IP 주소와 포트 번호를 통해 서버 소켓에게 연결을 시도, 서버 소켓은 어떤 연결 요청을 받아드릴지 말지 시스템에 등록하여 요청이 수신 되었을 때 해당 요청을 처리
  • 소켓 연결이 완료된 후, 클라이언트 소켓과 서버 소켓이 직접 데이터를 주고 받는 것처럼 보이지만, 사실 서버 소켓은 클라이언트 소켓의 연결 요청을 받아들이는 역할만 하고, 직접적인 데이터 송수신은 새로운 소켓을 통해 처리

소켓 통신의 흐름

  • 서버 측
    1. 소켓 생성 : 서버는 통신을 위해 소켓을 생성
    2. 소켓 바인딩 : 소켓을 특정 IP 주소와 포트에 바인딩
    3. 청취(listen) : 클라이언트로부터의 연결 요청을 기다림
    4. 연결 수락(accept) : 클라이언트의 연결 요청을 수락, 클라이언트와의 통신을 위한 새로운 소켓을 생성
    5. 데이터 송수신 : 클라이언트와 데이터를 주고받음
    6. 연결 종료 : 통신이 완료되면 연결을 종료
  • 클라이언트 측
    1. 소켓 생성 : 클라이언트는 서버와 통신하기 위해 소켓을 생성
    2. 서버에 연결 요청(connect) : 서버에 연결 요청을 보냄
    3. 데이터 송수신 : 서버와 데이터를 주고받음
    4. 연결 종료 : 통신이 완료되면 서버와의 연결을 종료

JAVA 소켓 프로그래밍

  • 서버 측
    1. ServerSocket 생성: 특정 포트에서 클라이언트의 연결 요청을 기다리기 위해 ServerSocket 객체를 생성
    2. 클라이언트 연결 대기: accept() 메서드를 호출하여 클라이언트의 연결 요청 기다림 클라이언트가 연결을 요청하면 새로운 Socket 객체를 반환
    3. 데이터 송수신: 반환된 Socket 객체를 사용하여 클라이언트와 데이터를 주고받음
    4. 연결 종료: 데이터 송수신이 끝나면 소켓을 닫고 연결을 종료
  • 클라이언트 측
    1. Socket 생성: 서버에 연결을 요청하기 위해 Socket 객체를 생성, 서버의 IP 주소와 포트 번호를 전달
    2. 데이터 송수신: 서버와 데이터를 주고받음
    3. 연결 종료: 데이터 송수신이 끝나면 소켓을 닫고 연결을 종료
import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) {
        try {
            // 8080 포트에서 클라이언트 연결 대기
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Server is waiting for connection...");

            // 클라이언트의 연결을 수락
            Socket socket = serverSocket.accept();
            System.out.println("Client connected!");

            // 입력 스트림(클라이언트에서 오는 데이터)
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            
            // 클라이언트로부터 메시지 수신
            String message = reader.readLine();
            System.out.println("Received from client: " + message);

            // 출력 스트림(클라이언트로 보낼 데이터)
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            
            // 클라이언트에게 응답 전송
            writer.println("Hello from server!");

            // 소켓 및 스트림 닫기
            socket.close();
            serverSocket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) {
        try {
            // 서버에 연결 (localhost:8080)
            Socket socket = new Socket("127.0.0.1", 8080);

            // 출력 스트림(서버로 보낼 데이터)
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);

            // 서버에게 메시지 전송
            writer.println("Hello from client!");

            // 입력 스트림(서버에서 오는 데이터)
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));

            // 서버로부터 메시지 수신
            String message = reader.readLine();
            System.out.println("Received from server: " + message);

            // 소켓 및 스트림 닫기
            socket.close();
        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
        }
    }
}
반응형
저작자표시 (새창열림)

'CS Study > 네트워크' 카테고리의 다른 글

[네트워크] WebSocket (ws/wss)  (0) 2024.10.21
[네트워크] HTTP/HTTPS  (0) 2024.10.02
[네트워크] OSI 7계층 및 TCP/IP 계층  (0) 2024.10.01
    'CS Study/네트워크' 카테고리의 다른 글
    • [네트워크] WebSocket (ws/wss)
    • [네트워크] HTTP/HTTPS
    • [네트워크] OSI 7계층 및 TCP/IP 계층
    ss__jae2
    ss__jae2

    티스토리툴바