HTTP协议

221 阅读15分钟

HTTP:WEB的基础

  • 超文本传输协议

概述

在TCP/IP协议族中位于应用层的网络协议

用途

网页获取,数据的传输

特点

  1. 典型的客户/服务器(C/S)模式。
    • HTTP协议永远都是客户端发起请求,服务器才回送响应
  2. 简单快速
    • 客户向服务器请求服务时,只需传送请求方法(请求类型,GET,POST)和路径。
    • 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活
    • HTTP允许传输任意类型的数据对象。
  4. 非持续连接
    • 非持续连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
    • 从HTTP 1.1起使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。采用这种方式可以节省传输时间。
  5. 无状态
    • 无状态是指协议对于事务处理没有记忆能力。
    • Web服务器不保存发送请求的Web浏览器进程的任何信息,每次请求都是相互独立的
    • 比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
    • 影响
      • 对于动态网页,如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
      • 对于静态网页,在服务器不需要先前信息时它的应答就较快。
  6. 像 HTTP 这样的协议只使用一个套接字进行一次传输。客户端发送一个请求,然后读取响应。就这么简单。套接字会被销毁。 表示客户端可以通过接收 0 字节序列表示检测到响应的结束。

网页请求过程

1.客户端(浏览器)发送http请求给服务端 2.服务端接收到http请求后进行解析 3.服务端处理请求内容,组织响应内容 4.服务端将响应内容以http响应格式发送给浏览器 5.浏览器接收到响应内容,解析展示

HTTP请求格式

  • HTTP请求示例:
GET /sample.jsp HTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate

组成

  • 请求行 : 请求类别+URL(请求内容)+协议版本

    • 八大请求类型
    请求类型意义
    GET获取网络资源
    POST提交一定的信息,得到反馈
    HEAD只获取网络资源的响应头,
    PUT更新服务器资源
    OPTIONS用于和服务器进行一些协商,如CORS的复杂请求。返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
    PATCH补丁,小面积局部更新服务器资源
    DELETE删除
    TRACE回显服务器收到的请求,主要用于测试或诊断。
  • 请求头:对请求的进一步解释和描述(由多个键值对组成)

  • 空行

  • 请求体: 请求参数或者提交内容

HTTP响应格式

  • HTTP响应格式示例:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AID1904</title>
</head>
<body>
    <h1>网页学习</h1>
    <p>网页前端</p>
    <p>网页爬虫</p>
</body>
</html>

组成

  1. 响应行 : 反馈基本的响应情况

    1. 格式:协议版本 状态码 信息
    常见状态码:
    100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
    
    200~299:表示服务器成功接收请求并已完成整个处理过程。常用200(OK 请求成功)。
    
    300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
    400~499:客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服务器拒绝访问,权限不够)。
    500~599:服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)。
    
  2. 响应头:对响应内容的描述(由多个键值对组成)

  3. 空行

  4. 响应体:响应的主体内容信息

常见HTTP请求头

  1. Host (主机和端口号)
  2. Connection (链接类型):Connection:keep-alive 保持持续连接,一次连接可以处理多次请求
  3. Upgrade-Insecure-Requests (升级为HTTPS请求)
  4. User-Agent (浏览器名称)
  5. Accept (传输文件类型)
  6. Referer (页面跳转处)
  7. Accept-Encoding(文件编解码格式)
  8. Cookie (Cookie)
  9. x-requested-with :XMLHttpRequest (是Ajax 异步请求)

HTTP无状态的问题

文件参考地址:www.cnblogs.com/EricaMIN198…

  • 无状态是指协议对于事务处理没有记忆能力

cookie :

  1. cookie由服务器生成,保存在客户端浏览器。

  2. 容易被劫持,不安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。

  3. cookie可以被用户禁止

  4. 容量小, 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

session

  1. session是由应用服务器维持的一个服务器端的存储空间, 没有对存储的数据量的限制,可以保存更为复杂的数据类型.
  2. session 默认被存在在服务器的一个文件里, 当用户量增多时,会对服务器造成较大压力。
  3. Session的实现方式大多数情况用Cookie保存的,但是也可以使用URL地址重写。
    • 使用Cookie来实现
      • 服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。
    • 使用URL回写来实现
  4. 较安全,用户验证这种场合一般会用 session, 比如金融银行类的产品,

token

1.无状态、可扩展

2.支持移动设备

  • 可用于Android、IOS设备

3.跨服务器调用

4.安全:

  • 实现方式不用基于cookie,可以预防csrf
  • token具有一定的时效性

URL与资源

  1. URI(Uniform Resource Identity) 统一资源标识
  2. URL(Uniform Resource Locator) 统一资源定位符 ,URI的子集

URL语法

  • URL 提供了一种定位因特网上任意资源的手段,但这些资源是可以通过各种不同的方案(比如HTTP、FTP、SMTP)来访问的,因此URL 语法会随方案的不同而有所不同。

  • 通用的语法格式:

    • <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
scheme:协议(例如:http, https, ftp,SMTP)   简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)
user:password: 用户名和密码,有些服务器需要用户密码才允许操作,如FTP
host:服务器的IP地址或者域名
port:服务器的端口(如果是走协议默认端口,80 or 443)
path:访问资源的路径
params:参数,为应用程序提供了访问资源所需的所有附加信息。每个路径段后都可以添加参数。
query-string:查询字符串,发送给http服务器的数据
frag:锚(跳转到网页的指定锚点位置),只在客户端使用,不会传递给服务端
  • 作用:

    • 用来表示互联网上某个资源的地址。
  • 说明:

    • 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
  • URL的一般语法格式为:

    protocol :// hostname[:port] / path [?query][#fragment]
    (带方括号[]的为可选项):
    
  • 说明:

    • protocol(协议)
      • http 通过 HTTP 访问该资源。 格式 HTTP://
      • https 通过安全的 HTTPS 访问该资源。 格式 HTTPS://
      • file 资源是本地计算机上的文件。格式: file:///
      • ...
    • hostname(主机名)
      • 是指存放资源的服务器的域名系统(DNS) 主机名、域名 或 IP 地址。
    • port(端口号)
      • 整数,可选,省略时使用方案的默认端口;
      • 各种传输协议都有默认的端口号,如http的默认端口为80。
    • path(路径)
      • 由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
    • query(查询)
      • 可选,用于给动态网页传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
    • fragment(信息片断)
      • 字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
  • 如:

常用请求报头

Connection (链接类型)

Connection:表示客户端与服务连接类型

  1. Client 发起一个包含 Connection:keep-alive的请求,HTTP/1.1使用 keep-alive为默认值。
  2. Server收到请求后:
    • 如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;
    • 如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。
  3. 如果client收到包含 Connection:keep-alive的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。

keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。

Upgrade-Insecure-Requests (升级为HTTPS请求)

Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。

HTTPS 是以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 HTTP 请求,一旦出现就是提示或报错。

User-Agent (浏览器名称)

User-Agent:是客户浏览器的名称,以后会详细讲。

Accept (传输文件类型)

Accept:指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器可以根据它判断并返回适当的文件格式。

举例:
Accept: */*:表示什么都可以接收。
Accept:image/gif:表明客户端希望接受GIF图像格式的资源;
Accept:text/html:表明客户端希望接受html文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有的图像格式资源。

q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被赋值为0,则用于表示浏览器不接受此内容类型。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;Application:用于传输应用程序数据或者二进制数据。详细请点击
Referer (页面跳转处)

Referer:表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。

有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载;

Accept-Charset(字符编码)

Accept-Charset:指出浏览器可以接受的字符编码。

Accept-Charset:iso-8859-1,gb2312,utf-8

- ISO8859-1:通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,英文浏览器的默认值是ISO-8859-1.
- gb2312:标准简体中文字符集;
- utf-8:UNICODE 的一种变长字符编码,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。

**如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。*
Cookie (Cookie)

Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能,以后会详细讲。

Content-Type
  • Content-Type:标头告诉客户端实际返回的内容的内容类型

  • MIME类型

Content-Type = Text/XML; charset=gb2312:

指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。
常见类型
text/plain :纯文本格式
application/json: JSON数据格式(当request使用json传值时,入参为json字符串)
application/x-www-form-urlencoded: 当使用data传值时,入参为object类型,在发送前,request将参数前置处理,在body中处理成格式为k1=v1&k2=v2 格式
另外一种常见的媒体格式是上传文件之时使用的:
- 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
- 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。
  -  如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 
  -  但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。

image.png

缓存

  • WEB缓存(cache)位于Web服务器和客户端之间。

  • 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。

  • HTTP协议定义了相关的消息头来使WEB缓存尽可能好的工作。

缓存的优点

减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快。 减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。

常见流程

服务器收到请求时,会在200OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。两个头的值分别是响应中Last-Modified和ETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。

Web缓存机制

HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。 HTTP定义了3种缓存机制: 1)Freshness:允许一个回应消息可以在源服务器不被重新检查,并且可以由服务器和客户端来控制。例如,Expires回应头给了一个文档不可用的时间。Cache-Control中的max-age标识指明了缓存的最长时间; 2)Validation:用来检查以一个缓存的回应是否仍然可用。例如,如果一个回应有一个Last-Modified回应头,缓存能够使用If-Modified-Since来判断是否已改变,以便判断根据情况发送请求;
3)Invalidation:在另一个请求通过缓存的时候,常常有一个副作用。例如,如果一个URL关联到一个缓存回应,但是其后跟着POST、PUT和DELETE的请求的话,缓存就会过期。

HTTPS

  1. HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。

  2. HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS

  3. 作用:用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全。

    1. HTTP的端口号为80
    2. HTTPS的端口号为443
  4. 结构:HTTPS=HTTP + SSL(安全套接字层)

  5. 特点:HTTPS比HTTP更安全,但是性能更低