超文本传输协议HTTP是一个请求响应模式的无连接无状态的应用层协议,基于TCP连接。HTTP协议目前处于多个版本共存的状态,HTTP1.0、HTTP1.1和HTTP2.0。HTTP1.1主要是在1.0版本的基础上增加了一个长连接(keep-alive)特性,是目前使用最广泛的版本。
特点
HTTP协议的主要特点如下:
- 支持C/S模式:客户端浏览器通过URL向服务端Web服务器发送请求,服务端解析处理之后返回响应给客户端。
- 简单快速:请求只需要给出请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,通信很快。
- 灵活:HTTP允许传输任意类型的数据对象,正在传输的数据类型由Content-Type加以标记。
- 无连接:限制每次连接只处理一个请求,服务器处理完客户端的请求并收到客户端的应答之后即断开连接,采用这种方式可以节省传输时间。从HTTP1.1开始,默认使用了长连接,即服务器需要等待一段时间后才断开连接,以保证连接特性,优化效率,但这个优化属于HTTP协议之外的内容。
- 无状态:协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要之前的信息,则必须被重传。
HTTP请求结构
HTTP请求格式.jpgHTTP响应结构
HTTP响应格式.png请求/响应的步骤
- 客户端连接到Web服务器
- 发送HTTP请求
- 服务器接收请求并返回HTTP响应
- 释放TCP连接
- 客户端浏览器解析HTML内容
响应状态码
- 1xx:指示信息,表示请求已接收,继续处理
- 2xx:成功,表示请求已被成功接收、理解、接受
- 3xx:重定向,要完成请求必须进行更进一步的操作
- 4xx:客户端错误,请求有语法错误或请求无法实现
- 5xx:服务端错误,服务器未能实现合法的请求
状态码 | 信息 | 解释 |
---|---|---|
200 | OK | 正常返回信息 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用 |
403 | Forbidden | 服务收到请求,但是拒绝提供服务 |
404 | Not Found | 请求资源不存在 |
500 | Internal Server Error | 服务器发生不可预期的错误 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
GET请求和POST请求的区别
- HTTP报文层面:GET请求信息放在URL,POST放在报文体中(安全性区别不大,URL有长度限制)
- 数据库层面:GET符合幂等性(一次操作和多次操作结果一样)和安全性(对数据库的操作没有改变数据库中的数据),POST不符合。
- 其他层面:GET请求可以被缓存、被存储,而POST不行。
从HTTP标准来说,以上区别是存在的,但是从报文的角度来说,GET请求和POST请求没有本质区别,只要服务器支持,参数怎么传都无所谓。
- GET参数的写法并不固定。
- POST方法几乎不比GET安全多少(明文传输)。
- HTTP本身没有限制URL的长度,是浏览器和服务器基于性能和安全考虑限制的。
- POST报文不一定会发送两个TCP报文,这是部分浏览器和框架的行为。
Cookie和Session的区别
HTTP是无状态的,Cookie和Session让HTTP具备了状态。
Cookie
Cookie是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端。例如,客户端向一个支持Cookie的服务器发送用户名和密码后,服务器在响应的同时,会把这些信息放在Response header(Set-Cookie)中返回给客户端,客户端会把这些信息存放在统一的位置。当客户端再次请求时,会在Request header(Cookie)中把Cookie回发。服务器接收到后,会解析Cookie生成与客户端相对应的内容。
Session
Session是服务器端的一种机制,在服务器上保存的信息(类似于hash的结构)。服务器解析客户端的请求中是否包含session id,如果存在session id,说明服务器以前已经为客户端创建过session,把这个session检索出来使用,如果检索不到,就新建一个session。如果客户端请求不包含session id,则为此客户端新建一个session,并生成一个对应的session id,在响应中会发给客户端进行保存。
Session可以通过Cookie实现,即通过Cookie保存JSESSIONID。也可以通过URL回写来实现,服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,客户端点击任何一个链接都可以把JSESSIONID会发给服务器,但如果不是点击的而是输入的URL,Session是匹配不到的。
区别
- 存放位置
- Session相对更安全
- 考虑到服务器性能开销,应使用Cookie
HTTPS
HTTPS在HTTP协议和TCP协议之间增加了一个SSL(安全套接字层)或TLS(安全传输层),从而提供了保证交换数据隐私和数据完整性,以及网站服务器身份认证的功能。
SSL
Security Sockets Layer,安全套接字层
- 为网络通信提供安全及数据完整性的一种安全协议
- 是操作系统对外的API,SSL3.0以后更名为TLS
- 采用身份验证和数据加密保证网络通信的安全和数据的完整性
加密的方式
- 对称加密,性能较高,安全性较低
- 非对称加密,性能较低,安全性较高,能加密的长度有限
- 哈希算法(摘要算法),将任意长度的信息转化为固定长度的值,算法不可逆
- 数字签名:证明某个消息或者文件是某人发出/认同的
HTTPS数据传输流程
HTTPS采用了证书和加密结合的方式。
HTTPS数据传输过程.png
HTTP和HTTPS的区别
- HTTPS需要到CA申请证书,HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS默认采用443端口,HTTP使用80端口
- HTTPS = HTTP + 认证 + 加密 + 完整性保护,较HTTP安全(SSL是有状态的)
HTTPS真的很安全吗
- 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险;
- 可以使用HSTS (HTTP Strict Transport Security)优化。
Socket
本地进程可以用进程号PID唯一标识,网络进行需要IP + 协议 + 端口号来唯一标识。Socket是对TCP/IP协议的抽象,是操作系统对外开放的接口。Socket通信流程如下:
socket通信流程.jpg
网友评论