2014-07-21 18 views
5

Tôi đang sử dụng openssl trong ứng dụng iOS của mình và nó hoạt động phạt cho đến khi tôi gửi tin nhắn quá lớn (100kb) từ máy chủ đến ứng dụng khách (ứng dụng iOS).Giới hạn bộ đệm iOS Openssl

vấn đề là phương thức ssl_read() có kích thước bộ đệm giới hạn là 16384 byte, vì vậy nếu máy chủ gửi thư lớn hơn 16384 byte, việc đặt lại thư sẽ bị bỏ qua.

câu hỏi của tôi là cách tôi có thể thay đổi giới hạn này (tăng giới hạn này)?

+0

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

Trả lời

3

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ý.

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