HTTP协议介绍
HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。HTTP协议是一种无状态的协议,这样保证了它高效的传输信息效率,但是因为它是无状态协议,在许多场景中,需要借助其他技术来辅助它完成一些其他功能。
HTTP详细请求过程
-
建立TCP连接:当用户在浏览器中输入一个URL并按下回车键时,浏览器首先会检查自身的DNS缓存以及操作系统的DNS缓存,看是否有该URL对应的IP地址。如果没有,浏览器会向DNS服务器发起一个DNS解析请求,将域名解析为对应的IP地址。然后,浏览器会尝试与服务器建立TCP连接,这通常通过TCP三次握手完成。
-
Web浏览器向Web服务器发送请求命令:一旦TCP连接建立成功,Web浏览器会向Web服务器发送一个HTTP请求。这个请求包含了请求方法(如GET或POST),请求的URL,以及请求头部信息。请求头部信息可以包含客户端的环境信息、身份验证信息等。
-
Web服务器应答:Web服务器在接收到请求后,会处理该请求并生成一个HTTP响应。响应的第一部分包括状态码,用来指示请求是否成功以及其他相关信息。
-
Web服务器发送应答头信息和数据:在状态码之后,Web服务器会发送应答头信息,这些信息可以包含服务器类型、日期时间、内容类型和长度等。接着,服务器会发送请求的正文数据,这些数据可能是HTML、JSON或其他格式的内容。
-
浏览器解析和渲染页面:浏览器在接收到响应后,会解析HTML标签,并加载和解析其中的JavaScript和CSS等资源。然后,浏览器会根据这些资源对页面进行渲染,最终在用户的屏幕上显示出请求的网页。
-
断开连接:在数据传输完成后,浏览器和服务器会进行TCP四次挥手来断开连接,释放网络资源。
需要注意的是,HTTP/1.1版本中引入了持久连接(persistent connection)的概念,也称为keep-alive连接。在这种连接中,多个请求和响应可以在同一个TCP连接上依次进行,不需要为每个请求都建立新的连接。这可以显著提高网络传输的效率。
HTTP请求响应模型
HTTP是一种经典的C/S模型(客户端服务器模型),HTTP协议永远都是客户端向服务端发送请求,服务器回复。
HTTP响应码
- 1XX类状态码信息表示:临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1XX响应
- 2XX类状态码信息表示:服务器成功的接收了客户端请求
- 3XX类状态码信息表示:客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同页面,或者通过代理服务器重复该请求
- 4XX类状态码信息表示:发生错误,客户端似乎有问题。一般跟网络的资源丢失相关,或者拒绝你的访问。
- 5XX类状态码信息表示:服务器遇到错误而不能完成该请求
HTTP报文格式
请求/响应报文格式主要分成三部分:请求行,头部信息,空行,正文。
常见头部字段
- 通用首部字段:这些字段在请求报文和响应报文中都会使用。例如:
- Cache-Control:用于控制缓存的行为,如设置缓存的最大有效时间、禁止缓存等。
- Connection:用于控制是否保持连接,常见的值有keep-alive和close。
- Date:表示消息创建的日期和时间。
- Transfer-Encoding:指定报文主体的传输编码方式。
- 请求首部字段:这些字段主要在请求报文中使用。例如:
- Host:表示请求资源所在服务器的域名或IP地址。
- Accept:告知服务器客户端可以处理哪些媒体类型,如text/html、application/xml等。
- Accept-Encoding:告诉服务器客户端支持的压缩格式,如gzip、deflate等。
- Accept-Language:告诉服务器客户端支持的自然语言,如zh-CN、en-US等。
- User-Agent:包含发出请求的用户代理的信息,通常包括浏览器类型、版本和操作系统等。
- Referer:指示请求源自哪个页面,常用于分析用户行为、防止恶意请求等。
- 响应首部字段:这些字段主要在响应报文中使用。例如:
- Server:包含服务器的软件信息,如服务器名称、版本等。
- Location:用于重定向,告诉客户端应该访问的新URL地址。
- Allow:告诉客户端资源支持哪些HTTP请求方法,如GET、POST等。
- 实体首部字段:这些字段与请求报文和响应报文的实体部分相关。例如:
- Content-Length:表示实体主体的长度,即请求或响应正文的字节数。
- Content-Type:表示实体主体的媒体类型,如text/html、application/json等。