TIME_WAIT
Mac OS X에 s 없음
일반적으로 TCP 연결이 닫히면 close()
처음 호출 되는 쪽의 소켓 이 TIME_WAIT
상태로 유지됩니다.
피어 중 하나가 Mac OS X (Lion) 시스템 인 경우 Mac 측에서 먼저 호출 된 경우 Mac에 아무 TIME_WAIT
것도 표시 되지 않습니다 . 그러나 소켓 옵션을 사용하지 않고 다시 호출 하면 실패 하기 때문에 소켓 이 실제로 상태에 있는 것 같습니다 .netstat -an
close()
TIME_WAIT
listen()
SO_REUSEADDR
listen()
2 * MSL (Mac OS X Lion에서보고 한 최대 세그먼트 수명 15 초) 동안 대기 sysctl net.inet.tcp.msl
하면 TIME_WAIT
상태가 지워지고 listen()
오류없이 다시 호출 할 수 있습니다.
소켓이 보이지 않는 이유는 무엇 TIME_WAIT
입니까?
테스팅
다음은 파이썬에서 간단한 두 가지 테스트 프로그램입니다.
섬기는 사람
#!/usr/bin/env python
import socket
HOST = ''
PORT = 50007
l = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
l.bind((HOST, PORT))
l.listen(1)
print("Listening on %d" % PORT)
(s, _) = l.accept()
print("Connected")
raw_input("Press <enter> to close...")
l.close()
s.close()
print("Closed")
고객
#!/usr/bin/env python
import socket
import sys
HOST = sys.argv[1]
PORT = 50007
print("Opening connection to server")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
raw_input("Press <enter> to close...")
s.close()
print("Closed")
두 개의 다른 Linux 시스템에서 서버와 클라이언트를 모두 실행하는 경우 먼저 <enter>
호출 을 눌러 피어가 예상 한대로 close()
가져 옵니다 TIME_WAIT
.
$ ./server-timewait.py
Listening on 50007
Connected
Press <enter> to close...
Closed
$ netstat -an | grep 50007
tcp 0 0 172.16.185.219:50007 172.16.185.42:49818 TIME_WAIT
$
동료 중 하나가 Mac (OS X Lion 실행) 일 때 Mac에서 처음 닫은 후에 는 TIME_WAIT
실행 되지 않습니다 netstat -an | grep 50007
.
sudo lsof -i -P
는 이미 종료 된 프로세스에 대해 TIME_WAIT 상태를 표시하지 않습니다.