[CS공부] 네트워크 구조(4)-소켓 (Socket)

Min Kim·2023년 2월 15일
0

CS 공부

목록 보기
5/15

들어가기 전에


소켓을 활용한 소켓 통신의 개념을 알아봅시다.

1. 소켓이란?


  • 프로그램이 네트워크에서 데이터를 주고받을 수 있도록 네트워크 환경에 연결할 수 있게 만들어진 연결부
  • 프로토콜, IP주소, 포트 넘버로 정의
  • IP주소를 통해 도착지 정보, TCP/UDP 헤더를 통해 프로토콜 정보, 포트번호를 통해 프로세스 정보를 찾음.
  • 역할에 따라 서버 소켓, 클라이언트 소켓으로 구분

😜 추가 지식

  • 프로토콜 : 원래 외교상의 언어로써 의례나 국가간의 약속을 의미하며, 통신에서는 어떤 시스템이 다른 시스템과 통신을 원활하게 수용하도록 해주는 통신 규약, 약속
  • IP : 전 세계 컴퓨터에 부여된 고유의 식별 주소
  • 포트 : 포트는 네트워크 사엥서 통신하기 위해서 호스트 내부적으로 프로세스가 할당받아야하는 고유한 숫자이다. 한 호스트 내에서 네트워크 통신을 하고 있는 프로세스를 식별하기 위해 사용되는 값이므로, 같은 호스트 내에서 서로 다른 프로세스가 같은 포트 넘버를 가질 수 없다. 즉, 같은 컴퓨터 내에서 프로그램을 식별하는 번호이다.
    EX ) 161.25.10.8 : 1625 (빨간색 : IP주소, 파란색 : 포트 주소)

2. 소켓 종류


스트림(TCP)

  • 양방향으로 바이트 스트림을 전송 , 연결 지향성
  • 오류 수정, 전송처리, 흐름제어 보장
  • 송신된 순서에 따라 중복되지 않게 데이터를 수신(HOLB 발생)
  • 소량의 데이터보단 대량의 데이터 전송에 적합

데이터그램(UDP)

  • 비연결형소켓
  • 데이터의 크기에 제한이 있음
  • 확실하게 전달이 보장되지 않음, 데이터가 손실돼도 오류가 발생하지 않음
  • 실시간 멀티미디어 정보를 처리하기 위해 주로 사용

3. 그림으로 보는 소켓 통신



4. 클라이언트와 서버의 통신 모습

(1) 서버 - Listen 소켓 생성

  • 서버의 정보 또는 DNS를 통해 만들어야 할 소켓의 정보를 가져옴.

  • socket(): 속성들이 비어있는 새로운 소켓을 생성.

  • bind(): 1번에서 가져온 정보들을 소켓에게 부여. (바인딩)

  • listen(): 소켓을 LISTEN 상태로 만듬.

😜 추가 지식

  • LISTEN 소켓 : 클라이언트의 연결 요청을 기다리는 소켓. 연결 요청이 오게되면 본인을 복제한 새로운 소켓을 만들어 네트워크 통신을 연결.

(2) 클라이언트 & 서버 - 연결 성립: 3 Way Handshaking

  • 클라이언트와 서버간의 네트워크 연결을 확인하는 과정

  • 통신간의 신뢰성을 보장하는 TCP 통신의 연결 확인 과정

  • 소켓통신의 연결을 위해 3-way handshaking, 연결 종료를 위해 4-way handshaking을 진행

  • 서버에 여러 요청이 들어올 경우, 서버는 이를 저장해놓고 차례대로 처리하기 위해 2개의 queue를 가지고 있음

    • incomplete queue: 서버에 들어온 연결요청들을 저장해놓는 queue. 아직 완전히 연결된 상태가 아니며, 서버가 해당 요청들에 대해 클라이언트에게 연결확인 정보를 전송.
    • complete queue: 클라이언트에게 연결완료 정보를 받아 완전히 연결된 상태가 된 요청정보들을 저장하는 queue. 네트워크 연결이 완료되었기 때문에 순서대로 pop되면서 본래 수행하려던 작업들을 수행.

3 Way Handshaking 과정
1. 클라이언트는 socket()을 실행하여 CLOSED 소켓을 생성합니다.

  1. 클라이언트는 이후 connect()를 실행합니다. connect() 함수는 블록된 상태가 되어 종료되지 않습니다.

    2-1. 서버에게 연결요청 정보(SYN)를 전송합니다.

    2-2. 소켓의 상태를 SYN-SENT로 설정합니다.

  2. 서버의 LISTEN 소켓이 요청을 받게 되면, 서버는 accept()를 실행합니다. accept()함수는 블록된 상태가 되어 종료되지 않습니다.

    3-1. 클라이언트에게 연결확인 정보(SYN)를 받아 새로운 소켓을 생성하고, 소켓의 상태를 SYN-RECEIVED로 설정합니다.

    3-2. 연결 정보에 새로운 소켓을 매핑하고, incomplete queue에 push합니다.

    3-3. 클라이언트에게 연결확인 정보(SYN + ACK)를 전송합니다.

  3. 클라이언트는 서버에게 연결확인 정보(SYN + ACK)를 받고, connect() 함수는 블록이 해제됩니다. 아래 과정을 수행한 후 connect()는 종료됩니다.

    4-1. 연결확인 정보(SYN + ACK)를 받고 소켓을 ESTABLISHED로 설정합니다.

    4-2. 서버에게 연결완료 정보(ACK)를 전송합니다.

  4. 서버는 클라이언트에게 연결완료 정보(ACK)를 받고, accept() 함수는 블록이 해제됩니다. 아래 과정을 수행한 후 accept()는 종료됩니다.

    5-1. 연결완료 정보(ACK)를 받고 소켓을 ESTABLISHED로 설정합니다.

    5-2. 연결 정보를 incomplete queue에서 pop하고, incomplete queue에 push합니다.

(3) 클라이언트 & 서버 - 데이터 전송과 수신

  • 전달하려고 하는 정보들을 보내고 받는 과정
    • write(): 프로세스는 보내고자 하는 메세지나 파일들은 Buffer작성.(write) 이후 버퍼를 소켓을 통해 다른쪽의 소켓에게 전송.(send)
    • read(): 다른쪽의 소켓에게서 Buffer수신.(recv) 이후 버퍼에서 메세지나 파일을 읽음.(read)

😜 추가지식
버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역.

😡 주의사항!!
그림에서 서버가 클라이언트로 보내는 버퍼 안의 메세지는 hello가 아니라 world입니다. 그림 자료에 오류가 있으니 헷갈리지 마세용!

(4) 클라이언트 & 서버 - 연결 해제: 4 Way Handshaking

  • 연결 종료를 위해 4-way handshaking을 진행.
  • 모든 과정이 종료되면 클라이언트와 서버의 소켓이 삭제.
  • 클라이언트의 close()가 먼저 실행되어 받은 정보를 이용하여 서버의 close()가 실행.
  • 서버의 close() 과정에서 클라이언트가 보낸 모든 요청을 다 처리한 후 연결 종료를 요청하는 과정이 특징.

    4 Way Handshaking 과정

    1. 클라이언트는 close()를 실행하여 서버에게 연결해제 요청(FIN)을 보내고, 소켓의 상태를 FIN_WAIT1로 설정합니다.

    2. 서버는 클라이언트에게 연결해제 확인(ACK) 정보를 보내고, 소켓의 상태를 CLOSE_WAIT으로 설정합니다. 서버는 남아있는 클라이언트의 요청을 모두 처리하여 클라이언트에게 보내고, 이후 close()를 실행합니다.

    3. 클라이언트는 서버에게 연결해제 확인(ACK) 정보를 받은 후, 소켓의 상태를 FIN_WAIT2로 설정합니다. 이후 서버에게서 오는 모든 요청들을 받으며 연결해제 요청(FIN)을 받기를 기다립니다.

    4. 서버는 클라이언트에게 연결해제 요청(FIN)을 보내고, 소켓의 상태를 LAST_ACK로 설정합니다.

    5. 클라이언트는 서버에게 연결해제 요청(FIN)을 받은 후 연결해제 확인(ACK) 정보를 보내고 소켓을 삭제하며 네트워크 통신을 종료합니다.

    6. 서버는 클라이언트에게 연결해제 확인(ACK) 정보를 받은 후 소켓을 삭제하며 네트워크 통신을 종료합니다.

참고


해당 사이트의 내용을 참고로 작성했습니다. 추후에 더 알게 되는 내용들을 추가하겠습니다.

kxmjhwn tstory
명월 일지
[CS] 그림으로 알아보는 네트워크 - 소켓 프로그래밍과 Handshaking
[운영체제] 소켓
소켓이란 무엇인가?
곰돌이 놀이터

profile
Better & Better 꾸준히 성장하는 개발자

0개의 댓글