Unix Domain Socket 알아보기

Unix Domain Socket 알아보기

유닉스 도메인 소켓

Go 언어를 활용한 네트워크 프로그래밍 책을 보고 배움

  • 동일한 네트워크 노드 내에서 각기 다른 서비스들이 통신할 수 있도록 함

  • 예를들어 하나의 시스템 환경에서 API 서버와 데이터베이스 어플리케이션을 동시에 구동시킬 때, API에서 통신 대상 경로를 localhost:3306으로 지정하는 경우도 있지만, 유닉스 도메인 소켓을 통해 통신할 수 도 있음.

  • 네트워크 소켓는 IP 주소와 포트 번호로 목적지를 결정하지만, 유닉스 도메인 소켓은 파일 시스템을 이용하여 패킷의 목적지 주소를 결정. 즉 ==파일시스템 내의 특정 파일이 네트워크 소켓의 IP와 포트번호가 하는 역할을 대신 하는 것==

  • 네트워크 스택을 지나지 않기 때문에, 트래픽 라우팅에 대한 오버헤드가 존재하지 않아 효율적 (유닉스 도메인 소켓은 OSI Layer 를 지나지 않음)

  • 패킷 파편화나 패킷 순서를 걱정할 필요가 없음 (OSI Layer를 지나지 않으니)

  • 당연히 노드간 통신에는 사용할 수 없다.

사용

  • 파일의 소유권을 가지고 있어야 함
chown seankim /path/to/socket/file
  • 660권한 부여해야함
chmod 660 /path/to/socket/file

소켓 타입

타입설명
스트리밍소켓TCP 처럼 동작
데이터그램 소켓UDP 처럼 동작
시퀀스 패킷 소켓두개 합친느낌

예시 (소켓으로 로컬환경의 db와 통신)

func main() {  
   db, err := sql.Open("mysql", "username:password@unix(/path/to/socket)/database") 
   if err != nil { 
       panic(err) 
   } 
   defer db.Close() 

   var count int 
   err = db.QueryRow("SELECT COUNT(*) FROM users").Scan(&count) 
   if err != nil { 
       panic(err) 
   } 

   fmt.Println("Number of users:", count) 
}

기타

윈도우 OS같은 비 유닉스 환경에서는 사용할 수 없다.