Câu trả lời ngắn:
Bạn không thể thay đổi quá giới hạn. Bạn phải đọc một đoạn dữ liệu, lưu dữ liệu vào bộ đệm, đọc một đoạn khác, thêm đoạn đó vào bộ đệm đó, v.v. cho đến khi bạn nhận được toàn bộ thông báo.
Còn câu trả lời:
Kích thước kỷ lục tối đa là 16384 (2^14) vì nó được định nghĩa theo cách đó bởi tiêu chuẩn. Ví dụ: đối với TLS 1.2, là rfc5246.
Lớp bản ghi chia khối thông tin thành TLSPlaintext
ghi dữ liệu theo khối 2^14 byte trở xuống. Khách hàng
ranh giới thông điệp không được bảo quản trong lớp ghi lại (ví dụ:
nhiều tin nhắn khách hàng của cùng một ContentType CÓ THỂ được tập hợp
thành một kỷ lục TLSPlaintext duy nhất, hoặc một thông điệp duy nhất có thể
phân mảnh trên một số hồ sơ).
Các spec làm cho nó khá rõ ràng rằng độ dài có kích thước cố định:
Chiều dài tối đa không quá 2^14.
Máy phát của bạn không nên tạo bản ghi SSL lớn hơn. Nó sẽ phân mảnh thông điệp trên nhiều bản ghi SSL.
Bản ghi SSL tương tự với gói IP. Số lượng dữ liệu tối đa bạn thực sự có thể đặt bên trong gói IP là nhỏ hơn một chút so với số MTU, thường là 1500 byte. Vậy TCP hoạt động như thế nào, cho phép bạn gửi các thông điệp có độ dài tùy ý? Vâng, nó hoạt động bằng cách gửi tin nhắn của bạn trong khối, 1500 byte tại một thời gian cho đến khi bạn đã nhận được toàn bộ tin nhắn của bạn.
TCP biết khi nào bạn đã nhận được toàn bộ thư? Nó không. Nó không có ý tưởng. Đó là lý do tại sao TCP được gọi là giao thức luồng. Nó chỉ truyền các byte vào ứng dụng của bạn. Ứng dụng của bạn phải biết khi nào nó nhận được tin nhắn. Trong trường hợp của HTTP, bạn sẽ biết vì máy khách gửi một tiêu đề Content-Length cho máy chủ biết có bao nhiêu byte mong đợi.
Tương tự với ssl_read
. Bạn đọc một đoạn dữ liệu cùng một lúc cho đến khi ứng dụng của bạn xác định khi bạn đã đọc toàn bộ thư. Bạn tích lũy các khối này trong bộ đệm lớn hơn mà ứng dụng của bạn quản lý.
Lưu ý rằng bạn có thể trong mọi trường hợp được phục vụ tốt hơn bằng cách sử dụng API của Apple thay vì OpenSSL; nếu bạn sử dụng sau này, bạn cần phải giữ cho nó cập nhật, và bạn sẽ muốn gửi nó trong gói ứng dụng của bạn.Đối với HTTPS thông thường, bạn có thể làm hầu hết mọi thứ với Core Foundation và/hoặc Foundation. Đối với các tác vụ phức tạp hơn, hãy xem Giao thông an toàn và/hoặc Mật mã chung. – alastair