TCP ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ

ํด๋ผ์ด์ธํธ๋ socket()์ผ๋ก ์์ผ์ ๊ฐ์คํ๋ ๊ฒ์ ์์์ผ๋ก ํ๋ค.
์ฐ๊ฒฐํ ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด connect()๋ฅผ ํธ์ถํ์ฌ
์๋ฒ์ ์ฐ๊ฒฐ์ ์์ฒญํ๊ณ ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ง๋ฉด
send()์ recv()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๊ณ
์์ ์ด ์ข ๋ฃ๋๋ฉด close()๋ก ์์ผ์ ๋ซ๋๋ค.
์ด๊ฑฐ๋ฅผ ๋จ๊ณ๋ณ๋ก ์์ธํ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
1. socket(), ์์ผ ๊ฐ์ค
์ฌ์ฉํ ํ๋กํ ์ฝ(TCP, UDP ์์ผ)์ ์ ํํ๋ค.
| ํ๋กํ ์ฝ | ์์ผ |
| TCP | SOCK_STREAM |
| UDP | SOCK_DGRAM |
ํด๋ผ์ด์ธํธ๋ ๋จผ์ socket()์ผ๋ก ์์ผ์ ๊ฐ์คํด์ผ ํ๋๋ฐ ์ด๋ ํ๋กํ ์ฝ ์ฒด๊ณ๋ฅผ PF_INET๋ก ์ ํํ๊ณ , ์๋น์ค ํ์ ์ SOCK_STREAM์ผ๋ก ์ ํํ๋ค.
socket() ํธ์ถ ์ ํธ๋์คํฌํธ ํ๋กํ ์ฝ๋ง์ ์ง์ ํ๊ฒ ๋๋๋ฐ socket() ์ํ ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ํ๋ ๋์์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.

์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์ํด์๋ 5๊ฐ์ง ์์๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
1. ์ฌ์ฉํ ํธ๋์คํฌํธ ํ๋กํ ์ฝ(์คํธ๋ฆผ or ๋ฐ์ดํฐ๊ทธ๋จ)
2. ์์ ๊ณผ ์๋๋ฐฉ์ IP ์ฃผ์
3. ์์ ๊ณผ ์๋๋ฐฉ์ port ๋ฒํธ
์ฝ๊ฒ๋งํด, ์ฌ์ฉํ ํ๋กํ ์ฝ์ ์ง์ ํ์ฌ socket()์ ํธ์ถํ๋ฉด ์๋ก ์์ฑ๋ ์์ผ๊ณผ ์์ผ๋ฒํธ๊ฐ ๋ฐํ๋๋ค.
2. connect(), ์๋ฒ์ ์ฐ๊ฒฐ ์์ฒญ
ํด๋ผ์ด์ธํธ๋ connect()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ฐ๊ฒฐํ๊ณ ์ ํ๋ ์๋ฒ์ ์ฃผ์๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
4๋ฐ์ดํธ์ IP ์ฃผ์์ 2๋ฐ์ดํธ์ ํฌํธ ๋ฒํธ๋ฅผ ํฌํจํ๋ ์์ผ ์ฃผ์ ๊ตฌ์กฐ์ฒด sockaddr_in์ ๊ตฌํํด์ผ ํ๋ค.
sockaddr_in: ์ฐ๊ฒฐํ๊ณ ์ ํ๋ ์๋ฒ์ ์ฃผ์ ์ง์ (IP, port)
int connect (
int s, // ์๋ฒ์ ์ฐ๊ฒฐ์ํฌ ์์ผ๋ฒํธ
const struct sockaddr *addr, // ์๋๋ฐฉ ์๋ฒ์ ์์ผ์ฃผ์ ๊ตฌ์กฐ์ฒด
int addrlen); // ๊ตฌ์กฐ์ฒด *addr์ ํฌ๊ธฐ
์ด๋ ํด๋ผ์ด์ธํธ๋ bind()๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ด ์ฌ์ฉํ ํฌํธ ๋ฒํธ๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ ํ์๊ฐ ์๋ค.
TCP์ ๊ฐ์ ์ฐ๊ฒฐํ ํด๋ผ์ด์ธํธ์์๋ conenct()๋ฅผ ํธ์ถํ ๋, TCP๊ฐ ์์์ ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.

3. send(), recv(), ๋ฐ์ดํฐ ์ก์์
TCP ์์ผ์ ๋ฐ์ดํฐ ์ก์์ ๋ฉ์๋๋ ์๋์ ๊ฐ๋ค.
| ๋ฌธ๋ฒ | ์ธ์ | |
| int send(int s, char* buf, int length, int flags); | s | ์์ผ๋ฒํธ |
| buf | ์ ์กํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฒํผ | |
| length | buf ํฌ๊ธฐ | |
| flags | default: 0 | |
| int write(int s, const void* buf, int length) | s | ์์ผ๋ฒํธ |
| buf | ์ ์กํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฒํผ | |
| length | buf ๊ธธ์ด | |
| int recv(int s, char* buf, int length, int flags); | s | ์์ผ๋ฒํธ |
| buf | ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฒํผ | |
| length | buf ๊ธธ์ด | |
| flags | default: 0 | |
| int read(int s, void* buf, int length); | s | ์์ผ๋ฒํธ |
| buf | ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฒํผ | |
| length | buf์ ๊ธธ์ด | |
๋ฉ์์ง ์ก์ ํจ์๋ค์ ์ค์ ๋ก ๋ฏธ์์ง ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ฆฌํดํ๋ฉฐ,
๋ฉ์์ง ์์ ํจ์๋ ์ค์ ๋ก ์ฝ์ ๋ฉ์์ง ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ฆฌํดํ๋ค.
TCP ์์ผ ์ก์ ํจ์ ์ฌ์ฉ์,
TCP ์์ผ์์ write(), send()๋ฅผ ์คํํ๋ฉด ๋ฉ์์ง๋ TCP ๊ณ์ธต์ ์ก์ ๋ฒํผ(send buffer)์ ์ ์ฅ๋๋ค.
์ฆ write() ๋ฌธ์ด ๋ฆฌํด๋๋ฉด, ์์ ์ TCP์ ์๋ ์ก์ ๋ฒํผ์ ๋ฉ์์ง๊ฐ ๋ค์ด๊ฐ ๊ฒ.
๊ทธ๋ฆฌ๊ณ ์ก์ ๋ฒํผ์ ๋ด๊ธด ๊ฒ!= ๋ฉ์์ง ์ ์ก ์๋ฃ๊ฐ ์๋์ ์ฃผ์ํด์ผ ํ๋ค!
TCP ์์ผ ์์ ํจ์ ์ฌ์ฉ ์,
recv(), read()๋ ์คํธ๋ฆผํ(TCP) ์์ผ์ ํตํ์ฌ ํจํท์ ์ก์ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์์ ํ ์์ผ ๋ฒํธ, ์์ ๋ฒํผ, ์ฝ์ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ฌ, ์ค์ ๋ก ์ฝ์ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๋ฆฌํดํ๋ค.
โ
์คํธ๋ฆผ ์์ผ์์๋
ํ๋์ IP ํจํท์ด ํ ๋ฒ์ ์ ์กํ ์ ์๋ ์ต๋ ๋ฉ์์ง ํฌ๊ธฐ(MSS) ๋ณด๋ค ํฐ ๋ฉ์์ง๋ฅผ ์ก์ ๋ฒํผ์ ์ ์ฅํ๊ณ wirte()๋ send()๋ฅผ ํธ์ถํ ์ ์๋๋ฐ,
์ด๋ ์ ์ฒด ๋ฉ์์ง๊ฐ MSS ํฌ๊ธฐ๋ก ์๋ ๋ถํ ๋์ด ์ ์ก๋๋ค.
์ ์ฒด ๋ฐ์ดํฐ๋ฅผ IP ํจํท ๋จ์๋ก (์๋) ๋ถํ ์ ์กํ๋ฉด ๋ถ์ค ์ฌ๋ถ๋ฅผ ํ์ ํ ์ ์๊ณ ํ์์ ๋ฐ๋ผ ์ฌ์ ์ก ์๊ตฌ ๊ฐ๋ฅ!(TCP ์ ๋ขฐ์ฑ) ์ด๊ฒ์ด ์คํธ๋ฆผ ์์ผ์ ์ฅ์
๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๊ทธ๋จ(UDP) ์์ผ์์๋
์ฌ์ฉ์๊ฐ ์ ์ก ์๊ตฌํ ๋ฉ์์ง ํฌ๊ธฐ๊ฐ UDP๊ฐ ํ ๋ฒ์ ์ ์กํ ์ ์๋ ์ต๋ ๋ฉ์์ง ํฌ๊ธฐ๋ณด๋ค ํฌ๋ฉด
์๋ฌ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์๋ถ๋ถ ์ผ๋ถ๋ง ์ ์ก๋๋ค.(์ ๋ขฐ์ฑ x)
4. close(), ์์ผ ๋ซ๊ธฐ
close()๋ ํด๋ผ์ด์ธํธ๋ ์๋ฒ ๋๊ตฌ๋ ๋จผ์ ํธ์ถํ ์ ์๋ค.
close(s);
close()๋ฅผ ํธ์ถํ ์์ ์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ก์ ๋ฒํผ์ ๋ด๊ฒจ ์์ผ๋ ์์ง ์ ์ก ๋ชปํ๊ฑฐ๋ ์ ์ก ์ค์ธ ํจํท์ด ์์ ์๋ ์๋ค!
๊ทธ๋ด ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ close()๋ ๋ํดํธ๋ก ์ด๋ฌํ ํจํท๋ค์ ๋ชจ๋ ์ฒ๋ฆฌํ ํ์ ์์ผ์ ๋ซ์ ์ ์๋๋ก ๋์ด ์๋ค.
close() ํธ์ถ ์ ์ shutdown() ์์คํ ์ฝ์ ํ์ฌ directon ๊ฐ์ ๋ฐ๋ผ ์ข ๋ฃ๋ฅผ ์งํํ๋ค.
| ๊ฐ | ์ข ๋ฃ |
| 1 | ํจํท ์ ์ก ์ข ๋ฃ |
| 0 | ์์ ์ข ๋ฃ |
| 2 | ์ก์์ ๋ชจ๋ ์ข ๋ฃ |
shutdown(s, direction);
partial close
ํด๋ผ์ด์ธํธ๊ฐ ๋ ์ด์ ์ ์กํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด direction=0์ผ๋ก ํ์ฌ shutdown()์ ํธ์ถํ๋ฉด ๋๋ค.
์ด๋ฅผ partial close๋ผ๊ณ ํ๋ค.
์ด๋ ๋คํธ์ํฌ ์์คํ ์์ ์๋์ธก ์๋ฒ์๊ฒ end-of-file ์ ํธ๋ฅผ ๋ณด๋ด์ด ์ด๋ฅผ ์์ ํ ์๋ฒ๋ ์ ์กํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ํด๋น ์ฐ๊ฒฐ์ ์ข ๋ฃํ๋ฉด ๋๋ค.
setsockopt()
close()ํธ ์ถ์ ๋ฏธ์ฒ๋ฆฌ๋ ํจํท์ ์ฒ๋ฆฌํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํ์์์์ด๋ค.
์ผ์ ์๊ฐ์ ์ง์ ํ์ฌ ํด๋น ์๊ฐ ๋์๋ง ๋ฏธ์ฒ๋ฆฌ๋ ํจํท์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ์๋ ์๋ค.
์ด๋ฅผ ์ํด์๋ close() ํธ์ถ ์ ์ setsockopt()๋ฅผ ํธ์ถํ์ฌ ์์ผ ๋์์ ์ต์ ์ ๋ฐ๊ฟ์ฃผ์ด์ผ ํ๋ค.(์ด๊ฑด ์ถํ ๋ค์ ๊ณต๋ถํด์ ์ ๋ฆฌํ๊ฒ ๋ค^!^)
์ค๋ ๊ณต๋ถํ ๋ด์ฉ์ ํ ๋๋ก TCP ์์ฝ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋ ค๊ณ ํ๋ค!
์ด๊ฑฐ๋ ๋ค์ ์ฅ์ ๊ธฐ๋กํด์ผ์ง๐ฅฐ๐ฅฐ
'๐ Network ๊ธฐ๋ณธ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [VPN]: OpenVPN vs WireGuard (0) | 2024.11.29 |
|---|---|
| [์์ผ ํ๋ก๊ทธ๋๋ฐ]: ์ค์ต - TCP ์์ฝ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ณ ๋ถ์ํ๊ธฐ (0) | 2024.10.06 |
| ๋คํธ์ํฌ ์ฅ๋น ๊ฐ๋จ ์ ๋ฆฌ (0) | 2024.09.01 |
| [๋ค๊ด์ฌ 2๊ธ] NOS ์ค๋ต๋ ธํธ (0) | 2024.08.25 |
| [๋ค๊ด์ฌ 2๊ธ] ๋คํธ์ํฌ ์ผ๋ฐ ์ค๋ต๋ ธํธ (0) | 2024.08.25 |