Tidak ada TIME_WAIT
di Mac OS X
Biasanya, ketika koneksi TCP ditutup, soket di sisi tempat close()
dipanggil pertama ditinggalkan di TIME_WAIT
negara.
Ketika salah satu rekan adalah mesin Mac OS X (Lion), tidak TIME_WAIT
ada terdaftar oleh netstat -an
di Mac jika close()
disebut pertama di sisi Mac. Namun, tampaknya bahwa soket adalah benar-benar dalam TIME_WAIT
negara, karena mencoba untuk memanggil listen()
lagi (tanpa menggunakan opsi socket SO_REUSEADDR
) menyebabkan listen()
gagal.
Menunggu 2 * MSL (Maksimum Segmen Seumur Hidup yang 15 detik pada Mac OS X Lion sebagaimana dilaporkan oleh sysctl net.inet.tcp.msl
) menghapus TIME_WAIT
status, dan listen()
dapat dipanggil lagi tanpa kesalahan.
Mengapa saya tidak bisa melihat soket TIME_WAIT
?
Pengujian
Berikut adalah dua program pengujian sederhana dengan Python.
Server
#!/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")
Klien
#!/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")
Saat menjalankan server dan klien di dua mesin Linux yang berbeda, rekan yang menekan <enter>
untuk menelepon close()
terlebih dahulu mendapat TIME_WAIT
seperti yang diharapkan:
$ ./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
$
Ketika salah satu rekan adalah Mac (menjalankan OS X Lion) saya tidak pernah melihat TIME_WAIT
ketika berlari netstat -an | grep 50007
setelah menutup pertama pada Mac.
sudo lsof -i -P
tidak menunjukkan status TIME_WAIT untuk proses yang sudah keluar juga.Jawaban:
Laporan bug ini mengklaim bahwa masalahnya ada pada implementasi netstat . Kode yang terlampir pada laporan bug menunjukkan soket dalam keadaan TIME_WAIT dengan benar. Anda harus menghapus baris berikut
untuk membuatnya menunjukkan soket terikat ke localhost.
sumber
Ini bukan jawaban, tetapi seseorang mungkin bisa menggali lebih banyak dari ini.
tcpdump -i lo0 -vv port 50007
sumber