1 HTTP 简介
HTTP, Hyper Text Transfer Protocol(超文本传输协议)
用于从 万维网服务器 传输 超文本 到 本地浏览器 的传送协议
HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件, 图片文件, 查询结果等)。
HTTP协议工作于客户端-服务端架构之上。
浏览器 作为 HTTP客户端 通过URL向 HTTP服务端即WEB服务器 发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
2 HTTP 主要特点
1、简单快速:
客户向服务器请求服务时,只需传送请求方法和路径。
HTTP报文格式为 body+header,header也是key-value的文本形式,简单易于理解
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活易于扩展:
HTTP允许传输任意类型的数据对象。
HTTP还允许开发人员自定义和扩充
(正在传输的类型由Content-Type加以标记。)
3、跨平台、应用广泛:
PC和手机终端都支持HTTP应用
天然具有跨平台的优越性 ❓❓❓
3 HTTP 双刃剑
1、无状态:
好处是,减轻服务器的负担,让服务器把更多的CPU和内存资源用于处理请求
因为无状态使得服务器无需去记忆HTTP的状态,不需要额外资源来记录这些状态信息
坏处是,没有记忆能力,因此每次在处理 有关联性的操作 时会很麻烦,如同一个账户短时间内多次访问一个网页
—> 解决方法: cookies机制、session机制
2、明文传输
好处是,方便可阅读,方便开发人员,同时不加密解密也降低开销
坏处是,信息暴露,容易被窃取
3、安全性
HTTP不安全
针对以上,HTTPS 的改进:
引入加密认证机制(TCP连接 多了 SSL握手的过程)
TODO
HTTP/1.1 、HTTP/2 、HTTP/3 的演变和变化
3.无连接:
~~无连接的含义是限制每次连接只处理一个请求。~
~~服务器处理完客户的请求,并收到客户的应答后,即断开连接。~
采用这种方式可以节省传输时间。
4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
5、支持B/S及C/S模式。
4 HTTP 状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
5 HTTP 请求方法
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
5.1 GET 和 POST的区别
(都是HTTPP常用的谓词、方法)
(1)从功能上:
Get用于从服务器上请求资源
Post用于向服务器提交和更新资源
(2)从服务角度上(幂等性):
Get是幂等的,Post是不幂等的
(3)从请求参数形式上:
Get的请求参数会附在URL之后,即报文的请求头
- 以?分割url和传输数据
- 参数之间用&连接
- 字母和数字原样发送,其他需进行转义、加密处理
Post的请求参数附在请求体中即http body
(4)从安全性上:
Post比Get更加安全,因为Get的请求参数直接暴露于url中,而Post则是包装在请求体中
(5)从请求大小上:
Get的请求参数的大小受限于url长度:
url长度限制来源于两个方面:
i. 浏览器对于url长度的限制
ii. 服务器对于url长度的限制
(6)编码支持:
Get 只支持 url编码;
Post 则支持各种编码格式
----------------------------------
7 GET和POST的区别(5)
GET和POST 都属于 HTTP谓词、HTTP Method
- 从功能上
- GET是向服务器请求资源
- POST是一般用于更新服务器资源
- 从服务角度上(幂等性)
- GET是幂等的,即申请同一资源总是得到相同的值
- POST不是幂等的,因为每次POST请求都可能会修改服务器的资源
- 从请求参数上
- GET的请求参数放在url之后,用?分隔,
- 参数之间用&分隔
- 英文和数字原样发送
- 汉字和其他字符经转义、编码后发送
- POST 请求参数放在请求体中
- 从安全性上
- POST更安全
- 因为POST的请求参数包装在请求体中,而GET的请求参数直接暴露在URL中
- 从请求的大小上
- POST大小通常无限制
- GET大小受限于
- 1)浏览器对于URL长度的限制
- 2)服务器对于URL长度的限制
6 HTTP 工作原理
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
(从输入网址到获得页面的过程:)
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、域名解析
浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、建立TCP连接
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、发送请求
浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,**该请求报文作为 TCP 三次握手的第三个报文**的数据发送给服务器;
4、响应请求
服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
(根据请求参数,经后端处理生成HTML页面,返回给浏览器)
~5、释放连接~
~释放 TCP连接;~
6、页面解析、渲染
浏览器将该 html 文本解析并显示内容;
7 HTTP常见字段
- HOST
- 客户端发送请求时用于指定服务器域名
- 可以将请求发到 同一台服务器上 的不同网站
- Connection
- 客户端要求服务器使⽤ TCP 持久连接,以便其他请求复⽤该连接
- 注意,HTTP/1.1 之后默认使用持久连接,但出于兼容性保留该字段
- Accept
- 客户端声明自己所接受的数据格式和编码
- Content-type
- 服务器用于告知客户端,所返回数据的格式和编码
- content-length
- 服务器返回数据时,用于表明数据的长度(单位为 字节Byte)
Session 和 cookie 机制
: 都是会话跟踪机制,是客户端和服务端之间保持状态的解决方案
cookie机制采用的是 在客户端 保持状态的方案
session ~ 在服务端 保持状态的方案
cookie
客户端向服务端发起请求。如果服务端需要记录该用户状态,就 用response 向客户端颁发一个cookie。
客户端随之将cookie保存在本地。
当客户端(浏览器)再次请求时,可以携带上cookie一同提交给服务器,服务器检查cookie来辨认用户状态
session
同样,会化妆台也可以保存在服务端;
服务端记录用户状态时会获取(生成)session-sessionid,并且把sessionid通过response返回给客户端保存。
当客户端(浏览器)再次请求时,可以携带上sessionid一同提交给服务器,服务器检查sessionid来查session和辨认用户
cookie 和 session的区别
(1)实现机制:
session的实现依赖于cookie机制,sessionid通过cookie机制进行回传
(2)大小限制
cookie有大小限制,并且浏览器对于每个站点有cookie数量的限制
session无大小限制,理论上只与服务器的内存大小有关
(3)安全性
cookie存在安全隐患,在回传过程汇总可能被拦截,保存在本地的文件也可能被获取;
session相对安全,因为存在服务端
(4)服务器消耗
session在服务端的 生存周期为 会话期+20min(通常),若session过多会增加服务端的负担和压力