DevLog ๐ถ
[Network] ํ๋กํ ์ฝ ์คํ์ ๋ํด์ ๋ ์์ธํ ์์๋ณด์! ๋ณธ๋ฌธ
[Network] ํ๋กํ ์ฝ ์คํ์ ๋ํด์ ๋ ์์ธํ ์์๋ณด์!
dolmeng2 2023. 4. 23. 13:00์ง๋ ํฌ์คํ ์์๋, ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ด๋ค ์์ผ๋ก ์์ผ์ด ์์ฑ๋๋์ง ์์๋ณด์๋ค.
๊ทธ ์ฌ์ด์๋ ๋ 'ํ๋กํ ์ฝ ์คํ' ์ด๋ผ๋ ์น๊ตฌ๊ฐ ์์๋๋ฐ, ์ด๋ฒ ํฌ์คํ ์์๋ ํ๋กํ ์ฝ ์คํ์ด ๋ญ์ง ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด๊ณ ์ ํ๋ค.
์์ผ๋ก ํฌ์คํ ์ ์งํํ๋ฉด์ ์๋ถ๋ถ์ ์ ์ฐจ๋ค์ ํ๋ํ๋์ฉ ์์๋๊ฐ ์์ ์ด๋ค.
โ๏ธ ํ๋กํ ์ฝ ์คํ์ด๋?
์์ ๊ทธ๋ฆผ์ ๋ณด์.
์ต์๋จ์ ๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ธ๋ผ์ฐ์ , ์น ์๋ฒ ๋ฑ์ ํ๋ก๊ทธ๋จ์ด ํด๋นํ๋ฉฐ, ์ฌ๊ธฐ์๋ถํฐ ์๋๋ก ํฅํ๊ฒ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด์ ํฌ์คํ ๊น์ง ๋ค๋ฃจ์๋ ๋ด์ฉ์ด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์กธ๋ฒ๋ฅผ ํตํด DNS ์๋ฒ์ ์กฐํํ๊ณ ์์ผ์ ๋ง๋๋ ๊ณผ์ ๊น์ง ๋ค๋ฃฌ ๊ฒ์ด๋ค.
๊ทธ ๋ค์ ๋จ๊ณ๋ OS์ ๋ด๋ถ์ด๋ฉฐ, ์ฌ๊ธฐ์ ํ๋กํ ์ฝ ์คํ์ด ์กด์ฌํ๋ค.
ํ๋กํ ์ฝ ์คํ์ TCP / UDP๋ผ๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ก-์์ ์ ๋ด๋นํ๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
๋ธ๋ผ์ฐ์ ์์ฒญ ๊ฐ์ ๊ฒฝ์ฐ๋ TCP, DNS ์๋ฒ ์กฐํ๋ UDP๋ก ์ฌ์ฉํ๋ ๊ฒ ์ผ๋ฐ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ IP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ํจํท์ ์ก-์์ ์ ์ ์ดํ๋๋ฐ, ๋ฐ์ดํฐ๋ฅผ ํจํท ๋จ์๋ก ๋๋์ด ์ด๋ฐํ๋ ๊ฒ์ด๋ค.
IP ๋ด๋ถ์๋ ICMP, ARP๋ผ๋ ํ๋กํ ์ฝ์ด ์กด์ฌํ๋๋ฐ, ICMP๋ ํจํท ์ด๋ฐ ์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ํต์งํ๊ฑฐ๋, ์ ์ด์ฉ ๋ฉ์์ง๋ฅผ ํต์งํ ๋ ์ฌ์ฉํ๋ฉฐ ARP๋ IP ์ฃผ์์ ๋์ํ๋ ์ด๋๋ท์ MAC ์ฃผ์๋ฅผ ์กฐ์ฌํ ๋ ์ฌ์ฉํ๋ค.
๋ง์ง๋ง์ผ๋ก LAN ๋๋ผ์ด๋ฒ๋ LAN ์ด๋ํฐ์ ํ๋์จ์ด๋ฅผ ์ ์ดํ๊ณ , LAN ์ด๋ํฐ๊ฐ ์ค์ ๋ก ์ผ์ด๋ธ์ ๋ํด ์ ํธ๋ฅผ ์ก-์์ ํ๋ ๋์์ ์งํํ๋ค.
ํ๋จ์ ๋ด์ฉ์ ์ ๊ฐ์ธ์ ์ธ ์๊ฐ์ด ๋ด๊ธด ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ถ์ ํํ ์ ์์ต๋๋ค.
๐ฌ ์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋์์ ์ผ์ด๋๋ ๊ฑธ๊น?
์ฌ์ค ์์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ถํฐ OS ๋ด๋ถ๋ผ๊ณ ์๊ฐํ์๋๋ฐ, ์ฑ ์ ๋ด์ฉ์ ๋ณด๊ณ ์ด์ง ํผ๋์ด ์๋ค ๐ฅฒ
๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง์ ๊ณต๋ถํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์คํ๋ง์ ๊ธฐ์ค์ผ๋ก ์๊ฐ์ ํด๋ณด์.
์น ์๋ฒ๋ฅผ ๋์ฐ๊ธฐ ์ํด ์คํ๋ง์ ์ฌ์ฉํ์๊ณ , ๋ง์ฝ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋๋ค๊ณ ์๊ฐํด๋ณด์.
์ด๋, ์คํ๋ง ํ๋ ์์ํฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด '์๋ธ๋ฆฟ ์ปจํ ์ด๋'๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค. (Tomcat์ ๋ง์ด ์ฌ์ฉํ๋ค) ๊ทธ๋ฆฌ๊ณ , ์ด๋ฌํ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ๋ณดํต Java Servlet API๋ฅผ ํ์ฉํ์ฌ ์ฒ๋ฆฌํ๊ณค ํ๋ค. (HttpServlet)
๋ด๋ถ์ ์ผ๋ก ์์ฒญ์ ์ ๋ฌ๋ฐ์์ ๊ฐ ์์ฒญ์ ๋ง๋ ์๋ธ๋ฆฟ์ ๋งคํํ๋๋ฐ, JVM์ ์ํด ์คํ๋ ์ ์๋๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ์๋ธ๋ฆฟ ์ด๊ธฐํ๋ฅผ ํ๊ณ , ์ฒ๋ฆฌํ๊ณ , ์๋ตํ๊ณ ... ๊ทธ๋ฐ ๊ณผ์ ์ ์งํํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์์ (์๋ง) ๋ด๋ถ์ ์ผ๋ก ์๋ฐ์์ ์ ๊ณตํ๋ ์์ผ API๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ ์ด๋ฆ์ ๋ฐ์์ค๊ณ , ์์ผ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๊ณ , HTTP ์์ฒญ ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์๋ธ๋ฆฟ์๊ฒ ์ ๋ฌํ๋ ๊ณผ์ ์ด ์ผ์ด๋๋ ๊ฒ ๊ฐ๋ค.
์๋ง Socket ํด๋์ค ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์๋ฐ, Socket ํด๋์ค์ ์์ฑ์๋ฅผ ๋ณด๋ฉด ๋ด๋ถ์ ์ผ๋ก ๋๋ฉ์ธ ์ฃผ์๋ฅผ ์์๋ด๋ ์ฝ๋๊ฐ ์๋ค.
public Socket(String host, int port) throws UnknownHostException, IOException { this(host != null ? new InetSocketAddress(host, port) : new InetSocketAddress(InetAddress.getByName(null), port), (SocketAddress) null, true); }โ
์ฌ๊ธฐ์์ ๋ณด๋ฉด ์ฐ๊ฒฐํ ํธ์คํธ ์ ๋ณด์ ํฌํธ ๋ฒํธ๋ฅผ ๋ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ๋ง์ฝ ํธ์คํธ ์ ๋ณด๊ฐ ์กด์ฌํ๋ค๋ฉด InetSocketAddress๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
public InetSocketAddress(String hostname, int port) { checkHost(hostname); InetAddress addr = null; String host = null; try { addr = InetAddress.getByName(hostname); } catch(UnknownHostException e) { host = hostname; } holder = new InetSocketAddressHolder(host, addr, checkPort(port)); }
๊ทธ๋ฆฌ๊ณ , ํด๋น ๊ฐ์ฒด์ ์์ฑ์๋ฅผ ๊ฐ๋ณด๋ฉด ์์ ๊ฐ์ด InetAddress.getByName()์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
ํด๋น ๋ฉ์๋๋ ๋๋ฉ์ธ ์ด๋ฆ์ ๋ฐ๋ฅธ IP ์ฃผ์๋ฅผ ๋ฐ์์ค๋ ๋ฉ์๋์ธ๋ฐ, ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ ๋ DNS ์๋ฒ๋ฅผ ํตํด ๋ฐ์์ค๋ ๊ณผ์ ์ด ์ํ๋๋ ๊ฒ ์๋๊น... ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
์ ๋ฐ์ ์ธ ๋์ ๊ณผ์ ์ ์์์ผ๋, ํ๋กํ ์ฝ ์คํ์ ๋ํด์ ์๊ฐํด๋ณด์.
ํ๋กํ ์ฝ ์คํ ํต์ ๋์์ ์ ์ดํ๊ธฐ ์ํ ์ ์ด ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋๋ฐ, IP ์ฃผ์๋ ํฌํธ ๋ฒํธ, ํ์ฌ ์งํ ์ํ๋ฅผ ๊ธฐ๋กํ๋ค.
์์ผ ์์ฒด๋ ๊ฐ๋ ์ ์ผ๋ก ์กด์ฌํ ๋ฟ์ด์ง๋ง, ์๋ฐ๋ก ๋ฐ์ง์๋ฉด ์ด๋ ํ Socket ํด๋์ค๋ก์ ํํํ ์ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
ํ๋กํ ์ฝ ์คํ์ ๋ฐ์ดํฐ ์ก์ ์ ์์ผ์ ๊ธฐ๋ก๋ ์๋์ IP ์ฃผ์๋ ํฌํธ ๋ฒํธ๋ฅผ ๋ณด๊ณ , ๊ทธ IP ์ฃผ์์ ํฌํธ ๋ฒํธ๋ฅผ ๋์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์ผ์๋ ์๋ต์ด ๋์์ค๋์ง๋ ์ก์ ๋์ ์ดํ ๊ฒฝ๊ณผ ์๊ฐ ๋ฑ์ ๊ธฐ๋กํด๋๋๋ฐ, ํ๋กํ ์ฝ ์คํ์ ์ด๋ฅผ ๋ณด๊ณ ๋ฐ์ดํฐ ์ฌ์ ์ก ๋ฑ์ ์ํํ๋ค.
์ค์ ๋ก ํ์ธํด๋ณด์. ํฐ๋ฏธ๋์ ์ผ ๋ค์ netstat์ ์ ๋ ฅํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋ณผ ์ ์๋ค.
์์๋๋ก ๋ณด์. ์ฌ๊ธฐ์ ํ๋์ ํ์ด ๊ณง ํ๋์ ์์ผ์ ์๋ฏธํ๋ค.
์์ผ์ ์์ฑํ๋ค๋ ๊ณณ์ ๊ณง ์์ ์๋ก์ด ํ์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ด๋ผ๊ณ ๋ ๋ณผ ์ ์๋ค.
Protocol: ์ด๋ค ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋์ง, TCP/IP ํ๋กํ ์ฝ์ด๋ผ๋ฉด TCP๋ UDP ์ค ํ๋๊ฐ ๋์จ๋ค.
Recv-Q: ์์ผ์ด ์์ ํ ๋ฐ์ดํฐ๊ฐ ์์ผ๋, ํ๋ก๊ทธ๋จ์ด ์ฒ๋ฆฌ ๋ชปํ๊ณ ์๋ ๋ฐ์ดํธ ์
Send-Q: ์ ์ก์ ํ์์ผ๋ ์๊ฒฉ ํธ์คํธ๋ก๋ถํฐ ACK๋ฅผ ๋ฐ์ง ๋ชปํ์ฌ ๋๊ธฐ์ค์ธ ๋ฐ์ดํธ ์
Local Address: ์ถ๋ฐ์ง IP ์ฃผ์์ ํฌํธ (LAN ์ด๋ํฐ๋ฅผ ๋ฐ๋ฅธ๋ค). 0.0.0.0์ ํน์ IP ์ฃผ์์ ์ฐ๊ฒฐ๋์ด ์์ง ์์ ๊ฒฝ์ฐ.
Foreign Address: ๋์ฐฉ์ง IP ์ฃผ์์ ํฌํธ. 0.0.0.0์ ํต์ ์ด ์์๋์ง ์๊ณ ํน์ IP๋ ํฌํธ์ ์ฐ๊ฒฐ์ด ๋์ง ์์ ๊ฒฝ์ฐ. UDP์ธ ๊ฒฝ์ฐ ์์ผ์ ์๋์ธก์ ์ฐ๊ฒฐํ์ง ์๊ธฐ ๋๋ฌธ์ *:*๋ก ํ์ํ๋ค.
State: ํฌํธ์ ์ํ (Established - ์ ์์ด ๋๋๊ณ ์์ง ํต์ ์ค์ธ์ง ๋ํ๋, Listened - ์ ์ ๋๊ธฐ... ๋ฑ๋ฑ)
โ๏ธ ์์ผ์ ํธ์ถํ๋ค๋ฉด?
์์์ ์์ผ์ ๋ชจ์ต์ ๋ณด์๋ค. ์์ผ์ ํธ์ถํ๋ค๋ฉด ํ๋กํ ์ฝ ์คํ์ ๋ญ ํ ๊น?
์ง๋ ํฌ์คํ ์์ ๋ดค๋ ๊ทธ๋ฆผ์์ ์กฐ๊ธ๋ง ์ ๋ฐ์ดํธ๋ฅผ ํด๋ณด์.
์ฒ์์๋ ์์ผ์ ์์ฑํ๋ค.
socket()์ ํตํด ์์ผ์ ์์ฑํ๋๋ก ์ง์ํ๋ฉด, ํ๋กํ ์ฝ ์คํ์ ํ ๊ฐ์ ์์ผ์ ๋ง๋ ๋ค.
์ด๋, ํ๋กํ ์ฝ ์คํ์ ์์ผ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ๋ณดํ์ฌ ํด๋น ์์ญ์ ์์ผ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
์์ผ์ด ์์ฑ๋๋ฉด ์์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์๊ฒ ์๋ ค์ค๋ค.
๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์, ํ๋กํ ์ฝ ์คํ์ ๋ฐ์ดํฐ ์ก-์์ ๋์ ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํจ๊ป ํต์งํ๋ค.
์์ผ์๋ ํต์ ์ ์ฃผ์ฒด์ ์ํ ๋ฑ์ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ์ด๋ค ์์ผ์ด ์ด๋ค ์ํ์ธ์ง ํ๋กํ ์ฝ ์คํ์์ ์ฝ๊ฒ ์ ์ ์๊ฒ ๋๋ค. ๋๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ ๋ํด ํ๋์ฉ ํต์ง๋ฐ์ ํ์๊ฐ ์๊ฒ ๋๋ค.
๋ค์ ํฌ์คํ ์์ ์์ผ ์ ์ ๋ฐ ๋ฐ์ดํฐ ์ก์์ ๊ณผ์ ์ ๋ํด ์์๋ณด์.