一、概述
计算机网络体系结构分层:
TCP/IP通信传输流
- 发送端在应用层(HTTP协议)发送一个请求某web页面的连接请求。
- 在传输层(TCP协议)把应用层受到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
- 在网络层(IP协议)增加作为通信目的地的MAC地址后转发给链路层。
- 接收端的服务器在链路层接收到数据向上发送,当传输到应用层才能真正接收到由客户端发送过来的HTTP请求
- HTTP协议(超文本协议)用于从www服务器传输超文本到本地浏览器的传输协议。
- HTTP协议是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。
- 浏览器通过URL统一资源定位符网址,确定了要浏览的网页地址,提取代码后翻译成漂亮的网页。
二、HTTP 工作过程
HTTP通信机制是在一次完整的HTTP通信过程中,客户端与服务端之间完成下列7个步骤:
- 建立TCP连接:TCP与IP协议共同构造Internet,即著名的TCP/IP协议族。HTTP是比TCP更高层次的应用层协议,根据规则,只有底层协议建立之后,才能进行高层协议的连接,因此首先建立TCP连接。
- 客户端向服务器发送请求命令:GET/sample/hello.jsp HTTP/1.1
- 客户端发送请求头信息:客户端发送请求命令后,以头信息的形式向服务器发送一些别的信息,之后以空白行来通知服务器,已经结束了该头信息的发送。
- 服务器应答:HTTP/1.1 200 OK 协议版本号和响应码
- 服务器返回响应头信息:服务器也会随同响应向用户发送关于它自己的数据及被请求的文档
- 服务器向客户端发送数据:服务器发送头信息后,之后发送一个空白行来表示头信息的发送结束,接着以Content-Type响应头信息所描述的格式发送用户所请求的实际数据
- 服务器关闭TCP连接:一般情况下服务器返回给了客户端所请求的数据,就关闭TCP连接,但是如果客户端或者服务器在其头信息中加入了Connection:keep=alive,TCP连接在发送后将仍然保持打开状态,于是客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络宽带。
三、HTTP 协议基础
- 通过请求和响应的交换达成通信:首先从客户端开始建立通信,服务器在没有收到请求之前是不会发送响应的
- HTTP是不保存状态的协议:协议自身不对请求和响应之间的通信状态进行保存,也就是HTTP协议对于发送和响应不做持久化处理,后续的Cookie技术可以保存通信状态。
- 使用Cookie的状态管理:在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当下次客户端再往服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送,服务端发现客户端发送的Cookie会检查究竟是哪个客户端发来的请求,然后对比服务上的记录,最后得到之前的状态信息。
- 请求URI定位资源:URI定位网络资源
- 告知服务器意图的HTTP方法(HTTP/1.1)
- 持久连接:避免请求一个资源(包含多资源)造成无畏的TCP连接和断开,所以现在连接方法是只要任意一方没有明确提出断开连接,则始终保持TCP连接状态,旨在建立一次TCP连接后多次请求和响应的交互。在 HTTP/1.1 中,所有的连接默认都是持久连接。
- 管线化:以前发送请求需要等待并接收到响应后才能发送下一个请求。管线化技术出现之后,不用等待也可以发送下一个请求,做到了同时并行发送多个请求,而不需要一个接一个地等待响应了。
四、HTTP 协议报文结构
- HTTP报文:用于HTTP协议交互的信息被称为HTTP报文。请求端被称作请求报文,响应端被称作响应报文,HTTP报文本身是由多行数据构成的字符串文本
- HTTP报文结构:报文首部(服务器或客户端需处理的请求或响应的内容以及属性)和报文主体(应被发送的数据)。
- 请求报文结构
请求报文:
响应报文:
五、HTTP 报文首部之请求行、状态行
请求行:请求访问某台HTTP服务器上的/index.htm页面资源
- GET 表示请求访问服务器的类型,称之为方法
- /index.htm 指明了请求访问的资源对象,也叫做请求URI
- HTTP/1.1 HTTP版本号,用来指示客户端使用的HTTP协议功能
- 开头的HTTP/1.1表示服务器对应的HTTP版本
- 200 OK 表示请求的处理结果状态码和原因短语
六、HTTP 报文首部之首部字段(重点分析)
首部字段由首部--------字段名:字段值
首部字段类型:
- 通用首部字段--------请求报文和响应报文两方都会使用的首部
- 请求首部字段--------从客户端向服务端发送请求报文时使用的首部,补充了请求附加内容、客户端信息、响应内容相关优先级等信息
- 响应首部字段-------从服务端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息
- 实体首部字段-------针对请求报文和响应报文的实体部分使用的首部,补充了资源内部更新时间与实体有关的信息。
可用指令:
警告:HTTP/1.1定义了7种警告
请求首部
响应首部
实体首部
Cookie
七、HTTP 响应状态码(重点分析)
3.1 200 OK
表示从客户端发来的请求在服务器端被正常处理了。
3.2 204 No Content
-
代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。
-
一般在只需要从客户端向服务器端发送消息,而服务器端不需要向客户端发送新消息内容的情况下使用。
3.3 206 Partial Content
表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 首部字段指定范围的实体内容。
3.4 301 Moved Permanently
永久性重定向。表示请求的资源已被分配了新的 URI。以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。
3.5 302 Found
-
临时性重定向。表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
-
和 301 Moved Permanently 状态码相似,但 302 Found 状态码代表资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的 URI 将来还有可能发生改变。
3.6 303 See Other
-
表示由于请求的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。
-
303 See Other 和 302 Found 状态码有着相同的功能,但 303 See Other 状态码明确表示客户端应采用 GET 方法获取资源,这点与 302 Found 状态码有区别。
3.7 304 Not Modified
-
表示客户端发送附带条件的请求时,服务器端允许请求访问的资源,但未满足条件的情况。
-
304 Not Modified 状态码返回时,不包含任何响应的主体部分。
-
304 Not Modified 虽然被划分到 3xx 类别中,但和重定向没有关系。
3.8 307 Temporary Redirect
临时重定向。该状态码与 302 Found 有着相同的含义。
3.9 400 Bad Request
-
表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
-
另外,浏览器会像 200 OK 一样对待该状态码。
3.10 401 Unauthorized
-
表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。
-
另外,若之前已进行过 1 次请求,则表示用户认证失败。
-
返回含有 401 Unauthorized 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。
3.11 403 Forbidden
表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出详细的拒绝理由,当然也可以在响应报文的实体主体部分对原因进行描述。
3.12 404 Not Found
表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由的时候使用。
3.13 500 Internal Server Error
表明服务器端在执行请求时发生了错误。也可能是 Web 应用存在的 bug 或某些临时的故障。
3.14 503 Service Unavailable
表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入 Retry-After 首部字段再返回给客户端。
八、HTTP 报文实体
-
报文:是网络中交换和传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
-
实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
- 内容编码:HTTP应用程序有时在发送之前需要对内容进行编码。例如,把很大的HTML文档压缩有助于减少传输实体的时间,服务器还可以把内容搅乱或加密,以此来防止未授权的第三方看到文档内容。
- 这种类型的编码是在发送方应用到内容上,当内容经过编码后,编码好的数据就放在实体主体中,像往常一样发送给接收方。
-
九、与 HTTP 协作的 Web 服务器
代理:
缓存:
HTTP / FTP 网关
HTTP/SSL 隧道
HTTP 隧道的一种常见用途就是通过 HTTP 连接承载加密的安全套接字层(SSL)流量,这样 SSL 流量就可以穿过只允许 Web 流量通过的防火墙了。
Agent 代理
自动搜索引擎“网络蜘蛛”
HTTPS协议:
这样做是不是就绝对安全了呢?并不是。
虽然我们在后续的通信中对明文进行了加密,但是第一次约定加密方式和密钥的通信仍然是明文,如果第一次通信就已经被拦截了,那么密钥就会泄露给中间人,中间人仍然可以解密后续所有的通信内容。
小灰不知道公钥被偷偷换过,以为Key3就是小红的公钥。于是按照先前的流程,用Key3加密了自己生成的对称加密密钥Key2,发送给小红。
这一次通信再次被中间人截获,中间人先用自己的私钥解开了Key3的加密,获得Key2,然后再用当初小红发来的Key1重新加密,再发给小红。
这时候,我们有必要引入第三方,一个权威的证书颁发机构(CA)来解决。
到底什么是证书呢?证书包含如下信息:
流程如下:
4.小灰收到证书以后,要做的第一件事情是验证证书的真伪。需要说明的是,各大浏览器和操作系统已经维护了所有权威证书机构的名称和公钥。所以小灰只需要知道是哪个机构颁布的证书,就可以从本地找到对应的机构公钥,解密出证书签名。
接下来,小灰按照同样的签名规则,自己也生成一个证书签名,如果两个签名一致,说明证书是有效的。