๐ŸŒ ์†Œ์ผ“ํ†ต์‹  ๊ตฌํ˜„ ๋ฐ 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๋„ ์•Œ์•˜์œผ๋‹ˆ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์†Œ์ผ“ ํ†ต์‹ ์€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€, ๊ตฌํ˜„๊ณผ์ •๊นŒ์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค

์†Œ์ผ“ํ†ต์‹  ๊ณผ์ •

์ด ๋„ํ‘œ๊ฐ€ ์ „์ฒด์ ์ธ ๊ทธ๋ฆผ์„ ๊ฐ€์žฅ ์ž˜ ๋‚˜ํƒ€๋‚ด์ค€๋‹ค.

  1. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์—์„œ ์†Œ์ผ“์„ ์ƒ์„ฑํ•œ๋‹ค
  2. ์„œ๋ฒ„์—์„œ ์†Œ์ผ“์„ ํŠน์ • ์ฃผ์†Œ์— ์†Œ์ผ“์„ bind ์‹œํ‚จ๋‹ค. โ€ป์—ฌ๊ธฐ์„œ ์ฃผ์†Œ๋Š” IP์™€ port๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค
  3. ์†Œ์ผ“์„ listen ์ƒํƒœ๋กœ ํ•œ๋‹ค
  4. ํด๋ผ์ด์–ธํŠธ์—์„œ ์†Œ์ผ“์— connect ์š”์ฒญ์„ ํ•œ๋‹ค
  5. ์„œ๋ฒ„๊ฐ€ listen ์ค‘์ด๋ฉด acceptํ•œ๋‹ค
  6. ์ƒํ˜ธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค
  7. ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜๋ฉด ์†Œ์ผ“์„ ๋‹ซ๋Š”๋‹ค(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์ด๋‹ค.