Фрагмент SHUTDOWN — это просто указание на то, что удаленная сторона хотела бы закрыть ассоциацию. Локальная сторона по-прежнему может передавать данные, которые она ранее получила от верхнего уровня. По сути, локальная сторона должна доставить все, что было получено от верхнего уровня и еще не доставлено на удаленный конец.
Согласно RFC 4960, глава 9.2:
После получения SHUTDOWN одноранговая конечная точка должна
войти в состояние SHUTDOWN-RECEIVED,
прекратить прием новых данных от своего пользователя SCTP и
проверить, проверив поле Cumulative TSN Ack фрагмента, что все его ожидающие фрагменты DATA были получены отправителем SHUTDOWN.
...
Если все еще остались необработанные блоки ДАННЫХ, получатель SHUTDOWN ДОЛЖЕН продолжать следовать обычным процедурам передачи данных, определенным в Разделе 6, до тех пор, пока не будут подтверждены все необработанные блоки ДАННЫХ; однако получатель SHUTDOWN НЕ ДОЛЖЕН принимать новые данные от своего пользователя SCTP.
Как только все исходящие данные будут успешно доставлены на удаленный конец, можно отправить SHUTDOWN_ACK:
Если у получателя SHUTDOWN больше нет ожидающих обработки фрагментов DATA, получатель SHUTDOWN ДОЛЖЕН отправить SHUTDOWN ACK и запустить собственный таймер отключения T2, перейдя в состояние SHUTDOWN-ACK-SENT. Если таймер истекает, конечная точка должна повторно отправить SHUTDOWN ACK.
То же самое относится к частям SACK. Локальная сторона по-прежнему может получать сообщения SACK, подтверждающие невыполненные данные. Однако локальная сторона не должна отправлять какой-либо новый фрагмент SACK на удаленный конец, потому что фрагмент SHUTDOWN отправляется только после того, как удаленный конец успешно доставил все исходящие данные.
Надеюсь, это поможет.
person
Alexander Zinovyev
schedule
11.01.2018