应用层对应用程序的通信提供服务
应用层协议定义的内容
应用层的功能 | 应用层的重要协议 |
---|---|
文件传输、访问和管理 | FTP |
电子邮件 | SMTP、POP3 |
虚拟终端 | HTTP |
查询服务和远程作业登录 | DNS |
两种网络应用模型
服务器:提供计算服务的设备。
客户机:请求计算服务的主机。
应用:Web,文件传输FTP,远程登录,电子邮件
P2P 模型的特点
P2P 模型的优势
P2P 模型可以应对大量主机涌入网络的情况,因为加入网络的主机既可以请求服务,也可以提供服务。但是 C/S 模型由于服务器资源以及带宽等问题限制,只能接收一定数量的客户端请求
域名服务器的概念
DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。 域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。
把域名翻译成IP地址的软件称为域名系统,即DNS。它是一种管理名字的方法。这种方法是:分不同的组来负责各子系统的名字。系统中的每一层叫做一个域,每个域用一个点分开。所谓域名服务器(即Domain Name Server,简称Name Server)实际上就是装有域名系统的主机。它是一种能够实现名字解析(name resolution)的分层结构数据库。
域名的举例
以王道考研论坛为例:www.cskaoyan.com
像 com、cskaoyan 和 www 这种以 .
分隔开的称为标号,标号一般不超过 63 个字符,为了记忆方便,一般不超过 12 个字符,并且不区分大小写。标号中可出现 -
,除此之外不能有其他标点符号。有多个标号组成的完整域名总共不超过255个宇符。
域名级别最低的域名写在最左边,级别最高的域名写在最右边。域名由两组或两组以上的ASCII或各国语言字符构成,各组字符间由点号分隔开,最右边的字符组称为顶级域名或一级域名(com)、倒数第二组称为二级域名(cskaoyan)、倒数第三组称为三级域名(www)、以此类推。
域名的分类
根域名
根域名是最顶级的域名,也就是一个点(.)
顶级域名
域名级数是指一个域名由多少级组成,域名的各个级别被“.”分开,最右边的那个词称为顶级域名。顶级域名又分为三类:
二级域名
二级域名(Second Level Domain,SLD)在国际顶级域名或国家顶级域名之下的意义不同。
目前,中国“.cN”的注册量为13455541个,在顶级域名“.CN下”,采用层次结构设置“类别域名”和“行政区域名”两类。
三级域名
三级域名是形如“youa.baidu.com”的域名,可以当做是二级域名的子域名,特征为域名包含两个“.”(dot)。对于域名所有者/使用者而言,三级域名都是二级域名的附属物而无需单独费用。
一个完整的域名(*.com、*.net、*.edu、*.gov等)由二个或二个以上部分组成,各部分之间用英文的句号".“来分隔,最后一个”."的右边部分称为顶级域名 (Top-level Domain Name),顶级域名“.”的左边部分称为二级域名 (Second-level Domain Name),二级域名的左边部分称为三级域名,以此类推,每一级的域名控制它下一级域名的分配。
四级域名
四级域名是形如“new.book.cirno.site”的域名,可以当做是三级域名的子域名,特征为域名包含三个“.”(dot)。对于域名所有者/使用者而言,四级域名都是三级域名的附属物而无需单独费用。
域名树
将域名树自下而上书写,便可组成一个域名
参考资料
百度百科:根域名服务器
DNS入门:域名结构与域名服务器
1、根域名服务器
根服务器主要用来管理互联网的主目录,最早是IPV4,全球只有13台(这13台IPv4根域名服务器名字分别为“A”至“M”,网域名称格式为字母.root-servers.org
),1个为主根服务器在美国。其余12个均为辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。
这13台根域名服务器由12个组织独立运营。其中,Verisign 公司管理两台根域名服务器:A 和 J。每家公司为了保证根域名服务器的可用性,会部署多个节点,比如单单 Verisign 一家公司就部署了104台根域名服务器(2016年1月数据)。所以,根域名服务器其实不止13台。据统计,截止2016年1月,全世界共有 517 台根域名服务器。你可以在 http://root-servers.org 这个网站查到所有根域名服务器的信息。
从DNS协议(域名解析协议)说起。DNS协议使用了端口上的UDP和TCP协议,UDP通常用于查询和响应,TCP用于主服务器和从服务器之间的传送。由于在所有UDP查询和响应中能保证正常工作的最大长度是512字节,512字节限制了根服务器的数量和名字。要让所有的根服务器数据能包含在一个512字节的UDP包中,IPv4根服务器只能限制在13个,而且每个服务器要使用字母表中的单个字母命名,这也是IPv4根服务器是从A~M命名的原因。
随着互联网+、物联网和工业互联网等网络应用融合发展,原有IPv4 体系已经不能满足需求。基于IPv6的新型地址结构为新增根服务器提供了契机。下一代互联网国家工程中心于2013 年联合日本和美国相关运营机构和专业人士发起“雪人计划”,提出以IPv6 为基础、面向新兴应用、自主可控的一整套根服务器解决方案和技术体系。亚太互联网络信息中心预测,10年内IPv4将全面退出历史舞台,互联网将全面转向IPv6。最后的 IPv4 地址储备池已于2019年11月25日完全耗尽。
2、顶级域名服务器
就好像国家总理下面的各个省长,管辖省级单位。在DNS中,它们负责管理在该顶级域名服务器注册的下一级域名(二级域名)。所有顶级域名服务器的名称和IP地址是在根服务器注册的,也就是说,根域名服务器知道所有的顶级域名服务器的名称和IP地址。
3、权限域名服务器
负责一个区的域名服务器,就好像省长以下的那些市长、镇长、乡长等行政官。顶级域名服务器也可以算作是权威域名服务器,只不过由于其特殊性,我们专门把它划分为一类。因此权威域名服务器通常是指顶级域名以下的管理二级、三级、四级等域名的服务器。
上面三种服务器的关系可以用这张图表示:
4、本地域名服务器
这类服务器不属于上面的层次结构,当一个主机(个人电脑)发出DNS请求时,查询请求就被发送到本地域名服务器,本地域名服务器负责回答这个查询,或者代替主机向域名空间中不同层次的权威域名服务器查询,再把查询的结果返回给主机。
域名解析的过程
下面的图示表示了一个域名的解析过程以及各个类型的域名服务器所处的位置。
域名解析的两种方式
域名解析的举例
DNS高速缓存
什么是DNS的高速缓存?
服务器可以高速缓存从其他 DNS 服务器收到的 DNS 记录。 也可以在 DNS 客户服务中使用高速缓存, 将其作为 DNS 客户端保存在最近的查询过程中得到的信息高速缓存的方法。 总的来说就是提高解析速度。
DNS高速缓存有什么作用?
当某个访问请求解析过一个域名以后,该解析记录就放置在缓存中,以后再有同样的解析请求, 就直接从缓存中提供结果,加快了访问者的应答速度。
dig命令
dig(域信息搜索器)命令是个用于询问 DNS 域名服务器的灵活的工具。 他执行 DNS 搜索,显示从受请求的域名服务器返回的答复
CDN 的概念
CDN 全称是内容分发网络。其目的是让用户能够更快速的得到请求的数据。简单来讲,CDN 就是用来加速的,他能让用户就近访问数据,这样就更更快的获取到需要的数据。
举个例子,现在服务器在北京,深圳的用户想要获取服务器上的数据就需要跨越一个很远的距离,这显然就比北京的用户访问北京的服务器速度要慢。但是现在我们在深圳建立一个 CDN 服务器,上面缓存住一些数据,深圳用户访问时先访问这个 CDN 服务器,如果服务器上有用户请求的数据就可以直接返回,这样速度就大大的提升了。
当用户请求一个文件时,cdn的工作过程如下
FTP 协议
FTP(File Transfer Protocol):是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。
相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。FTP是基于TCP协议的,因此iptables防火墙设置中只需要放开指定端口(21 + PASV端口范围)的TCP协议即可。
SFTP 协议
SFTP(Secure File Transfer Protocol):安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP为SSH的一部份,是一种传输文件到服务器的安全方式。在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
FTP是基于客户/服务器(C/S)的协议。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。
用户要连上 FTP 服务器,就要用到 FPT 的客户端软件,通常 Windows 自带 ftp
命令,这是一个命令行的 FTP 客户程序,另外常用的 FTP 客户程序还有 CuteFTP、Ws_FTP、Flashfxp、LeapFTP、流星雨-猫眼等。
1、FTP用户授权
1)、用户授权
要连上 FTP 服务器(即“登陆”),必须要有该 FTP 服务器授权的帐号,也就是说你只有在有了一个用户标识和一个口令后才能登陆FTP服务器,享受FTP服务器提供的服务。
2)、FTP地址格式
FTP地址如下: ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名
上面的参数除FTP服务器IP或域名为必要项外,其他都不是必须的。如以下地址都是有效FTP地址:
2、匿名FTP
互连网中有很大一部分 FTP 服务器被称为“匿名”(Anonymous)FTP 服务器。这类服务器的目的是向公众提供文件拷贝服务,不要求用户事先在该服务器进行登记注册,也不用取得FTP服务器的授权。Anonymous(匿名文件传输)能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“anonymous”登陆FTP服务,就可访问远程主机上公开的文件。许多系统要求用户将Emai1地址作为口令,以便更好地对访问进行跟综。匿名FTP一直是Internet上获取信息资源的最主要方式,在Internet成千上万的匿名FTP主机中存储着无以计数的文件,这些文件包含了各种各样的信息,数据和软件。人们只要知道特定信息资源的主机地址,就可以用匿名FTP登录获取所需的信息资料。虽然目前使用WWW环境已取代匿名FTP成为最主要的信息查询方式,但是匿名FTP仍是 Internet上传输分发软件的一种基本方法。如red hat 、autodesk等公司的匿名站点。
FTP 工作原理图
1、PORT(主动)方式
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了一个1024+的随机端口,你过来连接我”。于是服务器从20端口向客户端的1024+随机端口发送连接请求,建立一条数据链路来传送数据。
PORT方式,服务器会主动连接客户端的指定端口,那么如果客户端通过代理服务器链接到internet上的网络的话,服务器端可能会连接不到客户端本机指定的端口,或者被客户端、代理服务器防火墙阻塞了连接,导致连接失败
2、PASV(Passive被动)方式
PASV(Passive被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了一个1024+的随机端口,你过来连接我”。于是客户端向服务器的指定端口发送连接请求,建立一条数据链路来传送数据。
PASV方式,服务器端防火墙除了要放开21端口外,还要放开PASV配置指定的端口范围
1、ASCII传输方式
ASCII模式,以文本序列传输数据;
2、二进制传输模式
Binary模式,以二进制序列传输数据。
电子邮件的优点
电子邮件系统可以说是因特网上最早流行的一种应用,并且至今仍有重要的地位。原因主要是实时通信存在着两大缺陷:
而电子邮件就像寄信一样,既可以传达信息又不至于打扰人们正常或休息,而且如今的电子邮件还可以附上声音和图像等等,功能十分强大。
电子邮件系统概念
电子邮件系统(Electronic mail system,E-mail)由用户代理MUA(Mail User Agent)以及邮件传输代理MTA(Mail Transfer Agent),和邮件投递代理MDA(Mail Delivery Agent)组成。
MUA指用于收发Mail的程序,MTA指将来自MUA的信件转发给指定用户的程序,MDA就是将MTA接收的信件依照信件的流向(送到哪里)将该信件放置到本机账户下的邮件文件中(收件箱)。
当用户从 MUA 中发送一份邮件时,该邮件会被发送送到MTA,而后在一系列MTA中转发,直到它到达最终发送目标为止。
专业术语解释
总的来说,参照rfc4021标准,mime格式分为消息头和消息体两部分(邮件头和邮件体)。
邮件头
邮件头包含了发件人、收件人、主题、时间、MIME版本、内容的类型、内容的传输编码方式等重要信息。每条信息称为一个域,由域名后加冒号(“ : ”)和信息内容构成,可以是一行,也可以占用多行。域的首行必须顶头写(即左边不能有空白字符(空格和制表符));续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。另外,邮件头中不允许出现空行。例如
Date: Wed, 15 Aug 2017 10:09:00 +0800
From: [email protected]
To: "simba"
Cc: "simba"
BCC: "simba"
Subject: test
Message-ID: <[email protected]>
X-mailer: Foxmail 6, 15, 201, 21 [cn]
X-Spam: yes
X-Rmilter-Greylist: Sender IP ::1 is whitelisted by configuration
Mime-Version: 1.0
包含内容解释及其他信息如下:
邮件头:
域名 | 含义 | 添加者
Received | 传输路径 | 各级邮件服务器
Return-Path | 回复地址 | 目标邮件服务器
Delivered-To | 发送地址 | 目标邮件服务器
Reply-To | 回复地址 | 邮件的创建者
From | 发件人地址 | 邮件的创建者
To | 收件人地址 | 邮件的创建者
Cc | 抄送地址 | 邮件的创建者
Bcc | 暗送地址 | 邮件的创建者
Date | 日期和时间 | 邮件的创建者
Subject | 主题 | 邮件的创建者
Message-ID | 消息ID | 邮件的创建者
MIME-Version | MIME版本 | 邮件的创建者
Content-Type | 内容的类型 | 邮件的创建者
Content-Transfer-Encoding | 内容的传输编码方式 | 邮件的创建者
-----------------------------------------------------------------------------
段头:
域名 含义
Content-Type | 段体的类型
Content-Transfer-Encoding | 段体的传输编码方式
Content-Disposition | 段体的安排方式
Content-ID | 段体的ID
Content-Location | 段体的位置(路径)
Content-Base | 段体的基位置
邮件体
邮件内容有各种各样的(既纯文本,超文本,内嵌资源(比如内嵌在超文本中的图片),附件的组合),服务器通过第一个content-type判断邮件内容,如果包含了其他内容,邮件体被分为多个段,段中可包含段,每个段又包含段头和段体两部分。
如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。什么是“至少”?举个例子说,如果只有纯文本与超文本正文,那么在邮件头中将类型扩大化,定义为multipart/related,甚至multipart/mixed,都是允许的。
+----------------------------------------multipart/mixed----------------------------------------+
| |
| |
| +---------------------------multipart/related---------------------------+ |
| | | |
| | | |
| | +---------mutipart/alternative--------------+ +-------------+ | +-------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | | | +-------------+ | +-------+ |
| | | +---------------+ +---------------+ | | |
| | | | 纯文本正文 | | 超文本正文 | | | |
| | | +---------------+ +---------------+ | +-------------+ | +-------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | | | +-------------+ | +-------+ |
| | +-------------------------------------------+ | |
| | | |
| | | |
| +-----------------------------------------------------------------------+ |
| |
| |
+-----------------------------------------------------------------------------------------------+
电子邮件系统的组成
另外,邮件在发送过程中要经过很多结点,因此每个结点都要安装邮件传输程序(MTA),以便对邮件存储转发。Internet上的MTA集合构成了报文传送系统(MTS)。
发送电子邮件的具体过程
电子邮件的传输协议
电子邮件系统采用客户/服务器体系结构
原因就是用户代理所在的计算机不可能每天24小时在线(就像你在给一个没电池的手机打电话)。
而将发送、接受和缓存邮件的功能交给24小时开机的邮件服务器,当用户方便时候从邮件服务器的用户信箱中读取邮件是一种比较合理的方法。
总结以上的内容,电子邮件系统的体系结构粗糙一画是这样子的:
A用户<------>邮件服务器<------>B用户
SMTP 协议的概念
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是由源地址到目的地址传送邮件的一组规则,用来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它使每台计算机在发送或中转信件时能找到下一个目的地。通过使用指定的服务器,把Email寄到收信人的服务器上。
SMTP服务器是遵循SMTP协议的邮件服务器,用来发送或中转电子邮件。首先, 客户端需要建立一个与SMTP服务器的TCP连接 , 端口一般为25 。在连接建立之后,客户端和服务器先执行一些应用层的握手操作,让SMTP服务器知道客户端的信息,并且对客户端需求做出响应等。
在SMTP握手阶段,客户端向SMTP服务器分别指定发件人和收件人的电子邮件地址。握手阶段完毕,SMTP服务器把客户端发出的邮件消息添加到发信队列中,通过TCP提供的可靠数据传输服务把该消息准确地传送到收件人的服务器。
SMTP 通信的三个阶段:连接建立、邮件传送和连接释放
连接建立:
SMTP客户每隔一定时间对邮件缓存扫描一次。如发现有邮件,就使用SMTP的熟知端口号码25与接收方邮件服务器的SMTP服务器建立TCP连接。在建立连接后,接收方SMTP服务器要发出“220 Service ready”(服务就绪)。然后SMTP客户向SMTP服务器发送HELO命令,附上发送方的主机名。SMTP服务器若有能力接收邮件,则回答:“250 OK”,表示已准备好接收。
邮件传送
连接释放:邮件发送完毕后,SMTP客户发送QUIT命令。SMTP服务器返回的信息是:221 服务关闭,表示SMTP同意释放TCP连接。邮件传送的全部过程即结束。
SMTP 的缺点
RFC822协议
RFC822 文档定义了邮件内容的主体结构和各种邮件头字段的详细细节,但是,它没有定义邮件体的格式,RFC822文档定义的邮件体部分通常都只能用于表述一段普通的文本,而无法表达出图片、声音等二进制数据。另外,SMTP服务器在接收邮件内容时,当接收到只有一个“.”字符的单独行时,就会认为邮件内容已经结束,如果一封邮件正文中正好有内容仅为一个“.”字符的单独行,SMTP服务器就会丢弃掉该行后面的内容,从而导致信息丢失。
由于 Internet的迅猛发展,人们已不满足于电子邮件仅仅是用来交换文本信息,而希望使用电子邮件来交换更为丰富多彩的多媒体信息,例如,在邮件中嵌入图片、声音、动画和附件。但是,由于图片和声音等内容是非ASCII码的二进制数据,而RFC822邮件格式只适合用来表达纯文本的邮件内容,所以,要使用 RFC822邮件格式发送这些非ASCII码的二进制数据时,必须先采用某种编码方式将它们“编码”成可打印的ASCII字符后再作为RFC822邮件格式的内容。邮件阅读程序在读取到这种经过编码处理的邮件后,再按照相应的解码方式解码出原始的二进制数据,这样就可以借助RFC822邮件格式来传递多媒体数据了。这种做法需要解决以下两个技术问题:
针对这个问题,人们后来专门为此定义了MIME(Multipurpose Internet MailExtension,多用途Internet邮件扩展)协议。
MIME 协议
MIME,全称为“Multipurpose Internet Mail Extensions”,比较确切的中文名称为“通用互联网邮件扩充
MIME协议用于定义复杂邮件体的格式,它可以表达多段平行的文本内容和非文本的邮件内容,例如,在邮件体中内嵌的图像数据和邮件附件等。另外,MIME 协议的数据格式也可以避免邮件内容在传输过程中发生信息丢失。MIME协议不是对RFC822邮件格式的升级和替代,而是基于RFC822邮件格式的扩展应用。一言以蔽之,RFC822定义了邮件内容的格式和邮件头字段的详细细节,MIME协议则是定义了如何在邮件体部分表达出的丰富多样的数据内容。
一个采用了 MIME协议的电子邮件就叫做MIME邮件,MIME邮件在RFC822文档中定义的邮件头字段的基础上,扩充了一些自己专用的邮件头字段,例如,使用 MIME-Version头字段指定MIME协议的版本,使用Content-Type头字段指定邮件体的MIME类型,使用Content- Transfer-Encoding头字段指定编码方法,如下所示:
POP3 协议的概念
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
POP3 协议的通信流程
用户从邮件服务器上接收邮件的典型通信过程如下。
用户运行用户代理(如Foxmail, Outlook Express)。
用户代理(以下简称客户端)与邮件服务器(以下简称服务器端)的110端口建立TCP连接。
客户端向服务器端发出各种命令,来请求各种服务(如查询邮箱信息,下载某封邮件等)。
服务端解析用户的命令,做出相应动作并返回给客户端一个响应。
用户代理解析从服务器端获得的邮件,以适当地形式(如可读)呈现给用户。
POP3 命令格式
POP3的命令不多,它的一般形式是:COMMAND [Parameter] 。其中COMMAND是ASCII形式的命令名,Parameter是相应的命令参数,是回车换行符(0DH, 0AH)。
服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行“+OK”或“-ERR”开头,然后再加上一些ASCII文本。“+OK”和“-ERR”分别指出相应的操作状态是成功的还是失败的。
POP3 协议的三个状态
POP3协议中有三种状态,认正状态,处理状态,和更新状态。 命令的执行可以改变协议的状态,而对于具体的某命令,它只能在具体的某状态下使用,这些请参看表1和RFC193。
客户机与服务器刚与服务器建立连接时,它的状态为认证状态;一旦客户机提供了自己身份并被成功地确认,即由认可状态转入处理状态; 在完成相应的操作后客户机发出QUIT命令(具体说明见后续内容),则进入更新状态,更新之后又重返认可状态;当然在认可状态下执行QUIT命令,可释放连接。状态间的转移如图 1所示。
IMAP 协议概述
IMAP(Internet Message Access Protocol)以前称作交互邮件访问协议(Interactive Mail Access Protocol),是一个应用层协议。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。
IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。
IMAP和POP3的区别
IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP和POP3是邮件访问最为普遍的Internet标准协议。不同的是:
基于HTTP协议的万维网邮件
随着动态网页技术的发展和应用,越来越多公司和大学提供了基于万维网的电子邮件。不管在什么地方只要我们能够上网,通过浏览器登陆邮件服务器万维网网站就可以撰写和收发邮件。
采用这种方式的好处就是不用安装专门的客户端软件,用普通的万维网浏览器访问邮件服务器的万维网网站即可。所以这种方式收发邮件采用的是HTTP协议,而不是前面提到的SMTP和POP3协议(使用同一个邮件服务器时)。
但当发信人和收信人使用不同的邮件服务器时,情况就变了,服务器和服务器之间仍然采用SMTP协议传送:
万维网概念
万维网WWW是World Wide Web的简称,也称为Web、3W等。WWW是基于客户机/服务器方式的信息发现技术和超文本技术的综合。WWW服务器通过超文本标记语言(HTML)把信息组织成为图文并茂的超文本,利用链接从一个站点跳到另个站点。这样一来彻底摆脱了以前查询工具只能按特定路径一步步地查找信息的限制。
URL 和 URI
URI的全称是(Uniform Resource ldentifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。
URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是URI的一个子集。
URI不仅包括URL,还包括URN(统一资源名称),它们之间的关系如下
URL 格式
在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。也可认为由4部分组成:协议、主机、端口、路径.URL的一般语法格式如下,其中带方括号[]的为可选项
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
HTTP 协议的概念
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
HTTP协议定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向事务的(Transaction-oriented)应用层协议,它规定了在浏览器和服务器之间的请求和响应的格式和规则,它是万维网上能够可靠交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
一次访问网页请求的全过程详解
第一步:浏览器输入域名
例如输入:www.csdn.net
第二步:浏览器查找域名的IP地址
浏览器会把输入的域名解析成对应的IP,其过程如下:
本例子中:根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器dns.net的IP地址。本地域名服务器向顶级域名服务器dns.net进行查询。顶级域名服务器dns.net告诉本地域名服务器,下一次应查询的权限域名服务器dns.csdn.net的IP地址。本地域名服务器向权限域名服务器dns.csdn.net进行查询。权限域名服务器dns.csdn.net告诉本地域名服务器,所查询的主机www.csdn.net的IP地址。本地域名服务器最后把结果告诉主机。
第三步 :浏览器与目标服务器建立TCP连接
第四步:浏览器通过http协议发送请求
浏览器向主机发起一个HTTP-GET方法报文请求。请求中包含访问的URL,也就是http://www.csdn.cnet/ ,KeepAlive,长连接,还有User-Agent用户浏览器操作系统信息,编码等。值得一提的是Accep-Encoding和Cookies项。Accept-Encoding一般采用gzip,压缩之后传输html文件。Cookies如果是首次访问,会提示服务器建立用户缓存信息,如果不是,可以利用Cookies对应键值,找到相应缓存,缓存里面存放着用户名,密码和一些用户设置项。
第五步:某些服务会做永久重定向响应
第六步:浏览器跟踪重定向地址
当浏览器知道了重定向后最终的访问地址之后,重新发送一个http请求,发送内容同上。
第七步:服务器处理请求
服务器接收到获取请求,然后处理并返回一个响应。
第八步:服务器发出一个HTML响应
返回状态码200 OK,表示服务器可以响应请求,返回报文,由于在报头中Content-type为“text/html”,浏览器以HTML形式呈现,而不是下载文件。
第九步:释放TCP连接
第十步:浏览器显示页面
在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚步的交互。
第十一步:浏览器发送获取嵌入在HTML中的其他内容
比如一些样式文件,图片url,js文件url等,浏览器会通过这些url重新发送请求,请求过程依然是HTML读取类似的过程,查询域名,发送请求,重定向等。不过这些静态文件是可以缓存到浏览器中的,有时访问这些文件不需要通过服务器,直接从缓存中取。某些网站也会使用第三方CDN进行托管这些静态文件。
一次访问网页请求的全过程(简单步骤)
简化步骤如下
深入理解HTTP协议的特点
无连接:
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
早期这么做的原因是 HTTP 协议产生于互联网,因此服务器需要处理同时面向全世界数十万、上百万客户端的网页访问,但每个客户端(即浏览器)与服务器之间交换数据的间歇性较大(即传输具有突发性、瞬时性),并且网页浏览的联想性、发散性导致两次传送的数据关联性很低,大部分通道实际上会很空闲、无端占用资源。因此 HTTP 的设计者有意利用这种特点将协议设计为请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
随着时间的推移,网页变得越来越复杂,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次 TCP 连接就显得很低效。后来,Keep-Alive 被提出用来解决这效率低的问题。
Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。市场上的大部分 Web 服务器,包括 iPlanet、IIS 和 Apache,都支持 HTTP Keep-Alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep-Alive 功能对资源利用的影响尤其突出。
这样一来,客户端和服务器之间的 HTTP 连接就会被保持,不会断开(超过 Keep-Alive 规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。
无状态:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能改变这个结果。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。
Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookies 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是 Cookies 的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入 Cookies,以便在最后付款时提取信息。
与 Cookie 相对的一个解决方案是 Session,它是通过服务器来保持状态的。
当客户端访问服务器时,服务器根据需求设置 Session,将会话信息保存在服务器上,同时将标示 Session 的 SessionId 传递给客户端浏览器,浏览器将这个 SessionId 保存在内存中,我们称之为无过期时间的 Cookie。浏览器关闭后,这个 Cookie 就会被清掉,它不会存在于用户的 Cookie 临时文件。
以后浏览器每次请求都会额外加上这个参数值,服务器会根据这个 SessionId,就能取得客户端的数据信息。
如果客户端浏览器意外关闭,服务器保存的 Session 数据不是立即释放,此时数据还会存在,只要我们知道那个 SessionId,就可以继续通过请求获得此 Session 的信息,因为此时后台的 Session 还存在,当然我们可以设置一个 Session 超时时间,一旦超过规定时间没有客户端请求时,服务器就会清除对应 SessionId 的 Session 信息。
HTTP协议的主要特点可概括如下
HTTP 状态码分类
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
1、非持久连接
浏览器需要与服务器进行三次握手建立 TCP 连接,当三次握手的前两部分结束后(经过一个 RTT ),浏览器可以将请求报文捎带在确认连接报文中,发送给服务器。服务器收到请求报文后,将文档返回给浏览器。非持久连接的请求一个文档的耗时为:两倍的 RTT + 整个文档的传输时间
如果浏览器还想再请求一个文档,需要重复上面的步骤,需要继续进行三次握手,发送请求报文,然后接收文档
2、持久连接
持久连接虽然也需要进行三次握手才能进行数据的传输(这不废话嘛~~~TCP 必须要三次握手),但是浏览器再次发送请求报文,就不需要再建立 TCP 连接,在之前 TCP 连接的基础上可以直接干(前提是之前的 TCP 连接没有断)
在持久连接的基础上,可以使用流水线的方式发送请求报文,服务器收到请求后会依次返回响应报文。因此浏览器使用流水线的方式大概只需花费一个 RTT 的时间就可以获取想要的资源,流水线的方式可使得 TCP 连接的空闲时间较少,提高文档下载的效率
HTTP报文是面向文本的,因此在报文中的每一个字段都是一些ASCII码串。
HTTP请求报文和响应报文都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
1、请求报文
报文中的数据都使用ASCII编码,各个字段的长度是不确定的(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
请求报文的举例
POST /search HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: http://www.google.cn/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: www.google.cn
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
hl=zh-CN&source=hp&q=domety
请求方法:所有请求方法名称全为大写,目前有9种
2、响应报文
响应报文结构与请求报文结构唯一的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。
响应报文的举例
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close
An Example Page
Hello World, this is a very simple HTML document.
关于HTTP请求GET和POST的区别
提交形式:
GET提交的数据会放在URL之后,以?
分割URL和传输数据,参数之间以&
相连,如EditPosts.aspx?name=test1&id=123456
。POST方法是把提交的数据放在HTTP包的Body中。
传输数据的大小:
HTTP协议本身没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:
GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节。对于其他浏览器,如Netscape,FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。因此对于GET提交时,传输数据就会受到URL长度的限制。
POST:由于不是通过URL传值,理论上数据不受限制。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache,IIS6都有各自的配置。
安全性:
注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义
比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,
以下是来自 w3schools 的标准答案