HTTP 协议通常承载于 TCP 协议之上,有时也承载于 TLS 或 SSL 协议层之上,这个时候,就成了 HTTPS。HTTP 默认的端口号为 80,HTTPS 的端口号为 443。
特点
- 客户端发起,服务端响应。
- 支持客户/服务器模式。支持基本认证和安全认证。
- 数据类型 Content-Type 灵活
- 无状态协议,前后的建立的连接可以认为基本独立
HTTP 0.9 和 1.0 使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1 使用持续连接:不必为每个 web 对象创建一个新的连接,一个连接可以传送多个对象。
HTTP 协议是无状态的和 Connection: keep-alive 的区别:
- 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态
- HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议(无连接)
- 从 HTTP/1.1 起,默认都开启了 Keep-Alive,CS 之间的 TCP 连接不会关闭,再次访问服务器上的网页,会默认采用之前的连接,省去了每次建立连接握手的过程
- Keep-Alive 不会永久保持,服务器上可以设置
而无状态协议:
- 协议的状态是指下一次传输可以“记住”这次传输信息的能力。
- http 是不会为了下一次连接而维护这次连接所传输的信息,为了保证服务器内存。比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登陆该网站,但是服务器并不知道客户关闭了一次浏览器。
- 由于 Web 服务器要面对很多浏览器的并发访问,为了提高 Web 服务器对并发访问的处理能力,在设计 HTTP 协议时规定 Web 服务器发送 HTTP 应答报文和文档时,不保存发出请求的 Web 浏览器进程的任何状态信息。这有可能出现一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二期服务请求。由于 Web 服务器不保存发送请求的 Web 浏览器进程的任何信息,因此 HTTP 协议属于无状态协议(Stateless Protocol)。
总的来说,就是 keep-alive
只是保持 TCP 连接,而无状态是指每次连接中发送的请求所包含的数据和状态是独立的,无记忆的。
请求方法
- OPTIONS - 返回服务器针对特定资源所支持的 HTTP 请求方法。也可以利用向 Web 服务器发送'*'的请求来测试服务器的功能性。
- HEAD- 向服务器索要与 GET 请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
- GET - 向特定的资源发出请求。注意:GET 方法不应当被用于产生“副作用”的操作中,例如在 web app.中。其中一个原因是 GET 可能会被网络蜘蛛等随意访问。
- POST - 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT - 向指定资源位置上传其最新内容。
- DELETE - 请求服务器删除 Request-URI 所标识的资源。
TRACE- 回显服务器收到的请求,主要用于测试或诊断。 - CONNECT - HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
- PATCH - 用来将局部修改应用于某一资源,添加于规范 RFC5789。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码 405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码 501(Not Implemented)
一般 GET/POST
是用的最多的,也经常会用到 PUT/DELETE
,用来明确的区分方法的意图。
get 和 post 的区别
1、GET 提交的数据会放在 URL 之后,以?分割 URL 和传输数据,参数之间以&相连,如 EditPosts.aspx?name=test1&id=123456. POST 方法是把提交的数据放在 HTTP 包的 Body 中。
2、GET 提交的数据大小有限制,最多只能有 1024 字节(因为浏览器对 URL 的长度有限制),而 POST 方法提交的数据没有限制。
3、GET 方式需要使用 Request.QueryString 来取得变量的值,而 POST 方式通过 Request.Form 来获取变量的值。
4、GET 方式提交数据,会带来安全问题,比如一个登录页面,通过 GET 方式提交数据时,用户名和密码将出现在 URL 上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
以上区别基本上都是需要注意的地方
解决 HTTP 无状态的问题
- 通过 Cookies 保存状态信息
- 通过 Session 保存状态信息
a.这里区分用 cookie 来保存 sessionID 的方式
b.及用 url 来保存 sessionID
认证方式
- 基本认证:用户名和密码来进行认证
- HTTP OAuth 认证:采用 token 进行认证
HTTPS
这部分后面再开一篇来介绍吧。内容详细些会比较多。写的简略也理解不清楚。
关于响应头的字段信息,以及其他具体一些的内容,参考 这里
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于