Di mana TIME_WAIT saya di Mac OS X?


9

Tidak ada TIME_WAITdi Mac OS X

Biasanya, ketika koneksi TCP ditutup, soket di sisi tempat close()dipanggil pertama ditinggalkan di TIME_WAITnegara.

Ketika salah satu rekan adalah mesin Mac OS X (Lion), tidak TIME_WAITada terdaftar oleh netstat -andi Mac jika close()disebut pertama di sisi Mac. Namun, tampaknya bahwa soket adalah benar-benar dalam TIME_WAITnegara, 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_WAITstatus, 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_WAITseperti 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_WAITketika berlari netstat -an | grep 50007setelah menutup pertama pada Mac.


Pertanyaan bagus. Melihat hal yang sama sendiri, dan tidak melihat opsi apa pun untuk netstat untuk memasukkannya ...
natevw

2
FWIW, sudo lsof -i -Ptidak menunjukkan status TIME_WAIT untuk proses yang sudah keluar juga.
natevw

@natevw Senang mengetahui bahwa saya tidak sendirian. :-)
mgd

Jawaban:


2

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

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

untuk membuatnya menunjukkan soket terikat ke localhost.


0

Ini bukan jawaban, tetapi seseorang mungkin bisa menggali lebih banyak dari ini.

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 !? Siapa yang mengirim kembali paket ini? Proses server ditutup!" Tampaknya dikirim oleh server yang dalam keadaan TIME_WAIT, karena itu adalah bagian yang mengirim FIN pertama. Meskipun proses server dihentikan, TCP stack menyatakan kondisi koneksi untuk mengirim ACK terakhir.
Neverov
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.