2010-01-24 36 views
12

tôi dường như không thể có được một câu trả lời dứt khoát về những câu dưới đây (Googling chủ yếu và đọc HTTP/1.1 thông số kỹ thuật):(chunked) HTTP nhị phân nội dung thư và CRLFs

Khi 'chunked' mã hóa chuyển được sử dụng, tại sao máy chủ cần phải viết ra cả hai kích thước chunk theo byte và có kết thúc dữ liệu đoạn tiếp theo với CRLF. Điều này không làm cho việc gửi dữ liệu nhị phân "CRLF-unclean" và phương thức thừa một chút? Điều gì sẽ xảy ra nếu dữ liệu có 0x0A theo sau bởi 0x0D ở một nơi nào đó (tức là đây thực sự là một phần của dữ liệu)? Khách hàng có dự kiến ​​tuân thủ quy mô chunk một cách rõ ràng được cung cấp ở phần đầu của đoạn hoặc bị nghẹt thở trên CRLF đầu tiên mà nó gặp phải trong dữ liệu không? Sự hiểu biết của tôi cho đến nay là chỉ cần lấy kích thước chunk được cung cấp bởi máy chủ, tiến tới dòng tiếp theo, sau đó đọc chính xác số byte này từ bên trong dữ liệu sau (CRLF hoặc không có CRLF bên trong), sau đó bỏ qua CRLF theo sau dữ liệu và lặp lại quy trình cho đến khi không còn khối nữa ... Tôi có đúng không? Điểm CRLF sau mỗi datachunk là gì? Dễ đọc?

Trả lời

21

Một chunked tiêu dùng không quét nội dung thư cho một cặp CRLF . Đầu tiên nó đọc số byte được chỉ định, và sau đó đọc thêm hai byte để xác nhận rằng chúng là CR và LF. Nếu không, nội dung tin nhắn bị hỏng, và kích thước được chỉ định không đúng hoặc dữ liệu bị hỏng.

CRLF theo sau là bảo đảm treo và treo (mỗi RFC 2616 section 3.6.1, Mã hóa chuyển chunk), nhưng nó cũng phục vụ để duy trì quy tắc nhất quán mà trường bắt đầu ở đầu dòng.

+0

Cảm ơn lời giải thích. Bạn lấy nó từ tài liệu RFC 2616 hay ở nơi khác? Lời giải thích của bạn cũng ngụ ý rằng đoạn trả lời CÓ THỂ KHÔNG chứa sự kết hợp CRLF như là một phần của chính dữ liệu? – amn

+0

Nó theo sau từ EBNF trong RFC; lưu ý rằng 'chunk-data' bao gồm' OCTET', gợi ý rằng các byte đó không được hiểu. Một đoạn phản ứng chắc chắn có thể chứa CRLF. Tôi đã thực hiện một codec chunked hai lần bây giờ, cả hai lần trong Java, và trong mỗi trường hợp tôi đã không làm bất kỳ giải thích về nội dung của dữ liệu chunk. Nó mờ đục với khung hình chunk. Bộ giải mã xác định độ dài dự kiến, đọc nhiều byte, và sau đó đảm bảo rằng hai byte tiếp theo là CR và LF. – seh

+0

Điều đó làm cho nó hoàn toàn rõ ràng với tôi. Quy tắc Octets. Cảm ơn bạn đã dành thời gian. – amn

4

CRLF sau mỗi đoạn có lẽ chỉ dành cho khả năng đọc tốt hơn vì không cần thiết do kích thước chunk ở đầu mỗi đoạn. Nhưng CRLF sau khi “tiêu đề đoạn” là cần thiết vì có thể có thêm thông tin sau kích thước đoạn (xem Chunk Transfer Encoding):

 chunk   = chunk-size [ chunk-extension ] CRLF 
         chunk-data CRLF 
+0

Nhưng, ngay cả với thông tin bổ sung, nó không còn dư thừa để cung cấp BOTH kích thước dữ liệu chunk VÀ CRLF sau? Đó là thứ mà tôi không thể có được cái đầu của tôi - tại sao BOTH? Bạn có kích thước của đoạn, đọc N byte quy định trước, và đó là nó cho dữ liệu chunk thực tế, tiến hành từ đó trên để giả định trailer tiêu đề hoặc CRLF, mà không có một CRLF trước tiêu đề tùy chọn. – amn

+0

Cảm ơn bạn đã dành thời gian. "seh" đã trả lời câu hỏi của tôi, nhưng tuy nhiên, tất cả các thông tin tiêu hóa là có giá trị ;-) – amn

Các vấn đề liên quan