TIME_WAIT
मैक ओएस एक्स पर कोई एस
आम तौर पर, जब एक टीसीपी कनेक्शन बंद होता है, तो उस तरफ का सॉकेट जहां close()
पहले कहा जाता है, TIME_WAIT
राज्य में छोड़ दिया जाता है ।
जब साथियों में से एक मैक ओएस एक्स (लायन) मशीन है, तो मैक TIME_WAIT
द्वारा कोई भी सूचीबद्ध नहीं है netstat -an
यदि close()
मैक पक्ष पर पहली बार कहा जाता है। हालांकि, ऐसा लगता है कि सॉकेट है में वास्तव में TIME_WAIT
राज्य है, क्योंकि फोन करने की कोशिश कर listen()
फिर से (सॉकेट विकल्प का उपयोग कर के बिना SO_REUSEADDR
) का कारण बनता है listen()
विफल।
2 * एमएसएल की प्रतीक्षा (अधिकतम सेगमेंट लाइफटाइम जो मैक ओएस एक्स शेर पर 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")
दो अलग-अलग लिनक्स मशीनों पर सर्वर और क्लाइंट दोनों को चलाने पर, पीयर जो पहले <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
$
जब साथियों में से एक है एक मैक (चल ओएस एक्स शेर) मैं एक कभी नहीं देखना TIME_WAIT
जब चल netstat -an | grep 50007
मैक पर पहले बंद करने के बाद।
sudo lsof -i -P
उन प्रक्रियाओं के लिए TIME_WAIT स्थिति नहीं दिखाता है जो पहले से ही बाहर हो चुकी हैं।