TL;DR
- ์์ผ์ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ์ํ ํต๋ก์ด์ ์ปค๋ ์์์ ์ถ์ํํ ํ์ผ
- ์ ๋์ค ๋๋ฉ์ธ ์์ผ(UDS)์ ๋ก์ปฌ์์ ๋น ๋ฅด๊ฒ, ๋คํธ์ํฌ ์์ผ(TCP/UDP)์ ์๊ฒฉ๊น์ง ์ฐ๊ฒฐ
- ์ํฉ๋ณ ์์ผ ์ ํ ๊ธฐ์ค๊ณผ UDS/TCP ๋ ธ์ถ ๋ณด์ ์ฃผ์์ฌํญ ์ ๋ฆฌ
์์ผ (Socket)์ด๋?
โ์์ผโ์ ํ๋ก์ธ์ค A์ ํ๋ก์ธ์ค B๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ๋ ๋ฌธ(ํต๋ก)
๊ทธ ๋ฌธ์ด ํ์ผ ์์คํ
์์ ์๋๋, IPยทํฌํธ ์ฃผ์๋ก ๋
ธ์ถ๋๋๋์ ๋ฐ๋ผ ๋ ๊ฐ์ง๋ก ๋๋จ
์์ผ์ ๋ณธ์ง โ ํ์ผ์ด๋ค
์ข ๋ฅ๋ฅผ ์ธ์ฐ๊ธฐ ์ ์ ๋ณธ์ง์ ๋จผ์ ์ก์์ผ ํ๋ค. ์์ผ์ ํ์ผ์ด๋ค.
๋ฆฌ๋
์ค์์ ํ์ผ์ ๋์คํฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ง ๊ฐ๋ฆฌํค์ง ์๋๋ค. ์ปค๋ ์์ ์ด๋ค ์์์ ์ถ์ํํ ์ธํฐํ์ด์ค๋ ์ ๋ถ โํ์ผโ๋ก ๋ค๋ฃฌ๋ค.
๊ทธ ์์์ด ํ๋กํ ์ฝ ์คํ(TCP/UDP ๋ฑ) ์ค ํ๋๋ผ๋ฉด, ๊ทธ ํ์ผ์ ํน๋ณํ ์์ผ์ด๋ผ ๋ถ๋ฅผ ๋ฟ์ด๋ค.
๊ฐ์ ์๋ฆฌ๋ก ๋ธ๋ฃจํฌ์ค ์ฅ์น๋ฅผ ์ถ์ํํ๋ฉด ๋ธ๋ฃจํฌ์ค ์์ผ, ์ ์ธ์ ํต์ (IrDA)์ ์ถ์ํํ๋ฉด IrDA ์์ผ์ด ๋๋ค.
์ฆ โ์์ผโ์ ์ปค๋ ์์์ ํ์ผ์ฒ๋ผ ๋ค๋ฃจ๊ธฐ ์ํ ์ด๋ฆํ์ ๊ฐ๊น๋ค.
์ด ๊ด์ ์ด ์ค์ํ ์ด์ ๋ ํ์ผ์ ๋ค๋ฃจ๋ ๋ฐฉ์์ ๊ทธ๋๋ก ์์ผ์ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
C์์ ์ฝ์์ด๋ ๋๋ฐ์ด์ค ํ์ผ์ ์ด์ด writeํ๋ฉด ๊ทธ ๋ฐ์ดํฐ๊ฐ ํ๋ฉด์ผ๋ก ๋๊ฐ๋ฏ, ๊ฐ๋ฆฌํค๋ ๋์์ด TCP๋ผ๋ฉด ๋๊ฐ์ ์ฐ๊ธฐ๊ฐ ๋คํธ์ํฌ๋ก ๋๊ฐ๋ค. ๋์๋ง ๋ฐ๋ ๋ฟ โ์ด๊ณ โ ์ฝ๊ณ /์ฐ๊ณ โ ๋ซ๋โ ํ๋ฆ์ ๋์ผํ๋ค.
ํ์ผ I/O์ ์์ผ์ ๋์
์ ์ถ๋ ฅ์ ํ์ ์ฃผ์ฒด๋ ํ๋ก์ธ์ค๋ค. ํ๋ก์ธ์ค๊ฐ ํ์ผ์ ์ด๊ณ ๋ซ์ผ๋ฉฐ ์ฝ๊ณ ์ฐ๋ฏ, ์์ผ๋ ํ๋ก์ธ์ค๊ฐ ๋๊ฐ์ด ๋ค๋ฃฌ๋ค. ๋์์ด ๋คํธ์ํฌ๋ผ ์ด๋ฆ๋ง ๋ฐ๋๋ค.
| ๋์ | ์ผ๋ฐ ํ์ผ | ์์ผ |
|---|---|---|
| ์ด๊ธฐ | open | socket |
| ์ฐ๊ธฐ | write | send |
| ์ฝ๊ธฐ | read | recv |
| ๋ซ๊ธฐ | close | close |
๊ทธ๋์ ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ๊ฒฐ๊ตญ โTCP๋ผ๋ ๋์์ ์ถ์ํํ ํ์ผ์ ๋ํ ์
์ถ๋ ฅ ๋ฐฉ๋ฒโ์ ๋ฐฐ์ฐ๋ ๊ฒ์ด๋ค. ํ์ผ์ fopen โ read/write โ fclose๋ก ๋ค๋ฃจ๋ฏ, ์์ผ๋ socket์ผ๋ก ์ด๊ณ ์ค๊ฐ์ ํ๋กํ ์ฝ ํน์ฑ์ ๋ง๋ ์ฒ๋ฆฌ๋ฅผ ๋ผ์ด ๋ค ๋ซ๋๋ค.
fd์ ์ ์ฒด โ ์ ์ handle๊ณผ ๊ทธ ์๋ ์ธ ์ธต
open์ด๋ socket์ด ๋๋ ค์ฃผ๋ fd๋ ํ์ผ์ด๋ ์์ผ ๊ทธ ์์ฒด๊ฐ ์๋๋ค. ํ๋ก์ธ์ค๊ฐ ๊ทธ ์์์ ๊ฐ๋ฆฌํค๋ ค๊ณ ๋ฐ๋ ์์ ์ ์ handle์ผ ๋ฟ์ด๋ค. ์ค์ ๋ก๋ ์ธ ์ธต์ผ๋ก ๋๋๋ค.
| ์ธต | ์ ์ฒด | ๋ฌด์์ ๋ด๋ |
|---|---|---|
| fd | ํ๋ก์ธ์ค๋ณ fd ํ ์ด๋ธ์ ์ธ๋ฑ์ค์ธ ์ ์ | โ3๋ฒ ํธ๋คโ ๊ฐ์ ์ฐธ์กฐ |
| open file description | fd๊ฐ ๊ฐ๋ฆฌํค๋ ์ปค๋ ๊ฐ์ฒด(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, IPC | HTTP, 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๋ ์ธ์ ์ด๋์๋ ์ฐ๊ฒฐํ ์ ์์
ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ(๋ฒ์, ์ฑ๋ฅ, ๋ณด์)์ ๋ง์ถฐ ๋ ์ข ๋ฅ๋ฅผ ์ ์ ํ ์ ํํด์ผ ํจ
๊ด๋ จ ๋ ธํธ
- WebSocket ํ๋กํ ์ฝ ์ค๊ณ์ ๋น๋ฐ - TCP ์์ผ ์์์ ๋์ํ๋ WebSocket ํ๋กํ ์ฝ์ ์ค๊ณ ๊ฒฐ์