2014-07-21 11 views
5

Sto usando openssl nella mia applicazione iOS e funziona fino a quando non ho inviato un messaggio troppo grande (100kb) da server a client (app iOS).Limite del buffer iOS opensl.

il problema è che il metodo ssl_read() ha una dimensione del buffer limite di 16384 byte, quindi se il server invia un messaggio di 16384 byte, il reset del messaggio verrà ignorato.

la mia domanda è come posso modificare questo limite (aumentare questo limite)?

+0

Nota che potresti in ogni caso essere meglio servito utilizzando le API di Apple invece di OpenSSL; se si utilizza quest'ultimo, è necessario tenerlo aggiornato, e si vorrà spedirlo nel pacchetto di applicazioni.Per HTTPS ordinario, puoi fare la maggior parte delle cose con Core Foundation e/o Foundation. Per attività più complesse, consulta Secure Transport e/o Common Crypto. – alastair

risposta

3

Risposta breve:

Non è possibile modificare il limite. Devi leggere un blocco di dati, salvarlo in un buffer, leggere un altro blocco, aggiungerlo a quel buffer e così via fino a quando non hai ricevuto l'intero messaggio.

Più rispondere:

La dimensione massima record è 16384 (2^14) perché è cosi inteso dallo standard. Ad esempio, per TLS 1.2, ovvero rfc5246.

Lo strato di registrazione frammenta blocchi di informazione in TLSPlaintext
record trasportano dati in blocchi di 2^14 byte o meno. Client
messaggio confini non vengono mantenute nello strato di registrazione (vale a dire,
più messaggi client dello stesso ContentType MAGGIO essere fusero
in un unico record TLSPlaintext, o un singolo messaggio può essere
frammentato tra diverse registrazioni).

Le specifiche rende abbastanza chiaro che la lunghezza è di dimensioni fisse:

La lunghezza non deve superare i 2^14.

Il trasmettitore non deve costruire record SSL più grandi di questo. Dovrebbe essere frammentare il messaggio su più record SSL.

Un record SSL è analogo a un pacchetto IP. La quantità massima di dati che puoi effettivamente inserire in un pacchetto IP è leggermente inferiore a quella del tuo MTU, che di solito è di 1500 byte. Quindi, come funziona TCP, che ti permette di inviare messaggi di lunghezza arbitraria? Bene, funziona inviando il tuo messaggio in blocchi, 1500 byte alla volta fino a quando non hai ricevuto l'intero messaggio.

Come fa il TCP a sapere quando hai ricevuto l'intero messaggio? Non è così. Non ha idea. Ecco perché TCP è chiamato un protocollo di flusso. Trasmette solo byte alla tua app. La tua app deve sapere quando ha ricevuto un messaggio. Nel caso di HTTP, dovresti sapere perché il client invia un'intestazione Content-Length che indica al server quanti byte aspettarsi.

Uguale a ssl_read. Leggi una porzione di dati alla volta fino a quando l'app non ha determinato quando hai letto un intero messaggio. Si accumulano questi blocchi in un buffer più grande gestito dall'applicazione.

Problemi correlati