ไม่มีTIME_WAIT
ใน Mac OS X
โดยปกติเมื่อปิดการเชื่อมต่อ TCP ซ็อกเก็ตด้านข้างที่close()
เรียกว่าครั้งแรกจะถูกทิ้งให้อยู่ในTIME_WAIT
สถานะ
เมื่อเพื่อนคนหนึ่งเป็นเครื่อง Mac OS X (Lion) TIME_WAIT
จะไม่มีรายชื่ออยู่netstat -an
บน Mac หากclose()
มีการเรียกครั้งแรกทางด้าน Mac อย่างไรก็ตามดูเหมือนว่าซ็อกเก็ตอยู่ในTIME_WAIT
สถานะจริงเนื่องจากพยายามโทรlisten()
อีกครั้ง (โดยไม่ใช้ตัวเลือกซ็อกเก็ตSO_REUSEADDR
) ทำให้listen()
ล้มเหลว
กำลังรอ 2 * MSL (อายุการใช้งานส่วนสูงสุดซึ่งคือ 15 วินาทีบน Mac OS X Lion ตามที่รายงานโดยsysctl net.inet.tcp.msl
) จะล้างTIME_WAIT
สถานะและlisten()
สามารถเรียกได้อีกครั้งโดยไม่มีข้อผิดพลาด
ทำไมฉันไม่สามารถดูซ็อกเก็ตในTIME_WAIT
?
การทดสอบ
ต่อไปนี้เป็นโปรแกรมทดสอบอย่างง่ายสองโปรแกรมใน Python
เซิร์ฟเวอร์
#!/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) ฉันไม่เคยเห็นTIME_WAIT
เมื่อทำงานnetstat -an | grep 50007
หลังจากปิดก่อนบน Mac
sudo lsof -i -P
ไม่แสดงสถานะ TIME_WAIT สำหรับกระบวนการที่ออกไปแล้ว