공부해봅시당

[네트워크] Socket 통신 본문

STUDY/네트워크

[네트워크] Socket 통신

tngus 2024. 3. 20. 19:53

1. 소켓(SOCKET)이란?

소켓(Socket)은 프로세스가 네트워크 세계로 데이터를 내보내거나 혹은 그 세계로부터 데이터를 받기 위한 실제적인 창구 역할을 한다. 그러므로 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써보내거나 소켓으로부터 데이터를 읽어들여야 한다.

 

네트워크를 경유하는 프로세스 간 통신의 종착점. OSI 7계층 중 응용 계층에 속하는 프로세스들은 데이터 송수신을 위해 반드시 소켓을 거쳐 전송 계층으로 데이터를 전달해야한다. 즉, 소켓은 전송 계층과 응용 프로그램 사이의 인터페이스 역할을 하며 떨어져 있는 두 호스트를 연결해준다.



2. 소켓의 3요소

2-1. 프로토콜

프로토콜은 데이터 전송을 위한 표준 집합 규칙이다. 주로 TCP/IP, UDP/IP 프로토콜을 사용한다.

(1) TCP

- 연결 설정 후 통신이 가능한 연결형 프로토콜

- 데이터 경계의 구분이 없는 바이트 스트림(Byte-Stream) 서비스
- 신뢰성 보장, 오류 수정, 정송처리, 흐름제어 보장

- 송신된 순서에 따라 중복되지 않게 데이터를 수신 → 오버헤드가 발생
- 소량의 데이터보다 대량의 데이터 전송에 적합 → TCP를 사용

(2) UDP

- 연결 설정 없이 통신이 가능한 비연결형 프로토콜

- 데이터 경계를 구분하는 데이터그램(Datagram) 서비스
- 데이터의 크기에 제한이 있음
- TCP에 비해 신뢰성이 떨어짐. 확실하게 전달이 보장되지 않음, 데이터가 손실돼도 오류가 발생하지 않음

- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용 ex) 전화

 

2-2. IP

전 세계 컴퓨터에 부여된 고유의 식별 주소

2-3. Port(포트)

포트(Port)는 네트워크 상에서 통신하기 위해서 호스트 내부적으로 프로세스가 할당받아야 하는 고유한 숫자

한 호스트 내에서 네트워크 통신을 하고 있는 프로세스를 식별하기 위해 사용되는 값이므로, 같은 호스트 내에서 서로 다른 프로세스가 같은 포트 넘버를 가질 수 없음

즉, 같은 컴퓨터 내에서 프로그램을 식별하는 번호

다시말해 소켓은 떨어져 있는 두 호스트를 연결해주는 도구로써 인터페이스의 역할을 하는데 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어 진다. 이러한 소켓은 역할에 따라 서버 소켓, 클라이언트 소켓으로 구분된다.

 

3. 소켓통신의 흐름

3-1. 한 번에 보자

1. socket() 으로 통신을 위한 엔트포인트을 작성하고 해당 종료점을 나타내는 소켓 설명자를 리턴한다. 

   소켓 설명자는 정수로 이루어져있다.

2. 소켓 설명자가 있는 어플리케이션은 고유한 이름을 소켓에 바인드할 수 있다. 

   서버 소켓은 네트워크에서 액세스 가능한 이름을 바인드해야 한다.

3. 서버 소켓에서 listen()으로 클라이언트 연결 요청을 승인하려는 의사를 표시한다. 

4. 클라이언트 애플리케이션이 스트림 소켓에 대해 connect() API를 사용하여 서버에 대한 연결을 설정한다.

5. 서버 애플리케이션이 accept() API를 사용하여 클라이언트 연결 요청을 승인한다. 

6. 서버와 클라이언트 간 연결이 이루어지면 모든 데이터 전송을 할 수 있다.

7. 서버 또는 클라이언트는 조작을 중단하려는 경우 close() 를 실행하여 소켓이 획득한 시스템 자원을 해제한다.

3-2. 각각 따로 보자

서버와 클라이언트의 위치가 위와 다르니 유의해서 살펴보도록 하자.

 

1) 서버 (Server)

클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신이 가능하게 한다

1) socket() 함수를 이용하여 소켓을 생성
2) bind() 함수로 ip와 port 번호를 설정
3) listen() 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기 시킬지 결정
4) accept() 함수를 사용하여 클라이언트와의 연결을 기다림

2) 클라이언트 (Client)

실제로 데이터 송수신이 일어나는 것은 클라이언트 소켓이다.

1) socket() 함수로 가장 먼저 소켓을 연다
2) connect() 함수를 이용하여 통신 할 서버의 설정된 ip와 port 번호에 통신을 시도
3) 통신을 시도 시, 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor를 반환
4) 이를 통해 클라이언트와 서버가 서로 read(), write() 를 하며 통신 (이 과정이 반복)

 

4. HTTP 통신과 SOCKET 통신의 비교

4-1. HTTP 통신

- Client의 요청(Request)이 있을 때만 서버가 응답(Response)하여 해당 정보를 전송하고 곧바로 연결을 종료하는 방식

HTTP 통신의 특징
- Client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신이다.
- Server로부터 응답을 받은 후에는 연결이 바로 종료된다. 
- 실시간 연결이 아니고, 필요한 경우에만 Server로 요청을 보내는 상황에 유용하다.
- 요청을 보내 Server의 응답을 기다리는 어플리케이션의 개발에 주로 사용된다.


추가: HTTP는 응답을 받은 후 Connection이 끊어지는 것이 기본 동작이지만, 성능 상으로 필요하다면 Keep Alive 옵션을 주어 일정 시간 동안 Connection을 유지하는 것이 가능하다. 

 

4-2. SOCKET 통신

- Server와 Client가 특정 Port를 통해 실시간으로 양방향 통신을 하는 방식


SOCKET 통신의 특징
- Server와 Client가 계속 연결을 유지하는 양방향 통신이다.
- Server와 Client가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 사용된다.

- 소켓 통신은 계속해서 Connection을 들고 있기 때문에 HTTP 통신에 비해 많은 리소스가 소모된다.
- 실시간 동영상 Streaming이나 온라인 게임 등과 같은 경우에 자주 사용된다.

 

4-3. 정리

조금 더 깊이 들어가 보면 HTTP는 결국 소켓 통신이다. 소켓은 IP와 Port number을 사용해 만들어진 통신의 양 끝단을 의미하는데 IP와 Port Number을 활용하는 TCP 레이어 위에 올라간 HTTP 또한 같은 방식을 사용한다. 즉, HTTP 통신은 소켓 통신을 활용한 통신 방식의 일종이기 때문이다.

 

하지만 둘을 구분하는 이유는 한쪽에서만 요청에 대한 응답을 하는 웹 통신의 특성 상 HTTP가 하나의 중요한 프로토콜로 구분되었기 때문이다. http:// 로 시작되는 프로토콜은 내부 구현에서는 소켓을 사용하지만 별도 프로토콜로 구분한 이유가 이것이다.


즉, HTTP 통신은 소켓통신의 일종이지만, 소켓통신이 HTTP 통신은 아니다.


출처

https://velog.io/@newdana01/%EC%86%8C%EC%BC%93%EC%9D%B4%EB%9E%80-%EC%A2%85%EB%A5%98-%ED%86%B5%EC%8B%A0-%ED%9D%90%EB%A6%84-HTTP%ED%86%B5%EC%8B%A0%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

소켓이란? 종류, 통신 흐름, HTTP통신과의 차이

네트워크를 경유하는 프로세스 간 통신의 종착점. OSI 7계층 중 응용 계층에 속하는 프로세스들은 데이터 송수신을 위해 반드시 소켓을 거쳐 전송 계층으로 데이터를 전달해야한다. 즉, 소켓은

velog.io

https://kotlinworld.com/75

 

HTTP 통신과 Socket 통신의 차이점

목표 Htttp 통신과 Socket 통신의 차이점을 이해한다. HTTP 통신이란? HTTP란 HyperText Transfer Protocol의 약자로 HTML 파일을 전송하는 프로토콜이라는 의미를 가진다. 웹브라우저에서 통신이 일어나며, 초

kotlinworld.com