5.3. Пример клиент-сервер
Следующий пример показывает поток данных с обеспечением безопасности потока посредством STARTTLS (заметим: альтернативные шаги, показанные ниже, выполнены для иллюстрации протокола в случае сбоя (неудачи), они не являются исчерпывающими и не обязательно будут реализованы при пересылке данных в данном примере).
Шаг 1: Клиент формирует поток к серверу:
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>
Шаг 2: Сервер откликается посылкой тэга потока клиенту:
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='c2s_123' from='example.com' version='1.0'>
Шаг 3: Сервер посылает клиенту расширение STARTTLS и данные о механизме аутентификации и других особенностях потока:
<stream:features> <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'> <required/> </starttls> <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'> <mechanism>DIGEST-MD5</mechanism> <mechanism>PLAIN</mechanism> </mechanisms> </stream:features>
Шаг 4: Клиент посылает серверу команду STARTTLS:
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
Шаг 5: Сервер информирует клиента о том, что он может продолжить работу:
<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
Шаг 5 (alt): Сервер информирует клиента, что согласование TLS не состоялось и следует прервать поток и разорвать TCP-соединение:
<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> </stream:stream>
Шаг 6: Клиент и сервер пытаются завершить согласование применения TLS через существующее TCP-соединение.
Шаг 7: Если согласование TLS успешно, клиент формирует новый поток к серверу:
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' to='example.com' version='1.0'>
Шаг 7 (alt): Если согласование TLS не получилось, сервер закрывает TCP-соединение.
Шаг 8: Сервер реагирует посылкой клиенту заголовка потока и любых характеристик потока:
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='example.com' id='c2s_234' version='1.0'> <stream:features> <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'> <mechanism>DIGEST-MD5</mechanism> <mechanism>PLAIN</mechanism> <mechanism>EXTERNAL</mechanism> </mechanisms> </stream:features>
Шаг 9: Клиент продолжает согласование SASL (раздел 6).