HTTP协议详解
简介
HTTP:超文本传输协议(HyperText transfer Prototcol),是一种用于分布式,协作式和超媒体信息系统的应用层协议。HTTP是万维网数据通信的基础。
它是从web服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。用户通过网页浏览器或其他终端,发送一个HTTP请求到服务器上的指定端口。终端为用户代理程序(user agent),存储资源的应答服务器为源服务器。终端和原服务器之间可能存在多个中间层,如代理服务器、网关等
原理
HTTP基于TCP/IP通信协议来传递数据,定义了web客户端如何向web服务器发送请求,以及web服务器如何应答这次请求。也是一种请求/响应模式的协议。
Http请求/响应的步骤:
- 客户端连接到web服务器,以访问百度为例:www.baidu.com DNS域名解析为服务器的ip。
- 客户端发起TCP请求,通过3次握手建立连接。
- 发送HTTP请求,通过TCP连接,客户端发送一个请求报文给服务端,请求报文有三部分组成:
- 请求行:包括请求方法,URL,协议/版本
- 请求头
- 请求体(请求正文)
- 服务器响应HTTP请求,服务器根据请求数据定位到资源,通过TCP资源返回响应报文,一个响应报文有三分组成:
- 状态行: 如 状态码 200
- 响应头:如 Date、Content-type, 浏览器会根据响应头来解析响应体。
- 响应体:浏览器解析的数据
- 终端(浏览器)根据响应报文来解析响应体,渲染成页面,提供给用户浏览
特点
- 是一种基于请求/响应模式的协议。
- 无状态:协议对于请求和响应不会进行保存,每一次获取数据都要重新发送一次请求
- 无连接:每次连接只处理一个请求,服务器处理完请求并作出响应后,即断开连接。
- 灵活:HTTP可以传输任意协议的数据对象,传输类型由Content-type标记
常见的请求方法
- GET:请求指定的信息,GET请求应该只用在读取数据,而不应该用于产生副作用的操作中
- POST:想指定资源提交数据进行处理,数据包含在请求体中,POST请求可能会导致资源被修改
- HEAD:类似GET方法,常用于获取资源的源信息
- PUT:向资源提交数据,常用于修改资源
- DELETE:请求服务器删除指定的资源
响应状态码
浏览器向web服务器发送请求时,服务器在响应报文中会包含一个包含HTTP状态码(status code):
状态码分类:
- 1XX:信息状态码,接受的请求正在处理
- 2XX:成功状态码,请求正常处理完毕
- 3XX:重定向状态码,需要进行附加操作以完成请求
- 4XX:客户端错误状态码,服务器无法处理客户端的请求
- 5XX:服务器错误状态码,服务器处理请求出错
常见的状态码:
- 200:客服端请求成功
- 301:请求资源被永久转移到其他URL
- 302:临时跳转
- 400:Bad Request,客户端请求语法有错误,服务器不能处理
- 401:Unauthorized,请求未授权
- 403:Forbidden,Web客户端发送的请求被Web服务器拒绝(常见的就是跨域问题)
- 404:请求的资源不存在
- 405: Method Not Allowed,请求的方法错误
- 500:服务器内部错误
其他知识点
在浏览器地址栏输入URL,按下回车后的流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
- 解析出IP地址后,根据IP地址和端口号,和服务器建立TCP连接
- 浏览器发出请求文件的HTTP请求,改请求作为TCP三次握手的第三次报文的数据发送给服务器
- 服务器对浏览器的请求作出响应,并把对应的html文件发送给浏览器
- 释放TCP连接
- 浏览器对HTML进行解析并进行渲染
TCP三次握手
- 建立连接时,客户端发送syn包(syn=x)到服务器,并进入syn_sent状态,等待服务器确认。syn:同步序列编号
- 服务器收到syn包,必须确认客户的syn(ack=x+1),同时自己也发送一个syn包(syn=y),即syn+ack包,服务器进入syn_recv状态
- 客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack=y+1),此包发送完毕,服务端和客户端进入连接成功状态(established),完成三次握手。