WebSocket และ gRPC ผ่านพร็อกซี: การอัปเกรดโปรโตคอล, CONNECT และการดีบักการเชื่อมต่อระยะยาว
เรื่องคุ้น ๆ ไหม? คำขอ REST ผ่านพร็อกซีขององค์กรหรือคลาวด์ทำงานได้อย่างราบรื่น แต่พอเปิด WebSocket หรือเรียกใช้เมธอด gRPC เท่านั้นแหละ การเชื่อมต่อก็ไม่สำเร็จหรืออยู่ได้แค่ประมาณสามสิบวินาทีแล้วก็เงียบหายไป ขณะที่ในเบราว์เซอร์หรือล็อกของแอปพลิเคชัน คุณเห็นรหัสลึกลับอย่าง 101, 502, 504 หรือแค่ connection reset กระทันหัน นี่ไม่ใช่เรื่องลี้ลับหรือเวรกรรม แต่เป็นความแตกต่างพื้นฐานระหว่างวิธีที่พร็อกซีจัดการธุรกรรมคำขอ-ตอบกลับแบบสั้น กับวิธีที่มันควรปฏิบัติต่อสตรีมสองทางที่มีอายุยาวนาน
บทความนี้คือคู่มือฉบับสมบูรณ์ว่าด้วยการส่งโปรโตคอลที่ทำงานบน TCP ผ่านพร็อกซี ไม่ว่าจะเป็น WebSocket, gRPC หรืออะไรก็ตามที่ต้องมีการอัปเกรดโปรโตคอลหรืออุโมงค์แบบทะลุทะลวง เราจะเจาะกลไกทุกเฮดเดอร์ แสดงความแตกต่างระหว่าง ws:// ผ่าน HTTP พร็อกซีกับ wss:// ผ่านเมธอด CONNECT อธิบายว่าทำไม SOCKS5 ถึงมักจะง่ายกว่า วิธีรับมือกับ gRPC บน HTTP/2 วิธีเอาชนะไทม์เอาต์การไม่ใช้งาน และที่สำคัญคือวิธีดีบักทุกอย่างเมื่อไม่มีอะไรทำงาน ในท้ายที่สุดมีโค้ดที่ใช้ได้จริงบน Python และ Node พร้อมเช็กลิสต์และคำถามที่พบบ่อย
ขอพูดถึงขอบเขตของหัวข้อนี้ไว้ก่อน: เราจะไม่พูดถึงกลไก UDP ASSOCIATE ใน SOCKS5 ในบทความนี้โดยตั้งใจ เพราะมันเป็นเรื่องใหญ่อีกเรื่องหนึ่งเกี่ยวกับดาตาแกรม ซึ่งมีเนื้อหาแยกต่างหากอยู่แล้ว ที่นี่เราจะโฟกัสเฉพาะโปรโตคอล TCP บน HTTP และ SOCKS เท่านั้น