मैक ओएस एक्स पर मेरे TIME_WAITs कहां हैं?


9

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मैक पर पहले बंद करने के बाद।


अच्छा प्रश्न। खुद को एक ही चीज़ देखकर, और उन्हें शामिल करने के लिए
— नेटस्टैट के

2
FWIW, sudo lsof -i -Pउन प्रक्रियाओं के लिए TIME_WAIT स्थिति नहीं दिखाता है जो पहले से ही बाहर हो चुकी हैं।
— natevw

@natevw यह जानकर खुश हूं कि मैं अकेला नहीं हूं। :-)
— एमजीडी

जवाबों:


2

यह बग रिपोर्ट दावा करती है कि समस्या नेटस्टैट कार्यान्वयन में है । बग रिपोर्ट से जुड़ा कोड TIME_WAIT स्थिति में सही तरीके से सॉकेट दिखाता है। आपको निम्न पंक्तियों को हटाने की आवश्यकता है

if (lip == INADDR_LOCALHOST ||
  lip == INADDR_ANY
  ) { continue; }

यह लोकलहोस्ट के लिए बाध्य सॉकेट्स दिखाने के लिए।


0

यह एक उत्तर नहीं है, लेकिन कोई शायद इससे अधिक खुदाई करने में सक्षम है।

tcpdump -i lo0 -vv port 50007

## Press Enter at the server window

# Server send a FIN (note the flag)
23:33:04.283768 IP (tos 0x0, ttl 64, id 4134, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->2c9c)!)
    localhost.50007 > localhost.56030: Flags [F.], cksum 0xfe28 (incorrect -> 0xeff9), seq 1, ack 1, win 9186, options [nop,nop,TS val 432165676 ecr 432157913], length 0

# Client send back ACK
23:33:04.283803 IP (tos 0x0, ttl 64, id 44906, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->8d57)!)
    localhost.56030 > localhost.50007: Flags [.], cksum 0xfe28 (incorrect -> 0xd1a6), seq 1, ack 2, win 9186, options [nop,nop,TS val 432165676 ecr 432165676], length 0

# Server confirm the ACK is received
23:33:04.283812 IP (tos 0x0, ttl 64, id 18284, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->f555)!)
    localhost.50007 > localhost.56030: Flags [.], cksum 0xfe28 (incorrect -> 0xd1a6), seq 2, ack 1, win 9186, options [nop,nop,TS val 432165676 ecr 432165676], length 0

## After this point, the server process is actually exit but client still running.
## It's strange that re-run server script gives "OSError: [Errno 48] Address already in use"
## and netstat shows this connection is in CLOSE_WAIT status

## Press Enter at the client window

# Client send a FIN to server
23:33:09.731728 IP (tos 0x0, ttl 64, id 51478, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->73ab)!)
    localhost.56030 > localhost.50007: Flags [F.], cksum 0xfe28 (incorrect -> 0xbcb6), seq 1, ack 2, win 9186, options [nop,nop,TS val 432171035 ecr 432165676], length 0

# WTH!? Who send back this packet? The server process is closed!
23:33:09.731764 IP (tos 0x0, ttl 64, id 18754, offset 0, flags [DF], proto TCP (6), length 52, bad cksum 0 (->f37f)!)
    localhost.50007 > localhost.56030: Flags [.], cksum 0xfe28 (incorrect -> 0xa7c7), seq 2, ack 2, win 9186, options [nop,nop,TS val 432171035 ecr 432171035], length 0

"WTH !? इस पैकेट को कौन वापस भेजता है? सर्वर प्रक्रिया बंद है!" यह सर्वर द्वारा भेजा गया लगता है जो TIME_WAIT स्थिति में है, क्योंकि यह पहला फ़ाइनल भेजने वाला भाग है। सर्वर प्रक्रिया समाप्त होने के बावजूद, अंतिम ACK भेजने के लिए कनेक्शन की TCP स्टैक मंटेंस स्थिति।
— 17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.