HTTP请求的发起和结束

HTTP请求

HTTP 目前的主流版本是1.X,它是一种无状态的协议。

  • 什么叫做无状态

    • 无状态是值Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应,连接就被关闭了,在服务端不保留连接的有关信息,即当一次连接结束后,并不能知道之前是谁连接了。
  • HTTP遵循请求(Request)/应答(Response)模型。

    • Web浏览器向Web服务器发送请求,Web服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。
  • 一次完整的HTTP请求过程
    • 1、对用户输入的域名进行DNS域名解析,得到对应的IP地址
      • DNS域名解析采用的递归查询的方式
        • 过程:先去找DNS缓存=>缓存找不到就去找根域名服务器=>根域名又回去找下一级
        • 详细过程:
          • 1、首先会搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且能容纳1000条缓存)
          • 2、如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的DNS缓存
          • 3、如果还没有找到,那么尝试从host文件里面查找
          • 4、若依旧没有找到,之后才是真正的递归查询
    • 2、根据这个IP地址,找到对应的服务器,发起TCP三次握手
    • 3、建立TCP连接后发起HTTP请求
      • 为什么HTTP协议要在TCP连接后才发起?
        • TCP是一个端到端的可靠的、面向连接的基于字节流的协议,HTTP基于传输层TCP协议不用担心数据传输的各种问题(超时重传、错误校验、流量控制)
    • 4、服务器响应HTTP请求,浏览器得到HTML代码
    • 5、浏览器解析HTML代码,并请求HTML代码中的资源(js、css图片等)
    • 6、浏览器对页面进行渲呈现给用户
      • 浏览器是如何对页面进行渲染的?
        • 1、解析HTML文件构成DOM树
        • 2、解析CSS文件构成渲染树
        • 3、边解析,边渲染
        • 4、JS单线程运行,JS有可能修改DOM结构
          • 意味着JS执行完成前,后续所有资源的下载是没有必要的,所以JS是单线程的,hi阻塞后续资源下载

HTTP通信机制

  • 1、建立TCP连接

    • 首先要通过网络与Web服务器建立连接,通过TCP协议来完成,HTTP协议比TCP协议层次更高,它在TCP/IP协议的应用层上,可以认为HTTP协议是比TCP协议更高层次的协议,只有TCP协议建立连接之后,才能进行HTTP协议的连接,所以,要先开启TCP连接。
  • 2、web客户端向目标服务器发出请求

  • 3、web客户端发送请求头信息

    • 浏览器发送它的请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器会发送一空白行通知服务器,它结束了请求头信息的发送
  • 4、目标服务器应答

    • 客户端向目标服务器发送请求后,服务端应该根据请求应答
  • 5、目标服务器发送响应头

  • 6、web服务器向浏览器发送数据

    • web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为止,然后,就会以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
  • 7、目标服务器关闭TCP连接

    • 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

      Connection:keep-alive

      TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP请求报文组成

  • 1、请求行
    • 请求行是由三部分组成的
      • 请求方式
      • 请求的资源路径
      • HTTP协议版本
  • 2、请求头
  • 3、空行
  • 4、请求体
GET请求报文
GET请求的请求报文没有请求体,只有请求行、请求头、空行组成
请求行举例,注意每项数据间都使用了\r\n
# 请求行
GET/HTTP/1.1:    		请求方式/请求资源路径/HTTO协议的版本
# 请求头
HOST:www.r5k.com			服务器的主机地址和端口号,默认为80
Connection:keep-alive		和服务器保持长连接
Upgrade-Insecure-Request:让浏览器升级不安全请求,使用https请求
User-Agent:				用户代理,也就是客户端的名称
Accept:						可接受的数据类型
Accept-Encoding:			可接受的压缩格式
Accept-Language:			可接受的语言
Cookie:					登录用户的身份标识

---空行---
POST请求报文
POST方式的请求报文可以有请求行、请求头、空行、请求体四部分(POST方式可以允许没有请求体,这是这种格式很少见)
  • POST请求报文,每行数据之间都用\r\n
---请求行----
POST /xmweb?host=&_t= HTTP/1.1:请求方式/请求资源路径/HTTP协议版本
---请求头---
HOST:			# 服务器的主机地址和端口号,默认是80
Connection:	 	 # 和服务器保持长连接
Content-Type:	# 告诉服务端请求的数据类型
User-Agent:		# 客户端的名称
---空行---
---请求体---
mobile=&age=:	# 请求参数
响应报文
--- 响应行/状态行 ---
HTTP/1.1 200 OK :# HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---
--- 响应体 ---
<!DOCTYPE html><html lang=“en”> …</html>:# 响应给客户端的数据
响应报文的组成
  • 1、响应行
    • HTTP协议 | 状态码 | 状态描述
  • 2、响应头
  • 3、空行
  • 4、响应体
常见的HTTP状态码

​ 200====>请求成功

​ 307====>重定向

​ 400====>错误的请求

​ 404====>请求资源在服务器不存在

​ 500====>服务器内部源代码出现错误

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值