sin(x)

Page 9 of 10

计算机网络:SMTP邮件客户端

本文来完成《Computer Networking: A Top-Down Approach》里有编写一个使用SMTP协议发送邮件的小程序的实验。

本实验使用的服务器是网易的smtp.126.com,向QQ邮箱发送一封邮件。在开始编写程序之前,先用telnet来摸索一下具体的流程。

实现原理

1. 首先建立TCP/IP连接,在命令行里输入`telnet smtp.126.com 25`连接网易邮件服务器,如果连接成功,服务器会返回`220 126.com Anti-spam GT for Coremail System (126com[20140526])`。

2. 发送`EHLO Alice`来开始与服务器的交互,我发现EHLO命令后面的内容对这个过程没有什么影响。如果无误,服务器返回:
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrdqNVBUCa
UUUUj
250-STARTTLS
250 8BITMIME

这么多东西看似复杂,其实知道返回的是数字250开始 的消息即可,毕竟程序要看的只是状态码。

3. 发送`AUTH LOGIN`来开始验证,服务器会返回`334 dXNlcm5hbWU6`,这个时候发送经过base64编码的网易邮箱地址,然后服务器又会返回`334 UGFzc3dvcmQ6`,接着发送经过base64编码的网页邮箱密码,如果用户名密码正确,服务器返回`235 Authentication successful`。

4. 发送`MAIL FROM: <*****@126.com>`,如果无误,服务器返回`250 Mail OK`。

5. 接着发送`RCPT TO: <*****@qq.com>`,如果没有问题,服务器返回`250 Mail OK`。

6. 发送`DATA`,服务器返回`354 End data with <CR><LF>.<CR><LF>`。

7. 现在我们可以开始发生邮件的内容了,比如:
from:^^^^@126.com
subject:I Love Computer Networks!
Content-type:text/html
<img src=\"http://www.people.com.cn/mediafile/200512/09/F2005120913054600000.jpg\"><h1>I love computer networks!</h1>
.

记得一定要加上from和subject这两个头,否则会被服务器判为垃圾邮件(虽然就是垃圾邮件)。如果没有问题,服务器返回250 Mail OK queued as smtp2,DMmowEAJb0O8NZJWTNpkAA--.10072S2 1452422762

8. 发送`QUIT`结束本次会话,然后服务器会自动断开连接。

9. 翻一下收件箱,邮件的确是收到了。![](https://img.sine-x.com/smtp.png)

Continue reading

深入理解计算机系统:体系结构实验

这个实验让我们用Y86语言写程序,然后用HCL语言写CPU的逻辑,可玩性很高。实验文件可以从CSAPP的网站上下载,我完成的答案在GitHub上。

Part A

Part A让我们用Y86写几个程序,对于被Bomb Lab和Buffer Lab虐过的我来说还是比较容易的。

Continue reading

深入理解计算机系统:性能试验

本实验要求使用一切可能的办法来优化程序(附:实验文件完整代码)。

rotate

这就是一个矩阵转置的问题。只要让内部循环得以连续写入就会得到很大的性能提升。经过我的实验发现,循环所需的性能消耗可以忽略不计,所以如果只是单纯地加大循环步长并没有获得什么性能提升。毕竟读取内存消耗的资源比CPU计算消耗的资源不知道要高到哪里去了。

Continue reading

深入理解计算机系统:内存分配实验

实验要求实现内存分配功能,关于内存分配的方法机制已经非常多了,本文主要尝试使用红黑树来实现内存空间的管理和分配,完整代码可见GitHub

原理

内存块

对于一个内存块来说,除了本身内存区域之外,通常还需要保存区域大小和是否空闲等信息。在内存管理过程中,通常需要合并相邻的内存空间,为了方便检查相邻空间的大小和空闲状态,内存块信息在头部和尾部各保留一份。需要注意的是,内存区大小包含了头部和尾部的占用空间。

Block size
Block size
0 0 a
0 0 a
Payload
(allocated block only)
Payload<div>(allocated block only)</div>
Padding (optional)
Padding (optional)
3 2 1 0
3 2 1 0
31
31
a = 1: Allocated
a = 0: Free
[Not supported by viewer]
Block size
Block size
0 0 a
0 0 a
Header
Header
Footer
Footer

Continue reading

深入理解计算机系统:代理实验

这是《深入理解计算机系统》配套实验之一:代理实验

其实在两年前,我已经完成了这个代理程序,后来《深入理解计算机系统》出了第三版,而代理实验内容也加入了缓存的要求。实验中只要求实现HTTP/1.0的GET方法多线程代理和简单的缓存机制,但其实如果只实现了实验内的要求的话,这个代理服务程序还是无法适应目前这个网络环境的,所以本文介绍的是关于代理实验的增强版本。

原理

时至今日,HTTP协议已经非常复杂,一些内容不太常见,本程序也就不会实现。在开始设计代理服务程序之前,需要了解一下常见的HTTP协议的内容:

Continue reading

« Older posts Newer posts »

Copyright © 2019 sin(x)

Theme by Anders Noren, host by Coding PagesUp ↑