HTTP
HTTP
HTTP简介
超文本传输协议HTTP的主要特点
支持客户/服务器模式
简单快速
灵活
无连接
- 限制每次连接只处理一个请求,服务器处理完客户的请求并收到客户的应答后就断开连接
- 默认使用长连接,即服务器需要等待一定时间后才断开连接,以保证连接特性
无状态
- 协议对于事物处理没有记忆能力,如果后续处理需要前面的信息则必须重传。
HTTP请求结构
请求行:
- 请求方法:Get、Post等
- URL:URL
- 协议版本号:HTTP/1.0、1.1
请求头部:
- 若干报头组成
- 设置请求的参数
请求正文:
- 数据体,只在post中用到,表示上传的数据
HTTP响应结构
- 状态行:
- 协议版本、状态码、状态码描述
- 响应头部
- 说明客户端要使用的附加信息
- 响应正文
请求/响应的步骤
客户端连接到Web服务器,建立TCP连接
发送HTTP请求
服务器接受请求并返回HTTP响应
- Web服务器解析该请求,定义请求资源,然后将该资源副本写到TCP套接字,由客户端读取。
释放TCP连接
- 若HTTP连接模式为close则服务器主动关闭连接
若为keep-alive则该连接会保持一段时间,在该时间内还可以接收数据。
- 在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
客户端浏览器解析HTML内容
在浏览器地址栏输入URL,按下回车后经历的流程
- DNS解析
- 浏览器缓存
- 系统缓存
- 路由器缓存
- IPS服务器缓存
- 域名服务器缓存
- 顶级域名服务器缓存
- 建立TCP连接
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接结束
HTTP状态码
五种可能的取值
常见的状态码
GET请求和POST请求的区别
从三个层面来解答:
- HTTP报文层面:GET将请求信息放到URL,POST放到报文体中
- 安全性上两者并没有太大的区别
- 数据长度上GET放到URL中,浏览器会对长度做限制,POST放到报文体中,没有限制。
- 数据库层面:GET符合幂等性和安全性,POST不符合
- 幂等性:对数据库的一次操作和多次操作获得的结果一致
- 安全性:对数据库的操作没有改变数据库的数据
- GET做查询操作,故不会改变数据库的数据
- POST做添加等操作,会改变数据库的数据
- 其他层面:GET可以被缓存、被存储,而POST不行
Cookie和Session的区别
Cookie简介
- 是由服务器发给客户端的特殊信息,以文本的形式存放在客户端
- 客户端再次请求时,会把Cookie回发
- 服务器接收到后,会解析Cookie生成与客户端相对应的内容
Cookie的设置及发送过程
- 客户端发送HTTP请求到服务端
- 服务端发送HTTP响应到客户端,其中包括
Set-Cookie
头部 - 客户端再发送HTTP请求到服务端,包括
Cookie
头部 - 服务器端发送对应响应
Session简介
- 服务端端机制,在服务器上保存信息
- 解析客户端请求并操作Session id,按需保存状态信息
Session的实现方式
两种:
- 使用Cookie来实现
- 服务器给每个Session分配一个唯一的JSESSIONID并通过Cookie发送给客户端
- 当客户端发起新的请求时将在Cookie头中携带JSESSIONID,如此服务器可以找到客户端对应的Session
- 使用URL回写来实现
- 服务器在发送给浏览器页面的所有链接中都携带JESSSIONID参数,这样客户端点击任何链接都会把JSESSIONID待会给服务器,如果直接在浏览器输入URL来请求该资源,Session就会匹配不到
Tomcat对Session的实现同时使用上述两种,如果发现客户端支持Cookie就继续使用Cookie停止URL回写,如果不支持Cookie就一致使用URL回写。
Cookie和Session的区别
- Cookie数据存放在客户浏览器上,Session数据存放在服务器上
- Session相对Cookie更安全
- 若考虑减轻服务器负担,应该使用Cookie
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Alfred的小站!