Bagaimana cara melihat ukuran Antrian Kirim dan Terima TCP pada Windows?

10

Linux netstat menunjukkan ukuran kirim dan terima.

Bagaimana saya mendapatkan info ini di Windows, khususnya Server 2003?

Izzy
sumber
Bisakah Anda menempelkan contoh hasil yang ingin Anda lihat?
Izzy
Lihat tautan ini. Saya memerlukan kolom Recv-Q dan Send-Q dari netstat. linux-ip.net/html/tools-netstat.html

Jawaban:

3

(Ini sedikit dump otak)

Dari melihat beberapa versi dari sumber netstat, sepertinya informasi yang Anda cari sedang ditanyakan langsung dari kernel (/ proc / net / ...) bukan melalui panggilan yang berhubungan dengan soket yang memiliki setara Windows. Jika Anda benar-benar bertekad untuk memilikinya, saya akan melihat bagaimana ini diambil di netstat dan melihat apa yang dapat Anda temukan yang menyediakan sesuatu yang setara.

Anda mungkin harus melihat ndis.com (Spesifikasi Antarmuka Driver Jaringan) dan PCAUSA.com untuk informasi tingkat driver, karena itu mungkin menjadi tempat terbaik Anda untuk mengambil info ini di Windows.

Saya tidak percaya bahwa getsockopt () atau sebagian besar arena Winsock akan membuat Anda berguna di mana saja, tetapi jika Anda ingin pergi ke arah itu, lihat informasi MSDN Winsock dan lihat juga FAQ Winsock Programmer .

Untuk inbound, Anda mungkin bisa mendapatkan sesuatu yang berguna dari fungsi ioctlsocket () dengan FIONREAD untuk mendapatkan jumlah data yang dapat dibaca untuk soket; Anda mungkin tidak bisa mendapatkan ini di seluruh proses dan tergantung pada jenis data itu hanya dapat mengembalikan informasi untuk blok data pertama bukan untuk seluruh antrian jika ada lebih dari satu item yang antri.

Anda mungkin melakukan beberapa penggalian pada "jaminan simpanan" dalam konteks ini, tetapi sebagian besar dari apa yang saya lihat tampaknya berhubungan dengan pengaturan ukuran maksimal untuk menangani banjir SYN, tidak benar-benar dengan melihat seberapa besar simpanan sebenarnya.

Jika Anda benar-benar bertekad, Anda mungkin bisa melakukan sesuatu dengan Penyedia Layanan Layered Anda sendiri , tapi itu jalan yang aneh dan jelek penuh bahaya dan saya akan menyarankan tinggal jauh dari itu.

UPDATE: Setelah melihat-lihat sedikit lebih banyak, saya pasti berpikir Anda harus melihat permintaan OIS NDIS. Menemukan informasi yang paling relevan bagi Anda dibiarkan sebagai latihan antara Anda, MSDN dan TechNet.

fencepost
sumber
3

Pertanyaan ini sudah lama tetapi saya ingin menambahkan beberapa informasi. Ini hasil pencarian yang cukup tinggi di Google.

Sejauh yang saya tahu tidak ada cara untuk melakukan ini, tetapi jika ada yang bisa melakukan lebih banyak menggali dan mencari alternatif yang valid yang akan sangat dihargai!

Seperti @Fencepost tunjukkan dalam jawabannya, Anda dapat mencoba untuk query OIS NDIS. OID NDIS paling relevan yang saya temukan adalah OID_GEN_TRANSMIT_QUEUE_LENGTH

Sebagian besar OIS NDIS dipetakan ke kelas WMI, Anda dapat membuat daftar dengan PowerShell

Get-WmiObject -Namespace root\wmi -List  | Where-Object {$_.name -Match "MSNdis" } | Sort-Object

tetapi sepertinya tidak ada satu untuk Panjang Antrian Transmit.

@ Chris J menyebutkan Network Interface \ Output Queue Length. Anda bisa mendapatkan nilai ini di baris perintah dengan typeperf .

typeperf "\Network Interface(*)\Output Queue Length" -sc 1

Tetapi nilainya selalu 0: http://support.microsoft.com/kb/822226

Windows hanya melacak informasi ini di perangkat lunak driver NIC, dan itu hanya paket yang di-antri per NIC, dan tidak membedakan antara apa yang antri per soket.

Jika Anda ingin melakukan debug jaringan pada baris perintah, penghitung apa pun yang Anda temukan di perfmon dapat ditanyakan menggunakan typeperf atau logman .

hmatt1
sumber
1

Apa yang Anda inginkan mungkin hasil dari panggilan fungsi API WinSock getsockopt:

  • SO_RCVBUF Total ruang buffer per-soket yang disediakan untuk menerima. Ini tidak terkait dengan SO_MAX_MSG_SIZEdan tidak harus sesuai dengan ukuran jendela penerimaan TCP.

  • SO_SNDBUF Total ruang buffer per-soket yang disediakan untuk pengiriman. Ini tidak terkait dengan SO_MAX_MSG_SIZEdan tidak harus sesuai dengan ukuran jendela pengiriman TCP.

Masalahnya adalah bahwa bisa diminta soket yang pegangannya Anda tahu. Permintaan dari luar tampaknya sulit, lihat alat sysinternals TcpView . Mark Russinovich benar-benar retak dan bahkan dia tidak memberikan info di alatnya. Saya cukup yakin dia akan menambahkan kolom jika dia memiliki maksud untuk mendapatkan nilai dengan mudah ...

Saya kira beberapa driver kernel dapat membantu menelusuri ke dalam sistem tetapi tidak menemukan alat yang tersedia. Ukuran dapat diatur pada basis per soket sehingga nilai global tidak memiliki makna ...

jdehaan
sumber
1

Hal terdekat yang dapat saya temukan adalah penghitung kinerja Network Interface\Output Queue Length. Ini bukan per-koneksi - hanya per-antarmuka dan hanya mencakup antrian keluar (jelas, dengan namanya).

Chris J
sumber
1

Sekarang, ukuran jendela berbeda untuk setiap soket! Pengaturan per antarmuka hanya mewakili nilai default.

Saya tahu tidak ada cara untuk melihat ukuran jendela setiap soket. Dalam Solaris, ini dapat dilihat dengan "netstat".

asd
sumber
0

Lihat di sini: http://support.microsoft.com/kb/224829 .

Massimo
sumber
1
khususnya, apa yang seharusnya saya lihat di sana?
Windows menggunakan berbagai algoritma untuk mengatur ukuran jendela penerimaan TCP-nya; Anda dapat mengganti default dengan mengatur kunci Registry. Program ini juga dapat membantu Anda: dslreports.com/drtcp .
Massimo
Massimo - Anda membingungkan ukuran jendela dengan data yang antri. Saya tidak tertarik dengan ukuran jendela.
Ok maaf Informasi ini tidak tersedia di Windows.
Massimo