HTTP协议特点
- 简单快速
- 灵活
- 无连接
- 无状态
简单快速
每个资源(比如图片、页面)都通过 url 来定位。这都是固定的,在http协议中,处理起来也比较简单,想访问什么资源,直接输入url即可。
灵活
http协议的头部有一个数据类型,通过http协议,就可以完成不同数据类型的传输。
无连接
连接一次,就会断开,不会继续保持连接。
无状态
客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并没有记住之前的状态,也就是说,服务器端无法区分客户端是否为同一个人、同一个身份。 有的时候,我们访问网站时,网站能记住我们的账号,这个是通过其他的手段(比如 session)做到的,并不是http协议能做到的。
HTTP报文组成
- 请求报文
- 请求方法
- 请求url
- http协议及版本
- 报文头
- 报文体
请求行:包括请求方法、请求的url、http协议及版本。 请求头:一大堆的键值对。 空行指的是:当服务器在解析请求头的时候,如果遇到了空行,则表明,后面的内容是请求体。 请求体:数据部分。
- 响应报文
- 报文协议及版本
- 状态码及状态描述
- 响应头
- 响应体
状态行:http协议及版本、状态码及状态描述。 响应头 空行 响应体
HTTP方法
- GET
- POST
- put
- DELETE
- HEAD
get和post区别
get在浏览器退回时是无害的,post会再次提交请求 [重要] get产生的url地址可以被收藏,post不可以 get请求会被浏览器主动缓存,post不会,除非手动设置 [重要] get请求只能进行url编码,post支持多种编码方式 get请求参数会被完整保留在历史记录里,post的参数不会保留,为了防止CSRF攻击,很多公司把get统一改成了post [重要] get请求在url中传送的参数长度有限制(基本是2kb),post无限制 [重要] 对参数的数据类型,get只能接受ASCII字符,post无限制 get比post更不安全,因为参数暴露在url上,所以不能用来传递敏感信息 [重要] get参数通过url传递,post放在request body中
HTTP状态码
状态码分类
1xx: 指示信息-表示请求已接收,继续处理 2xx: 成功-表示请求已被成功接收 3xx: 重定向-要完成请求必须进行更进一步的操作 4xx: 客户端错误-请求有语法错误或请求无法实现 5xx: 服务器错误-服务器未能实现合法的请求
常见HTTP状态码
200 OK:客户端请求成功 206 Partial Content:客户发送了一个带有Range头的GET请求,服务器完成了它 301 Moved Permanently: 所请求的页面已经转移至新的url 302 Found: 所请求的页面已经临时转移至新的url 304 Not Modified: 客户端有缓冲的文档并发出了一个条件性的请求,服务器告诉客户,原来的缓冲的文档还可以继续使用 400 Bad Request: 客户端请求有语法错误,不能被服务器理解 401 Unauthorized: 请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用 403 Forbidden: 对被请求页面的访问被禁止 404 Not Found: 请求的资源不存在 500 Internal Server Error: 服务器发生不可预期的错误,原来的缓冲文档还可以继续使用 503 Server Unavailable: 请求未完成,服务器临时过载或宕机
持久链接/http长连接
- 轮询:http1.0中,客户端每隔很短的时间,都会对服务器发出请求,查看是否有新的消息,只要轮询速度足够快,例如1秒,就能给人造成交互是实时进行的印象。这种做法是无奈之举,实际上对服务器、客户端双方都造成了大量的性能浪费。
- 长连接:HTTP1.1中,通过使用Connection:keep-alive进行长连接,。客户端只请求一次,但是服务器会将继续保持连接,当再次请求时,避免了重新建立连接。
HTTP 1.1默认进行持久连接。在一次 TCP 连接中可以完成多个 HTTP 请求,但是对每个请求仍然要单独发 header,Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
长连接中的管线化
- 长连接时,默认的请求这样的:
请求1 --> 响应1 -->请求2 --> 响应2 --> 请求3 --> 响应3
- 长连接中的管线化,请求是这样的:
请求1 --> 请求2 --> 请求3 --> 响应1 --> 响应2 --> 响应3
管线化就是,我把现在的请求打包,一次性发过去,你也给我一次响应回来。