๐ ์์ผํต์ ๊ตฌํ ๋ฐ TCP UDP - YangJJune/U-Compass GitHub Wiki
์์ผ ํต์ ์ด๋?
๋๋ ์์ผํต์ ์ ์์ ์ฒ์ ๋ณด๋ ์ฌ๋ํํ
๋๋ก๋ฅผ ๋น๋์ด ์ค๋ช
ํ๊ณ ๋ ํ๋ค. HTTP ํต์ ์ ๋งค๋ฒ ๋๋ก๋ฅผ ๊น์์ผํ๋ค. ์ฐจ๋ผ๋ฆฌ, ๊ทธ๋ฅ ๋๋ก๋ฅผ ๊น์๋๊ณ ํตํํ๋ ๊ฒ์ด ๋์ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค, ์ฐ๋ฆฐ ๊ทธ๊ฑธ ์์ผ ํต์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฅ์ ์ ์๋ฌด๋๋ ์ธ์ ๋ ์ฐจ๋ฅผ ํตํ์ํฌ ์ ์์ผ๋ ์ค์๊ฐ์ฑ์ด ๋ณด์ฅ๋๊ณ ๋น ๋ฅด๋ค. ๋จ์ ์ ๋๋ก ์ ์ง๋น๊ฐ ๋ค์ด๊ฐ๋ค๋ ๊ฒ์ด๋ค.
์์ผ ํต์ ์ ์์
- ๊ฒ์ ์๋ฒ
- ์ฑํ ์ ํ๋ฆฌ์ผ์ด์
- FTP
- ์ค์๊ฐ ์ฃผ์ ๊ฑฐ๋ ์์คํ etc...
TCP/UDP?
๋ณธ๊ฒฉ์ ์ผ๋ก ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ , TCP UDP ๊ฐ๋ ์ ๋ํด ์์๊ฐ ํ์์ฑ์ด ์๋ค.
TCP(Transmission Control Protocol)
์ฐ๊ฒฐ ์งํฅ์ ์ธ ํ๋กํ ์ฝ๋ก, ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ด๊ณ ์ ๋ขฐ์ฑ ์๊ฒ ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค
- ์ฐ๊ฒฐ ์งํฅ์
- ์ ๋ขฐ์ฑ ์๋ ์ ์ก
- ํ๋ฆ ์ ์ด
- ํผ์ก๋ ์ ์ด
- ์์ค/์ค๋ฅ ๋ฐ์ ์ ์ฌ์ ์ก
UDP(User Datagram Protocol)
๋น์ฐ๊ฒฐ ์งํฅ์ ์ธ ์ ์ก ๊ณ์ธต ํ๋กํ ์ฝ๋ก, ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ๋น์ฐ๊ฒฐ ์งํฅ์
- ์ ๋ขฐ์ฑ ์์
- ๋ฐ์ดํฐ ์์์ ๋ณด์ฅ ์์
- ํค๋๊ฐ ๊ฐ๋จํจ
- ์๋์ ํจ์จ์ฑ
์ฒ์ ๋ณด๋ ์ฌ๋๋ค์ ๋ฌด์จ ๋ง์ธ์ง ์ ๋ชจ๋ฅผ ์ ์๋๋ฐ, ํต์ฌ์ ์ด๋ ํ ๋ธ๋ก๊ทธ์ ๋งค์ฐ ์ ์ ๋ฆฌ๊ฐ ๋์ด์์๋ค. https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4
์ด๊ฒ์ด TCP์ด๊ณ ,
์ด๊ฒ์ด UDP์ด๋ค.
๊ฐ์ฅ ํฐ ์ฐจ์ด๋ฅผ ํ์คํ๊ฒ ๋ณด์ฌ์ฃผ๋ ๋ํ๋ผ ๊ฐ์ ธ์๋ณด์๋ค. ๊ทธ๋ผ ์ด์ TCP์ UDP๋ ์์์ผ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ผ ํต์ ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง, ๊ตฌํ๊ณผ์ ๊น์ง ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค
์์ผํต์ ๊ณผ์
์ด ๋ํ๊ฐ ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ๊ฐ์ฅ ์ ๋ํ๋ด์ค๋ค.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์์ ์์ผ์ ์์ฑํ๋ค
- ์๋ฒ์์ ์์ผ์ ํน์ ์ฃผ์์ ์์ผ์ bind ์ํจ๋ค. โป์ฌ๊ธฐ์ ์ฃผ์๋ IP์ port๋ก ์ด๋ฃจ์ด์ ธ์๋ค
- ์์ผ์ listen ์ํ๋ก ํ๋ค
- ํด๋ผ์ด์ธํธ์์ ์์ผ์ connect ์์ฒญ์ ํ๋ค
- ์๋ฒ๊ฐ listen ์ค์ด๋ฉด acceptํ๋ค
- ์ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค
- ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋๋ฉด ์์ผ์ ๋ซ๋๋ค(close)
์์ผํต์ ์ ๊ตฌํ
#server.py
import socket
# ์์ผ ์์ฑ
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ์์ผ ์ฃผ์ ์ธํ
server_address = ('localhost', 9999)
print('Start up on {} port {}'.format(*server_address))
# ์์ผ ์ ๋ณด bind
server_socket.bind(server_address)
# ์์ผ listen
server_socket.listen()
print('accept wait')
# ์์ผ accept ๋๊ธฐ
client_socket, client_address = server_socket.accept()
while True:
try:
# ํด๋ผ์ด์ธํธ๋ก๋ถํฐ data recv
data = client_socket.recv(1024)
data = data.decode()
print("received : "+data)
encodedData = bytes("ACK : "+data,'utf-8')
# ํด๋ผ์ด์ธํธ์ data send
client_socket.sendall(encodedData)
except Exception as err:
client_socket.close()
print(err)
break
#client.py
import socket
# ์์ผ ์์ฑ
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ์๋ฒ ์ฃผ์ ์ง์
server_address = ('localhost', 9999)
# ์๋ฒ ์์ผ์ ์ ์
client_socket.connect(server_address)
while True:
try:
# ์๋ฒ๋ก ์ ์กํ ๋ฐ์ดํฐ ์
๋ ฅ ๋ฐ๊ธฐ
data = input('')
if data == 'quit':
break
# ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ
data = data.encode()
# ์๋ฒ๋ก ์ ์ก
client_socket.send(data)
# ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ ๋ฐ๊ธฐ
encodedData = client_socket.recv(1024)
message = encodedData.decode('utf-8')
print("SERVER> "+message)
except Exception as err: # ์์ธ ๋ฐ์ ์
client_socket.close()
print(err)
break
client_socket.close()
๊ฒฐ๊ณผํ๋ฉด
์ข์ธก์ด server.py์ด๊ณ ์ฐ์ธก์ด client.py์ด๋ค.