HTTP:WEB的基础
- 超文本传输协议
概述
在TCP/IP协议族中位于应用层的网络协议
用途
网页获取,数据的传输
特点
- 典型的客户/服务器(C/S)模式。
- HTTP协议永远都是客户端发起请求,服务器才回送响应
- 简单快速
- 客户向服务器请求服务时,只需传送请求方法(请求类型,GET,POST)和路径。
- 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活
- HTTP允许传输任意类型的数据对象。
- 非持续连接
- 非持续连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
- 从HTTP 1.1起使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。采用这种方式可以节省传输时间。
- 无状态
- 无状态是指协议对于事务处理没有记忆能力。
- Web服务器不保存发送请求的Web浏览器进程的任何信息,每次请求都是相互独立的
- 比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
- 影响
- 对于动态网页,如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
- 对于静态网页,在服务器不需要先前信息时它的应答就较快。
- 像 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>
组成
-
响应行 : 反馈基本的响应情况
- 格式:协议版本 状态码 信息
常见状态码: 100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。 200~299:表示服务器成功接收请求并已完成整个处理过程。常用200(OK 请求成功)。 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。 400~499:客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服务器拒绝访问,权限不够)。 500~599:服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)。 -
响应头:对响应内容的描述(由多个键值对组成)
-
空行
-
响应体:响应的主体内容信息
常见HTTP请求头
- Host (主机和端口号)
- Connection (链接类型):Connection:keep-alive 保持持续连接,一次连接可以处理多次请求
- Upgrade-Insecure-Requests (升级为HTTPS请求)
- User-Agent (浏览器名称)
- Accept (传输文件类型)
- Referer (页面跳转处)
- Accept-Encoding(文件编解码格式)
- Cookie (Cookie)
- x-requested-with :XMLHttpRequest (是Ajax 异步请求)
HTTP无状态的问题
文件参考地址:www.cnblogs.com/EricaMIN198…
- 无状态是指协议对于事务处理没有记忆能力
cookie :
-
cookie由服务器生成,保存在客户端浏览器。
-
容易被劫持,不安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗。
-
cookie可以被用户禁止
-
容量小, 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
session
- session是由应用服务器维持的一个服务器端的存储空间, 没有对存储的数据量的限制,可以保存更为复杂的数据类型.
- session 默认被存在在服务器的一个文件里, 当用户量增多时,会对服务器造成较大压力。
- Session的实现方式大多数情况用Cookie保存的,但是也可以使用URL地址重写。
- 使用Cookie来实现
- 服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。
- 使用URL回写来实现
- 使用Cookie来实现
- 较安全,用户验证这种场合一般会用 session, 比如金融银行类的产品,
token
1.无状态、可扩展
2.支持移动设备
- 可用于Android、IOS设备
3.跨服务器调用
4.安全:
- 实现方式不用基于cookie,可以预防csrf
- token具有一定的时效性
URL与资源
- URI(Uniform Resource Identity) 统一资源标识
- 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:/// - ...
- http 通过 HTTP 访问该资源。 格式
- hostname(主机名)
- 是指存放资源的服务器的域名系统(DNS) 主机名、域名 或 IP 地址。
- port(端口号)
- 整数,可选,省略时使用方案的默认端口;
- 各种传输协议都有默认的端口号,如http的默认端口为80。
- path(路径)
- 由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
- query(查询)
- 可选,用于给动态网页传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
- fragment(信息片断)
- 字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
- protocol(协议)
-
如:
常用请求报头
Connection (链接类型)
Connection:表示客户端与服务连接类型
- Client 发起一个包含 Connection:keep-alive的请求,HTTP/1.1使用 keep-alive为默认值。
- Server收到请求后:
- 如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;
- 如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。
- 如果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)。
缓存
-
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
-
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层。
-
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS
-
作用:用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全。
- HTTP的端口号为80
- HTTPS的端口号为443
-
结构:HTTPS=HTTP + SSL(安全套接字层)
-
特点:HTTPS比HTTP更安全,但是性能更低