一、HTTP协议
最近看了一些网络通信方面的书籍,研究了一下 HTTP 和 TCP/IP,有了一些新的收获和理解,在这里做个归纳和总结。
(1)什么是HTTP协议
HTTP (HyperText Transfer Protocol,超文本传输协议) 是一种通信协议,是指计算机网络中两台计算机之间进行通信所必须共同遵守的规定或规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端,是互联网上应用最为广泛的一种网络协议。
(2)一种无状态协议
HTTP协议是不保存状态的协议,即HTTP是无状态协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过来的请求或响应都不做持久化处理。
使用HTTP协议,每当有新的请求发送时,就会有对应的新的响应产生。协议本身不保留之前一切的请求或响应报文的信息。也就是说,无法根据之前的状态进行本次请求的处理。
无状态优点: ①更快地处理大量事务,确保协议的可伸缩性。②由于不必保存状态,这就可以减少服务器的CPU及内存资源的消耗。
HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。
Cookie会根据从服务器端发送的响应报文类中的Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往服务器发送请求时,客户端会自动的请求报文中加入Cookie值后发送出去。服务器端接收到客户端发送过来的Cookie后,回去检查究竟是从哪一个客户端发来的请求,然后对比服务器上的记录,最后得到之前状态的信息。
(3)HTTP方法
HTTP/1.0 和 HTTP/1.1支持的方法
其中LINK 和 UNLINE 已被HTTP/1.1废弃,不再支持。
(4)HTTP协议的报文
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的HTTP报文叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本。
HTTP报文包括以下三部分:
1. 报文首部
客户端或服务器端需处理的请求或响应的内容及属性。包括:请求行(包含用于请求的方法,请求URI,HTTP版本),状态行(包含表明响应结果的状态码,原因短语,HTTP版本),首部字段(包含表明请求和响应的各种条件和属性的各类首部)。
2. 空行
CR+LF,CR(Crriage Return,回车符) 和 LF(Line Feed,换行符)。
3. 报文主体
应被发送的数据。
请求报文和响应报文的示例图:
(5)HTTP持久化连接
1. 持久连接
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接,增加了通行量的开销。
为了解决上述TCP的问题,HTTP/1.1推出了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive 或 HTTP connection reuse)的方法。
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
优点:减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度就相应提高了。
在HTTP/1.1中,所有连接默认都是持久连接,但在HTTP/1.0内并未标准化。
2. 管线化
持久连接使得多数请求以管线化方式发送成为可能。之前发送请求后需等待并收到响应之后,才能发送下一个请求。管线化技术出现后,不用等待响应就可直接发送下一个请求。
(6)HTTP结果的状态码
HTTP状态码的职责是当客户端向服务端发送请求时,描述返回的请求结果。通过状态码,用户可以知道服务器是正常的处理了请求,还是出现了错误。
每条HTTP响应报文返回时都会携带一个状态码,状态码是由一个三位数字和原因短语组成,如200 OK。数字的第一位是响应类别(状态码类别),后两位无分类。
5种状态码的类别:
只要遵守状态码类别的定义,及时改变RFC2616总定义的状态码,或服务器端自行创建装条码都没问题。
几个常见的状态码:
- 200 OK。 表示从客户端发来的请求在服务器端被正常处理了。
- 204 No Content。 表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分,也不允许返回任何实体的主体。一般在只需要重客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
- 301 Moved Permanently。 永久性重定向。表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这是应该按Location首部字段提示的URI重新保存。
- 302 Found。 临时性重定向。表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
- 304 Not Modified。 表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,其实和重定向没有关系。
- 400 Bad Request。 表示报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
- 401 Unauthorized。 表示发送的请求需要通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。若之前已经进行过1次请求,则表示用户认证失败。
- 404 Not Found。 表示服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
- 500 Internal Server Error。 表示服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
- 503 Service Unavailable。 表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况所需要的时间,最好写入Retry-After首部字段再返回给客户端。
(7)常见的疑问
1. HTTP 和 TCP/IP 的区别
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。
详细点说就是,我们在传输数据的时候,可以只使用 TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。
2. URI、URL、URN 的区别
URI:Uniform Resorce Identifier,统一资源标识符。
URL:Uniform Resource Locator,统一资源定位符。
URN:Uniform Resource Name,统一资源名称。
URI用字符串表标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。
三者关系图:
如果是一个人,我们会想到他的姓名和住址。URL类似于住址,它告诉你一种寻找目标的方式(在这个例子中,是通过街道地址找到一个人)。要知道,上述定义同时也是一个URI。相对地,我们可以把一个人的名字看作是URN;因此可以用URN来唯一标识一个实体。由于可能存在同名(姓氏也相同)的情况,所以更准确地说,人名这个例子并不是十分恰当。更为恰当的是书籍的ISBN码和产品在系统内的序列号,尽管没有告诉你用什么方式或者到什么地方去找到目标,但是你有足够的信息来检索到它。
二、HTTPS 协议
(1)为什么要使用HTTPS
上面已经介绍了HTTP协议,虽然HTTP协议用的很普遍,但是它也有些不足。列举如下:
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法验证报文的完整性,所以有可能已遭篡改。
这些问题不仅在HTTP上出现,其他未加密的协议中也会存在这类问题。
为了统一解决上述这些问题,需要在HTTP上在加入加密处理和认证等机制。我们把添加了加密及认证机制的HTTP称为HTTPS(HTTP Secure)。
简单的说,其实 HTTPS = HTTP + 加密 + 认证 + 完整性保护。
经常会在Web的登录页面和购物结算界面使用HTTPS通信。使用HTTPS通信时,不再用http://,而是改用https://。当浏览器访问HTTPS通信有效的Web网站时,浏览器的地址栏会出现一个带锁的标记。
(2)特殊的HTTP
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Socker Layer)和 TLS(Transport Layer Security)协议代替而已。
通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。简言之,所谓HTTPS,其实就是身披 SSL 协议这层外壳的HTTP。
TLS/SSL 是独立于HTTP的协议,是介于 TCP 和 HTTP 之间的一层安全协议,不影响原有的 TCP 协议和 HTTP 协议,所以使用 HTTPS 基本上不需要对 HTTP 页面进行太多的改造。不光是HTTP协议,其他运行在应用层的SMTP 和 Telnet等协议均可配合SSL协议的使用。
(3)为什么不都使用HTTPS
既然HTTPS那么完全可靠,那为何所有的Web网站不一直使用HTTPS?
主要是因为以下几个原因:
1. 与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能处理的请求数量必定会随之减少。
因此,如果是非敏感信息还是用HTTP通信,只有在包含个人敏感数据时,才利用HTTPS加密通信。特别是每当那些访问量较多的Web网站在进行加密处理时,并非对所有内容都进行加密处理,而是仅对那些需要信息隐藏时才会加密,以节约资源。
2. 节约购买证书的开销。
要进行HTTPS通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。证书价格根据不同的认证机构略有不同,一年几百到几千的都有,那些购买证书并不合算的服务以及一些个人网站,可能只会选择采用HTTP的通信方式。
3. HTTPS使用SSL时,它的处理速度会变慢。
SSL的慢有两种,一是通信慢,二是大量消耗CPU及内存等资源,导致处理速度变慢。和HTTP相比,网络负载可能会慢2到100倍。除去和TCP连接、发送HTTP请求和响应以外,还必须进行SSL通信,因此整体上处理通行量不可避免会增加。SSL必须进行加密处理。在服务器和客户端都需要进行加密和解密的运算处理。因此,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。当然,可以通过使用SSL加速器这种硬件来改善该问题。