Режим «Split Packet» при обработке данных TCP

Из отзывов клиентов Tibbo узнала, что иногда нужно знать размер отдельных пакетов TCP. Например, некоторые методы шифрования данных работают на уровне пакетов: сотрите границу между пакетами TCP - и данные не расшифровать.

Свойство sock.splittcppackets и событие on_sock_tcp_packet_arrival, появившиеся в Tibbo BASIC/C V2.0, позволяют обрабатывать входящие данные TCP пакет за пакетом. Для этого установите sock.splittcppackets = 1 - YES. После этого событие on_sock_tcp_packet_arrival будет генерироваться для каждого входящего пакета TCP, несущего новые данные (то есть не повторно переданные). Пример использования:

dim rx_tcp_packet_len as word 'to keep the size of the next incoming TCP packet
sub on_sys_init
   ...
   rx_tcp_packet_len=0
   sock.splittcppackets=YES
end sub
sub on_sock_tcp_packet_arrival(len as word)
   rx_tcp_packet_len=len 'we get the size of the next packet we are going to process
end sub
sub on_sock_data_arrival
   dim s as string
   'take exactly the contents of one packet (we assume that it can fit in the string!)
   s=sock.getdata(rx_tcp_packet_len)
   rx_tcp_packet_len=0 'very important!
end sub

Разумеется, может понадобиться и управление размером исходящих пакетов TCP. Это делается иначе. При sock.splittcppackets = 1 - YES, когда вы помещаете данные в буфер TX и выполняете sock.send, сокет не отправит эти данные, если всё содержимое буфера TX не умещается в один пакет TCP. Вот пример, как этим можно воспользоваться:

sock.splittcppackets=YES
...
...
sock.setdata("ABCDEFGH1234567890")
sock.send
while sock.txlen>0
   doevents
wend

Заметьте, что у этого способа есть недостаток - снижается пропускная способность, потому что программа ждёт подтверждения для каждого отправляемого пакета TCP. С другой стороны, это надёжный способ убедиться, что исходящий пакет TCP содержит именно те данные, которые вы задумали.

Будьте осторожны: не пытайтесь отправить больше данных, чем размер буфера RX на другой стороне. В этом режиме сокет не отправит данные, пока не сможет отправить их все целиком, и ваше соединение TCP застрянет!

Кроме того, попытка отправить пакет размером больше «максимального размера сегмента» (MSS), заданного другой стороной, приведёт к фрагментации данных! Сокет никогда не отправит пакет TCP с объёмом данных, превышающим MSS.

Внимание

Режим Split Packet несовместим с TLS. Если его включить, отправляемые и принимаемые зашифрованные данные будут повреждены.

Исходный материал Tibbo обновлён 11 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке