CLOSE_WAIT๐Ÿ˜ด

๊น€ํ™˜์ˆ˜ยท2024๋…„ 5์›” 30์ผ

๋ฌธ์ œ ์ƒํ™ฉ

๋ฌธ์ œ

ํ•œ์ •๋œ ์ˆ˜์˜ port๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” client์—์„œ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์— ๋” ์ด์ƒ ํ†ต์‹ ์„ ํ•˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋จ.

๋ถ„์„

# netstat -ano | find "<server_port>" (windows)

>netstat -ano | find "11111"
	ํ”„๋กœํ† ์ฝœ  	๋กœ์ปฌ ์ฃผ์†Œ            	์™ธ๋ถ€ ์ฃผ์†Œ               		์ƒํƒœ
    TCP    		127.0.0.1:11111      	 127.0.0.1:53481        	FIN_WAIT_2      28360
	TCP    		127.0.0.1:53481       	 127.0.0.1:11111        	CLOSE_WAIT      6160

ํ•ด์„

ํ•ด์„ค: Client๋Š” CLOSE_WAIT์ƒํƒœ๋‹ค.

์›์ธ ๋ถ„์„

TCP/IP ํ†ต์‹ ์—์„œ LOSE_WAIT ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋‹ค.
TCP/IP ํ†ต์‹ ์˜ ์ข…๋ฃŒ ์‹œ์ ์— ๋‘ peer๋Š” ๊ฐ๊ฐ active closer์™€ passive closer๋กœ ๋‚˜๋‰œ๋‹ค. active closer๋Š” FIN์„ ๋จผ์ € ๋ณด๋‚ด๋Š” ์ชฝ์ด๊ณ , passive closer๋Š” FIN์„ ๋ฐ›๊ณ , ACK๋ฅผ ๋ณด๋‚ด๋Š” ์ชฝ์ด๋‹ค.

์ฆ‰, client๊ฐ€ LOSE_WAIT์ƒํƒœ์—์„œ ๋Œ€๊ธฐ ์ค‘์ด๋ผ๋Š” ๊ฒƒ์€ server๊ฐ€ tcp ํ†ต์‹ ์„ ๋จผ์ € ์ข…๋ฃŒ(FIN์„ ๋ณด๋ƒ„)ํ•˜๊ณ , client์—์„œ ๊ทธ ์š”์ฒญ์— ๋Œ€ํ•ด ACK๋ฅผ ์ „๋‹ฌํ•˜์˜€์œผ๋‚˜, ์ดํ›„ FIN์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๋‹ค.

์žฌํ˜„

CLOSE_WAIT์„ ์ž„์˜๋กœ ์žฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Server

# server
import socket

def start_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('127.0.0.1', 11111))
    server.listen(5)
    print("Server started. Waiting for connections...")
    conn, addr = server.accept()
    print(f"Connection from {addr} established!")
    data = conn.recv(1024)
    print("Received:", data.decode())
    conn.shutdown(socket.SHUT_RDWR)  # Send FIN
    conn.close()
    print("Server connection closed")

if __name__ == "__main__":
    start_server()

server๋Š” recv() ์ดํ›„ ์—ฐ๊ฒฐ์„ ๋Š๋Š”๋‹ค.

Client

# client
import socket
import time

def start_client():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('127.0.0.1', 11111))
    client.sendall(b'Hello, Server!')
    time.sleep(10)
    client.close()

if __name__ == "__main__":
    start_client()

client๋Š” sendall() ์ดํ›„ sleep()ํ•˜์—ฌ process๋ฅผ block๋œ ์ƒํƒœ๋กœ ๋‘”๋‹ค.

๊ฒฐ๊ณผ

wireshark - No. 24 ์ดํ›„ CLOSE_WAIT์—์„œ ๋Œ€๊ธฐํ•˜๋˜ client๊ฐ€ NO. 34์—์„œ FIN์„ ๋ณด๋‚ด๊ณ  TCP/IP ํ†ต์‹ ์„ ์ข…๋ฃŒ

No. 34๊นŒ์ง€ 10์ดˆ ๊ฐ€๋Ÿ‰์˜ ๋”œ๋ ˆ์ด๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ client๊ฐ€ 10์ดˆ ๋™์•ˆ sleepํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

No. 24 ์งํ›„ netstat ๊ธฐ๋ก

>netstat -ano | find "11111"
ํ”„๋กœํ† ์ฝœ  	๋กœ์ปฌ ์ฃผ์†Œ          		   ์™ธ๋ถ€ ์ฃผ์†Œ               ์ƒํƒœ
	TCP    		127.0.0.1:11111        127.0.0.1:53481        FIN_WAIT_2      28360
  	TCP    		127.0.0.1:53481        127.0.0.1:11111        CLOSE_WAIT      6160

No 34 ์ดํ›„ netstat ๊ธฐ๋ก

>netstat -ano | find "11111"
  	ํ”„๋กœํ† ์ฝœ  		๋กœ์ปฌ ์ฃผ์†Œ           	   ์™ธ๋ถ€ ์ฃผ์†Œ               ์ƒํƒœ
    TCP  		 	127.0.0.1:11111        127.0.0.1:53481        TIME_WAIT       0

Kernel์˜ ๋™์ž‘

  1. ์œ„ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ client๋Š” senall()์„ ํ˜ธ์ถœํ•œ ํ›„, sleep()์„ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ ์ƒํƒœ์—์„œ server๋Š” shutdown()์— ์˜ํ•ด active closer๋กœ์„œ FIN์„ ๋ณด๋‚ธ๋‹ค.
  2. FIN์„ ๋ฐ›์€ client์˜ kernel์€ ํ•ด๋‹น TCP ์—ฐ๊ฒฐ์ด ์ •์ƒ์ด๊ธฐ์— ์ด์— ๋Œ€ํ•ด ACK๋ฅผ ๋ณด๋‚ธ๋‹ค. ์ดํ›„ kernel์€ socket์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  (์˜ˆ: socket.recv() returns EOF), ์ด๋ฅผ ํ™•์ธํ•œ client๊ฐ€ socket.close()๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค FIN์„ ๋ณด๋‚ธ๋‹ค.
  3. ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ client๋Š” sleep()์„ ํ˜ธ์ถœํ•˜๊ณ  10์ดˆ ํ›„์— socket.close()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์‚ฌ์ด์— ํ•ด๋‹น socket์€ CLOSE_WAIT ์ƒํƒœ๋กœ ๋Œ€๊ธฐํ•œ๋‹ค.

CLOSE_WAIT์˜ ๋ฌธ์ œ์ 

CLOSE_WAIT์˜ ๋ฌธ์ œ๋Š” timeout์ด ์—†๋‹ค๋Š” ์ ์ด๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ active closer์˜ FIN์— ๋Œ€ํ•œ passive closer์˜ ACK๋ฅผ ๋ฐ›์€ active closer๋Š” FIN_WAIT2 ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. FIN_WAIT2๋Š” linux์—์„œ tcp_fin_timeout์œผ๋กœ timeout์ด ์ •ํ•ด์ ธ ์žˆ์–ด server์—์„œ ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋”๋ผ๋„ port๊ฐ€ ๊ณ ๊ฐˆ๋˜๋Š” ์ผ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ CLOSE_WAIT์€ timeout์ด ์—†์–ด ๊ทธ ์ƒํƒœ๋กœ ๋ฌดํ•œํžˆ ๋Œ€๊ธฐํ•œ๋‹ค.

CLOSE_WAIT์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. ์‹์ƒํ•œ ๋ง์ด์ง€๋งŒ, ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์ž˜ ํ•˜์ž. socket๋„ ๋ฆฌ์†Œ์Šค๋‹ค. ์ด ๋ฌธ์ œ๋Š” socket ๋ฆฌ์†Œ์Šค๋ฅผ ์ ์œ ํ•œ ์ƒํƒœ์—์„œ ํ•ด์ œํ•˜์ง€ ์•Š์•˜๊ธฐ์— ์ƒ๊ธด ๋ฌธ์ œ๋‹ค.
profile
ใ…‡ใ…‹ใ…‡ใ…‹

0๊ฐœ์˜ ๋Œ“๊ธ€