http的主要特点
- 简单快速
- 灵活
- 无连接
- 无状态
简单快速
每个资源(图片,页面等)都通过URL来定位。
灵活
HTTP协议的头部包含数据类型,HTTP协议可以完成不同数据类型的传输。
无连接
连接一次就会断开,不会一直保持连接。
无状态
服务器端和客户端式两种身份。第一次请求结束后,会立刻断开连接,第二次连接时,服务器无法判断两次请求的客户端是否位同一身份,因为服务器端并没有记住之前的状态。有的网站登录的时候可以记住账号,是用了别的手段,比如服务器端的session,并不是http协议能做到的。
http报文的组成部分
http报文的组成分为两部分,请求报文和响应报文。
请求报文包括:
-
请求行:包括请求的方法、请求的URL、http协议以及版本。
-
请求头:键值对形式。
-
空行:空白行,用来隔开请求头和请求体。服务器端在解析请求头时如果遇到空白行,就表明后面是请求体。
-
请求体:数据部分。
请求报文图例:
响应报文包括: -
状态行:包含http协议及版本、状态码和状态描述。
-
响应头
-
空行
-
响应体
响应报文图例:
http的方法
http方法有以下八种,前五个比较重要,其中get和post最常见。
- GET:获取资源
- POST:传输资源
- PUT:更新资源
- DELETE:删除资源
- HEAD:获取报文头部
- OPTIONS:询问服务器支持的各种方法
- TRACE:回显服务器收到的请求,用于测试和诊断
- CONNECT:http/1.1协议中预留的能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接。
get和post的区别
get和post的区别有很多,主要有以下几点:
- 在浏览器回退时,get不会重新请求,post会重新请求。
- get请求会被浏览器主动缓存,post则不会。
- get请求的参数会被保留在浏览器记录里,而post不会。(为预防CSRF攻击,许多公司用post来替换get)
- get请求在URL中传递的参数有大小限制(一般为2KB,不同浏览器略有不同),而post没有。
- get请求的参数直接暴露在URL中,相对不安全;而post的参数放在请求体中,没有直接暴露。
get和post请求的区别,最主要的也是要强调的一点是,get相对不隐私,post相对隐私。详细区别见下图:
http状态码
http状态码分类:
常见的http状态码:
- 206:部分请求成功。206应用:客户端只请求某个大文件中的一部分内容,比如只播放视频地址的前面一部分,就可以用到206。
- 301:重定向(永久)
- 302:重定向(临时)
- 304:告诉客户端,已有缓存资源,不需要从服务器端取了。
- 403:请求被拒绝
- 404:资源不存在
什么是持久连接/http长连接
- 轮询:http1.0中,客户端每隔很短的时间,就对服务器发出请求查看是否有新消息。轮询速度足够快的话,用户就会有一种实时交互的感觉。但是这种做法会对客户端和服务器端造成很大的性能浪费。
- 长连接:http1.1中,通过connection:keep-alive进行长连接,客户端只请求一次,但服务器一直保持连接,当客户端再次发出请求时,无需重新建立连接。
需要注意的是,http1.1默认长连接。一次TCP连接可以完成多个http请求,但是对每个请求仍要单独发header,keep-alive不会永久保持连接,可以在不同的服务器软件(例如Apache)中设定保持时间。
长连接中的管线化
管连接的原理
长连接时,默认的请求是这样的:
请求1 --> 响应1 -->请求2 --> 响应2 --> 请求3 --> 响应3
长连接的管线化,请求是这样的:
请求1–> 请求2–> 请求3–>响应1–>响应2–>响应3
管线化的注意事项
后续再更新