Rekod putus sambungan tiba selepas sambungan kedua dengan nama yang sama sudah bermula, dan pengendali yang mengemas kini baris terbaharu untuk pengguna itu menutup sesi yang salah. Kesilapannya bukan pada perbandingan cap masa. Kesilapannya ialah andaian bahawa nama ditambah satu saat penuh mengenal pasti satu sesi. Peristiwa cangkuk menerangkan sambungan, dan sambungan memerlukan kunci yang hanya miliknya.

Mulakan dengan apa yang sebenarnya dimaksudkan oleh pemboleh ubah putus sambungan. Hanya selepas itu pilihan pengecam masuk akal.

Apa yang sebenarnya dibawa oleh cangkuk putus sambungan

Dalam Community OpenVPN 2.6, rujukan cangkuk time_unix mentakrifkannya sebagai saat klien bersambung; ia ditetapkan sebelum cangkuk sambungan berjalan dan tidak ditakrifkan semula apabila cangkuk putus sambungan dicetuskan kemudian. time_duration memberikan panjang sesi itu dalam saat, jadi penghujungnya lebih kurang masa sambungan ditambah tempoh. Kedua-duanya saat bulat, dan tiada satu pun merupakan saat pangkalan data anda memproses peristiwa itu. Memisahkan ketiga-tiga masa itulah yang membuatkan korelasi bertahan, bukan sekadar kelihatan betul semasa ujian.

Aritmetik ini wajar dicatat, kerana inilah satu-satunya masa tamat yang ditawarkan oleh cangkuk itu sendiri. Kelewatan pemprosesan dan perbezaan jam antara hos masih berada di luarnya.

Mengapa pasangan yang jelas tidak unik

Memasangkan nama dengan masa sambungan menyempitkan carian dan masih tidak mengenal pasti sesi. Klien boleh bersambung semula dalam saat yang sama, jadi dua sesi boleh berkongsi kedua-dua nilai. Dua instans daemon, atau penggantian pelayan yang mengekalkan konfigurasi yang sama, boleh menghasilkan pasangan itu daripada proses yang berbeza. Alamat terowong dikitar semula atas sebab yang sama, yang menjadikannya atribut sesuatu sesi, bukan pengecam untuknya.

Mod kegagalannya senyap. Putus sambungan yang lewat untuk sesi pertama sepadan dengan baris terbaharu dan menamatkan peruntukan yang masih digunakan sesi kedua, jadi pengguna mengalami kehilangan akses rawak yang tidak dilakukannya. Kiraan baris yang kelihatan betul selepas itu menjadikan masalah lebih sukar dikesan.

Dari mana identiti stabil datang

Antara muka pengurusan memberikan setiap klien pengecam instans klien, dan pengecam itu terhad kepada instans daemon yang mengeluarkannya. Kunci luaran yang boleh digunakan menggabungkan pengecam pelayan yang stabil, satu epok yang berubah apabila daemon bermula, dan ID klien itu. Epok itu penting kerana pengecam bermula semula bersama proses, dan ID proses kosong boleh digunakan semula kemudian oleh sesuatu yang tidak berkaitan.

Pemboleh ubah persekitaran yang ditetapkan di dalam skrip sambungan anak tidak bergerak ke skrip putus sambungan daemon induk yang kemudian, kerana skrip itu berjalan sebagai proses berasingan dengan persekitarannya sendiri. Jadi menjana UUID semasa sambungan hanyalah separuh penyelesaian. Bahagian putus sambungan mesti dapat menamakan UUID yang sama, yang bermaksud identiti mesti hidup di tempat yang boleh dicapai oleh kedua-dua peristiwa.

Jadikan penamatan bersyarat dan idempoten

Tamatkan mengikut pemilik sesi, bukan mengikut pengguna. Pengendali yang memadam apa-apa peruntukan yang pada masa ini milik sesuatu nama akhirnya akan memadam yang salah, dan satu-satunya pertahanan ialah memeriksa bahawa rekod yang dialih keluar ialah rekod yang diterangkan oleh peristiwa ini.

Antara muka pengurusan menerima satu klien pengurusan bersambung pada satu masa, jadi berintegrasilah dengan pihak yang sudah memilikinya daripada melampirkan pemerhati kedua yang bersaing untuk soket yang sama.

Kendalikan peristiwa berulang tanpa mengubah hasil dua kali, dan simpan peristiwa yang tidak berpasangan untuk perdamaian daripada membuangnya. Panggilan balik putus sambungan mempunyai syarat kitaran hayat yang didokumenkan dan mungkin tidak pernah tiba selepas ranap atau hentian keras, jadi reka bentuk memerlukan cara untuk mewakili sesi yang peristiwa akhirnya hilang.

Uji kes-kes janggal dengan sengaja: dua sambungan semula dalam satu saat, dua instans daemon, sambungan yang pemprosesannya gagal, dan mula semula daemon di tengah-tengah sesi. Kunci yang bertahan kesemua empat ialah kunci yang layak dipercayai.

Artikel berkaitan