Понимание протокола SMTP

Опубликовано: 25 Марта, 2023

Простой протокол передачи почты, и вы

Одной из самых привлекательных частей Интернета и компьютеров для многих людей является возможность отправлять и получать электронную почту. Как работает отправка и получение электронной почты, для многих остается загадкой. В этой статье мы поговорим о протоколе, отвечающем за отправку электронной почты. Этим протоколом будет SMTP, или, как его еще называют, Simple Mail Transfer Protocol. Этот протокол будет прослушивать порт 25, или, точнее, SMTP-сервер будет прослушивать клиентские подключения через порт 25. Наиболее известным почтовым сервером, используемым сегодня, является Microsoft Exchange.

Ну, как всегда, я стараюсь использовать эталонную модель OSI для сопоставления протоколов, и этот не исключение. SMTP сам по себе будет протоколом прикладного уровня. Он использует TCP в качестве транспортного протокола и, в свою очередь, использует IP для маршрутизации. Как и HTTP, протокол SMTP имеет ряд кодов состояния для расширения его функциональности. Эти коды состояния используются для передачи определенных условий между клиентом и сервером. Да вы действительно правы! Этот протокол действительно соответствует широко обсуждаемой модели клиент/сервер. Думайте о Microsoft Outlook как о клиенте, а о Microsoft Exchange как о сервере.

В дополнение к кодам состояния, которые использует SMTP, существует также ряд SMTP-команд. Такие команды, как «AUTH» для аутентификации и «EHLO» для расширенного приветствия. Эти команды позволяют почтовому клиенту и серверу общаться друг с другом. Я всегда говорю, что видеть значит верить, поэтому давайте посмотрим на пример, когда клиент и сервер общаются друг с другом.

Дайте мне пакеты!

В приведенном ниже пакете мы видим, что присутствует SMTP-команда «HELO». Эта команда выдается после того, как между клиентом и сервером завершено трехкратное рукопожатие TCP/IP. Что на самом деле означает HELO? Ну, на самом деле это в значительной степени соответствует тому, как это звучит. Почтовый клиент передает приветствие, а после команды HELO указывается домен, из которого исходит клиент. Мы можем видеть домен в приведенном ниже содержимом ASCII, и для ясности он выделен жирным шрифтом.

Команда HELO заменена командой EHLO. EHLO означает «расширенное приветствие». При отправке команды EHLO почтовый сервер объявляет обо всех своих функциях. Такие функции, как возможность переноса символов, отличных от безопасных символов ASCII. Однако на самом деле EHLO не заменил HELO, поскольку это означало бы, что HELO больше не используется. Сегодня он очень широко используется, и все почтовые серверы по-прежнему должны принимать простой HELO.

06/09/2005 06:10:46.595221 192.168.1.100.40565 > 192.168.1.200.25: P [tcp sum ok] 159505509:159505543 (34) ack 578397676 win 33304 <nop,nop,timestamp 310237481 108030715> (DF) (ttl 52, id 34293, длина 86)
0x0000 4500 0056 85f5 4000 3406 5235 c0a8 0164 [электронная почта защищена]…
0x0010 c0a8 01c8 9e75 0019 0981 dc65 2279 a5ec …..u…..e”y..
0x0020 8018 8218 0449 0000 0101 080a 127d d929 …..I…….}.)
0x0030 0670 6afb 4845 4c4f 2077 6562 3334 3231.pj. ПРИВЕТ. веб3421
0x0040 332e 6d61 696c 2e6d 7564 2e79 6168 6f6f 3.mail.mud.yahoo
0x0050 2e63 6f6d 0d0a .com..

Итак, что происходит после того, как HELO был отправлен почтовому серверу? Что происходит дальше, так это то, что почтовый клиент скажет, что у него есть почта от кого-то. Мы можем видеть это в приведенном ниже пакете. Я подчеркнул «ПОЧТА ОТ» в содержимом ASCII. Возвращаясь немного назад к TCP/IP, мы можем видеть из порядковых номеров TCP в приведенном выше и ниже пакете, что порядковые номера TCP следуют друг за другом, как и должно быть. Из этого мы также можем сделать вывод, что почтовый сервер еще не подтвердил ни один из пакетов, как показано выше и ниже.

06/09/2005 06: 10: 46.641311 192.168.1.100.40565> 192.168.1.200.25: P [TCP Sum OK] 159505543: 159505580 (37) ACK 578397699 WIN 33304 < NOP, TIMEST 310234848030303030303030303034848484848484848484848484848484848484848484848430303030348484848484848484848430303030303030348484848484848430303030 (ttl 52, id 35311, длина 89)
0x0000 4 500 0059 89ef 4000 34 06 4e38 c0a8 0164 [электронная почта защищена]…
0x0010 c0a8 01c8 9e75 0019 0981 dc87 2279 a603 …..u……”y..
0x0020 8 018 8218 053c 0000 0101 080a 127d d92e …..<…….}..
0x0030 0670 6b00 4d41 494c 2046 524f 4d3a xxxx.pk. ПОЧТА.ОТ:<x
0x0040 xxxx xxxx xxxx xxxx xxxx xxxx 4079 6168 [электронная почта защищена]
0x0050 6f6f 2e63 6f6d 3e0d 0a oo.com>..

Теперь давайте рассмотрим пакет выше немного дальше. Вот несколько быстрых шагов, чтобы сориентироваться. Мы знаем, что в начале у нас есть IP-заголовок, который использует IPv4, как указано в подчеркнутой цифре 4. Также мы видим, что транспортным протоколом является TCP, как указано в подчеркнутой цифре 06 в IP-заголовке. Из подчеркнутой цифры 8 в заголовке TCP видно, что у нас установлено 12 байт опций TCP. Начиная с байта 4d41 и далее, у нас начинаются фактические данные прикладного уровня SMTP. Я выделил эти байты жирным шрифтом.

Еще раз давайте воспользуемся возможностью немного вернуться к TCP. В приведенном выше пакете у нас есть два различных варианта TCP. Примечательно, что у нас есть NOP (нет операции) и отметка времени, как показано в ASCII выше. Теперь давайте разберем эти параметры на шестнадцатеричном уровне.

Начиная с байта 0101, показанного выше и подчеркнутого, это представляет параметр TCP 01, а длина указанного параметра составляет 01 байт, т. е. один байт. После этого у нас есть байт 08, который представляет параметр временной метки, как показано в нижней части листовки TCP / IP и tcpdump, найденной внизу этой страницы. За этим байтом следует байт 0a, который представляет длину параметра метки времени, измеренную в байтах. 0a равняется десяти в десятичной системе. Наконец, за ним следуют байты 127d d92e, и это представляет собой первое значение метки времени 310237486. Затем следуют байты 0670 6b00, которые представляют собой конечное значение метки времени 108030720. Параметр метки времени не тот, который вы всегда видите, поэтому я хотел воспользуйтесь этой возможностью, чтобы показать его вам и то, как он выглядит.

Вернемся к этому!

А теперь вернемся к обсуждению самого SMTP и того, как он работает. В последний раз мы рассмотрели второй шаг, который выполняет клиент при отправке электронной почты на почтовый сервер. Это отображается в приведенном выше пакете содержимым «MAIL FROM:» ASCII. Что дальше в цепи событий? Что ж, следующий пакет будет содержать само сообщение электронной почты. Также будут содержаться тело письма и поля заголовка. Под «телом письма» я подразумеваю фактическое содержание самого письма. Последним шагом клиента является команда «ВЫЙТИ», тем самым разрывая соединение с веб-сервером.

Резюме

Вот, вкратце, как работает SMTP и как он доставляет вам почту. Конечно, SMTP — это нечто большее, чем то, что я здесь изложил. Я, безусловно, рекомендую вам прочитать соответствующие RFC, относящиеся к SMTP. Черт возьми, вы даже можете напрямую взаимодействовать с почтовым сервером, если хотите, и играть с выдачей ему команд. Я надеюсь, что этого вкуса SMTP достаточно, чтобы пробудить ваш аппетит и, возможно, побудить вас к дальнейшему чтению этого протокола. Как всегда, я искренне надеюсь, что эта статья была полезной, и я всегда рад обратной связи. До следующего раза!