Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Spesifikasi Antarmuka Driver Jaringan (NDIS) untuk driver miniport dapat membuang beban segmentasi paket TCP yang ukurannya lebih besar dari unit transmisi maksimum (MTU) media jaringan. NIC yang mendukung segmentasi paket TCP besar juga harus dapat:
Hitung checksum IP untuk mengirim paket yang berisi opsi IP.
Hitung checksum TCP untuk mengirim paket yang berisi opsi TCP.
NDIS versi 6.0 dan yang lebih baru mendukung pengalihan pengiriman besar versi 1 (LSOv1), yang mirip dengan pengalihan pengiriman besar (LSO) di NDIS 5.x. NDIS versi 6.0 dan yang lebih baru juga mendukung offload pengiriman besar versi 2 (LSOv2), yang menyediakan layanan segmentasi paket besar yang ditingkatkan, termasuk dukungan untuk IPv6.
Driver miniport yang mendukung LSOv2 dan LSOv1 harus menentukan jenis offload dari informasi out-of-band (OOB) struktur NET_BUFFER_LIST. Driver dapat menggunakan anggota Tipe dalam struktur NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO untuk menentukan apakah tumpukan driver menggunakan LSOv2 atau LSOv1 dan menjalankan layanan offload jaringan yang sesuai. Stuktur NET_BUFFER_LIST apa pun yang berisi data OOB LSOv1 atau LSOv2 juga berisi satu struktur NET_BUFFER. Untuk informasi selengkapnya tentang NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO, lihat Mengakses Informasi NET_BUFFER_LIST Offload TCP/IP.
Namun, dalam kasus di mana miniport telah menerima OID_TCP_OFFLOAD_PARAMETERS untuk mematikan fitur LSO pada miniport dan setelah miniport berhasil menyelesaikan OID, miniport harus menghilangkan semua NET_BUFFER_LIST yang berisi data OOB LSOv1 atau LSOv2 nonzero (NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO).
Transportasi TCP/IP hanya membongkar paket TCP besar yang memenuhi kriteria berikut:
Paket adalah paket TCP. Transportasi TCP/IP tidak membongkar paket UDP besar untuk segmentasi.
Paket harus dapat dibagi setidaknya dengan jumlah minimum segmen yang ditentukan oleh driver miniport. Untuk informasi selengkapnya, lihat Melaporkan KemampuanPacket-Segmentation LSOv1 TCP NIC dan Melaporkan KemampuanPacket-Segmentation LSOv2 TCP NIC.
Paket ini bukan paket loopback.
Paket tidak akan dikirim melalui terowongan.
Sebelum mengalihkan paket TCP besar untuk segmentasi, protokol TCP/IP:
- Memperbarui informasi segmentasi paket besar yang terkait dengan struktur NET_BUFFER_LIST. Informasi ini adalah struktur NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO yang merupakan bagian dari informasi NET_BUFFER_LIST yang terkait dengan struktur NET_BUFFER_LIST. Untuk informasi selengkapnya tentang informasi NET_BUFFER_LIST, lihat Mengakses Informasi NET_BUFFER_LIST Offload TCP/IP. Transportasi TCP/IP menetapkan nilai MSS
ke ukuran segmen maksimum.
Untuk LSOv1, menuliskan panjang total dari paket TCP besar ke bidang
Total Length
pada header IP paket. Panjang total mencakup panjang header IP, panjang opsi IP jika ada, panjang header TCP, panjang opsi TCP jika ada, dan panjang payload TCP. Untuk LSOv2, mengatur nilai bidangTotal Length
dari header IP paket ke 0. Driver miniport harus menentukan panjang paket dari panjang struktur NET_BUFFER pertama yang terdapat dalam struktur NET_BUFFER_LIST.Menghitung jumlah pelengkap seseorang untuk pseudoheader TCP dan menulis jumlah ini ke bidang
Checksum
header TCP. Transport TCP/IP menghitung jumlah pelengkap satu dari bidang berikut di pseudoheader:Source IP Address
,Destination IP Address
, danProtocol
. Penjumlahan pelengkap satu untuk pseudoheader yang disediakan oleh transport TCP/IP memberikan NIC awal yang cepat dalam menghitung checksum TCP nyata untuk setiap paket yang diperoleh NIC dari paket TCP besar tanpa perlu memeriksa header IP. Perhatikan bahwa RFC 793 menetapkan bahwa checksum pseudo-header dihitung berdasarkanSource IP Address
,Destination IP Address
,Protocol
, danTCP Length
. (Panjang TCP adalah panjang header TCP ditambah panjang payload TCP. Panjang TCP tidak menyertakan panjang pseudo-header.) Namun, karena driver miniport dan NIC yang mendasar menghasilkan segmen TCP dari paket besar yang diteruskan oleh transportasi TCP/IP, transportasi tidak tahu ukuran payload TCP untuk setiap segmen TCP dan oleh karena itu tidak dapat menyertakan Panjang TCP dalam pseudo-header. Sebagai gantinya, seperti yang dijelaskan di bawah ini, NIC memperluas checksum pseudo-header yang disediakan oleh transport TCP/IP agar mencakup panjang TCP dari setiap segmen TCP yang dihasilkan.Menuliskan nomor urutan yang benar ke dalam bidang
Sequence Number
pada header TCP. Byte pertama dari payload TCP diidentifikasi oleh nomor urut.
Setelah driver miniport mendapatkan struktur NET_BUFFER_LIST dalam fungsi MiniportSendNetBufferLists atau MiniportCoSendNetBufferLists, ia dapat memanggil makro NET_BUFFER_LIST_INFO dengan nilai _Id
TcpLargeSendNetBufferListInfo
untuk mendapatkan nilai MSS yang ditulis oleh transport TCP/IP.
Driver miniport mendapatkan panjang total paket besar dari header IP paket dan menggunakan nilai MSS untuk membagi paket TCP besar menjadi paket yang lebih kecil. Masing-masing paket yang lebih kecil berisi byte data pengguna MSS atau kurang. Hanya paket terakhir yang dibuat dari paket besar tersegmentasi yang harus berisi kurang dari byte data pengguna MSS. Semua paket lain yang dibuat dari paket tersegmentasi harus berisi byte data pengguna MSS. Jika Anda tidak mengikuti aturan ini, pembuatan dan transmisi paket tambahan yang tidak perlu dapat menurunkan performa.
Driver miniport membubuhkan header MAC, IP, dan TCP ke setiap segmen yang berasal dari paket besar. Driver miniport harus menghitung checksum IP dan TCP untuk paket turunan ini. Untuk menghitung checksum TCP untuk setiap paket yang berasal dari paket TCP besar, NIC menghitung bagian variabel dari checksum TCP (untuk header TCP dan payload TCP), menambahkan checksum ini ke jumlah pelengkap satu untuk pseudoheader yang dihitung oleh transport TCP/IP, lalu menghitung pelengkap satu 16-bit untuk checksum. Untuk informasi selengkapnya tentang menghitung checksum tersebut, lihat RFC 793 dan RFC 1122.
Gambar berikut menunjukkan segmentasi paket besar.
Panjang data pengguna TCP dalam paket TCP besar harus sama dengan atau kurang dari nilai yang ditetapkan driver miniport ke nilai MaxOffLoadSize
. Untuk informasi selengkapnya tentang nilai MaxOffLoadSize
, lihat Melaporkan Kemampuan TCP LSOv1 NICPacket-Segmentation dan Melaporkan Kemampuan TCP LSOv2 NICPacket-Segmentation.
Setelah driver mengeluarkan indikasi status untuk menunjukkan perubahan pada nilai MaxOffLoadSize
, driver tidak boleh mengalami crash jika menerima permintaan pengiriman LSO yang menggunakan nilai MaxOffLoadSize
sebelumnya. Sebagai gantinya, driver dapat gagal mengirim permintaan.
Driver perantara yang secara independen mengeluarkan indikasi status yang melaporkan perubahan nilai MaxOffLoadSize
harus memastikan bahwa adaptor miniport yang mendasar yang belum mengeluarkan indikasi status tidak mendapatkan paket apa pun yang ukurannya lebih besar dari nilai MaxOffLoadSize
yang dilaporkan adaptor miniport.
Driver perantara miniport yang merespons OID_TCP_OFFLOAD_PARAMETERS untuk mematikan layanan LSO harus siap menghadapi periode waktu singkat di mana permintaan pengiriman LSO masih dapat mencapai driver miniport.
Panjang data pengguna TCP dalam paket segmen harus kurang dari atau sama dengan MSS. MSS adalah nilai ULONG yang diteruskan oleh transportasi TCP dengan menggunakan informasi LSO NET_BUFFER_LIST yang berkaitan dengan struktur NET_BUFFER_LIST. Hanya paket terakhir yang dibuat dari paket besar tersegmentasi yang harus berisi kurang dari byte data pengguna MSS. Semua paket lain yang dibuat dari paket tersegmentasi harus berisi byte data pengguna MSS. Jika Anda tidak mengikuti aturan ini, pembuatan dan transmisi paket tambahan yang tidak perlu dapat menurunkan performa.
Jumlah paket segmen yang berasal dari paket TCP besar harus sama dengan atau lebih besar dari nilai MinSegmentCount
yang ditentukan oleh driver miniport. Untuk informasi selengkapnya tentang nilai MinSegmentCount
, lihat Melaporkan Kemampuan TCP LSOv1 NICPacket-Segmentation dan Melaporkan Kemampuan TCP LSOv2 NICPacket-Segmentation.
Asumsi dan pembatasan berikut berlaku untuk memproses header IP dan TCP untuk driver miniport berkemampuan LSO terlepas dari versinya:
Bit MF di header IP dari paket TCP besar yang diturunkan oleh transport TCP/IP tidak akan diatur, dan offset fragmen di header IP akan tetap nol.
Flag URG, RST, dan SYN di header TCP dari paket TCP besar tidak akan diaktifkan, dan offset mendesak (pointer) di header TCP akan menjadi nol.
Jika bit FIN di header TCP dari paket besar disetel, driver miniport harus menyetel bit ini di header TCP dari paket terakhir yang dibentuknya dari paket TCP besar.
Jika bit PSH di header TCP dari paket TCP besar telah diatur, driver miniport harus mengatur bit ini di header TCP dari paket terakhir yang dibuatnya dari paket TCP besar tersebut.
Jika bit CWR pada header TCP dari paket TCP besar diatur, driver miniport harus mengatur bit ini pada header TCP dari paket pertama yang dibuatnya dari paket TCP besar tersebut. Driver miniport mungkin memilih untuk mengatur bit ini di header TCP dari paket terakhir yang dibuatnya dari paket TCP besar, meskipun ini kurang diinginkan.
Jika paket TCP besar berisi opsi IP atau opsi TCP (atau keduanya), driver miniport menyalin opsi ini, tidak diubah, ke setiap paket yang berasal dari paket TCP besar. Secara khusus, NIC tidak akan menaikkan opsi Time Stamp.
Semua header paket (ethernet, IP, TCP) akan berada di MDL pertama paket. Header tidak akan dibagi di beberapa MDL.
Tips
Asumsi ini valid ketika LSO diaktifkan. Jika tidak, ketika LSO tidak diaktifkan, driver miniport tidak dapat mengasumsikan bahwa header IP berada di MDL yang sama dengan header ethernet.
Driver miniport harus mengirim paket dalam struktur NET_BUFFER_LIST sesuai dengan urutan struktur NET_BUFFER_LIST yang diterima dari protokol TCP/IP.
Saat memproses paket TCP besar, adaptor miniport hanya bertanggung jawab untuk mensegmentasi paket dan membubuhkan header MAC, IP, dan TCP ke paket yang berasal dari paket TCP besar. Transportasi TCP/IP melakukan semua tugas lain (seperti menyesuaikan ukuran jendela kirim berdasarkan ukuran jendela penerima host jarak jauh).
Sebelum menyelesaikan operasi pengiriman untuk paket besar (seperti dengan NdisMSendNetBufferListsComplete atau NdisMCoSendNetBufferListsComplete), driver miniport menulis nilai NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO (informasiNET_BUFFER_LIST untuk offload pengiriman TCP besar) dengan jumlah total byte data pengguna TCP yang berhasil dikirim di semua paket yang telah dibuat dari paket TCP besar.
Selain persyaratan LSO sebelumnya, driver miniport berkemampuan LSOv2 juga diwajibkan:
Mendukung IPv4 atau IPv6, atau IPv4 dan IPv6.
Mendukung replikasi opsi IPv4 dari paket besar di dalam setiap paket segmen yang dihasilkan oleh kartu antarmuka jaringan (NIC).
Mendukung replikasi header ekstensi IPv6, dari paket TCP besar, di setiap paket segmen TCP.
Mendukung replikasi opsi TCP di setiap paket segmen TCP yang dihasilkan driver miniport.
Gunakan header IP dan TCP dalam struktur NET_BUFFER_LIST sebagai templat untuk menghasilkan header TCP/IP untuk setiap paket segmen.
Gunakan nilai identifikasi IP (ID IP) dalam rentang dari 0x0000 hingga 0x7FFF. (Rentang dari 0x8000 hingga 0xFFFF disediakan untuk perangkat yang mendukung offload TCP chimney.) Misalnya, jika header IP templat dimulai dengan nilai bidang Identifikasi 0x7FFE, paket segmen TCP pertama harus memiliki nilai ID IP 0x7FFE, diikuti oleh 0x7FFF, 0x0000, 0x0001, dan sebagainya.
Gunakan offset byte di TcpHeaderOffset anggota NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO untuk menentukan lokasi header TCP, mulai dari byte pertama paket.
Batasi jumlah struktur NET_BUFFER yang terkait dengan setiap struktur NET_BUFFER_LIST LSOv2 menjadi satu.
Nota
Ini adalah persyaratan baru untuk driver miniport berkemampuan LSOv2. Aturan ini tidak diberlakukan untuk driver miniport LSOv1 secara eksplisit, meskipun disarankan.
Tentukan panjang total paket dari panjang struktur
NET_BUFFER
pertama dalam strukturNET_BUFFER_LIST
. Ini berbeda dari penggerak metode untuk LSOv1.Mendukung opsi TCP, opsi IP, dan header ekstensi IP.
Ketika operasi pengiriman selesai, driver miniport harus mengatur anggota
LsoV2TransmitComplete.Reserved
struktur NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO ke nol dan anggotaLsoV2TransmitComplete.Type
keNDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE
.