TIME_WAIT của tôi ở đâu trên Mac OS X?


9

Không có TIME_WAITtrên Mac OS X

Thông thường, khi kết nối TCP được đóng, ổ cắm ở phía close()được gọi đầu tiên sẽ ở TIME_WAITtrạng thái.

Khi một trong các máy ngang hàng là máy Mac OS X (Lion), không có TIME_WAITdanh sách nào được liệt kê netstat -antrên Mac nếu close()được gọi đầu tiên ở phía máy Mac. Tuy nhiên, có vẻ như các ổ cắm thực sự trong TIME_WAITtrạng thái, bởi vì cố gắng gọi listen()lại (mà không sử dụng các tùy chọn socket SO_REUSEADDR) gây ra listen()thất bại.

Chờ 2 * MSL (Thời gian phân đoạn tối đa là 15 giây trên Mac OS X Lion như đã báo cáo sysctl net.inet.tcp.msl) sẽ xóa TIME_WAITtrạng thái và listen()có thể được gọi lại mà không gặp lỗi.

Tại sao tôi không thể nhìn thấy ổ cắm trong TIME_WAIT?

Kiểm tra

Đây là hai chương trình thử nghiệm đơn giản trong Python.

Người phục vụ

#!/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")

Khách hàng

#!/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")

Khi chạy cả máy chủ và máy khách trên hai máy Linux khác nhau, máy ngang hàng nhấn <enter>để gọi close()trước tiên sẽ có được TIME_WAITnhư mong đợi:

$ ./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  
$ 

Khi một trong những người ngang hàng là Mac (chạy OS X Lion), tôi không bao giờ thấy a TIME_WAITkhi chạy netstat -an | grep 50007sau khi đóng đầu tiên trên Mac.


Câu hỏi hay. Thấy được điều tương tự bản thân mình, và không thấy bất kỳ tùy chọn để netstat để bao gồm họ ...
natevw

2
FWIW, sudo lsof -i -Pkhông hiển thị trạng thái TIME_WAIT cho các quy trình đã thoát.
natevw

@natevw Rất vui khi biết tôi không cô đơn. :-)
mgd

Câu trả lời:


2

Báo cáo lỗi này tuyên bố rằng vấn đề nằm ở việc triển khai netstat . Mã được đính kèm với báo cáo lỗi hiển thị các ổ cắm ở trạng thái TIME_WAIT chính xác. Bạn cần xóa các dòng sau

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

để làm cho nó hiển thị các socket bị ràng buộc với localhost.


0

Đây không phải là một câu trả lời, nhưng ai đó có thể có thể khai thác nhiều hơn từ điều này.

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!? Ai gửi lại gói tin này? Quá trình máy chủ bị đóng!" Nó dường như được gửi bởi máy chủ ở trạng thái TIME_WAIT, vì đây là phần gửi FIN đầu tiên. Mặc dù quá trình máy chủ đã bị chấm dứt, ngăn xếp TCP vẫn giữ trạng thái kết nối để gửi ACK cuối cùng.
neverov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.