Không có TIME_WAIT
trên Mac OS X
Thông thường, khi kết nối TCP được đóng, ổ cắm ở phía close()
được gọi đầu tiên sẽ ở TIME_WAIT
trạng thái.
Khi một trong các máy ngang hàng là máy Mac OS X (Lion), không có TIME_WAIT
danh sách nào được liệt kê netstat -an
trên Mac nếu close()
được gọi đầu tiên ở phía máy Mac. Tuy nhiên, có vẻ như các ổ cắm là thực sự trong TIME_WAIT
trạng thái, bởi vì cố gắng gọi listen()
lại (mà không sử dụng các tùy chọn socket SO_REUSEADDR
) gây ra listen()
thất bại.
Chờ 2 * MSL (Thời gian phân đoạn tối đa là 15 giây trên Mac OS X Lion như đã báo cáo sysctl net.inet.tcp.msl
) sẽ xóa TIME_WAIT
trạng thái và listen()
có thể được gọi lại mà không gặp lỗi.
Tại sao tôi không thể nhìn thấy ổ cắm trong TIME_WAIT
?
Kiểm tra
Đây là hai chương trình thử nghiệm đơn giản trong Python.
Người phục vụ
#!/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")
Khách hàng
#!/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")
Khi chạy cả máy chủ và máy khách trên hai máy Linux khác nhau, máy ngang hàng nhấn <enter>
để gọi close()
trước tiên sẽ có được TIME_WAIT
như mong đợi:
$ ./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
$
Khi một trong những người ngang hàng là Mac (chạy OS X Lion), tôi không bao giờ thấy a TIME_WAIT
khi chạy netstat -an | grep 50007
sau khi đóng đầu tiên trên Mac.
sudo lsof -i -P
không hiển thị trạng thái TIME_WAIT cho các quy trình đã thoát.