Membongkar Segmentasi Paket TCP Besar

Driver miniport NDIS dapat membongkar segmentasi paket TCP besar yang 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 offload pengiriman besar versi 1 (LSOv1), yang mirip dengan offload 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 struktur NET_BUFFER_LIST informasi OOB. Driver dapat menggunakan anggota Jenis struktur NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO untuk menentukan apakah tumpukan driver menggunakan LSOv2 atau LSOv1 dan melakukan layanan offload yang sesuai. Struktur NET_BUFFER_LIST apa pun yang berisi data OOB LSOv1 atau LSOv2 juga berisi struktur NET_BUFFER tunggal. 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 LSOv1 atau LSOv2 OOB non-nol (NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO).

Transportasi TCP/IP hanya membongkar paket TCP besar yang memenuhi kriteria berikut:

Sebelum membongkar paket TCP besar untuk segmentasi, transportasi TCP/IP:

  • Untuk LSOv1, tulis panjang total paket TCP besar ke bidang Total Length dari 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 bidang Total Length dari header IP paket ke 0. Driver Miniport harus menentukan panjang paket dari panjang struktur NET_BUFFER pertama dalam struktur NET_BUFFER_LIST.

  • Menghitung jumlah pelengkap seseorang untuk pseudoheader TCP dan menulis jumlah ini ke bidang Checksum header TCP. Transportasi TCP/IP menghitung jumlah pelengkap seseorang atas bidang berikut di pseudoheader: Alamat IP Sumber, Alamat IP Tujuan, dan Protokol. Jumlah pelengkap seseorang untuk pseudoheader yang disediakan oleh transportasi TCP/IP memberi NIC awal dalam menghitung checksum TCP nyata untuk setiap paket yang diperoleh NIC dari paket TCP besar tanpa harus memeriksa header IP. Perhatikan bahwa RFC 793 menetapkan bahwa checksum pseudo-header dihitung melalui Alamat IP Sumber, Alamat IP Tujuan, Protokol, dan Panjang TCP. (Panjang TCP adalah panjang header TCP ditambah panjang payload TCP. Panjang TCP tidak menyertakan panjang pseudo-header.) Namun, karena driver miniport yang mendasar dan NIC menghasilkan segmen TCP dari paket besar yang diturunkan oleh transportasi TCP/IP, transportasi tidak tahu ukuran payload TCP untuk setiap segmen TCP dan karenanya tidak dapat menyertakan Panjang TCP di header semu. Sebagai gantinya, seperti yang dijelaskan di bawah ini, NIC memperluas checksum pseudo-header yang disediakan oleh transportasi TCP/IP untuk mencakup Panjang TCP dari setiap segmen TCP yang dihasilkan.

  • Menulis nomor urutan yang benar ke bidang Nomor Urut header TCP. Nomor urut mengidentifikasi byte pertama dari payload TCP.

Setelah driver miniport mendapatkan struktur NET_BUFFER_LIST dalam fungsi MiniportSendNetBufferLists atau MiniportCoSendNetBufferLists , ia dapat memanggil makro NET_BUFFER_LIST_INFO dengan _IdTcpLargeSendNetBufferListInfo untuk mendapatkan nilai MSS yang ditulis oleh transportasi 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 MSS atau kurang byte data pengguna. Perhatikan bahwa 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 seseorang untuk pseudoheader yang dihitung oleh transportasi TCP/IP, lalu menghitung pelengkap 16-bit untuk checksum. Untuk informasi selengkapnya tentang menghitung checksum tersebut, lihat RFC 793 dan RFC 1122.

Gambar berikut menunjukkan segmentasi paket besar.

Diagram memperlihatkan segmentasi paket TCP besar ke dalam paket yang lebih kecil dengan header MAC, IP, dan TCP.

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 NIC LSOv1 TCP-Packet-Segmentation dan Melaporkan Kemampuan Segmentasi LSOv2 TCP-Packet-Segmentation NIC.

Setelah driver mengeluarkan indikasi status untuk menunjukkan perubahan pada nilai MaxOffLoadSize , driver tidak boleh 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 berukuran lebih besar dari nilai MaxOffLoadSize yang dilaporkan adaptor miniport.

Driver miniport-menengah yang merespons OID_TCP_OFFLOAD_PARAMETERS untuk mematikan layanan LSO harus disiapkan untuk jangka waktu yang kecil 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 NET_BUFFER_LIST LSO yang terkait dengan struktur NET_BUFFER_LIST . Perhatikan bahwa 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-Paket-Segmentasi LSOv1 NIC dan Melaporkan Kemampuan Segmentasi-Paket-Paket LSOv2 NIC.

Asumsi dan pembatasan berikut berlaku untuk memproses header IP dan TCP untuk driver miniport berkemampuan LSO terlepas dari versinya:

  • Bit MF di header IP paket TCP besar yang dilepaskan transportasi TCP/IP tidak akan diatur, dan Offset Fragmen di header IP akan menjadi nol.

  • Bendera URG, RST, dan SYN di header TCP paket TCP besar tidak akan diatur, dan offset (pointer) mendesak di header TCP akan menjadi nol.

  • Jika bit FIN di header TCP paket besar diatur, driver miniport harus mengatur bit ini di header TCP dari paket terakhir yang dibuatnya dari paket TCP besar.

  • Jika bit PSH di header TCP dari paket TCP besar diatur, driver miniport harus mengatur bit ini di header TCP dari paket terakhir yang dibuatnya dari paket TCP besar.

  • Jika bit CWR di header TCP dari paket TCP besar diatur, driver miniport harus mengatur bit ini di header TCP dari paket pertama yang dibuatnya dari paket TCP besar. Driver miniport dapat 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 Stempel Waktu.

  • Semua header paket (Ethernet, IP, TCP) akan berada di MDL pertama paket. Header tidak akan dibagi di beberapa MDL.

    Tip

    Asumsi ini valid ketika LSO diaktifkan. Jika tidak, ketika LSO tidak diaktifkan, driver miniport tidak dapat berasumsi bahwa header IP berada di MDL yang sama dengan header Ethernet.

Driver miniport harus mengirim paket dalam struktur NET_BUFFER_LIST dalam urutan menerima struktur NET_BUFFER_LIST dari transportasi 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 (informasi NET_BUFFER_LIST untuk offload pengiriman besar) dengan jumlah total byte data pengguna TCP yang berhasil dikirim dalam semua paket yang dibuat dari paket TCP besar.

Selain persyaratan LSO sebelumnya, driver miniport berkemampu LSOv2 juga harus:

  • Mendukung IPv4 atau IPv6 atau IPv4 dan IPv6.

  • Mendukung replikasi opsi IPv4, dari paket besar, di setiap paket segmen yang dihasilkan 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 ke 0xFFFF disediakan untuk perangkat berkemampuan offload cerobong asap TCP.) 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 anggota TcpHeaderOffsetdari 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.

    Catatan

    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 struktur NET_BUFFER_LIST. Ini berbeda dari metode yang digunakan driver untuk LSOv1.

  • Mendukung opsi TCP, opsi IP, dan header ekstensi IP.

  • Ketika operasi pengiriman selesai, driver miniport harus mengatur anggota LsoV2TransmitComplete.Reserved dari struktur NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO ke nol dan anggota LsoV2TransmitComplete.Type ke NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE.