Socket
Socket의 정의
소켓은 네트워크 상에서 돌아가는 두 개의 프로그램 간 양방향 통신의 하나의 엔드포인트이다. 포트번호로 바인딩되어 TCP 계층에서 데이터가 전달되어야하는 Application을 식별할 수 있게 해준다.
소켓은 프로토콜, IP주소, 포트번호로 정의된다. 다시 말해 소켓은 두 호스트를 연결하는 인터페이스 역할을 하는 데이터를 주고 받을 수 있는 구조체이다. 이를 통해 데이터 통로가 만들어진다. 소켓은 서버 소켓, 클라이언트 소켓으로 구분된다.
End-point
엔드포인트는 IP주소와 포트번호의 조합을 의미한다. 모든 TCP 연결은 2개의 엔드포인트로 유일하게 식별되어지고, 서버와 클라이언트 간의 여러 개의 연결이 맺어질 수 있다.
Socket 통신
![](https://velog.velcdn.com/images/xx0hn/post/d52f9b31-7b3d-4413-9027-86d35f2391ad/image.png)
소켓 통신은 서버가 클라이언트의 연결 요청을 소켓을 통해 리스닝하며 기다리고, 클라이언트의 요청을 받으면 이를 허가하고 소켓을 생성시켜 read, write할 수 있도록 하는 통신 기술이다.
Server Socket
클라이언트 소켓의 연결 요청을 항상 기다리는 Listening상태로 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신이 가능하도록 한다.
- socket() 함수를 통해 소켓을 생성
- bind() 함수로 IP와 Port번호를 설정
- listen() 함수로 클라이언트의 연결 요청을 기다림
- accept() 함수로 클라이언트의 연결 요청을 수락하고 소켓을 생성
Client Socket
클라이언트 소켓에서 실제로 데이터 송수신이 일어난다.
- socket() 함수로 가장 먼저 소켓 오픈
- connect()함수로 통신 할 서버의 IP와 Port번호에 통신 시도
- 서버가 accept() 함수로 클라이언트의 socket descriptor를 반환
- 클라이언트와 서버가 서로 read(), write()를 하며 통신
Socket 종류
Stream (TCP)
- 양방향으로 Byte stream 전송. (연결 지향성)
- 오류 수정, 정송처리, 흐름제어 보장
- 송신된 순서에 따라 중복되지 않도록 데이터를 수신 (이에 따른 오버헤드 발생)
- 소량의 데이터보다 대량의 데이터 전송에 적합 (TCP 사용)
Datagram (UDP)
- 비연결형 소켓
- 데이터의 크기에 제한
- Best effort (확실한 전달 보장 X, 데이터 손실이 발생해도 에러 발생 X)
- 실시간 멀티미디어 정보를 처리하기 위해 주로 사용 (ex. 전화)
HTTP 통신 VS Socket 통신
HTTP 통신
![](https://velog.velcdn.com/images/xx0hn/post/b8183264-2f11-4aac-9087-899500d55599/image.png)
클라이언트의 요청이 있을 때에만 서버가 응답하여 해당 정보를 전송하고, 곧바로 연결을 종료
HTTP 통신 특징
- 클라이언트가 연결 요청을 하는 경우에만 서버가 응답하는 단방향 통신
- 서버로부터 응답 받은 후, 연결 바로 종료
- 실시간 연결이 아니고 필요한 경우에만 서버로 요청을 보내는 상황에 유용
- 요청을 보내 서버의 응답을 기다리는 어플리케이션의 개발에 주로 사용
Socket 통신
![](https://velog.velcdn.com/images/xx0hn/post/41de2145-beba-4c62-a539-9faf863e98a4/image.png)
서버와 클라이언트가 특정 포트를 통해 실시간으로 양방향 통신을 하는 방식
Socket 통신 특징
- 서버와 클라이언트가 계속 연결을 유지하는 양방향 통신
- 서버와 클라이언트가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 사용
- 실시간 동영상 스트리밍이나 온라인 게임 등에 사용
정리
- 소켓 통신은 소켓을 통해 클라이언트가 서버에 연결을 요청하고, 서버는 소켓을 통해 리스닝 상태에 있다가 클라이언트의 요청을 받으면 이를 수락하고 이에 대한 소켓을 생성한다. 이렇게 클라이언트와 서버가 연결된다.
- 소켓 통신은 소켓을 통해 서버와 클라이언트의 연결을 유지하고, 양방향 통신을 제공
- 소켓 통신은 실시간성이 중요한 서비스에 주로 이용됨
- HTTP 통신은 클라이언트의 요청에 대한 응답을 서버가 제공하고 연결을 바로 끊는 단방향 통신 제공
- HTTP 통신은 클라이언트의 요청에 대한 서버의 응답이 주어지는 서비스에 주로 이용됨