TL;DR

  • ์†Œ์ผ“์€ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ํ†ต๋กœ์ด์ž ์ปค๋„ ์ž์›์„ ์ถ”์ƒํ™”ํ•œ ํŒŒ์ผ
  • ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“(UDS)์€ ๋กœ์ปฌ์—์„œ ๋น ๋ฅด๊ฒŒ, ๋„คํŠธ์›Œํฌ ์†Œ์ผ“(TCP/UDP)์€ ์›๊ฒฉ๊นŒ์ง€ ์—ฐ๊ฒฐ
  • ์ƒํ™ฉ๋ณ„ ์†Œ์ผ“ ์„ ํƒ ๊ธฐ์ค€๊ณผ UDS/TCP ๋…ธ์ถœ ๋ณด์•ˆ ์ฃผ์˜์‚ฌํ•ญ ์ •๋ฆฌ

์†Œ์ผ“ (Socket)์ด๋ž€?

โ€œ์†Œ์ผ“โ€์€ ํ”„๋กœ์„ธ์Šค A์™€ ํ”„๋กœ์„ธ์Šค B๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์—ฌ๋Š” ๋ฌธ(ํ†ต๋กœ)
๊ทธ ๋ฌธ์ด ํŒŒ์ผ ์‹œ์Šคํ…œ ์•ˆ์— ์žˆ๋А๋ƒ, IPยทํฌํŠธ ์ฃผ์†Œ๋กœ ๋…ธ์ถœ๋˜๋А๋ƒ์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰จ


์†Œ์ผ“์˜ ๋ณธ์งˆ โ€” ํŒŒ์ผ์ด๋‹ค

์ข…๋ฅ˜๋ฅผ ์™ธ์šฐ๊ธฐ ์ „์— ๋ณธ์งˆ์„ ๋จผ์ € ์žก์•„์•ผ ํ•œ๋‹ค. ์†Œ์ผ“์€ ํŒŒ์ผ์ด๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ ํŒŒ์ผ์€ ๋””์Šคํฌ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๋งŒ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค. ์ปค๋„ ์•ˆ์˜ ์–ด๋–ค ์ž์›์„ ์ถ”์ƒํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋„ ์ „๋ถ€ โ€œํŒŒ์ผโ€๋กœ ๋‹ค๋ฃฌ๋‹ค.
๊ทธ ์ž์›์ด ํ”„๋กœํ† ์ฝœ ์Šคํƒ(TCP/UDP ๋“ฑ) ์ค‘ ํ•˜๋‚˜๋ผ๋ฉด, ๊ทธ ํŒŒ์ผ์„ ํŠน๋ณ„ํžˆ ์†Œ์ผ“์ด๋ผ ๋ถ€๋ฅผ ๋ฟ์ด๋‹ค.
๊ฐ™์€ ์›๋ฆฌ๋กœ ๋ธ”๋ฃจํˆฌ์Šค ์žฅ์น˜๋ฅผ ์ถ”์ƒํ™”ํ•˜๋ฉด ๋ธ”๋ฃจํˆฌ์Šค ์†Œ์ผ“, ์ ์™ธ์„  ํ†ต์‹ (IrDA)์„ ์ถ”์ƒํ™”ํ•˜๋ฉด IrDA ์†Œ์ผ“์ด ๋œ๋‹ค.

์ฆ‰ โ€œ์†Œ์ผ“โ€์€ ์ปค๋„ ์ž์›์„ ํŒŒ์ผ์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์ด๋ฆ„ํ‘œ์— ๊ฐ€๊น๋‹ค.

์ด ๊ด€์ ์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์„ ๊ทธ๋Œ€๋กœ ์†Œ์ผ“์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
C์—์„œ ์ฝ˜์†”์ด๋‚˜ ๋””๋ฐ”์ด์Šค ํŒŒ์ผ์„ ์—ด์–ด writeํ•˜๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ™”๋ฉด์œผ๋กœ ๋‚˜๊ฐ€๋“ฏ, ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด TCP๋ผ๋ฉด ๋˜‘๊ฐ™์€ ์“ฐ๊ธฐ๊ฐ€ ๋„คํŠธ์›Œํฌ๋กœ ๋‚˜๊ฐ„๋‹ค. ๋Œ€์ƒ๋งŒ ๋ฐ”๋€” ๋ฟ โ€œ์—ด๊ณ  โ†’ ์ฝ๊ณ /์“ฐ๊ณ  โ†’ ๋‹ซ๋Š”โ€ ํ๋ฆ„์€ ๋™์ผํ•˜๋‹ค.

ํŒŒ์ผ I/O์™€ ์†Œ์ผ“์˜ ๋Œ€์‘

์ž…์ถœ๋ ฅ์˜ ํ–‰์œ„ ์ฃผ์ฒด๋Š” ํ”„๋กœ์„ธ์Šค๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ซ์œผ๋ฉฐ ์ฝ๊ณ  ์“ฐ๋“ฏ, ์†Œ์ผ“๋„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜‘๊ฐ™์ด ๋‹ค๋ฃฌ๋‹ค. ๋Œ€์ƒ์ด ๋„คํŠธ์›Œํฌ๋ผ ์ด๋ฆ„๋งŒ ๋ฐ”๋€๋‹ค.

๋™์ž‘์ผ๋ฐ˜ ํŒŒ์ผ์†Œ์ผ“
์—ด๊ธฐopensocket
์“ฐ๊ธฐwritesend
์ฝ๊ธฐreadrecv
๋‹ซ๊ธฐcloseclose

๊ทธ๋ž˜์„œ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฒฐ๊ตญ โ€œTCP๋ผ๋Š” ๋Œ€์ƒ์„ ์ถ”์ƒํ™”ํ•œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž…์ถœ๋ ฅ ๋ฐฉ๋ฒ•โ€์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด๋‹ค. ํŒŒ์ผ์„ fopen โ†’ read/write โ†’ fclose๋กœ ๋‹ค๋ฃจ๋“ฏ, ์†Œ์ผ“๋„ socket์œผ๋กœ ์—ด๊ณ  ์ค‘๊ฐ„์— ํ”„๋กœํ† ์ฝœ ํŠน์„ฑ์— ๋งž๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋ผ์šด ๋’ค ๋‹ซ๋Š”๋‹ค.

fd์˜ ์ •์ฒด โ€” ์ •์ˆ˜ handle๊ณผ ๊ทธ ์•„๋ž˜ ์„ธ ์ธต

open์ด๋‚˜ socket์ด ๋Œ๋ ค์ฃผ๋Š” fd๋Š” ํŒŒ์ผ์ด๋‚˜ ์†Œ์ผ“ ๊ทธ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ์ž์›์„ ๊ฐ€๋ฆฌํ‚ค๋ ค๊ณ  ๋ฐ›๋Š” ์ž‘์€ ์ •์ˆ˜ handle์ผ ๋ฟ์ด๋‹ค. ์‹ค์ œ๋กœ๋Š” ์„ธ ์ธต์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์ธต์ •์ฒด๋ฌด์—‡์„ ๋‹ด๋‚˜
fdํ”„๋กœ์„ธ์Šค๋ณ„ fd ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค์ธ ์ •์ˆ˜โ€3๋ฒˆ ํ•ธ๋“คโ€ ๊ฐ™์€ ์ฐธ์กฐ
open file descriptionfd๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋„ ๊ฐ์ฒด(open๋งˆ๋‹ค ํ•˜๋‚˜)ํ˜„์žฌ offset, ์ƒํƒœ ํ”Œ๋ž˜๊ทธ(O_NONBLOCK ๋“ฑ)
์‹ค์ œ ๊ฐ์ฒด์ง„์งœ ๋Œ€์ƒํŒŒ์ผ์ด๋ฉด inode, ์†Œ์ผ“์ด๋ฉด ์†Œ์ผ“ ๊ตฌ์กฐ์ฒด, ํŒŒ์ดํ”„๋ฉด ํŒŒ์ดํ”„ ๋ฒ„ํผ

๊ทธ๋ž˜์„œ โ€œ์†Œ์ผ“์€ ํŒŒ์ผ์ด๋‹คโ€์˜ ์ •ํ™•ํ•œ ๋œป์€ ์†Œ์ผ“ยทํŒŒ์ผยทํŒŒ์ดํ”„๊ฐ€ ์ „๋ถ€ ๊ฐ™์€ fd ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋…ธ์ถœ๋ผ ๊ฐ™์€ syscall๋กœ ๋‹ค๋ค„์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ์‹ค์ œ ๊ฐ์ฒด๋Š” ์ €๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งŒ์ง€๋Š” ์ฐฝ๊ตฌ(fd)๊ฐ€ ๊ท ์ผํ•ด readยทwriteยทclose๊ฐ€ ๋˜‘๊ฐ™์ด ํ†ตํ•œ๋‹ค. ์ด ๊ท ์ผํ•œ ์ฐฝ๊ตฌ๊ฐ€ ๊ณง ์œ ๋‹‰์Šค์˜ โ€œeverything is a fileโ€์˜ ์‹ค์ฒด๋‹ค.

์„ธ ์ธต์ด ๋ณ„๊ฐœ๋ผ๋Š” ๊ฑด ์ด๋Ÿฐ ๋ฐ์„œ ๋“œ๋Ÿฌ๋‚œ๋‹ค. dup(fd)๋Š” fd ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์€ open file description์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๊ณ (offset ๊ณต์œ ), ๊ฐ™์€ ํŒŒ์ผ์„ open์œผ๋กœ ๋‘ ๋ฒˆ ์—ด๋ฉด open file description ๋‘ ๊ฐœ๊ฐ€ ๊ฐ™์€ inode๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค(offset ๋”ฐ๋กœ). fd, open file description, ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธต์ด๋ผ โ€œfd = ํŒŒ์ผโ€๋กœ ๋ญ‰๋šฑ๊ทธ๋ฆฌ๋ฉด ์ด ๊ตฌ๋ถ„์ด ์•ˆ ๋ณด์ธ๋‹ค.

์ŠคํŠธ๋ฆผ, ์„ธ๊ทธ๋จผํŠธ, ํŒจํ‚ท

ํŒŒ์ผ ๊ฐœ๋…์—๋Š” ์ŠคํŠธ๋ฆผ์ด๋ผ๋Š” ๋‹จ์œ„๊ฐ€ ๋”ฐ๋ผ์˜จ๋‹ค. ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ appendํ•˜๋ฉด ๋’ค๋กœ ๊ณ„์† ์ด์–ด ๋ถ™๋“ฏ, ์†Œ์ผ“๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ์†ํ•ด์„œ ํ˜๋ ค๋ณด๋‚ธ๋‹ค. ์œ ์ € ์˜์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณด๋Š” ์†Œ์ผ“ ๋ฐ์ดํ„ฐ๋Š” ์ด๋ ‡๊ฒŒ ๋Š๊น€ ์—†์ด ์ด์–ด์ง„ ๋ฐ”์ดํŠธ ํ๋ฆ„, ์ฆ‰ ์ŠคํŠธ๋ฆผ์ด๋‹ค.

์ด ์ŠคํŠธ๋ฆผ์ด ์ปค๋„๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด ๋‹จ์œ„๊ฐ€ ๋ฐ”๋€๋‹ค. ์ „์†ก์„ ์œ„ํ•ด ์ผ์ • ํฌ๊ธฐ๋กœ ์ž˜๋ฆฌ๋Š”๋ฐ(segmentation), L4(์ „์†ก ๊ณ„์ธต)์—์„œ ์ž˜๋ฆฐ ์กฐ๊ฐ์ด ์„ธ๊ทธ๋จผํŠธ, L3(๋„คํŠธ์›Œํฌ ๊ณ„์ธต)์—์„œ IP ํ—ค๋” ๋“ฑ์œผ๋กœ ํฌ์žฅ๋œ ์กฐ๊ฐ์ด ํŒจํ‚ท์ด๋‹ค.

์ง์†Œ ํผ์ฆ ๋น„์œ 

์กฐ๊ฐ ํ•˜๋‚˜๊ฐ€ ํŒจํ‚ท(๋˜๋Š” ์„ธ๊ทธ๋จผํŠธ)์ด๋ผ๋ฉด, ๊ทธ ์กฐ๊ฐ๋“ค์ด ๋นˆํ‹ˆ์—†์ด ์ด์–ด ๋ถ™์–ด ์™„์„ฑ๋œ ๊ทธ๋ฆผ์ด ์ŠคํŠธ๋ฆผ์ด๋‹ค. ๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ • ๋‹จ์œ„๋กœ ์ž๋ฅด๋Š” ๊ฒƒ์ด ์„ธ๊ทธ๋จผํ…Œ์ด์…˜์ด๊ณ , ์ž˜๋ฆฐ ์กฐ๊ฐ์„ ์ธํ„ฐ๋„ท์—์„œ ์œ ํ†ต ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ํฌ์žฅํ•œ ๊ฒƒ์ด ํŒจํ‚ท์ด๋‹ค.


์™œ ์†Œ์ผ“์„ ์จ์•ผ ํ• ๊นŒ?

ํ‘œ์ค€ IPC API
  • socket() โ†’ bind() โ†’ listen() โ†’ accept() ํ˜ธ์ถœ๋งŒ ์•Œ๋ฉด ๋‚ด๋ถ€ยท์™ธ๋ถ€ ํ†ต์‹ ์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
์–‘๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆผ
  • ํ•œ์ชฝ์ด send() ํ•˜๋ฉด ์ƒ๋Œ€๊ฐ€ recv()๋กœ ๋ฐ”๋กœ ์ฝ์Œ. ํŒŒ์ดํ”„ยท๋ฉ”์‹œ์ง€ ํ๋ณด๋‹ค ์œ ์—ฐ
์–ธ์–ดยทํ”Œ๋žซํผ ๋…๋ฆฝ
  • C, Python, Go, Java ๋“ฑ ๋ญ๋กœ ๋งŒ๋“ค์–ด๋„ ์„œ๋กœ ๋ถ™์ผ ์ˆ˜ ์žˆ์Œ

์†Œ์ผ“์˜ ์ข…๋ฅ˜

์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“ (UDS, .sock)
ํŠน์ง•์„ค๋ช…
์ฃผ์†ŒํŒŒ์ผ ๊ฒฝ๋กœ(AF_UNIX), ์˜ˆ: /var/run/docker.sock
๋ฒ”์œ„๊ฐ™์€ ๋จธ์‹ 
์†๋„TCP๋ณด๋‹ค ๋น ๋ฆ„ (์ปค๋„ ๋‚ด๋ถ€ ๋ณต์‚ฌ ํ•œ ๋ฒˆ)
๊ด€๋ฆฌํŒŒ์ผ ๊ถŒํ•œ์œผ๋กœ ์ ‘๊ทผ ์ œ์–ด
์‚ฌ์šฉ์ฒ˜Docker CLI โ†” dockerd, Nginx โ†” PHP-FPM, MySQL ๋กœ์ปฌ ์ ‘์† ๋“ฑ
# Docker ๋ฐ๋ชฌ์— ์ง์ ‘ REST ์š”์ฒญ
curl --unix-socket /var/run/docker.sock http://localhost/containers/json
๋„คํŠธ์›Œํฌ ์†Œ์ผ“ (TCP/UDP)
ํŠน์ง•์„ค๋ช…
์ฃผ์†ŒIP:ํฌํŠธ(AF_INET), ์˜ˆ: 127.0.0.1:8080, 0.0.0.0:443
๋ฒ”์œ„๋กœ์ปฌ โ†” LAN โ†” ์ธํ„ฐ๋„ท ์–ด๋””๋“ 
ํ”„๋กœํ† ์ฝœTCP(์—ฐ๊ฒฐ ์ง€ํ–ฅ), UDP(๋ฉ”์‹œ์ง€ ์ง€ํ–ฅ)
๋ณด์•ˆ๋ฐฉํ™”๋ฒฝยทTLSยทmTLS ํ•„์š”
์‚ฌ์šฉ์ฒ˜์›น ์„œ๋ฒ„, REST API, ๊ฒŒ์ž„ ์„œ๋ฒ„, IoT
# ํŒŒ์ด์ฌ ๋ฏธ๋‹ˆ TCP ์„œ๋ฒ„
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("0.0.0.0", 8888))
s.listen()
conn, _ = s.accept()
conn.sendall(b"Hello over TCP!\n")
๋น„๊ต
ํ•ญ๋ชฉ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“๋„คํŠธ์›Œํฌ ์†Œ์ผ“
์ฃผ์†Œ ํ˜•ํƒœํŒŒ์ผ ๊ฒฝ๋กœIP:Port
ํ†ต์‹  ๋ฒ”์œ„๋กœ์ปฌ ๋จธ์‹ ๋กœ์ปฌ โ†” ์›๊ฒฉ
์˜ค๋ฒ„ํ—ค๋“œ๋‚ฎ์Œ๋†’์Œ
์ ‘๊ทผ ์ œ์–ดํŒŒ์ผ ํผ๋ฏธ์…˜๋ฐฉํ™”๋ฒฝยทTLS
์ฃผ์š” ์‚ฌ์šฉ์ฒ˜๋ฐ๋ชฌ โ†” CLI, IPCHTTP, gRPC, ๊ฒŒ์ž„

์–ธ์ œ ๋ฌด์—‡์„ ์“ฐ๋ฉด ์ข‹์„๊นŒ?

์ƒํ™ฉ์ถ”์ฒœ ์†Œ์ผ“
๊ฐ™์€ ์„œ๋ฒ„ ์•ˆ ๋‘ ํ”„๋กœ์„ธ์ŠคUDS
์ปจํ…Œ์ด๋„ˆ โ†” ํ˜ธ์ŠคํŠธ ๋ฐ๋ชฌUDS
๋‹ค๋ฅธ ๋จธ์‹ ๊ณผ ํ†ต์‹ TCP/UDP
๋ชจ๋ฐ”์ผยท๋ธŒ๋ผ์šฐ์ € ์ ‘๊ทผTCP/UDP

์ฒ˜์Œ์—” UDS๋กœ ๊ฐœ๋ฐœํ•˜๊ณ , ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ ๋„คํŠธ์›Œํฌ ์†Œ์ผ“์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ํŒจํ„ด๋„ ์ž์ฃผ ์‚ฌ์šฉ


๋ณด์•ˆ ๋ฌธ์ œ

UDS๋„ โ€œ๋ฃจํŠธ ์—ด์‡ โ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ
  • /var/run/docker.sock ์“ฐ๊ธฐ ๊ถŒํ•œ์€ ๋„์ปค ๋ฐ๋ชฌ ์ „๊ถŒ์„ ์˜๋ฏธ
TCP 2375(๋ฌดTLS) ๋…ธ์ถœ ๊ธˆ์ง€
  • dockerd -H tcp://0.0.0.0:2375 ๊ทธ๋Œ€๋กœ ๋„์šฐ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๊ฐ€๋Šฅ
TLS/mTLS, SSH ํ„ฐ๋„ ํ•„์ˆ˜
  • ์›๊ฒฉ ์†Œ์ผ“์€ ๋ฐ˜๋“œ์‹œ ์•”ํ˜ธํ™” + ์ธ์ฆ ๊ณ„์ธต์„ ์–น์–ด์•ผ ํ•จ

๋งˆ๋ฌด๋ฆฌ

์†Œ์ผ“์€ โ€œํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋Œ€ํ™” ์ฐฝ๊ตฌโ€

  • UDS๋Š” ๊ฐ™์€ ์„œ๋ฒ„ ์—์„œ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ,
  • TCP/UDP๋Š” ์„ธ์ƒ ์–ด๋””์„œ๋‚˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

ํ”„๋กœ์ ํŠธ ์š”๊ตฌ ์‚ฌํ•ญ(๋ฒ”์œ„, ์„ฑ๋Šฅ, ๋ณด์•ˆ)์— ๋งž์ถฐ ๋‘ ์ข…๋ฅ˜๋ฅผ ์ ์ ˆํžˆ ์„ ํƒํ•ด์•ผ ํ•จ


๊ด€๋ จ ๋…ธํŠธ