GDG on Campus: SSWU 6th/Winter Blog Challenge

[Winter Blog Challenge] (Chapter Member 백서이)

gdgoc-sswu 2025. 5. 13. 02:59

1. Socket

  • 네트워크 상에서 통신을 가능하게 해주는 양 끝단의 연결고리
  • 특정 프로토콜을 사용하여 데이터를 송수신할 수 있도록 해줌
  • 소켓 프로그래밍 : 소켓을 이용하여 네트워크 상에서 데이터를 주고받는 프로그램을 작성하는 것
    • 소켓 생성 : 프로그래밍 언어에서 제공하는 API를 활용하여 소켓을 생성할 수 있음
    • 소켓 주소 : IP 주소와 포트 번호로 구성된 네트워크 식별자
    • 용도 : 서버와 클라이언트 간의 통신, 프로세스 간 통신 등

2. TCP(Transmission Control Protocol) & UDP(User Datagram Protocol)

  • TCP : 전송 계층 프로토콜로, 데이터 전송의 신뢰성을 보장
    • 연결형 프로토콜 : 데이터 전송 전에 연결을 설정하고, 통신이 완료될 때까지 연결을 유지함
    • 신뢰성 : 데이터 전송의 순서 보장, 패킷 손실 시 재전송 등의 메커니즘을 제공
    • 사용 사례 : 웹 브라우징, 이메일 전송 등 신뢰성 있는 데이터 전송이 필요한 경우.
  • UDP : 전송 계층 프로토콜 중 하나로, 주로 간단하고 빠른 데이터 전송이 필요할 때 사용
    • 비연결형 프로토콜 : 데이터의 연결 상태를 유지하지 않고 데이터를 전송
    • 속도 우선 : 데이터 전송 속도가 빠르지만, 신뢰성은 보장되지 않음(패킷 손실 가능)
    • 사용 사례 : 실시간 스트리밍, 온라인 게임 등 신속한 데이터 전송이 필요한 상황
  • 비교
     
    TCP
    UDP
    신뢰성
    신뢰성 보장 O
    신뢰성 보장 X
    속도
    느림
    빠름
    오버헤드
    연결 설정 및 유지를 위한 오버헤드 있음
    TCP에 비해 상대적으로 오버헤드 적음
    출처 : https://velog.io/@jjo3ys/2.3.2-전송계층-tcp-udp-zbxef4i1

    3. 소켓 프로그래밍의 차이점

    • TCP 소켓 프로그래밍
      • 연결 설정 : 클라이언트와 서버 간에 안정적인 연결을 설정함(3-way handshake)
      • 데이터 전송 : 연결이 설정되면 스트림 방식으로 데이터를 주고 받음
      • 연결 해제 : 통신이 끝나면 연결을 해제하여 리소스를 반환함 (4-way handshake)
      • 더보기

        TCP 소켓 필수 구성 요소

        1. 소켓 생성:
          • socket() 함수를 사용하여 소켓을 생성합니다.
          • 예: int sockfd = socket(AF_INET, SOCK_STREAM, 0);
        2. 주소 구조체 설정:
          • sockaddr_in 구조체를 사용하여 IP 주소와 포트 번호를 설정합니다.
          • 예: servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = INADDR_ANY;servaddr.sin_port = htons(PORT);
        3. 소켓 옵션 설정 (선택사항):
          • **setsockopt()**를 사용하여 소켓 옵션을 설정할 수 있습니다. 예를 들어, 포트 재사용을 설정합니다.
          • 예: setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
        4. 바인딩:
          • bind() 함수를 사용하여 소켓을 특정 IP 주소와 포트에 바인딩합니다.
          • 예: bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
        5. 연결 대기 (서버에서만 필요):
          • listen() 함수를 통해 클라이언트의 연결 요청을 대기합니다.
          • 예: listen(sockfd, 3);
        6. 연결 수락 (서버에서만 필요):
          • accept() 함수를 사용하여 클라이언트의 연결 요청을 수락합니다.
          • 예: int new_socket = accept(sockfd, (struct sockaddr *)&cliaddr, &addrlen);
        7. 데이터 송수신:
          • **send()**와 recv() 함수를 사용하여 데이터를 주고받습니다.
          • 예: send(new_socket, hello, strlen(hello), 0);recv(new_socket, buffer, sizeof(buffer), 0);
        8. 연결 종료:
          • close() 함수를 통해 소켓을 닫습니다.
          • 예: close(sockfd);
    • UDP 소켓 프로그래밍
      • 간단한 설정 : 별도의 연결 설정 과정이 필요 없음. 데이터그램을 직접 보냄
      • 데이터 전송 : 독립적인 데이터그램을 전송하며, 데이터의 상태나 순서를 보장하지 않음
      • 연결 해제가 없음 : 연결 유지 없이 필요한 데이터 전송만 진행함
      • 더보기

        UDP 소켓 필수 구성 요소

        1. 소켓 생성:
          • socket() 함수를 사용하여 소켓을 생성합니다.
          • 예: int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        2. 주소 구조체 설정:
          • sockaddr_in 구조체를 사용하여 IP 주소와 포트 번호를 설정합니다.
          • 예: servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = INADDR_ANY;servaddr.sin_port = htons(PORT);
        3. 바인딩 (서버 측):
          • bind() 함수를 통해 소켓을 특정 IP 주소와 포트에 바인딩합니다.
          • 예: bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
        4. 데이터 송수신:
          • **sendto()**와 recvfrom() 함수를 사용하여 데이터를 주고받습니다.
          • 예: sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cliaddr, &len);
        5. 연결 종료:
          • close() 함수를 통해 소켓을 닫습니다.
          • 예: close(sockfd);