第 6 章 应用层

第 6 章 应用层

1、思维导图

image-20201230135624778

2、网络应用模型

2.1、应用层概述

应用层对应用程序的通信提供服务

image-20201230140249488

应用层协议定义的内容

  1. 应用进程交换的报文类型,请求还是响应?
  2. 各种报文类型的语法,如报文中的各个字段及其详细描述。
  3. 字段的语义,即包含在字段中的信息的含义。
  4. 进程何时、如何发送报文,以及对报文进行响应的规则。

应用层的功能 应用层的重要协议
文件传输、访问和管理 FTP
电子邮件 SMTP、POP3
虚拟终端 HTTP
查询服务和远程作业登录 DNS

2.2、网络应用模型

两种网络应用模型

  1. 客户/服务器模型(Client/Server)
  2. P2P 模型(Peer-to-Peer)

2.2.1、C/S 模型

服务器:提供计算服务的设备。

  1. 永久提供服务
  2. 永久性访问地址/域名

客户机:请求计算服务的主机。

  1. 与服务器通信,使用服务器提供的服务
  2. 间歇性接入网络
  3. 可能使用动态IP地址
  4. 不与其他客户机直接通信

应用:Web,文件传输FTP,远程登录,电子邮件

image-20201230141205148

2.2.2、P2P 模型

P2P 模型的特点

  1. 不存在永远在线的服务器
  2. 每个主机既可以提供服务,也可以请求服务
  3. 任意端系统/节点之间可以直接通讯
  4. 节点间歇性接入网络
  5. 节点可能改变IP地址

P2P 模型的优势

  1. 可扩展性好
  2. 网络健壮性强

image-20201230141242938


P2P 模型可以应对大量主机涌入网络的情况,因为加入网络的主机既可以请求服务,也可以提供服务。但是 C/S 模型由于服务器资源以及带宽等问题限制,只能接收一定数量的客户端请求

3、域名解析系统 DNS

3.1、DNS 系统

域名服务器的概念

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)的分层结构数据库。

3.2、域名

域名的举例

以王道考研论坛为例:www.cskaoyan.com

像 com、cskaoyan 和 www 这种以 . 分隔开的称为标号,标号一般不超过 63 个字符,为了记忆方便,一般不超过 12 个字符,并且不区分大小写。标号中可出现 -,除此之外不能有其他标点符号。有多个标号组成的完整域名总共不超过255个宇符。

域名级别最低的域名写在最左边,级别最高的域名写在最右边。域名由两组或两组以上的ASCII或各国语言字符构成,各组字符间由点号分隔开,最右边的字符组称为顶级域名或一级域名(com)、倒数第二组称为二级域名(cskaoyan)、倒数第三组称为三级域名(www)、以此类推。

域名的分类

根域名

根域名是最顶级的域名,也就是一个点(.)


顶级域名

域名级数是指一个域名由多少级组成,域名的各个级别被“.”分开,最右边的那个词称为顶级域名。顶级域名又分为三类:

  1. 一是国家和地区顶级域名(country code top-level domains,简称ccTLDs),目前200多个国家都按照ISO3166国家代码分配了顶级域名,例如中国是cn,日本是jp等;
  2. 二是通用顶级域名(generic top-level domains,简称gTLDs),例如表示工商企业的.com,表示网络提供商的 .net,表示非盈利组织的 .org等。
  3. 三是新顶级域名(New gTLD)如通用的.xyz、代表“高端”的.top、代表“红色”的.red、代表“人”的.men等一千多种。

二级域名

二级域名(Second Level Domain,SLD)在国际顶级域名或国家顶级域名之下的意义不同。

  1. 国际顶级域名下二级域名, 二级域名一般是指域名注册人选择使用的网上名称,如“yahoo.com”;上网的商业组织通常使用自己的商标、商号或其他商业标志作为自己的网上名称,如“microsoft.com”。
  2. 国家顶级域名下二级域名,在国家顶级域名之下二级域名一般是指类似于国际顶级域名的表示注册人类别和功能的标志。例如,在“.com.cn”域名结构中,“.com”此时是置于国家顶级域名“.cn”下的二级域名,表示商业性组织,以此类推。

目前,中国“.cN”的注册量为13455541个,在顶级域名“.CN下”,采用层次结构设置“类别域名”和“行政区域名”两类。

  1. 类别域名,中国互联网络的二级域名分类的类别域名最初为以下6个:
    1. “.gov”适用政府部门;
    2. “.ac”适用科研机构;
    3. “.edu”适用教育科研机构;
    4. “.com”适用工商金融企业
    5. “.net”适用互联网络、接入网络的信息中心(NIC)和运行中心(NOC);
    6. “.org”适用各种非营利性组织。后来,又增加了“adm.cn”和“mil.cn”。
  2. 行政区域名
    1. 中国行政区域名有34个,对应于省、自治区、直辖市,如“.bj”一北京市;“.sh”一上海市;“.tj”一天津市;“.cq”一重庆市;“.he”一河北省;“.sx”一山西省,等等。

三级域名

三级域名是形如“youa.baidu.com”的域名,可以当做是二级域名的子域名,特征为域名包含两个“.”(dot)。对于域名所有者/使用者而言,三级域名都是二级域名的附属物而无需单独费用。

一个完整的域名(*.com、*.net、*.edu、*.gov等)由二个或二个以上部分组成,各部分之间用英文的句号".“来分隔,最后一个”."的右边部分称为顶级域名 (Top-level Domain Name),顶级域名“.”的左边部分称为二级域名 (Second-level Domain Name),二级域名的左边部分称为三级域名,以此类推,每一级的域名控制它下一级域名的分配。


四级域名

四级域名是形如“new.book.cirno.site”的域名,可以当做是三级域名的子域名,特征为域名包含三个“.”(dot)。对于域名所有者/使用者而言,四级域名都是三级域名的附属物而无需单独费用。

域名树

将域名树自下而上书写,便可组成一个域名

image-20201230152159296

3.3、域名服务器

参考资料

百度百科:根域名服务器

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、权限域名服务器

负责一个区的域名服务器,就好像省长以下的那些市长、镇长、乡长等行政官。顶级域名服务器也可以算作是权威域名服务器,只不过由于其特殊性,我们专门把它划分为一类。因此权威域名服务器通常是指顶级域名以下的管理二级、三级、四级等域名的服务器。

上面三种服务器的关系可以用这张图表示:

image-20201230155009101

4、本地域名服务器

这类服务器不属于上面的层次结构,当一个主机(个人电脑)发出DNS请求时,查询请求就被发送到本地域名服务器,本地域名服务器负责回答这个查询,或者代替主机向域名空间中不同层次的权威域名服务器查询,再把查询的结果返回给主机。

域名解析的过程

下面的图示表示了一个域名的解析过程以及各个类型的域名服务器所处的位置。

image-20201230155210757

3.4、域名解析过程

域名解析的两种方式

  1. 递归查询:靠别人
  2. 迭代查询:靠自己

域名解析的举例

image-20201230155547567

DNS高速缓存

  1. 什么是DNS的高速缓存?

    服务器可以高速缓存从其他 DNS 服务器收到的 DNS 记录。 也可以在 DNS 客户服务中使用高速缓存, 将其作为 DNS 客户端保存在最近的查询过程中得到的信息高速缓存的方法。 总的来说就是提高解析速度。

  2. DNS高速缓存有什么作用?

    当某个访问请求解析过一个域名以后,该解析记录就放置在缓存中,以后再有同样的解析请求, 就直接从缓存中提供结果,加快了访问者的应答速度。

  3. dig命令

    dig(域信息搜索器)命令是个用于询问 DNS 域名服务器的灵活的工具。 他执行 DNS 搜索,显示从受请求的域名服务器返回的答复

4、CDN

4.1、什么是 CDN?

CDN 的概念

CDN 全称是内容分发网络。其目的是让用户能够更快速的得到请求的数据。简单来讲,CDN 就是用来加速的,他能让用户就近访问数据,这样就更更快的获取到需要的数据。

举个例子,现在服务器在北京,深圳的用户想要获取服务器上的数据就需要跨越一个很远的距离,这显然就比北京的用户访问北京的服务器速度要慢。但是现在我们在深圳建立一个 CDN 服务器,上面缓存住一些数据,深圳用户访问时先访问这个 CDN 服务器,如果服务器上有用户请求的数据就可以直接返回,这样速度就大大的提升了。

4.2、CDN 的整个工作过程

当用户请求一个文件时,cdn的工作过程如下

  1. dns请求当地local DNS
  2. 当地local DNS递归的查询服务器的gslb
  3. 服务器根据 local DNS 分配最佳节点,返回ip
  4. .用户获得最佳接入ip,访问最佳节点。
  5. 如果该节点没有用户想要获取的内容,则通过内部路由访问上一节点,直到找到文件或到达源站为止。
  6. cdn节点缓存该数据,下次请求该文件时可以直接返回。

image-20201230204611411

5、文件传输协议 FTP

5.1、参考资料

  1. ftp、sftp、scp、ssh、openssh
  2. FTP协议及工作原理详解
  3. 百度百科:FTP协议

5.2、文件传送协议

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。

5.3、FTP 服务器和客户端

FTP是基于客户/服务器(C/S)的协议。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。

  1. 服务器:依照 FTP 协议提供服务,进行文件传送的计算机就是 FTP 服务器。
  2. 客户端:连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。

用户要连上 FTP 服务器,就要用到 FPT 的客户端软件,通常 Windows 自带 ftp 命令,这是一个命令行的 FTP 客户程序,另外常用的 FTP 客户程序还有 CuteFTP、Ws_FTP、Flashfxp、LeapFTP、流星雨-猫眼等。

5.4、FTP 登录方式

1、FTP用户授权

1)、用户授权

要连上 FTP 服务器(即“登陆”),必须要有该 FTP 服务器授权的帐号,也就是说你只有在有了一个用户标识和一个口令后才能登陆FTP服务器,享受FTP服务器提供的服务。

2)、FTP地址格式

FTP地址如下: ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名

上面的参数除FTP服务器IP或域名为必要项外,其他都不是必须的。如以下地址都是有效FTP地址:

  1. ftp://foolish.6600.org
  2. ftp://list:[email protected]
  3. ftp://list:[email protected]:2003
  4. ftp://list:[email protected]:2003/soft/list.txt

2、匿名FTP

互连网中有很大一部分 FTP 服务器被称为“匿名”(Anonymous)FTP 服务器。这类服务器的目的是向公众提供文件拷贝服务,不要求用户事先在该服务器进行登记注册,也不用取得FTP服务器的授权。Anonymous(匿名文件传输)能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“anonymous”登陆FTP服务,就可访问远程主机上公开的文件。许多系统要求用户将Emai1地址作为口令,以便更好地对访问进行跟综。匿名FTP一直是Internet上获取信息资源的最主要方式,在Internet成千上万的匿名FTP主机中存储着无以计数的文件,这些文件包含了各种各样的信息,数据和软件。人们只要知道特定信息资源的主机地址,就可以用匿名FTP登录获取所需的信息资料。虽然目前使用WWW环境已取代匿名FTP成为最主要的信息查询方式,但是匿名FTP仍是 Internet上传输分发软件的一种基本方法。如red hat 、autodesk等公司的匿名站点。

5.5、FTP 工作原理

FTP 工作原理图

  1. 控制连接始终保持,数据连接只在发送数据时保持
  2. 是否使用TCP 20端口建立数据连接与传输模式有关:
    1. 主动方式使用TCP 20端口
    2. 被动方式由服务器和客户端自行协商决定(端口>1024)

image-20201230162357452

1、PORT(主动)方式

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了一个1024+的随机端口,你过来连接我”。于是服务器从20端口向客户端的1024+随机端口发送连接请求,建立一条数据链路来传送数据。

PORT方式,服务器会主动连接客户端的指定端口,那么如果客户端通过代理服务器链接到internet上的网络的话,服务器端可能会连接不到客户端本机指定的端口,或者被客户端、代理服务器防火墙阻塞了连接,导致连接失败

2、PASV(Passive被动)方式

PASV(Passive被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了一个1024+的随机端口,你过来连接我”。于是客户端向服务器的指定端口发送连接请求,建立一条数据链路来传送数据。

PASV方式,服务器端防火墙除了要放开21端口外,还要放开PASV配置指定的端口范围

5.6、FTP的传输模式

1、ASCII传输方式

ASCII模式,以文本序列传输数据;

2、二进制传输模式

Binary模式,以二进制序列传输数据。

6、电子邮件

6.1、参考资料

  1. 电子邮件系统的组成
  2. 百度百科:电子邮件系统
  3. 电子邮件系统Email
  4. 电子邮件基本格式(MIME格式)
  5. 电子邮件系统的介绍
  6. 简单邮件传送协议SMTP
  7. 简单邮件传输协议SMTP
  8. MIME协议详解
  9. 邮局协议POP3
  10. POP3协议分析
  11. imap协议
  12. 百度百科:imap

6.2、电子邮件系统概述

电子邮件的优点

电子邮件系统可以说是因特网上最早流行的一种应用,并且至今仍有重要的地位。原因主要是实时通信存在着两大缺陷:

  1. 通信双方必须同时在场。
  2. 一些不是很重要的实时通信会不必要的打扰人们正常的工作或休息。

而电子邮件就像寄信一样,既可以传达信息又不至于打扰人们正常或休息,而且如今的电子邮件还可以附上声音和图像等等,功能十分强大。

电子邮件系统概念

电子邮件系统(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中转发,直到它到达最终发送目标为止。

专业术语解释

  1. MUA:“邮件用户代理”,用于用户端,主要功能是接收邮件主机的电子邮件,并提供浏览访问的功能
  2. MDA:“邮件投送代理” ,将MTA 接收的信件依照信件的流向(送到哪里)将该信件放置到本机账户下的邮件文件中(收件箱),或者再经由MTA将信件送到下个MTA
  3. MTA(Mail Transfer Agent):MTA是用在邮件主机上的软件,主要的邮件服务器。MTA就是“邮件传送代理”,负责用户寄信与收信
  4. MRA(Mail Retrieval Agent):负责实现IMAP与POP3协议,与MUA进行交互 (Dovecot)协议

6.3、电子邮件基本格式(MIME格式)

总的来说,参照rfc4021标准,mime格式分为消息头和消息体两部分(邮件头和邮件体)。

邮件头

邮件头包含了发件人、收件人、主题、时间、MIME版本、内容的类型、内容的传输编码方式等重要信息。每条信息称为一个域,由域名后加冒号(“ : ”)和信息内容构成,可以是一行,也可以占用多行。域的首行必须顶头写(即左边不能有空白字符(空格和制表符));续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。另外,邮件头中不允许出现空行。例如

Date: Wed, 15 Aug 2017 10:09:00 +0800
From: [email protected]
To: "simba" <[email protected]>
Cc: "simba" <[email protected]>
BCC: "simba" <[email protected]>
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--------------+   +-------------+     |   +-------+       |
|   |   |                                           |   |   内嵌资源   |     |   |  附件  |      |
|   |   |                                           |   +-------------+     |   +-------+       |
|   |   |   +---------------+   +---------------+   |                       |                   |
|   |   |   |   纯文本正文   |   |   超文本正文    |   |                       |                  |
|   |   |   +---------------+   +---------------+   |   +-------------+     |   +-------+       |
|   |   |                                           |   |   内嵌资源   |     |   |  附件  |      |
|   |   |                                           |   +-------------+     |   +-------+       |
|   |   +-------------------------------------------+                       |                   |
|   |                                                                       |                   |
|   |                                                                       |                   |
|   +-----------------------------------------------------------------------+                   |
|                                                                                               |
|                                                                                               |
+-----------------------------------------------------------------------------------------------+

6.4、电子邮件系统的组成结构

电子邮件系统的组成

  1. 用户接口:用户接口是本地运行的程序,又称用户代理(UA),主要是撰写、显示、处理邮件。UA的任务是创建和显示报文,并且 在UA和本地的MAT之间传递报文
  2. 邮件传输程序:这个部分又称报文传送代理(MTA),它将邮件通过网络发送给对方主机,并从网络接收邮件。它包括如下两个功能:
    1. 传送和接收:电子邮件按照c/s方式工作。用户编写好邮件,通过UA将邮件交给MTA。发送邮件时,MTA作为远程 目的计算机服务器的客户,与目的主机建立TCP连接,并将邮件发送到目的主机。接收方收到邮件后,存放在接收方的 邮箱中,等待阅读
    2. 报告:将邮件传送情况(已交付、被拒、丢失等)向发信人报告

另外,邮件在发送过程中要经过很多结点,因此每个结点都要安装邮件传输程序(MTA),以便对邮件存储转发。Internet上的MTA集合构成了报文传送系统(MTS)。

image-20201230172354757

发送电子邮件的具体过程

  1. 发邮件的人调用自己主机中的用户代理撰写和编辑要发送的邮件。
  2. 发件人点击发送按钮邮件开始发送:
    1. 用户代理的 SMTP客户把邮件发送给 发送邮件服务器 的 STMP服务器。
    2. 发送方邮件服务器的STMP客户把邮件发给接收方邮件服务器的SMTP服务器。
  3. 由图中可以看出,每一段的邮件发送都是在一对SMTP客户和SMTP服务器之间进行的。SMTP客户负责发邮件,而SMTP服务器接收邮件。
  4. 接收方的邮件服务器中的SMTP服务器进程收到邮件以后,就把邮件放入收件人的用户邮箱中,等待收件人在他方便的时候进行读取。
  5. 收件人开机上网准备接收邮件时候,打开主机中的用户代理,使用POP3协议读取发送给自己的邮件。具体就是:
    1. 用户代理中的POP3客户程序发起通信,即与 接收方邮件服务器中的POP3服务器程序进行通信,如果有邮件则请求把邮件取回。
    2. 在上图中POP3服务器和POP3客户之间的箭头表示邮件传送的方向,但它们之间的通信是POP3客户发起的。
  6. 请注意这里两种通信方式。
    1. 推:SMTP客户把邮件推给SMTP服务器。
    2. 拉:POP3客户(通信发起者)把邮件从POP3服务器拉过来。

电子邮件的传输协议

  1. SMTP(Simple Mail Transfer Protocol)传输发送邮件所使用的标准协议,使用 TCP 25 端口
  2. IMAP(Internet Message Access Protocol)接收邮件使用的标准协议之一,使用 TCP 143 端口
  3. POP3(Post Office Protocol 3) 接收邮件使用的标准协议之一,使用 TCP 110 端口

电子邮件系统采用客户/服务器体系结构

原因就是用户代理所在的计算机不可能每天24小时在线(就像你在给一个没电池的手机打电话)。

而将发送、接受和缓存邮件的功能交给24小时开机的邮件服务器,当用户方便时候从邮件服务器的用户信箱中读取邮件是一种比较合理的方法。

总结以上的内容,电子邮件系统的体系结构粗糙一画是这样子的:

A用户<------>邮件服务器<------>B用户

6.5、简单邮件传送协议 SMTP

SMTP 协议的概念

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是由源地址到目的地址传送邮件的一组规则,用来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它使每台计算机在发送或中转信件时能找到下一个目的地。通过使用指定的服务器,把Email寄到收信人的服务器上。

SMTP服务器是遵循SMTP协议的邮件服务器,用来发送或中转电子邮件。首先, 客户端需要建立一个与SMTP服务器的TCP连接 , 端口一般为25 。在连接建立之后,客户端和服务器先执行一些应用层的握手操作,让SMTP服务器知道客户端的信息,并且对客户端需求做出响应等。

在SMTP握手阶段,客户端向SMTP服务器分别指定发件人和收件人的电子邮件地址。握手阶段完毕,SMTP服务器把客户端发出的邮件消息添加到发信队列中,通过TCP提供的可靠数据传输服务把该消息准确地传送到收件人的服务器。

SMTP 通信的三个阶段:连接建立、邮件传送和连接释放

  1. 连接建立:

    SMTP客户每隔一定时间对邮件缓存扫描一次。如发现有邮件,就使用SMTP的熟知端口号码25与接收方邮件服务器的SMTP服务器建立TCP连接。在建立连接后,接收方SMTP服务器要发出“220 Service ready”(服务就绪)。然后SMTP客户向SMTP服务器发送HELO命令,附上发送方的主机名。SMTP服务器若有能力接收邮件,则回答:“250 OK”,表示已准备好接收。

  2. 邮件传送

    1. 邮件的传送从MAIL命令开始。MAIL命令后面有发件人的地址。如MAIL FROM:[email protected] 。服务器给出响应回应;
    2. 接下来便是一个或多个RCPT命令,取决于把同一个邮件发送给一个或多个收件人,其格式为RCPT TO:<收件人地址>
    3. 再接下来就是DATA命令,表示要开始传送邮件的内容了。SMTP服务器返回的信息是:354 Start mail input;end with . ;这里是回车换行的意思。发送完毕后,在发送.表示邮件内容结束。
  3. 连接释放:邮件发送完毕后,SMTP客户发送QUIT命令。SMTP服务器返回的信息是:221 服务关闭,表示SMTP同意释放TCP连接。邮件传送的全部过程即结束。

SMTP 的缺点

  1. SMTP不能传送可执行文件或者其他二进制对象。
  2. SMTP仅限于传送7位ASCII码,不能传送其他非英语国家的文字。
  3. SMTP服务器会拒绝超过一定长度的邮件。

6.6、MIME 协议

RFC822协议

RFC822 文档定义了邮件内容的主体结构和各种邮件头字段的详细细节,但是,它没有定义邮件体的格式,RFC822文档定义的邮件体部分通常都只能用于表述一段普通的文本,而无法表达出图片、声音等二进制数据。另外,SMTP服务器在接收邮件内容时,当接收到只有一个“.”字符的单独行时,就会认为邮件内容已经结束,如果一封邮件正文中正好有内容仅为一个“.”字符的单独行,SMTP服务器就会丢弃掉该行后面的内容,从而导致信息丢失。

由于 Internet的迅猛发展,人们已不满足于电子邮件仅仅是用来交换文本信息,而希望使用电子邮件来交换更为丰富多彩的多媒体信息,例如,在邮件中嵌入图片、声音、动画和附件。但是,由于图片和声音等内容是非ASCII码的二进制数据,而RFC822邮件格式只适合用来表达纯文本的邮件内容,所以,要使用 RFC822邮件格式发送这些非ASCII码的二进制数据时,必须先采用某种编码方式将它们“编码”成可打印的ASCII字符后再作为RFC822邮件格式的内容。邮件阅读程序在读取到这种经过编码处理的邮件后,再按照相应的解码方式解码出原始的二进制数据,这样就可以借助RFC822邮件格式来传递多媒体数据了。这种做法需要解决以下两个技术问题:

  1. 邮件阅读程序如何知道邮件中嵌入的原始二进制数据所采用的编码方式;
  2. 邮件阅读程序如何知道每个嵌入的图像或其他资源在整个邮件内容中的起止位置。

针对这个问题,人们后来专门为此定义了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头字段指定编码方法,如下所示:

6.7、邮局协议 POP3

POP3 协议的概念

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

POP3 协议的通信流程

用户从邮件服务器上接收邮件的典型通信过程如下。

  1. 用户运行用户代理(如Foxmail, Outlook Express)。

  2. 用户代理(以下简称客户端)与邮件服务器(以下简称服务器端)的110端口建立TCP连接。

  3. 客户端向服务器端发出各种命令,来请求各种服务(如查询邮箱信息,下载某封邮件等)。

  4. 服务端解析用户的命令,做出相应动作并返回给客户端一个响应。

    1. 和4)交替进行,直到接收完所有邮件转到步骤6),或两者的连接被意外中断而直接退出。
  5. 用户代理解析从服务器端获得的邮件,以适当地形式(如可读)呈现给用户。

POP3 命令格式

POP3的命令不多,它的一般形式是:COMMAND [Parameter] 。其中COMMANDASCII形式的命令名,Parameter是相应的命令参数,是回车换行符(0DH, 0AH)

服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行“+OK”或“-ERR”开头,然后再加上一些ASCII文本。“+OK”和“-ERR”分别指出相应的操作状态是成功的还是失败的。

POP3 协议的三个状态

POP3协议中有三种状态,认正状态,处理状态,和更新状态。 命令的执行可以改变协议的状态,而对于具体的某命令,它只能在具体的某状态下使用,这些请参看表1RFC193

客户机与服务器刚与服务器建立连接时,它的状态为认证状态;一旦客户机提供了自己身份并被成功地确认,即由认可状态转入处理状态; 在完成相应的操作后客户机发出QUIT命令(具体说明见后续内容),则进入更新状态,更新之后又重返认可状态;当然在认可状态下执行QUIT命令,可释放连接。状态间的转移如图 1所示。

6.8、网际报文存取协议 IMAP

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标准协议。不同的是:

  1. IMAP提供Webmail与电子邮件客户端之间的双向通信,客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上(如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的) 。而POP3在客户端的操作不会反馈到服务器上。
  2. IMAP更好地支持了从多个不同设备中随时访问新邮件。
  3. IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。
  4. POP3需要下载未阅读的邮件,IMAP可以不用把所有的邮件全部下载,而是通过客户端直接对服务器上的邮件进行操作。所有通过IMAP传输的数据都会被加密,从而保证通信的安全性。
  5. IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件。

6.9、基于万维网的电子邮件

基于HTTP协议的万维网邮件

随着动态网页技术的发展和应用,越来越多公司和大学提供了基于万维网的电子邮件。不管在什么地方只要我们能够上网,通过浏览器登陆邮件服务器万维网网站就可以撰写和收发邮件。

采用这种方式的好处就是不用安装专门的客户端软件,用普通的万维网浏览器访问邮件服务器的万维网网站即可。所以这种方式收发邮件采用的是HTTP协议,而不是前面提到的SMTP和POP3协议(使用同一个邮件服务器时)。

但当发信人和收信人使用不同的邮件服务器时,情况就变了,服务器和服务器之间仍然采用SMTP协议传送:

image-20201230173109454

7、万维网和HTTP协议

7.1、参考资料

  1. 百度百科:www(万维网缩写)
  2. 一次访问网页请求的全过程详解
  3. HTTP协议超级详解
  4. 深入理解http协议的特点
  5. URL的组成格式
  6. HTTP协议报文解析

7.2、万维网概述

万维网概念

万维网WWW是World Wide Web的简称,也称为Web、3W等。WWW是基于客户机/服务器方式的信息发现技术和超文本技术的综合。WWW服务器通过超文本标记语言(HTML)把信息组织成为图文并茂的超文本,利用链接从一个站点跳到另个站点。这样一来彻底摆脱了以前查询工具只能按特定路径一步步地查找信息的限制。

URL 和 URI

URI的全称是(Uniform Resource ldentifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。

URL的全称是(Uniform Resource Locator),中文名称是统一资源定位符,也就是我们俗称的网址,它实际上是URI的一个子集。

URI不仅包括URL,还包括URN(统一资源名称),它们之间的关系如下

image-20201230200931537

URL 格式

在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志,就是指网络地址。

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。也可认为由4部分组成:协议、主机、端口、路径.URL的一般语法格式如下,其中带方括号[]的为可选项

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

  1. protocol 协议,常用的协议是http
  2. hostname 主机地址,可以是域名,也可以是IP地址
  3. port 端口 http协议默认端口是:80端口,如果不写默认就是:80端口
  4. path 路径 网络资源在服务器中的指定路径
  5. parameter 参数 如果要向服务器传入参数,在这部分输入
  6. query 查询字符串 如果需要从服务器那里查询内容,在这里编辑
  7. fragment 片段 网页中可能会分为不同的片段,如果想访问网页后直接到达指定位置,可以在这部分设置

7.3、超文本传输协议HTTP

HTTP 协议的概念

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。

通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

HTTP协议定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向事务的(Transaction-oriented)应用层协议,它规定了在浏览器和服务器之间的请求和响应的格式和规则,它是万维网上能够可靠交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

image-20201230193615206

一次访问网页请求的全过程详解

第一步:浏览器输入域名

例如输入:www.csdn.net


第二步:浏览器查找域名的IP地址

浏览器会把输入的域名解析成对应的IP,其过程如下:

  1. 查找浏览器缓存:因为浏览器一般会缓存DNS记录一段时间,不同浏览器的时间可能不一样,一般2-30分钟不等,浏览器去查找这些缓存,如果有缓存,直接返回IP,否则下一步。
  2. 查找系统缓存:浏览器缓存中找不到IP之后,浏览器会进行系统调用(windows中是gethostbyname),查找本机的hosts文件,如果找到,直接返回IP,否则下一步。
  3. 查找路由器缓存:如果1,2步都查询无果,则需要借助网络,路由器一般都有自己的DNS缓存,将前面的请求发给路由器,查找ISP 服务商缓存 DNS的服务器,如果查找到IP则直接返回,没有的话继续查找。
  4. 递归查询:如果以上步骤还找不到,则ISP的DNS服务器就会进行递归查询,所谓递归查询就是如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步查询。(本地域名服务器地址是通过DHPC协议获取地址,DHPC是负责分配IP地址的)
  5. 迭代查询:本地域名服务器采用迭代查询,它先向一个根域名服务器查询。本地域名服务器向根域名服务器的查询一般都是采用迭代查询。所谓迭代查询就是当根域名服务器收到本地域名服务器发出的查询请求报文后,要么告诉本地域名服务器下一步应该查询哪一个域名服务器,然后本地域名服务器自己进行后续的查询。(而不是替代本地域名服务器进行后续查询)。

本例子中:根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器dns.net的IP地址。本地域名服务器向顶级域名服务器dns.net进行查询。顶级域名服务器dns.net告诉本地域名服务器,下一次应查询的权限域名服务器dns.csdn.net的IP地址。本地域名服务器向权限域名服务器dns.csdn.net进行查询。权限域名服务器dns.csdn.net告诉本地域名服务器,所查询的主机www.csdn.net的IP地址。本地域名服务器最后把结果告诉主机。


第三步 :浏览器与目标服务器建立TCP连接

  1. 主机浏览器通过DNS解析得到了目标服务器的IP地址后,与服务器建立TCP连接。
  2. TCP 3次握手连接:浏览器所在的客户机向服务器发出连接请求报文(SYN标志为1);服务器接收报文后,同意建立连接,向客户机发出确认报文(SYN,ACK标志位均为1);客户机接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;此处客户机与服务器之间的TCP连接建立完成,开始通信。

第四步:浏览器通过http协议发送请求

浏览器向主机发起一个HTTP-GET方法报文请求。请求中包含访问的URL,也就是http://www.csdn.cnet/ ,KeepAlive,长连接,还有User-Agent用户浏览器操作系统信息,编码等。值得一提的是Accep-Encoding和Cookies项。Accept-Encoding一般采用gzip,压缩之后传输html文件。Cookies如果是首次访问,会提示服务器建立用户缓存信息,如果不是,可以利用Cookies对应键值,找到相应缓存,缓存里面存放着用户名,密码和一些用户设置项。


第五步:某些服务会做永久重定向响应

  1. 对于大型网站存在多个主机站点,了负载均衡或者导入流量,提高SEO排名,往往不会直接返回请求页面,而是重定向。返回的状态码就不是200OK,而是301,302以3开头的重定向码,浏览器在获取了重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新第一步访问即可。
  2. 重定向的作用:重定向是为了负载均衡或者导入流量,提高SEO排名。利用一个前端服务器接受请求,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力;重定向也可将多个域名的访问,集中到一个站点;由于baidu.com,www.baidu.com会被搜索引擎认为是两个网站,照成每个的链接数都会减少从而降低排名,永久重定向会将两个地址关联起来,搜索引擎会认为是同一个网站,从而提高排名。

第六步:浏览器跟踪重定向地址

当浏览器知道了重定向后最终的访问地址之后,重新发送一个http请求,发送内容同上。


第七步:服务器处理请求

服务器接收到获取请求,然后处理并返回一个响应。


第八步:服务器发出一个HTML响应

返回状态码200 OK,表示服务器可以响应请求,返回报文,由于在报头中Content-type为“text/html”,浏览器以HTML形式呈现,而不是下载文件。


第九步:释放TCP连接

  1. 浏览器所在主机向服务器发出连接释放报文,然后停止发送数据;
  2. 服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完;
  3. 服务器数据传输完毕后,向客户机发送连接释放报文;
  4. 客户机接收到报文后,发出确认,然后等待一段时间后,释放TCP连接;

第十步:浏览器显示页面

在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚步的交互。


第十一步:浏览器发送获取嵌入在HTML中的其他内容

比如一些样式文件,图片url,js文件url等,浏览器会通过这些url重新发送请求,请求过程依然是HTML读取类似的过程,查询域名,发送请求,重定向等。不过这些静态文件是可以缓存到浏览器中的,有时访问这些文件不需要通过服务器,直接从缓存中取。某些网站也会使用第三方CDN进行托管这些静态文件。

一次访问网页请求的全过程(简单步骤)

简化步骤如下

  1. 浏览器分析URL
  2. 浏览器向DNS请求解析IP地址
  3. DNS解析出IP地址
  4. 浏览器与服务器建立TCP连接
  5. 浏览器发出取文件命令
  6. 服务器响应
  7. 释放TCP连接
  8. 浏览器显示

7.4、HTTP协议的特点

深入理解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协议的主要特点可概括如下

  1. 支持客户/服务器模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

7.5、HTTP状态码

HTTP 状态码分类

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态代码的第一个数字代表当前响应的类型:

  1. 1xx消息——请求已被服务器接收,继续处理
  2. 2xx成功——请求已成功被服务器接收、理解、并接受
  3. 3xx重定向——需要后续操作才能完成这一请求
  4. 4xx请求错误——请求含有词法错误或者无法被执行
  5. 5xx服务器错误——服务器在处理某个正确请求时发生错误

7.6、HTTP协议的连接方式

1、非持久连接

浏览器需要与服务器进行三次握手建立 TCP 连接,当三次握手的前两部分结束后(经过一个 RTT ),浏览器可以将请求报文捎带在确认连接报文中,发送给服务器。服务器收到请求报文后,将文档返回给浏览器。非持久连接的请求一个文档的耗时为:两倍的 RTT + 整个文档的传输时间

如果浏览器还想再请求一个文档,需要重复上面的步骤,需要继续进行三次握手,发送请求报文,然后接收文档

image-20201230205312242

2、持久连接

持久连接虽然也需要进行三次握手才能进行数据的传输(这不废话嘛~~~TCP 必须要三次握手),但是浏览器再次发送请求报文,就不需要再建立 TCP 连接,在之前 TCP 连接的基础上可以直接干(前提是之前的 TCP 连接没有断)

在持久连接的基础上,可以使用流水线的方式发送请求报文,服务器收到请求后会依次返回响应报文。因此浏览器使用流水线的方式大概只需花费一个 RTT 的时间就可以获取想要的资源,流水线的方式可使得 TCP 连接的空闲时间较少,提高文档下载的效率

image-20201230205320581

7.7、HTTP报文结构

HTTP报文是面向文本的,因此在报文中的每一个字段都是一些ASCII码串。

HTTP请求报文和响应报文都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。

1、请求报文

报文中的数据都使用ASCII编码,各个字段的长度是不确定的(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

image-20201230202247239


请求报文的举例

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种

image-20201230202931811

2、响应报文

响应报文结构与请求报文结构唯一的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。

image-20201230202336609


响应报文的举例

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

<html>
<head>
  <title>An Example Page</title>
</head>
<body>
  Hello World, this is a very simple HTML document.
</body>
</html>

关于HTTP请求GET和POST的区别

  1. 提交形式:

    GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的Body中。

  2. 传输数据的大小:

    HTTP协议本身没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:

    GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节。对于其他浏览器,如Netscape,FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。因此对于GET提交时,传输数据就会受到URL长度的限制。

    POST:由于不是通过URL传值,理论上数据不受限制。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache,IIS6都有各自的配置。

  3. 安全性:

    注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义

    比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,


以下是来自 w3schools 的标准答案

  1. GET在浏览器回退时是无害的,而POST会再次提交请求。
  2. GET产生的URL地址可以被Bookmark,而POST不可以。
  3. GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  4. GET请求只能进行url编码,而POST支持多种编码方式。
  5. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  6. GET请求在URL中传送的参数是有长度限制的,而POST么有。
  7. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  8. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  9. GET参数通过URL传递,POST放在Request body中。

8、本章小结

image-20201230211115801

猜你喜欢

转载自blog.csdn.net/oneby1314/article/details/111998741