1. 了解 Web 及网络基础
1.1 3项 WWW 构建技术
1)把 SGML 作为页面的文本标记语言的 HTML;
2)作为文档传递协议的 HTTP ;
3)指定文档所在地址的 URL。
1.2 网络基础 TCP/IP
1.2.1 TCP/IP 是互联网相关的各类协议族的总称
1.2.2 TCP/IP 分层管理
应用层:决定了向用户提供应用服务时通信的活动。
传输层:对上层应用层提供处于网络连接中的两台计算机之间的数据传输。
网络层:又名网络互连层,用来处理在网络上流动的数据包。
链路层:又名数据链路层,网络接口层,用来处理连接网络的硬件部分。
1.2.3 TCP/IP 通信传输流
1.2.4 与 HTTP 关系密切的协议:IP、TCP 和 DNS
1)负责传输的 IP 协议
IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址,ARP 根据通信方的 IP 地址就可以反查出对应的 MAC 地址。
2)确保可靠性的 TCP 协议
为了准确无误地将数据送达目标处,TCP 协议采用了三次握手(three-way handshaking)策略,握手过程中使用了 TCP 的标志(flag)、SYN(synchronize) 和 ACK(acknowledgement)。
3)负责域名解析的 DNS 服务
1.2.5 各协议与 HTTP 协议的关系
2. 简单的 HTTP 协议
2.1 HTTP 协议用于客户端和服务器端之间的通信,通过请求和响应的交换达成通信
请求报文的构成:
响应报文的构成:
2.2 HTTP 是无状态的协议
HTTP 是无状态的协议,它不对之前发生过的请求和响应的状态进行管理。
2.3 告知服务器意图的 HTTP 方法
1)GET:获取资源
2)POST:传输实体主体
3)PUT:传输文件
4)HEAD:获得报文首部
5)DELETE:删除文件
6)OPTIONS:询问支持的方法
7)TRACE:追踪路径
8)CONNECT: 要求用隧道协议连接代理
2.4 持久连接节省通信量
持久连接:只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
管线化:可以同时并行发送多个请求,不需要一个接一个地等待响应了。
2.5 使用 Cookie 的状态管理
通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
3. HTTP 报文内的 HTTP 信息
3.1 HTTP 报文的结构
3.2 请求报文和响应报文的结构
3.3 编码提升传输速率
3.3.1 报文主体和实体主体的差异
报文(message):是 HTTP 通信中的基本单位,由 8 位组字节流(octet sequence,其中 octet 为 8 个比特)组成,通过 HTTP 通信传输。
实体(entity):作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
HTTP 报文的主体用于传输请求或响应的实体主体。
3.3.2 压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码:
1)gzip(GNU zip)
2)compress(UNIX 系统的标准压缩)
3)deflate(zlib)
4)identity(不进行编码)
3.3.3 分割发送的分块传输编码
在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)。
4. 返回结果的 HTTP 状态码
4.1 1XX:Informational(信息性状态码),接收的请求正在处理
4.2 2XX:Success(成功状态码),请求正常处理完毕
1) 200 OK:表示从客户端发来的请求在服务器端被正常处理了。
2)204 No Content:表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分,浏览器显示的页面不发生更新。
3)206 Partial Content:表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求,响应报文中包含由 Content-Range 指定范围的实体内容。
4.3 3XX:Redirection(重定向状态码),需要进行附加操作以完成请求
1)301 Moved Permanently:永久性重定向,表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。
2)302 Found:临时性重定向,表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
3)303 See Other:表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
4)304 Not Modified:表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回 304 Not Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)。
5)307 Temporary Redirect:临时重定向,307 会遵照浏览器标准,不会从 POST 变成 GET。但是对于处理响应时的行为,每种浏览器有可能出现不同的情况。
4.4 4XX:Client Error(客户端错误状态码),服务器无法处理请求
1)400 Bad Request:表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。
2)401 Unauthorized:表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用户认证失败。
3)403 Forbidden:表明对请求资源的访问被服务器拒绝了。
4)404 Not Found:表明服务器上无法找到请求的资源,也可以在服务器端拒绝请求且不想说明理由时使用。
4.5 5XX:Server Error(服务器错误状态码),服务器处理请求出错
1)500 Internal Server Error:表明服务器端在执行请求时发生了错误,也可能是 Web 应用存在的 bug 或某些临时的故障。
2)503 Service Unavailable:表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
5. 通信数据转发程序
5.1 代理
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务器。持有资源实体的服务器被称为源服务器,从源服务器返回的响应经过代理服务器后再传给客户端。
1)缓存代理
代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
2)透明代理
转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
5.2 网关
网关能使通信线路上的服务器提供非 HTTP 协议服务。利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。
5.3 隧道
隧道可按要求建立起一条与其他服务器的通信线路,使用 SSL 等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信,HTTP 请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
6. HTTP 首部字段
6.1 通用首部字段(General Header Fields)
请求报文和响应报文双方都会使用的首部。
6.1.1 Cache-Control:控制缓存的行为
1)缓存请求指令
no-cache:强制向源服务器再次验证
no-store:不缓存请求或响应的任何内容
max-age = [秒]:响应的最大Age值
max-stale( = [秒]):接收已过期的响应
min-fresh = [秒]:期望在指定时间内的响应仍有效
no-transform:代理不可更改媒体类型
only-if-cached:从缓存获取资源
cache-extension:新指令标记(token)
2)缓存响应指令
public:可向任意方提供响应的缓存
private:仅向特定用户返回响应
no-cache:缓存前必须先确认其有效性
no-store:不缓存请求或响应的任何内容
no-transform:代理不可更改媒体类型
must-revalidate:可缓存但必须再向源服务器进行确认
proxy-revalidate:要求中间缓存服务器对缓存的响应有效性再进行确认
max-age = [秒]:响应的最大Age值
s-maxage = [秒]:公共缓存服务器响应的最大Age值
cache-extension:新指令标记(token)
6.1.2 Connection:逐跳首部、连接的管理
1)控制代理不再转发的首部字段
2)管理持久连接
6.1.3 Date:创建报文的日期时间
表明创建 HTTP 报文的日期和时间。
6.1.4 Pragma:报文指令
Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。
6.1.5 Trailer:报文末端的首部一览
Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。
6.1.6 Transfer-Encoding:指定报文主体的传输编码方式
HTTP/1.1 的传输编码方式仅对分块传输编码有效。
6.1.7 Upgrade:升级为其他协议
Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
6.1.8 Via:代理服务器的相关信息
追踪客户端与服务器之间的请求和响应报文的传输路径。报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发。
6.1.9 Warning:错误通知
HTTP/1.1 的 Warning 首部是从 HTTP/1.0 的响应首部(Retry-After)演变过来的,该首部通常会告知用户一些与缓存相关的问题的警告。
HTTP/1.1 警告码:
110:Response is stale(响应已过期),代理返回已过期的资源
111:Revalidation failed(再验证失败),代理再验证资源有效性时失败(服务器无法到达等原因)
112:Disconnection operation(断开连接操作),代理与互联网连接被故意切断
113:Heuristic expiration(试探性过期),响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)
199:Miscellaneous warning(杂项警告),任意的警告内容
214:Transformation applied(使用了转换),代理对内容编码或媒体类型等执行了某些处理时
299:Miscellaneous persistent warning(持久杂项警告),任意的警告内容
6.2 请求首部字段(Request Header Fields)
从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
1)Accept:用户代理可处理的媒体类型
2)Accept-Charset:优先的字符集
3)Accept-Encoding:优先的内容编码
4)Accept-Language:优先的语言(自然语言)
5)Authorization:Web 认证信息
6)Expect:期待服务器的特定行为
7)From:用户的电子邮箱地址
8)Host:请求资源所在服务器
9)If-Match:比较实体标记(ETag)
10)If-Modified-Since:比较资源的更新时间
11)If-None-Match:比较实体标记(与 If-Match 相反)
12)If-Range:资源未更新时发送实体 Byte 的范围请求
13)If-Unmodified-Since:比较资源的更新时间(与If-Modified-Since相反)
14)Max-Forwards:最大传输逐跳数
15)Proxy-Authorization:代理服务器要求客户端的认证信息
16)Range:实体的字节范围请求
17)Referer:对请求中 URI 的原始获取方
18)TE:传输编码的优先级
19)User-Agent:HTTP 客户端程序的信息
6.3 响应首部字段(Response Header Fields)
从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。
1)Accept-Ranges:是否接受字节范围请求
2)Age:推算资源创建经过时间
3)ETag:资源的匹配信息
4)Location:令客户端重定向至指定 URI
5)Proxy-Authenticate:代理服务器对客户端的认证信息
6)Retry-After:对再次发起请求的时机要求
7)Server:HTTP 服务器的安装信息
8)Vary:代理服务器缓存的管理信息
9)WWW-Authenticate:服务器对客户端的认证信息
6.4 实体首部字段(Entity Header Fields)
针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。
1)Allow:资源可支持的 HTTP 方法
2)Content-Encoding:实体主体适用的编码方式
3)Content-Language:实体主体的自然语言
4)Content-Length:实体主体的大小(单位:字节)
5)Content-Location:替代对应资源的 URI
6)Content-MD5:实体主体的报文摘要
7)Content-Range:实体主体的位置范围
8)Content-Type:实体主体的媒体类型
9)Expires:实体主体过期的日期时间
10)Last-Modified:资源的最后修改日期时间
6.5 为 Cookie 服务的首部字段
6.5.1 Set-Cookie
表示开始状态管理所使用的 Cookie 信息,属于响应首部字段。
Set-Cookie 字段的属性:
1)NAME = VALUE:赋予 Cookie 的名称和其值(必需项)
2)expires = DATE:Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
3)path = PATH:将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录)
4)domain = 域名:作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie 的服务器的域名)
5)Secure:仅在 HTTPS 安全通信时才会发送 Cookie
6)HttpOnly:加以限制,使 Cookie 不能被 JavaScript 脚本访问
6.5.2 Cookie
首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个 Cookie 时,同样可以以多个 Cookie 形式发送。
6.6 其他首部字段
1)X-Frame-Options
首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题,其主要目的是为了防止点击劫持(clickjacking)攻击。
2)X-XSS-Protection
首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。
3)DNT
首部字段 DNT 属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
4)P3P
首部字段 P3P 属于 HTTP 响应首部,通过利用 P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
7. 确保 Web 安全的 HTTPS
7.1 HTTP 的缺点
7.1.1 通信使用明文(不加密),内容可能会被窃听
互联网上的任何角落都存在通信内容被窃听的风险:
7.1.2 不验证通信方的身份,有可能遭遇伪装
1)无法确定请求发送至目标的 Web 服务器是否是按真实意图返回响应的那台服务器,有可能是已伪装的 Web 服务器。
2)无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端,有可能是已伪装的客户端。
3)无法确定正在通信的对方是否具备访问权限,因为某些 Web 服务器上保存着重要的信息,只想发给特定用户通信的权限。
4)无法判定请求是来自何方、出自谁手,即使是无意义的请求也会照单全收。
5)无法阻止海量请求下的 DoS 攻击(Denial of Service,拒绝服务攻击)。
7.1.3 无法证明报文的完整性,有可能已遭篡改
没有任何办法确认,发出的请求 / 响应和接收到的请求 / 响应是前后相同的。
中间人攻击(Man-in-the-Middle attack,MITM):
7.2 HTTPS
7.2.1 HTTP + 加密 + 认证 + 完整性保护 = HTTPS
7.2.2 HTTPS 是身披 SSL 外壳的 HTTP
HTTPS 并非是应用层的一种新协议,而是 HTTP 通信接口部分用 SSL 和 TLS 协议代替而已。
7.2.3 相互交换密钥的公开密钥加密技术
SSL 采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。
7.2.4 证明公开密钥正确性的证书
7.2.5 HTTPS 通信
8. 确认访问用户身份的认证
8.1 核对信息
1)密码:只有本人才会知道的字符串信息;
2)动态令牌:仅限本人持有的设备内显示的一次性密码;
3)数字证书:仅限本人(终端)持有的信息;
4)生物认证:指纹和虹膜等本人的生理信息;
5)IC 卡等:仅限本人持有的信息。
8.2 认证方式
1)BASIC 认证(基本认证)
2)DIGEST 认证(摘要认证)
3)SSL 客户端认证
为达到 SSL 客户端认证的目的,需要事先将客户端证书分发给客户端,且客户端必须安装此证书。
SSL 客户端认证采用双因素认证,第一个认证因素的 SSL 客户端证书用来认证客户端计算机,另一个认证因素的密码则用来确定这是用户本人的行为。
4)FormBase 认证(基于表单认证)
基于表单的认证方法并不是在 HTTP 协议中定义的,客户端会向服务器上的 Web 应用程序发送登录信息(Credential),按登录信息的验证结果认证,一般会使用 Cookie 来管理 Session(会话)。
专业术语:
HTTP:HyperText Transfer Protocol,超文本传输协议
SGML:Standard Generalized Markup Language,标准通用标记语言
HTML:HyperText Markup Language,超文本标记语言
URI:Uniform Resource Identifier,统一资源标识符,用字符串标识某一互联网资源
URL:Uniform Resource Locator,统一资源定位符,表示资源的地点(互联网上所处的位置)
CGI:Common Gateway Interface,公共网关接口
FTP:File Transfer Protocol,文件传输协议
DNS:Domain Name System,域名系统
IP:Internet Protocol,网际协议
TCP:Transmission Control Protocol,传输控制协议
UDP:User Data Protocol,用户数据报协议
NIC:Network Interface Card,网络适配器,即网卡
ARP:Address Resolution Protocol,地址解析协议
MAC 地址:Media Access Control Address,用来定义网络设备的位置
RFC:Request for Comments,征求修正意见书
REST:Representational State Transfer,表征状态转移
SSL:Secure Sockets Layer,安全套接层
TLS:Transport Layer Security,传输层安全
MIME:Multipurpose Internet Mail Extensions,多用途因特网邮件扩展
WebDAV:Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制
CERN:Conseil Européen pour la Recherche Nucléaire(法语),European Organization for Nuclear Research(英语),欧洲核子研究组织
NCSA:National Center for Supercomputer Applications,美国国家超级计算机应用中心
ICANN:Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构
IANA:Internet Assigned Numbers Authority,互联网号码分配局
SNS:Social Networking Service,社交网络服务