Skip to content

Latest commit

 

History

History

Prog4_应用层实验

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

应用层实验

2019.4.14

报告文档:应用层实验.pdf

任务一~任务四

Telnet 任务,已省略。

任务五

编写一个程序,用 FTP 协议下载指定文件。

任务六

编写 TCP Client。该客户端采用两个线程实现:一个输入和发送线程,一个接收线程。

实验总结

  1. HTTP请求头之后有一个空行。HTTP请求报文分为请求行、头部行和消息正文,其中头部行与消息正文之间有一个空行(\r\n)。在本次实验发送的HTTP请求中,消息正文部分均为空,因此在使用Telnet发送HTTP请求时,需要在头部行后面紧跟两个空行,否则请求不完整,则不会得到相应。如果空行方式不当,则可能导致服务器返回400错误。
  2. HTTP的Connection值一般是keep-alive的。使用Telnet发送带有“Connection: close”的请求,得到服务器响应后该连接立即被关闭;若发送带有“Connection: keep-alive”的请求,则服务器响应后连接没有关闭,可以紧接着直接发送下一条请求。如果不发送该字段,我发现效果与“Connection: keep-alive”是相同的。查阅资料得知,这是因为服务器默认的Connection设置为keep-alive的。
  3. FTP协议的控制连接和数据连接。FTP协议的显著特征是具有控制连接和数据连接——前者负责发送命令,后者负责上传或下载数据;前者一般使用21号端口(也可以修改),而后者的端口号是不确定的,使用数据连接之前要先通过控制连接协商一个地址和端口号。使用Telnet的过程中发现,数据连接只能进行“一次服务”,如上传一个文件、下载一个文件或者显示一次文件目录,一旦完成了这些动作,数据连接立即被关闭。若想进行另一个操作,需要建立新的数据连接。新的数据连接和之前的数据连接的地址与端口号不一定相同,需要重新协商。
  4. SMTP协议用到的字符全部是可显示ASCII码,也就是7位ASCII码。如果要传输特殊字符或者二进制文件,则需要使用特殊的编码方式将它们编码为7位ASCII码。用到的编码方式主要是Base64和quoted-printable这两种。经查阅资料得知,早期的电子邮件功能简单,仅仅用来传输可见的字符,因此只支持7位ASCII。不过随着互联网和计算机的发展,媒体种类越来越多,才采用MIME来支持非ASCII数据的传输。
  5. 本次实验内容的五和六都通过上次实验(Chat实验)的程序改写而来。对于FtpDownloader程序,我使用了单线程(串行)的方法——采用这种方法是由FTP协议的特点决定的——仅有发送命令、接受回复这两个功能。对于TcpClient程序,采用了与聊天程序相似的多线程写法——主线程负责发送,子线程负责接收。在编写这两个程序的过程中需要特别注意的是,客户端向服务器发送的命令都必须以“\r\n”结尾。
  6. 关于我使用的终端软件。平日里我使用SSH时最常用的终端软件是 MobaXterm,它具有许多功能,其中就包含Telnet的支持,因此我选用该软件作为完成本次实验的主要软件。除此之外,我还使用 cmd 中的 Telnet、SecureCRT、老师提供的TCPClient.exe、我自己编写的 TcpClient 一共5种不同的客户端来测试实验中的内容一到四,结果基本相同。