UDP Menerima Offload Coalescing Segmen (URO)
Mulai Windows 11, versi 24H2, UDP Receive Segment Coalescing Offload (URO) memungkinkan kartu antarmuka jaringan (NIC) untuk menyatukan segmen penerima UDP. NIC dapat menggabungkan datagram UDP dari alur yang sama yang cocok dengan sekumpulan aturan ke dalam buffer yang berdampingan secara logis. Datagram gabungan ini kemudian ditunjukkan ke tumpukan jaringan Windows sebagai satu paket besar.
Datagram UDP coalescing mengurangi biaya CPU untuk memproses paket dalam aliran bandwidth tinggi, menghasilkan throughput yang lebih tinggi dan lebih sedikit siklus per byte.
Bagian berikut menjelaskan aturan untuk menyatukan paket UDP dan cara menulis driver miniport URO.
- Aturan untuk menyaring paket UDP
- Menulis driver miniport URO
- Pertimbangan pemrograman untuk driver URO
Aturan untuk menyaring paket UDP
Coalescing URO hanya dapat dicoba pada paket yang memenuhi semua kriteria berikut:
- IpHeader.Version identik untuk semua paket.
- IpHeader.SourceAddress dan IpHeader.DestinationAddress identik untuk semua paket.
- UdpHeader.SourcePort dan UdpHeader.DestinationPort identik untuk semua paket.
- UdpHeader.Length identik untuk semua paket, kecuali paket terakhir, yang mungkin kurang.
- UdpHeader.Length harus nonzero.
- UdpHeader.Checksum, jika bukan nol, harus benar pada semua paket. Ini berarti bahwa menerima offload checksum harus memvalidasi paket.
- Header Lapisan 2 harus identik untuk semua paket.
Jika paket adalah IPv4, paket tersebut juga harus memenuhi kriteria berikut:
- IPv4Header.Protocol == 17 (UDP) untuk semua paket.
- EthernetHeader.EtherType == 0x0800 untuk semua paket.
- IPv4Header.HeaderChecksum pada paket yang diterima harus benar. Ini berarti bahwa menerima offload checksum harus memvalidasi header.
- IPv4Header.HeaderLength == 5 (tanpa Header Opsi IPv4) untuk semua paket.
- IPv4Header.ToS identik untuk semua paket.
- IPv4Header.ECN identik untuk semua paket.
- IPv4Header.DontFragment identik untuk semua paket.
- IPv4Header.TTL identik untuk semua paket.
- IPv4Header.TotalLength == UdpHeader.Length + length(IPv4Header) untuk semua paket.
Jika paket adalah IPv6, paket tersebut juga harus memenuhi kriteria berikut:
- IPv6Header.NextHeader == 17 (UDP) untuk semua paket (tanpa header ekstensi).
- EthernetHeader.EtherType == 0x86dd (IPv6) untuk semua paket.
- IPv6Header.TrafficClass dan IPv6Header.ECN identik untuk semua paket.
- IPv6Header.FlowLabel identik untuk semua paket.
- IPv6Header.HopLimit identik untuk semua paket.
- IPv6Header.PayloadLength == UdpHeader.Length untuk semua paket.
Struktur paket URO
Single Coalesced Unit (SCU) yang dihasilkan harus memiliki satu header IP dan header UDP, diikuti dengan payload UDP untuk semua datagram yang digabungkan bersama-sama.
Indikasi URO harus mengatur bidang IPv4Header.TotalLength ke panjang total bidang SCU, atau IPv6Header.PayloadLength ke panjang payload UDP dan bidang UdpHeader.Length ke panjang payload yang dikoalesced.
Jika header Layer 2 (L2) ada dalam datagram coalesced, SCU harus berisi header L2 yang valid. Header L2 di SCU harus menyerupai header L2 dari datagram yang di-coalesced.
Validasi dan indikasi checksum
Indikasi URO harus mengatur bidang IPv4Header.HeaderChecksum dan UdpHeader.Checksum ke nol dan mengisi informasi out-of-band offload checksum pada SCU yang menunjukkan keberhasilan checksum IPv4 dan UDP.
Paket yang cocok dengan semua kondisi untuk di-coalesced tetapi validasi checksum gagal harus ditunjukkan secara terpisah. Paket yang diterima setelah itu tidak boleh dikoalesced dengan paket yang diterima sebelum itu.
Misalnya, paket 1, 2, 3, 4, dan 5 diterima dari alur yang sama, tetapi paket 3 gagal validasi checksum. Paket 1 dan 2 dapat dikoaleskasi bersama-sama, dan paket 4 dan 5 dapat dikoaleskasi bersama-sama, tetapi paket 3 tidak boleh dikoaleskasi dengan salah satu SCU. Paket 1 dan 2 tidak boleh dikoaleskasi bersama dengan paket 4 dan 5. Paket 2 adalah paket terakhir dalam SCU dan paket 4 memulai SCU baru. Selain itu, SCU yang berisi paket 1 dan 2 harus ditunjukkan sebelum paket 3 ditunjukkan dan paket 3 harus ditunjukkan sebelum SCU yang berisi paket 4 dan 5.
Coalescing paket dan pemisahan aliran
Paket dari beberapa alur dapat dikoaleskan secara paralel, karena perangkat keras dan memori mengizinkan. Paket dari alur yang berbeda tidak boleh digabungkan bersama-sama.
Paket dari beberapa penerimaan yang diselingi dapat dipisahkan dan dikoalesced dengan alur masing-masing. Misalnya, alur yang diberikan A, B, dan C, jika paket tiba dalam urutan A, A, B, C, B, A, paket dari aliran A dapat dikoaleskan ke AAA, dan paket dari aliran B dikoalesk ke dalam BB, sementara paket dari aliran C dapat ditunjukkan secara normal atau dikoaleskan dengan SCU yang tertunda dari aliran C.
Paket dalam alur tertentu tidak boleh diurutkan ulang sehubungan satu sama lain. Misalnya, paket dari alur A harus digabungkan dalam urutan yang diterima, terlepas dari paket dari alur B dan C yang diterima di antaranya.
Kata kunci INF untuk mengontrol URO
Kata kunci berikut dapat digunakan untuk mengaktifkan/menonaktifkan URO dengan pengaturan kunci registri.
*UdpRsc
Kata kunci INF standar enumerasi memiliki atribut berikut:
SubkeyName
Nama kata kunci yang harus Anda tentukan dalam file INF dan yang muncul di registri.
ParamDesc
Teks tampilan yang terkait dengan SubkeyName.
Nilai
Nilai bilangan bulat enumerasi yang terkait dengan setiap opsi dalam daftar. Nilai ini disimpan dalam NDI\params\ SubkeyName\Value.
EnumDesc
Teks tampilan yang terkait dengan setiap nilai yang muncul di menu.
Default
Nilai default untuk menu.
SubkeyName | ParamDesc | Nilai | EnumDesc |
---|---|---|---|
*UdpRsc | URO | 0 | Nonaktif |
1 (Default) | Diaktifkan |
Untuk informasi selengkapnya tentang menggunakan kata kunci enumerasi, lihat Kata Kunci Enumerasi.
Menulis driver miniport URO
Mulai dari NDIS 6.89, antarmuka NDIS untuk URO memfasilitasi komunikasi antara TCP/IP dan driver miniport NDIS.
Laporkan kemampuan URO
Driver miniport mengiklankan dukungan untuk URO di anggota UdpRsc dari struktur NDIS_OFFLOAD, yang diteruskannya ke fungsi NdisMSetMiniportAttributes.
Kemampuan URO kueri
Untuk memeriksa apakah driver miniport mendukung URO, driver NDIS, dan aplikasi lain dapat meminta OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES OID, yang mengembalikan struktur NDIS_OFFLOAD .
Status URO kueri
Untuk menentukan status URO saat ini, driver NDIS dan aplikasi lain dapat meminta permintaan OID OID_TCP_OFFLOAD_CURRENT_CONFIG . NDIS menangani OID ini dan tidak meneruskannya ke miniport.
Mengubah status URO
URO dapat diaktifkan atau dinonaktifkan dengan mengeluarkan permintaan OID OID_TCP_OFFLOAD_PARAMETERS. OID ini menggunakan struktur NDIS_OFFLOAD_PARAMETERS. Dalam struktur ini, anggota UdpRsc.Enabled dapat memiliki nilai berikut:
Nilai | Makna |
---|---|
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_NO_CHANGE 0 |
Driver miniport tidak boleh mengubah pengaturan saat ini. |
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED 1 |
URO dinonaktifkan. |
NDIS_OFFLOAD_PARAMETERS_UDP_RSC_ENABLED 2 |
URO diaktifkan. |
Ketika driver memproses permintaan OID OID_TCP_OFFLOAD_PARAMETERS dengan NDIS_OFFLOAD_PARAMETERS_UDP_RSC_DISABLED
set bendera, NIC harus menunggu untuk menyelesaikan permintaan sampai semua segmen bersatu yang ada dan indikasi URO yang beredar ditunjukkan. Ini memastikan sinkronisasi URO mengaktifkan/menonaktifkan peristiwa di seluruh komponen NDIS.
Setelah driver miniport memproses permintaan OID OID_TCP_OFFLOAD_PARAMETERS , driver miniport harus mengeluarkan indikasi status NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG dengan status offload yang diperbarui.
NDIS_OFFLOAD_PARAMETERS_SKIP_REGISTRY_UPDATE
Bendera di NDIS_OFFLOAD_PARAMETERS memungkinkan penonaktifan URO khusus runtime. Perubahan yang dilakukan dengan bendera ini tidak disimpan ke registri.
Menolak URO di NDIS 6.89 dan yang lebih baru
Driver yang menargetkan NDIS 6.89 dan yang lebih baru harus memahami paket URO dan menanganinya dengan anggun. Untuk menolak URO:
- Driver filter ringan (LWF) mengatur
NDIS_FILTER_DRIVER_UDP_RSC_NOT_SUPPORTED
bendera dalam struktur NDIS_FILTER_DRIVER_CHARACTERISTICS. - Driver protokol mengatur
NDIS_PROTOCOL_DRIVER_UDP_RSC_NOT_SUPPORTED
bendera dalam struktur NDIS_PROTOCOL_DRIVER_CHARACTERISTICS.
Pendekatan ini memastikan komponen yang tidak terbiasa dengan URO tidak menerima NBL URO. NDIS menonaktifkan URO pada miniport selama pengikatan jika LWF atau driver protokol yang tidak mendukung URO ada.
Pertimbangan pemrograman untuk driver URO
Pertimbangkan masalah berikut saat menerapkan driver miniport berkemampu URO.
Winsock URO API
Untuk informasi tentang API Winsock URO, lihat opsi soket IPPROTO_UDP. Lihat informasi tentang UDP_RECV_MAX_COALESCED_SIZE dan UDP_COALESCED_INFO.
Pembaruan tumpukan TCP/IP Windows
Transportasi TCP/IP Microsoft memungkinkan URO pada waktu pengikatan dengan NDIS, kecuali konfigurasi mencegahnya melakukannya.
Callout WFP dapat digunakan FWP_CALLOUT_FLAG_ALLOW_URO
dalam FWPS_CALLOUT2 untuk mengiklankan dukungan mereka untuk URO. Jika callout WFP yang tidak kompatibel terdaftar di lapisan Sensitif URO, MAKA OS akan menonaktifkan URO saat callout terdaftar.
Jika soket ikut serta ke URO dengan ukuran maksimum yang dikoalesced lebih besar dari atau sama dengan ukuran offload perangkat keras, maka tumpukan akan mengirimkan NBL dari perangkat keras yang tidak dimodifikasi ke soket. Jika soket ikut serta ke ukuran baralesced maks yang lebih kecil, tumpukan akan memecah penerimaan batubara menjadi ukuran yang lebih kecil untuk soket.
Jika soket tidak ikut serta dalam URO, maka tumpukan akan menerima resegmen untuk soket tersebut. Dengan tidak adanya URO perangkat keras, fitur URO perangkat lunak yang ada akan terus tersedia.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk