網絡協議研究(一)SMTP
一、網絡協議概述
網絡傳輸協議或簡稱為傳送協議(Communications Protocol),是指計算機通信的共同語言。是目前最普及的計算機通信方式,所以"傳送協議"一般都指計算機通信的傳送協議,如:TCP/IP、NetBEUI等。然而,傳送協議也存在于計算機的其他形式通信,例如:面向對象編程里面對象之間的通信;操作系統內不同程序之間的消息,都需要有一個傳送協議,以確保傳信雙方能夠溝通無間。
以下是TCP/IP體系結構中每層中包含的主要協議:(摘自維基百科)
|
網絡協議 |
|
DHCP · DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP · SNMP · SSH ·TELNET · RPC · RTCP · RTP ·RTSP· SDP · SOAP · GTP · STUN · NTP· SSDP · BGP · RIP · 更多 |
|
Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) · ARP · RARP · ATM · DTM · 令牌環 · 以太網 ·FDDI · 幀中繼 · GPRS · EVDO ·HSPA · HDLC · PPP · L2TP · ISDN· 更多 |
|
以太網 · 調制解調器 · 電力線通信(PLC) · SONET/SDH · G.709 · 光導纖維 · 同軸電纜 · 雙絞線 · 更多 |
前段時間給公司一個老客戶搭建了一個輕量級的郵件服務器,由于他們的需求很簡單,負載也不大,于是使用了一個免費的郵件服務器hMailServer,可以在這里下載,數據庫使用的MySQL。借這次機會,把網絡協議系統學習一下,今天就從郵件協議SMTP開始。
簡單郵件傳輸協議 (Simple Mail Transfer Protocol, SMTP) 是事實上的在Internet傳輸email的標準。
SMTP是一個相對簡單的基于文本的協議。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被確認是存在的),然后消息文本會被傳輸。
由于SMTP開始是基于純ASCII文本的,它在二進制文件上處理得并不好。諸如MIME(多用途互聯網郵件擴展)的標準被開發來編碼二進制文件以使其通過SMTP來傳輸。今天,大多數SMTP服務器都支持8位MIME擴展,它使二進制文件的傳輸變得幾乎和純文本一樣簡單,此舉大大方便了附件的放松。
SMTP是一個"推"的協議,它不允許根據需要從遠程服務器上"拉"來消息。要做到這點,郵件客戶端必須使用POP3或IMAP。另一個SMTP服務器可以使用ETRN在SMTP上觸發一個發送。
協議分析將使用一款開源、免費的協議分析軟件:WireShark,官方主頁:http://www.wireshark.org/
其功能非常強大,可以自定義篩選規則,非常便于抓包、分析協議等。
推薦資源:
相關 RFC
- RFC 5321 - 簡單郵件傳輸協議,在最近(2008.8)代替了RFC 2821
- RFC 2821 - 簡單郵件傳輸協議,在最近(2001)代替了RFC 821,RFC 1869,RFC 974
- RFC 2822 - Internet(比如 e-mail)消息格式,代替了RFC 822
- RFC 3461 - SMTP的發送狀態通知(DSN)擴展,代替了RFC 1891
二、SMTP傳送階段
SMTP報文的傳送分為三個階段:連接建立、郵件傳送、連接終止。
2.1、連接建立
在端口25建立TCP連接后,就開始了連接階段。
2.2、郵件傳送
在SMTP客戶端與服務器建立連接后,發件人就可以與一個或多個收件人交換單個的報文了。整個階段分為8個步驟:
若收件人超過一個,則步驟3與步驟4將重復進行。
2.3、連接終止
在報文傳送成功后,客戶就終止連接,此時TCP連接也必須關閉。
三、命令與響應
SMTP使用命令與響應在客戶端與服務器之間傳遞報文。
命令采用 【關鍵字 = 變量】 的格式:
|
關鍵字 |
變量 | |
|
必須 |
HELO |
發送方的主機名 |
|
MAIL FROM |
發件人 | |
|
RCPT TO |
預期的收件人 | |
|
DATA |
郵件的主體 | |
|
QUIT |
||
|
可選 |
RSET |
|
|
VRFY |
需要驗證的收件人名字 | |
|
NOOP |
||
|
不常用 |
TURN |
|
|
EXPN |
需要擴展的郵件發送清單 | |
|
HELP |
命令名 | |
|
SEND FROM |
預期的收件人 | |
|
SMOL FROM |
預期的收件人 | |
|
SMAL FROM |
預期的收件人 |
響應是三位十進制數字,后面可以添加附加的文本信息:
|
代碼 |
說明 |
|
正面完成回答 | |
|
211 |
系統狀態或求助回答 |
|
214 |
求助報文 |
|
220 |
服務就緒 |
|
221 |
服務關閉傳輸信道 |
|
250 |
請求命令完成 |
|
251 |
用戶不是本地的;報文將被轉發 |
|
正面中間回答 | |
|
354 |
開始郵件輸入 |
|
過渡負面完成回答 | |
|
421 |
服務不可用 |
|
450 |
郵箱不可用 |
|
451 |
命令異常終止:本地差錯 |
|
452 |
命令異常終止:存儲器不足 |
|
永久負面完成回答 | |
|
500 |
語法差錯,不能識別的命令 |
|
501 |
語法的參數或變量差錯 |
|
502 |
命令未實現 |
|
503 |
命令序列不正確 |
|
504 |
命令暫時未實現 |
|
550 |
命令未執行;郵箱不可用 |
|
551 |
用戶非本地的 |
|
552 |
所請求的動作異常終止 |
|
553 |
所請求的動作未發生 |
|
554 |
事務失敗 |
四、使用代碼發送郵件,并使用WireShark抓包分析
安裝完WireShark后,打開,選擇需要分析的網卡:
點擊對應網卡的【Options】:
注意,如果用的筆記本的無線網卡,則需要取消"promiscuous mode"的選擇,否則可能無法抓到包:
點擊【Start】后就開始分析了:
可以看到顯示的數據包非常多,所以必須要進行篩選,在【Filter】中輸入:smtp后【Apply】,一般暫時是不會有SMTP的數據包的:
下面我們發送一封簡單的測試郵件,來分析下SMTP協議。打開VS2010新建一個控制臺項目,輸入如下代碼:
代碼
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;
namespace SMTPDemo
{
class Program
{
private static void fnSMTPDemo()
{
SmtpClient mailClient = new SmtpClient("smtp.qq.com");
mailClient.Credentials = new NetworkCredential("214427358", "******");
MailMessage message = new MailMessage(new MailAddress("214427358@qq.com"), new MailAddress("undead_47@163.com"));
message.Body = "SMTP Demo!";
message.Subject = "SMTP Demo!";
Attachment att = new Attachment(@"G:\cnBlogs\Network\Protocol\SMTP.vsd");
message.Attachments.Add(att);
mailClient.Send(message);
}
static void Main(string[] args)
{
Program.fnSMTPDemo();
}
}
}
F5運行后,在WireShark中就可以抓取到相應的數據包了:
如果你沒有看到類似的數據包,請檢查防火墻設置。
在收件箱中可以看到已發送和接受的郵件:
五、SMTP安全和垃圾郵件
最初的SMTP的局限之一在于它沒有對發送方進行身份驗證的機制。因此,后來定義了SMTP-AUTH擴展。
盡管有了身份認證機制,垃圾郵件仍然是一個主要的問題。但由于龐大的SMTP安裝數量帶來的網絡效應,大刀闊斧地修改或完全替代SMTP被認為是不現實的。Internet Mail 2000就是一個替代SMTP的建議方案。
因此,出現了一些同SMTP工作的輔助協議。IRTF的反垃圾郵件研究小組正在研究一些建議方案,以提供簡單、靈活、輕量級的、可升級的源端認證。最有可能被接受的建議方案是發送方策略框架協議。
小結:
SMTP主要用來發送郵件,是一種最基礎的服務,各大郵件服務提供商都支持SMTP,連Windows也自帶了SMTP Server。借助MIME,可以發送豐富的附件信息,方便了信息快速傳遞、分享。
接觸WireShark等一類協議分析軟件可以方便的分析各種協議,該軟件功能很強大,更多用法請查閱官方文檔。如果你對其實現原理感興趣,請自行編譯源代碼。后續篇章將繼續研究郵件的相關協議:POP3、IMAP等。


浙公網安備 33010602011771號