HTTP简介
HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)的应用层协议。
HTTP工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com。
2.发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据四个部分组成。
3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据四个部分组成。
4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html 文本解析加载其它资源显示内容;
注意
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。
但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,有新的请求,那么还是通过之前的连接通道来收发消息,如果户没有发送新的请求就会断开连接,这样可以提高效率,减少建立连接是耗时,默认的好像是3秒,但这个时间可以通过代码来调整,网站根据用户的行为来分析统计出一个最优的等待时长。
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。Content-Type
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。虽然是无状态协议,为了实现期望的保持状态功能, HTTP/1.1引入了Cookie技术。
面试题:TCP连接的三次握手与四次挥手
三次握手:
为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
四次挥手:
释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。
请求头与响应头
HTTP遵循请求(Request)/应答(Response)模型,Web浏览器向Web服务器发送请求时,Web服务器处理请求并返回适当的应答。
HTTP请求包括三部分,分别是请求行(请求方法)、请求头(消息报头)和请求正文。
HTTP请求第一行为请求行,由三部分组成,第一部分说明了该请求时POST请求,第二部分是一个路径,用来说明请求是该域名地址,第三部分说明使用的是HTTP1.1版本。
HTTP请求第二行至空白行为请求头(也被称为消息头)。
HTTP请求第三行为请求正文,请求正文是可选的,它最常出现在POST请求方式中。
HTTP响应的第一行为响应行,其中有HTTP版本(HTTP/1.1)、状态码(200)以及消息“OK”。
第二行至末尾的空白行为响应头,由服务器向客户端发送。
消息头之后是响应正文,是服务器向客户端发送的HTML数据。
常见请求头
- Accept 这个消息头用于告诉服务器客户端愿意接受那些内容,比如图像类,办公文档格式等等。
- Host 请求报头域主要用于指定被请求资源的Internet主机和端口。
- Cookie 是非常重要的请求头,常用来表示请求者的身份等。
- Referer 包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面。当前请求的原始URL地址。
- User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。
- …
常见响应头
- Content-Length 表示内容长度。
- Content-Type 表示后面的文档属于什么MIME类型。 Servlet默认为text/plain,但通常需要显式地指定为text/html。
- Date 当前的GMT时间。
- Expires 应该在什么时候认为文档已经过期,从而不再缓存它。
- Last-Modified 文档的最后改动时间。 客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。
- Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
- Set-Cookie 设置和页面关联的Cookie。
- …
面试题:缓存机制
缓存策略:强缓存,协商缓存。
面试题:Cookie,Localstorage和Sessionstorage
localStorage、sessionStorage、Cookie共同点:都是保存在浏览器端,且同源的。
Cookie 随请求携带存储信息。
localStorage、sessionStorage只是浏览器本地数据存储。
请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了五种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。 数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称, 向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作等。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
面试题:GET与POST区别
这个是浏览器厂商或服务器端对HTTP请求的封装,最终都是TCP数据包。
HTTP状态码
HTTP状态码的英文为HTTP Status Code。
五种状态码:
- 1xx:信息提示,表示请求已被成功接收,继续处理。
- 2xx:请求被成功提交。
- 3xx:客户端被重定向到其他资源。
- 4xx:客户端错误状态码,格式错误或者不存在资源。
- 5xx:描述服务器内部错误。
常见的状态码描述如下:
- 101:切换协议。http请求升级(Upgrade)为websoket。
- 200:客户端请求成功,是最常见的状态。
- 302:重定向。
- 400:客户端请求有语法错误,不能被服务器所理解。
- 401:请求未经授权。
- 403:服务器收到请求,但是拒绝提供服务。
- 404:请求资源不存在,是最常见的状态。
- 500:服务器内部错误,是最常见的状态。
- 503:服务器当前不能处理客户端的请求。
web服务程序
参考链接
https://www.cnblogs.com/an-wen/p/11180076.html
https://blog.csdn.net/qq_38265137/article/details/93379922
https://developer.mozilla.org/zh-CN/docs/Web/HTTP