Handshake SOCKS berhasil. Sekarang relai membaca dari klien, menulis ke tujuan, menunggu respons lengkap, dan baru setelah itu membaca lagi dari klien. Urutan itu dapat membuat aplikasi yang sepenuhnya sah mengalami deadlock.

Setelah terowongan TCP terbentuk, SOCKS tidak mendefinisikan pesan di dalamnya. Tujuan dapat mengirim lebih dulu. Kedua sisi dapat mengirim secara independen. Satu sisi dapat mengirim catatan pendek lalu menunggu jawaban pihak lain.

Teruskan byte, bukan transaksi yang ditebak

Panggilan penerimaan mengembalikan byte yang tersedia menurut flag dan keadaan soketnya. Ia tidak memberi tahu relai generik bahwa respons aplikasi sudah lengkap. Menunggu buffer besar sembarang terisi dapat menghalangi pengiriman pesan kecil yang dibutuhkan rekan untuk melanjutkan.

Gunakan model konkurensi aplikasi yang sudah ada untuk melayani kedua arah: loop peristiwa, I/O asinkron, atau desain lain yang dipilih dengan sengaja. Perilaku pentingnya adalah kemajuan di satu arah tidak memerlukan batas pesan yang diciptakan di arah lain.

Pertahankan dua buffer tertunda yang terbatas

Data yang dibaca dari klien mungkin masih menunggu mencapai tujuan, sementara data dari tujuan menunggu mencapai klien. Lacak byte tertunda itu secara terpisah.

Pengiriman dapat menulis lebih sedikit byte daripada yang diminta. Simpan bagian yang belum tertulis; jangan membuangnya atau memutar ulang seluruh buffer. Soket yang sementara tidak dapat ditulisi adalah alasan untuk menunggu peristiwa kesiapan yang benar, bukan berputar terus-menerus.

Batasi buffer. Jika tujuan lambat, terus membaca data klien tanpa batas hanya memindahkan antrean ke memori relai. Tekanan balik berarti menjeda pembacaan ketika buffer tertunda terkait penuh dan melanjutkannya ketika penulisan memberi ruang.

Akhir di satu arah memerlukan kebijakan

TCP dapat menutup arah pengiriman sementara arah lain masih memiliki data berguna. Putuskan bagaimana menyebarkan kondisi itu setelah byte yang di-buffer terkuras, dan bedakan penutupan tertib dari galat atau tenggat.

Tak satu pun dari ini menuntut relai mendekripsi atau mengurai muatan aplikasi. Ia memerlukan penanganan aliran yang benar. Menaikkan ukuran buffer saja tidak dapat memperbaiki relai yang menunggu sisi yang salah atau menganggap setiap pembacaan sama dengan satu permintaan utuh.

Artikel terkait