[포스코 x 코딩온] 스마트팩토리 개발자 과정 12주차 | 소켓

배돌·2023년 3월 22일
0

소켓

소켓(Socket)은 네트워크를 경유해서 통신을 하기 위한 도구로 컴퓨터 간 통신에 이용되는 인터페이스다. IP주소, 포트번호, 프로토콜을 담고 있으며, 클라이언트 쪽에서 서버에 요청을 보내면 서버에서 소켓을 생성해 통신이 가능하도록 한다.

예시로 서울에 사는 개똥이와 부산에 사는 금똥이에게 생일파티 초대장을 보낸다고 하자. 개똥이는 편지에 금똥이의 주소와 내용을 적어 우체통에 넣고, 금똥이는 우편함에서 편지를 받아서 메시지를 확인하고, 다시 개똥이에게 우편을 보내는 방식으로 답신한다. 이 과정에서 소켓은 편지지와 비슷한 역할을 한다.

소켓이 없다면 데이터를 전송하고 받는 작업을 직접 구현해야 한다. 소켓을 사용하면 이러한 작업을 직접 구현할 필요 없이 네트워크상에서 프로그램들끼리 통신을 가능하게 해준다.

TCP/UDP 소켓

소켓은 일반적으로 TCP와 UDP 프로토콜을 구현하는 데 사용된다.

1. TCP 소켓

TCP 소켓을 구현하기 위해서는 다음과 같은 함수들이 필요로 한다.

  • socket() : 소켓의 생성. 프로토콜 패밀리와 소켓 타입을 매개변수로 설정한다.

프로토콜 패밀리 : 소켓이 사용할 네트워크 프로토콜을 결정한다. 옵션은 많은데 주로 AF_INET(인터넷 주소체계), AF_UNIX(유닉스 주소체계)를 사용한다.

소켓 타입 : 소켓이 어떤 특성을 갖는지를 지정한다. 주요한 소켓 타입으로는
SOCK_STREAM(연결 지향형 TCP 소켓)과 SOCK_DGRAM(비연결형 UDP 소켓)이 있다.

  • bind() : 소켓에 IP 주소와 포트 번호를 할당. 소켓을 구분, 식별해주는 역할.

  • listen() : 소켓을 수신 대기 상태로 전환하는 함수. 클라이언트의 연결 요청을 받을 준비를 한다.

  • accept() : 클라이언트의 연결 요청을 수락하고 새로운 소켓을 생성하는 함수.
    클라이언트와 통신할 새로운 소켓을 생성하고, 이 소켓을 통해 클라이언트와 데이터를 주고 받는다.

  • connect() : 서버에 연결을 요청하는 함수. 클라이언트 소켓에서 호출한다.

  • send(), recv(): 소켓으로 데이터를 전송, 수신하는 함수. 소켓 버퍼에 데이터를 쓰거나 읽고, 네트워크로 전송/반환 한다.

  • close() : 연결 종료.

TCP 소켓은 안정적이고 신뢰성 높은 데이터 전송을 보장한다.

2. UDP 소켓

UDP 소켓을 구현할 위해서는 다음과 같은 함수들이 필요로 한다.

  • socket(), close() : TCP 방식과 동일한 역할

  • bind() : 서버 뿐만 아니라 클라이언트 쪽에서도 실행한다.

  • listen(), accept() : 연결 방식 특성상 생략한다.

  • sendto(), recvfrom(): TCP 방식에서의 send(), rect()의 역할.

UDP 소켓은 TCP 소켓보다 빠르고 경량화되어 있어 대용량 데이터 전송이나 실시간 스트리밍 등 높은 성능을 요구하는 서비스에 적합하다.

통합 주소 체계가 필요한 이유

struct sockaddr_un {	struct sockaddr_in {
sun_family;				sun_family;
sun_path[-];			sin_port; //port
}						sin_addr; //ip
						}

위의 코드는 각각 유닉스와 인터넷 주소체계를 구조체의 형태로 나타낸 것이다.

유닉스 주소체계 구조체(struct sockaddr_un)
sun_family : 소켓의 주소 체계
sun_path : 소켓 파일의 경로

인터넷 주소 체계 구조체 (struct sockaddr_in, IPv4)
sin_family : 소켓의 주소 체계
sin_port : 포트 번호
sin_addr : IP 주소

주소 체계의 형식이 다른 기기와 통신을 하려면 통신 할 때마다 IP 주소와 포트 번호를 따로 지정해야 하기 때문에 번거로워 진다. 또한 같은 기기에서 여러 개의 서비스를 제공할 때 서비스를 구분하기 어렵고, 네트워크 보안에도 취약해진다.

통합 주소 체계(Unified Addressing System / Scheme) 는 소켓에서 IP 주소와 포트 번호를 조합하여 생성되는 주소 체계를 말한다. IP 주소는 네트워크 상에서 기기를 식별하는 데 사용되고, 포트 번호는 해당 기기에서 실행 중인 프로세스나 애플리케이션을 식별하는 데 사용된다.

struct sockaddr {
u_short sa_family;	
char sa_data[-];	
}

통합 주소 체계 구조체
sa_family : 소켓의 주소 체계
sa_data : IP 주소, 포트 번호. 크기가 가변적

-> 구체적인 IP 주소와 포트 번호는 사용하는 주소 체계에 따라 다르기 때문에 가변적인 크기를 가진 sa_data 멤버를 사용하여 저장.

일반적으로 통합 주소체계는 16바이트 크기로 설계 되어 있지만 구조체에 할당된 공간이 다른 주소 체계에서 필요한 공간보다 더 커야 정상적으로 작동한다.

통합 주소 체계는 다양한 주소 체계를 하나의 API로 처리할 수 있어 편리하고 IPv6와 같은 새로운 주소 체계의 도입을 용이하게 한다. 또한 호스트와 네트워크 주소를 하나로 묶어 사용할 수 있어 구조적으로 간결해지게 된다. 짱이네.

profile
스마트팩토리 지향 누-비

0개의 댓글