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 socketSố byte luồng sẵn có và bộ đệm của bên gọi
Thông điệp hoặc khung HTTPCá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.

Bài viết liên quan