Bagikan melalui


Kode Kontrol SIO_SET_COMPATIBILITY_MODE

Deskripsi

Kode kontrol SIO_SET_COMPATIBILITY_MODE meminta bagaimana tumpukan jaringan harus menangani perilaku tertentu yang cara default menangani perilaku mungkin berbeda di seluruh versi Windows.

Untuk melakukan operasi ini, panggil fungsi WSAIoctl atau WSPIoctl dengan parameter berikut.

int WSAIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_SET_COMPATIBILITY_MODE, // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to WSA_COMPATIBILITY_MODE struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_SET_COMPATIBILITY_MODE, // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to WSA_COMPATIBILITY_MODE struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Parameter

s

Deskriptor yang mengidentifikasi soket.

dwIoControlCode

Kode kontrol untuk operasi. Gunakan SIO_SET_COMPATIBILITY_MODE untuk operasi ini.

lpvInBuffer

Penunjuk ke buffer input. Parameter ini harus menunjuk ke struktur WSA_COMPATIBILITY_MODE .

cbInBuffer

Ukuran, dalam byte, dari buffer input. Parameter ini harus sama dengan atau lebih besar dari ukuran struktur WSA_COMPATIBILITY_MODE yang diacu oleh parameter lpvInBuffer .

lpvOutBuffer

Penunjuk ke buffer output. Parameter ini tidak digunakan untuk operasi ini.

cbOutBuffer

Ukuran, dalam byte, dari buffer output. Parameter ini harus diatur ke nol.

lpcbBytesReturned

Penunjuk ke variabel yang menerima ukuran, dalam byte, dari data yang disimpan dalam buffer output. Parameter yang dikembalikan ini menunjuk ke nilai DWORD nol untuk operasi ini, karena tidak ada output.

lpvOverlapped

Penunjuk ke struktur WSAOVERLAPPED .

Jika soket dibuat tanpa atribut yang tumpang tindih, parameter lpOverlapped diabaikan.

Jika s dibuka dengan atribut yang tumpang tindih dan parameter lpOverlapped bukan NULL, operasi dilakukan sebagai operasi yang tumpang tindih (asinkron). Dalam hal ini, parameter lpOverlapped harus menunjuk ke struktur WSAOVERLAPPED yang valid.

Untuk operasi yang tumpang tindih, fungsi WSAIoctl atau WSPIoctl segera kembali, dan metode penyelesaian yang sesuai disinyalir ketika operasi telah selesai. Jika tidak, fungsi tidak kembali sampai operasi selesai atau terjadi kesalahan.

lpCompletionRoutine

Jenis: LPWSAOVERLAPPED_COMPLETION_ROUTINE _In_opt_

Penunjuk ke rutinitas penyelesaian yang dipanggil ketika operasi telah selesai (diabaikan untuk soket yang tidak tumpang tindih).

lpThreadId

Penunjuk ke struktur WSATHREADID yang akan digunakan oleh penyedia dalam panggilan berikutnya ke WPUQueueApc. Penyedia harus menyimpan struktur WSATHREADID yang direferensikan (bukan penunjuk ke yang sama) sampai setelah fungsi WPUQueueApc kembali.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

lpErrno

Penunjuk ke kode kesalahan.

Catatan Parameter ini hanya berlaku untuk fungsi WSPIoctl .

Mengembalikan nilai

Jika operasi berhasil diselesaikan, fungsi WSAIoctl atau WSPIoctl mengembalikan nol.

Jika operasi gagal atau tertunda, fungsi WSAIoctl atau WSPIoctl mengembalikan SOCKET_ERROR. Untuk mendapatkan informasi kesalahan yang diperluas, panggil WSAGetLastError.

Kode kesalahan Makna
WSA_IO_PENDING Operasi yang tumpang tindih berhasil dimulai dan penyelesaian akan ditunjukkan di lain waktu.
WSA_OPERATION_ABORTED Operasi yang tumpang tindih dibatalkan karena penutupan soket atau eksekusi perintah SIO_FLUSH IOCTL.
WSAEFAULT Parameter lpOverlapped atau lpCompletionRoutine tidak sepenuhnya terkandung dalam bagian ruang alamat pengguna yang valid.
WSAEINPROGRESS Fungsi ini dipanggil ketika panggilan balik sedang berlangsung.
WSAEINTR Operasi pemblokiran terganggu.
WSAEINVAL Parameter dwIoControlCode bukan perintah yang valid, atau parameter input tertentu tidak dapat diterima, atau perintah tidak berlaku untuk jenis soket yang ditentukan. Kesalahan ini dikembalikan jika parameter cbInBuffer kurang dari ukuran struktur WSA_COMPATIBILITY_MODE .
WSAENETDOWN Subsistem jaringan gagal.
WSAENOPROTOOPT Opsi soket tidak didukung pada protokol yang ditentukan.
WSAENOTCONN Soket tidak tersambung.
WSAENOTSOCK Deskriptor bukan soket.
WSAEOPNOTSUPP Perintah IOCTL yang ditentukan tidak didukung. Kesalahan ini dikembalikan jika SIO_SET_COMPATIBILITY_MODE IOCTL tidak didukung oleh penyedia transportasi. Kesalahan ini juga dikembalikan ketika upaya untuk menggunakan IOCTL SIO_SET_COMPATIBILITY_MODE dibuat pada soket datagram.

Keterangan

SIO_SET_COMPATIBILITY_MODE IOCTL meminta bagaimana tumpukan jaringan harus menangani perilaku tertentu yang cara default menangani perilaku mungkin berbeda di seluruh versi Windows. Struktur argumen input untuk SIO_SET_COMPATIBILITY_MODE ditentukan dalam struktur WSA_COMPATIBILITY_MODE yang ditentukan dalam file header Mswsockdef.h . Penunjuk ke struktur WSA_COMPATIBILITY_MODE diteruskan dalam parameter cbInBuffer . Struktur ini didefinisikan sebagai berikut:

// Need to #include <mswsock.h>

/* Argument structure for SIO_SET_COMPATIBILITY_MODE */
typedef struct _WSA_COMPATIBILITY_MODE {
    WSA_COMPATIBILITY_BEHAVIOR_ID BehaviorId;
    ULONG TargetOsVersion;
} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

Nilai yang ditentukan dalam anggota BehaviorId menunjukkan perilaku yang diminta. Nilai yang ditentukan dalam anggota TargetOsVersion menunjukkan versi Windows yang diminta untuk perilaku tersebut.

Anggota BehaviorId dapat menjadi salah satu nilai dari jenis enumerasi WSA_COMPATIBILITY_BEHAVIOR_ID yang ditentukan dalam file header Mswsockdef.h . Nilai yang mungkin untuk anggota BehaviorId adalah sebagai berikut:

Istilah Deskripsi
WsaBehaviorAll Ini setara dengan meminta semua kemungkinan perilaku kompatibel yang ditentukan untuk WSA_COMPATIBILITY_BEHAVIOR_ID.
WsaBehaviorReceiveBuffering Ketika anggota TargetOsVersion diatur ke nilai untuk Windows Vista atau yang lebih baru, pengurangan ukuran buffer penerima TCP pada soket ini menggunakan opsi soket SO_RCVBUF diizinkan bahkan setelah koneksi TCP dibuat. Ketika anggota TargetOsVersion diatur ke nilai yang lebih lama dari Windows Vista, pengurangan ukuran buffer penerima TCP pada soket ini menggunakan opsi soket SO_RCVBUF tidak diizinkan setelah pembentukan koneksi.
WsaBehaviorAutoTuning Ketika anggota TargetOsVersion diatur ke nilai untuk Windows Vista atau yang lebih baru, penyetelan otomatis jendela terima diaktifkan dan faktor skala jendela TCP dikurangi menjadi 2 dari nilai default 8. Ketika TargetOsVersion diatur ke nilai yang lebih lama dari Windows Vista, terima penyetelan otomatis jendela dinonaktifkan. Opsi penskalaan jendela TCP juga dinonaktifkan dan ukuran jendela penerima true maksimum dibatasi hingga 65.535 byte. Opsi penskalaan jendela TCP tidak dapat dinegosiasikan pada koneksi meskipun opsi soket SO_RCVBUF dipanggil pada soket ini yang menentukan nilai yang lebih besar dari 65.535 byte sebelum koneksi dibuat.

Anggota TargetOsVersion dapat menjadi salah satu konstanta versi NTDDI yang ditentukan dalam file header Sdkddkver.h . Beberapa nilai yang mungkin untuk anggota TargetOsVersion adalah sebagai berikut:

Istilah Deskripsi
NTDDI_LONGHORN Perilaku target adalah default untuk Windows Vista.
NTDDI_WS03 Perilaku target adalah default untuk Windows Server 2003.
NTDDI_WINXP Perilaku target adalah default untuk Windows XP.
NTDDI_WIN2K Perilaku target adalah default untuk Windows 2000.

Dampak utama anggota TargetOsVersion adalah apakah anggota ini diatur ke nilai yang sama atau lebih besar dari NTDDI_LONGHORN.

Performa TCP tidak hanya tergantung pada tingkat transfer itu sendiri, melainkan pada produk tingkat transfer dan waktu penundaan pulang-pergi. Produk penundaan bandwidth ini mengukur jumlah data yang akan "mengisi pipa". Produk penundaan bandwidth ini adalah ruang buffer yang diperlukan pada pengirim dan penerima untuk mendapatkan throughput maksimum pada koneksi TCP di atas jalur. Ruang buffer ini menunjukkan jumlah data yang tidak diakui yang harus ditangani TCP agar alur tetap penuh. Masalah performa TCP muncul ketika produk penundaan bandwidth besar. Jalur jaringan yang beroperasi dalam kondisi ini sering disebut "pipa panjang, lemak". Contohnya termasuk tautan satelit paket kapasitas tinggi, tautan nirkabel berkecepatan tinggi, dan tautan serat optik terrestrial dalam jarak jauh.

Header TCP menggunakan bidang data 16-bit (bidang Jendela di header paket TCP) untuk melaporkan ukuran jendela penerima ke pengirim. Oleh karena itu, jendela terbesar yang dapat digunakan adalah 65.535 byte. Untuk menghindari batasan ini, opsi ekstensi TCP, TCP Window Scale, ditambahkan untuk TCP berkinerja tinggi untuk memungkinkan jendela yang lebih besar dari 65.535 byte. Opsi Skala Jendela TCP (WSopt) ditentukan dalam RFC 1323 yang tersedia di situs web IETF. Ekstensi WSopt memperluas definisi jendela TCP menjadi 32 bit menggunakan faktor skala logaritma satu byte untuk memperluas bidang Jendela 16-bit di header TCP. Ekstensi WSopt mendefinisikan faktor skala implisit (2 hingga beberapa daya), yang digunakan untuk mengalikan nilai ukuran jendela yang ditemukan di header TCP untuk mendapatkan ukuran jendela yang sebenarnya. Jadi faktor skala jendela 8 akan menghasilkan ukuran jendela benar yang sama dengan nilai di bidang Jendela di header TCP dikalikan dengan 2^8 atau 256. Jadi, jika bidang Jendela di header TCP diatur ke nilai maksimum 65.535 byte dan faktor skala WSopt dinegosiasikan ke nilai 8, ukuran jendela yang sebenarnya adalah 16.776.960 byte.

Ukuran jendela penerima yang benar dan oleh karena itu faktor skala ditentukan oleh ruang buffer penerima maksimum. Ruang buffer maksimum ini adalah jumlah data yang memungkinkan penerima TCP mengirim pengirim TCP sebelum harus menunggu pengakuan. Setelah koneksi dibuat, ukuran jendela terima diiklankan di setiap segmen TCP (bidang Jendela di header TCP). Mengiklankan jumlah maksimum data yang dapat dikirim pengirim adalah mekanisme kontrol alur sisi penerima yang mencegah pengirim mengirim data yang tidak dapat disimpan penerima. Host pengirim hanya dapat mengirim jumlah maksimum data yang diiklankan oleh penerima sebelum menunggu pengakuan dan menerima pembaruan ukuran jendela.

Pada Windows Server 2003 dan Windows XP, ruang buffer penerima maksimum yang mewakili ukuran jendela penerima untuk tumpukan TCP/IP memiliki nilai default berdasarkan kecepatan tautan antarmuka pengirim. Nilai aktual secara otomatis menyesuaikan dengan kenaikan bahkan dari ukuran segmen maksimum (MSS) yang dinegosiasikan selama pembentukan koneksi TCP. Jadi untuk tautan 10 Mbit/detik, ukuran jendela penerima default biasanya akan diatur ke 16K byte, sementara pada tautan 100 MBit/detik, ukuran jendela terima default akan diatur ke 65.535 byte.

Pada Windows Server 2003 dan Windows XP, ukuran jendela penerima maksimum yang benar untuk tumpukan TCP/IP dapat dikonfigurasi secara manual menggunakan nilai registri berikut pada antarmuka tertentu atau untuk seluruh sistem:

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\TCPWindowSize

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Interface\TCPWindowSize

Nilai registri untuk TCPWindowSize dapat diatur ke maksimum 65.535 byte ketika tidak menggunakan ekstensi WSopt atau maksimum 1.073.741.823 byte ketika ekstensi WSopt digunakan (faktor skala maksimum 4 didukung). Tanpa penskalaan jendela, aplikasi hanya dapat mencapai throughput sekitar 5 megabit per detik (Mbps) pada jalur dengan waktu pulang-pergi 100 milidetik (RTT), terlepas dari bandwidth jalur. Throughput ini dapat diskalakan ke lebih dari gigabit per detik (Gbps) dengan penskalaan jendela, yang memungkinkan TCP untuk menegosiasikan faktor penskalaan untuk ukuran jendela selama pembentukan koneksi.

Pada Windows Server 2003 dan Windows XP, ekstensi WSopt dapat diaktifkan dengan mengatur nilai registri berikut.

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Tcp1323Opts

Nilai registri Tcp1323Opts adalah DWORD yang dikodekan sedemikian rupa sehingga ketika bit 0 diatur, ekstensi TCP WSopt diaktifkan. Ketika bit 1 diatur, opsi Tanda Waktu TCP (TSopt) yang ditentukan dalam RFC 1323 diaktifkan. Jadi nilai 1 atau 3 akan mengaktifkan ekstensi WSopt.

Pada Windows Server 2003 dan Windows XP, defaultnya adalah nilai registri TCPWindowSize dan Tcp1323Opts tidak dibuat. Jadi defaultnya adalah ekstensi WSopt dinonaktifkan dan ukuran jendela penerima TCP diatur oleh sistem ke nilai maksimum hingga 65.535 byte berdasarkan kecepatan tautan. Ketika penskalaan jendela diaktifkan pada Windows Server 2003 dan Windows XP dengan mengatur nilai registri Tcp1323Opts, penskalaan jendela pada koneksi TCP masih hanya digunakan ketika pengirim dan penerima menyertakan opsi skala jendela TCP dalam segmen sinkronisasi (SYN) yang dikirim satu sama lain untuk menegosiasikan faktor skala jendela. Saat penskalaan jendela digunakan pada koneksi, bidang Jendela di header TCP diatur ke 65.535 byte dan faktor skala jendela digunakan untuk menyesuaikan ukuran jendela penerima yang benar ke atas oleh faktor skala jendela yang dinegosiasikan saat koneksi dibuat.

Aplikasi dapat menentukan ukuran jendela penerima TCP untuk koneksi dengan menggunakan opsi soket SO_RCVBUF . Ukuran jendela penerima TCP untuk soket dapat ditingkatkan kapan saja menggunakan SO_RCVBUF, tetapi hanya dapat dikurangi sebelum membuat koneksi. Untuk menggunakan penskalan jendela, aplikasi harus menentukan ukuran jendela yang lebih besar dari 65.535 byte saat menggunakan opsi soket SO_RCVBUF sebelum koneksi dibuat.

Nilai ideal untuk ukuran jendela penerima TCP sering sulit ditentukan. Untuk mengisi kapasitas jaringan antara pengirim dan penerima, ukuran jendela penerima harus diatur ke produk penundaan bandwidth untuk koneksi, yang merupakan bandwidth dikalikan dengan waktu pulang-pergi. Bahkan jika aplikasi dapat menentukan produk penundaan bandwidth dengan benar, masih belum diketahui seberapa cepat aplikasi penerima akan mengambil data dari buffer data yang masuk (tingkat pengambilan aplikasi). Meskipun dukungan untuk penskalaan jendela TCP, ukuran jendela penerima maksimum di Windows Server 2003 dan Windows XP masih dapat membatasi throughput karena ini adalah ukuran maksimum tetap untuk semua koneksi TCP (kecuali ditentukan per aplikasi yang menggunakan SO_RCVBUF), yang dapat meningkatkan throughput untuk beberapa koneksi dan mengurangi throughput untuk orang lain. Selain itu, ukuran jendela terima maksimum tetap untuk koneksi TCP tidak bervariasi dengan perubahan kondisi jaringan.

Untuk mengatasi masalah penentuan nilai ukuran jendela penerima maksimum dengan benar untuk koneksi TCP berdasarkan kondisi jaringan saat ini, tumpukan TCP/IP di Windows Vista mendukung fitur penyetelan otomatis jendela penerima. Ketika fitur ini diaktifkan, terima penyetelan otomatis jendela secara terus-menerus menentukan ukuran jendela penerima true yang optimal dengan mengukur produk penundaan bandwidth dan laju pengambilan aplikasi, dan menyesuaikan ukuran jendela penerimaan maksimum yang sebenarnya berdasarkan perubahan kondisi jaringan. Penyetelan otomatis jendela terima memungkinkan ekstensi TCP WSopt secara default, memungkinkan hingga 16.776.960 byte untuk ukuran jendela yang sebenarnya. Saat data mengalir melalui koneksi, tumpukan TCP/IP memantau koneksi, mengukur produk penundaan bandwidth saat ini untuk koneksi dan tingkat penerimaan aplikasi, dan menyesuaikan ukuran jendela penerima aktual untuk mengoptimalkan throughput. Tumpukan TCP/IP mengubah nilai bidang Jendela di header TCP berdasarkan kondisi jaringan, karena faktor skala WSopt diperbaiki saat koneksi pertama kali dibuat.

Tumpukan TCP/IP di Windows Vista tidak lagi menggunakan nilai registri TCPWindowSize . Dengan throughput yang lebih baik antara rekan-rekan TCP, pemanfaatan bandwidth jaringan meningkat selama transfer data. Jika semua aplikasi dioptimalkan untuk menerima data TCP, maka pemanfaatan jaringan secara keseluruhan dapat meningkat secara substansial, membuat penggunaan Quality of Service (QoS) lebih penting pada jaringan yang beroperasi pada atau mendekati kapasitas.

Perilaku default pada Windows Vista untuk menerima buffering ketika SIO_SET_COMPATIBILITY_MODE tidak ditentukan menggunakan WsaBehaviorReceiveBuffering adalah bahwa tidak ada pengurangan ukuran jendela yang menerima menggunakan opsi soket SO_RCVBUF diizinkan setelah koneksi dibuat.

Perilaku default pada Windows Vista untuk penyetelan otomatis ketika SIO_SET_COMPATIBILITY_MODE tidak ditentukan menggunakan WsaBehaviorAutoTuning adalah bahwa tumpukan akan menerima penyetelan otomatis jendela menggunakan faktor skala jendela 8. Perhatikan bahwa jika aplikasi menetapkan ukuran jendela terima yang valid dengan opsi soket SO_RCVBUF , tumpukan akan menggunakan ukuran yang ditentukan dan jendela menerima penyetelan otomatis akan dinonaktifkan. Penyetelan otomatis Windows juga dapat dinonaktifkan sepenuhnya menggunakan perintah berikut, netsh interface tcp set global autotuninglevel=disabled, dalam hal ini menentukan WsaBehaviorAutoTuning tidak akan berpengaruh. Penyetelan otomatis penerimaan jendela juga dapat dinonaktifkan berdasarkan kebijakan grup yang ditetapkan pada Windows Server 2008.

Opsi WsaBehaviorAutoTuning diperlukan pada Windows Vista untuk beberapa perangkat gateway Internet dan firewall yang tidak mendukung aliran data dengan benar untuk koneksi TCP yang menggunakan ekstensi WSopt dan faktor skala windows. Pada Windows Vista, penerima secara default menegosiasikan faktor skala jendela 8 untuk ukuran jendela benar maksimum 16.776.960 byte. Ketika data mulai mengalir pada tautan cepat, Windows awalnya dimulai dengan ukuran jendela benar 64 Kilobyte dengan mengatur bidang Jendela header TCP ke 256 dan mengatur faktor skala jendela ke 8 dalam opsi TCP (256*2^8=64KB). Beberapa perangkat gateway Internet dan firewall mengabaikan faktor skala jendela dan hanya melihat bidang Jendela yang diiklankan di header TCP yang ditentukan sebagai 256, dan menghilangkan paket masuk untuk koneksi yang berisi lebih dari 256 byte data TCP. Untuk mendukung penskalaan jendela penerima TCP, perangkat gateway atau firewall harus memantau jabat tangan TCP dan melacak faktor skala jendela yang dinegosiasikan sebagai bagian dari data koneksi TCP. Juga beberapa aplikasi dan implementasi tumpukan TCP pada platform lain mengabaikan ekstensi TCP WSopt dan faktor penskalaan jendela. Jadi host jarak jauh yang mengirim data dapat mengirim data dengan tarif yang diiklankan di bidang Jendela header TCP (256 byte). Hal ini dapat mengakibatkan data diterima dengan sangat lambat oleh penerima.

Mengatur anggota BehaviorId ke WsaBehaviorAutoTuning dan TargetOsVersion ke Windows Vista mengurangi faktor skala jendela menjadi 2, sehingga bidang Jendela di header TCP awalnya diatur ke 16.384 byte dan faktor skala jendela diatur ke 2 untuk ukuran penerimaan jendela benar awal 64K byte. Fitur penyetelan otomatis jendela kemudian dapat meningkatkan ukuran penerimaan jendela yang benar hingga 262.140 byte dengan mengatur bidang Jendela di header TCP menjadi 65.535 byte. Aplikasi harus mengatur SIO_SET_COMPATIBILITY_MODE IOCTL segera setelah soket dibuat, karena opsi ini tidak masuk akal atau berlaku setelah SYN dikirim. Mengatur opsi ini memiliki dampak yang sama dengan perintah berikut: netsh interface tcp set global autotuninglevel=highlyrestricted

Perhatikan bahwa file header Mswsockdef.h secara otomatis disertakan dalam Mswsock.h atau Netiodef.h, dan tidak boleh digunakan secara langsung.

Lihat juga

soket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW