HTTP(一)、详细介绍

xiaoxiao2021-03-01  56

HTTP 概述

HTTP 是一种获取网络资源的通讯协议,它是Web进行交换数据的基础,是一种client-server协议。

通常,客户端是由像浏览器这样的接收方发起的,服务端一般分为Web服务器或者Ftp文件服务器。

一个完整的Web页面是由不同的子文档拼接而成,例如文本、布局描述、脚本、图片、视频等。

HTTP不仅被用来传输HTML文件还可以传输图片、视频或者向服务端发送如HTML表单数据。HTTP还可以根据网页需求,仅获取部分Web文档内容更新网页。

HTTP 组件系统

HTTP协议是一个client-server协议:请求通过一个实体被发出,实体也就是用户代理,大多数情况下,这个用户代理就是指浏览器。

1.客户端:user-agent

user-agent 就是可以发起HTTP请求的工具。通常这个角色是由浏览器扮演。

如何显示一个网页? 浏览器首先发送一个请求信息获取页面的HTML文档,再解析这些文档中的资源信息发送其他请求,获取JS脚本文件或CSS样式文件来进行页面布局渲染,以及其他资源文件(图片或者视频)。最后,浏览器将这些资源进行整合输出,呈现最终的页面文件。

2.Web服务端

在HTTP请求的另一端,是由WEB 服务器提供客户端请求的文档数据的。

服务端不一定是一台机器,但是一台机器上是可以部署多个服务。服务端的作用,就是为客户端提供不同种类的服务,这些服务可能是Web 服务,Ftp数据资源服务,数据库服务等。

3.代理(Proxies)

代理存在于服务器和客户端之间。

代理的作用:

缓存过滤负载均衡认证日志记录

HTTP 基本属性

1.HTTP是简单的

2.HTTP是可扩展的

HTTP可扩展,具体是说HTTP header具有可扩展型。这就可以使我们自定义头信息,从而实现和服务端达成某种特殊约定。

3.HTTP是无状态,有会话的

无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个新的问题,用户无法在同一个网站中进行连续的交互。比如,在一个电商网站中,用户把某个商品添加到购物车中,切换一个页面之后,购物车中的数据是无法存储的,每次刷新页面购物车中的数据将被清空。解决方案是,使用HTTP头部扩展,HTTP Cookies就可以解决这个问题。把Cookies添加到头部中,就可以使每个请求都能共享相同的上下文信息,从而达到相同的状态。

4.HTTP和连接

客户端到服务端的连接是由传输层来控制的。

HTTP是面向应用层的协议,HTTP并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失数据信息的。

传输层有两个常见的协议:TCP、UDP。TCP是可靠传输,HTTP是基于TCP进行消息传递的。

因此,每次创建一个HTTP/1.0请求都会打开一个TCP连接,这就导致了两个缺点:

速度慢

打开一个TCP连接需要多次往返消息传递(三次握手协议,这种方式可以避免在不可靠的网络中提供一种可靠的端对端字节流数据传输)。

效率低

单个连接发送时效率低下,不过在周期性发送多个消息时,这样的连接方式的效率才能提升。

HTTP 能控制什么

用HTTP可以控制缓存和认证。

下面是常见的控制属性:

缓存

服务端告诉客户端或代理哪些资源是需要被缓存的,以及缓存时间,同时客户端也能够命令中间的缓存代理来忽略缓存资源。

开放同源限制

为了防止网络窃听和其他隐私数据泄露,浏览器对Web网站进行了强制安全限制。只有来自于相同来源的网页才能获取网站的全部信息(例如,欺诈网站可以利用iframe伪装成银行网站,如何没有同源策略,那么我们输入的银行账号信息就可能被窃取)。这样的限制有时也是一种负担,HTTP可以通过修改头部信息来开放这样的限制,因此,Web文档可以是由不同域下的信息拼接成的。

认证

某些网站只允许特定用户进行授权访问。基本的认证功能是通过HTTP提供。使用WWW-Authenticate类似的header信息即可实现,或者使用HTTP Cookies来设置指定的会话。

代理和隧道

通常情况下,服务端一般是在内网环境下的通过代理服务器连接到外网环境的,因此外网是无法感知其真实ip地址。HTTP请求就要通过代理越过这层网络障碍,但是并非所有的代理都是HTTP代理,例如SOCKET协议的代理就是在底层。

会话

HTTP Cookies允许使用服务端的状态发起请求,这就创建了会话。会话的作用就是将我们的状态进行存储。

HTTP 数据流(flow)

当客户端想要和服务端进行信息交互时(服务端是指最终服务器或中间代理),要通过以下几个步骤:

第一步 打开TCP连接

TCP连接用来发送一条或多条请求信息,以及接收服务端响应信息。客服端可以打开一条新的TCP连接,或重用一个已经存在的连接,也有可能打开多个新的TCP连接与服务端进行连接。

第二步 发送HTTP报文

HTTP报文(HTTP/2之前)是语义可读的。在HTTP/2中,这些简单的消息被封装在帧中,这使得报文不能直接进行读取,但是原理相似。

Request URL: https://www.google.com.hk/ Request Method: GET Status Code: 200 Remote Address: 108.177.125.199:443 Referrer Policy: no-referrer-when-downgrade

第三步 读取服务端返回报文

alt-svc: quic=":443"; ma=2592000; v="44,43,39,35" cache-control: private, max-age=0 content-encoding: br content-type: text/html; charset=UTF-8 date: Thu, 02 Aug 2018 08:51:15 GMT expires: -1 server: gws set-cookie: 1P_JAR=2018-08-02-08; expires=Sat, 01-Sep-2018 08:51:15 GMT; path=/; domain=.google.com.hk status: 200 strict-transport-security: max-age=3600 x-frame-options: SAMEORIGIN x-xss-protection: 1; mode=block

第四步 关闭连接或为后续请求重用连接

HTTP 报文

在HTTP/1.1以及更早之前,HTTP协议报文都是语义可读的。在HTTP/2中,这些报文信息被嵌入到一个新的数据结构中,* 帧*。帧允许实现很多优化,比如报文header的压缩和复用。

HTTP报文有两种类型:

1.请求2.响应
转载请注明原文地址: https://www.6miu.com/read-3350393.html

最新回复(0)