Proxy chuyển tiếp không giữ ranh giới phân đoạn TCP
Tách biệt việc phân đoạn TCP, các lần đọc socket và việc đóng khung HTTP khi kiểm tra lưu lượng ở hai phía của một proxy chuyển tiếp.
Giả sử một phản hồi HTTP xuất hiện trong nhiều phân đoạn TCP được ghi lại sau khi đi qua Squid. Đó có thể là hành vi TCP bình thường, không phải bằng chứng rằng phản hồi bị chia sai.
Một proxy chuyển tiếp thường có hai kết nối:
client ⇄ TCP connection A ⇄ proxy ⇄ TCP connection B ⇄ origin
Mỗi kết nối có trạng thái TCP, số thứ tự và cách đóng gói riêng. Proxy có thể đọc dữ liệu từ kết nối này và ghi sang kết nối kia mà không giữ kích thước phân đoạn ban đầu. Đệm dữ liệu, thời điểm gửi, tắc nghẽn và giới hạn kích thước của đường đi có thể tạo ra một cách nhóm khác.
Ba ranh giới nên giữ riêng
| Ranh giới | Điều gì quyết định nó |
|---|---|
| Phân đoạn TCP | Đường truyền tải và đường mạng |
| Kết quả một lần đọc socket | Số byte luồng sẵn có và bộ đệm của bên gọi |
| Thông điệp hoặc khung HTTP | Các quy tắc đóng khung của giao thức HTTP |
Một lần đọc có thể chứa một phần tiêu đề, toàn bộ tiêu đề cùng các byte thân, hoặc dữ liệu vượt qua nhiều hơn một ranh giới ở tầng ứng dụng. TCP không gắn «kết thúc phản hồi HTTP» vào cuối một lần đọc thành công.
Vì vậy trình phân tích HTTP/1.1 tích lũy tiêu đề và áp dụng các quy tắc đóng khung thân phù hợp, gồm độ dài, mã hóa truyền tải hoặc việc đóng kết nối được phép. Khung HTTP/2 là một cấu trúc giao thức có thể tự nó vượt qua các phân đoạn TCP; nó không phải tên gọi khác của gói tin mạng.
Một đường hầm CONNECT thành công giữ luồng byte trong hầm nhưng vẫn dùng hai chặng TCP. Ranh giới phân đoạn của nó có thể khác nhau ngay cả khi proxy không thay đổi các byte bên trong hầm.
Khi điều tra hỏng dữ liệu, hãy so sánh dữ liệu ứng dụng đã lắp ghép lại. So sánh số gói hoặc mong đợi độ dài gói giống nhau ở hai phía là yêu cầu TCP một bảo đảm về ranh giới mà nó không cung cấp.