HTTP协议

http协议介绍

http协议叫超文本传输协议,是因特网上应用最为广泛的一种网络传输协议。http协议是应用层的协议,由http请求和http应答构成。其在传输层使用TCP协议、在网络层使用IP协议。https协议是http协议的加密版本;http默认的端口是80,https默认的端口是443。

http协议通信流程

一次http工作过程大概如下:

  1. 用户在浏览器输入一个想要访问的网页的URL。
  2. 浏览器根据输入的URL中的域名,通过DNS域名解析协议解析出目标IP地址。
  3. 客户端先通过TCP/IP协议和服务端建立三次握手连接。
  4. 连接建立后,客户端发送一个http请求报文给服务端。请求报文分为请求首行、请求头部、空行(\r\n)、请求正文。
  5. 服务端接收到请求后,会向客户端发送一个http响应报文。同样响应报文分为响应首行、响应头部、空行(\r\n)、响应正文。
    在这里插入图片描述

比如在浏览器输入www.baidu.com,大致会经历以下过程:

  1. 浏览器先通过DNS解析出域名对应的IP地址。
  2. 然后浏览器与对应IP地址、端口为80的服务端主机进行TCP连接。
  3. 连接建立后客户端浏览器使用http协议向服务端发送http请求,请求百度首页。
  4. 服务端收到请求后发送http响应数据报文到客户端。
  5. 服务端发送完最后一条数据后断开TCP连接。(长连接情况下)
  6. 浏览器通过解析响应报文里的信息比如图片、html文本等将内容渲染成页面呈现给用户。

http协议格式

请求报文格式

请求格式分为请求首行、请求头部、空行(\r\n)、请求正文。

  1. 请求首行
    请求首行里有:请求方法、url、协议版本、\r\n。
    1.请求方法有GET方法和POST方法:

    1. GET:从服务器上面获取一个资源。GET并不是只能向服务器获取资源,也可以查询字符串当中提交数据到浏览器中。GET请求提交的数据都是在url中的。
    2. POST:向服务器提交数据。POST相比于GET最本质的区别是POST提交数据是在正文而不是url中。所以POST相比GET较为私密一点。
  2. 请求头部
    请求头部具有多行数据,每行数据都是一个key:value的形式,并且每一行之间使用 \r\n 进行分隔。请求头部与下面的正文部分也是用 \r\n 进行分隔。请求头部字段大概包括:

    1. Content-Length:正文长度,防止粘包。
    2. Content-Type:正文的编码格式。
      text/html:HTML格式
      text/plain:纯文本格式
      text/png:png图片格式
      application/json:json数据格式
      application/msword:word格式
    3. referer:标识当前的页面是从哪一个页面跳转过来的。
    4. Cookie:向服务器提交浏览器本地保存的认证信息,认证信息是之前登录浏览器的时候,服务器返回回来的。
    5. Tranfer-Encoding:针对于正文而言,可以支持分块传输。
    6. Location:和重定向搭配使用,http服务器会告诉浏览器刚刚请求的页面应该去哪一个地址上面重新申请。
    7. User-Agent:声明操作系统和浏览器版本信息。
    8. Connection:keep-alive 保持长连接。
  3. 请求正文
    请求正文即就是浏览器具体要请求的信息。

响应报文格式

响应格式分为响应首行、响应头部、空行(\r\n)、响应正文。

  1. 响应首行
    响应首行里有协议版本、状态码、状态码解释、\r\n。
    状态码:
    a. 1XX:接收到请求正在处理。
    b. 2XX:请求正常处理完毕。 eg:200 OK
    c. 3XX:重定向状态,表示浏览器需要进行附加操作。 eg:302 临时重定向
    d. 4XX:服务器无法处理这个请求。 eg:404 Page Not Found
    e. 5XX:服务器处理出错。 eg:502 Bad Gateway
  2. 响应头部:也是具有多行数据,每行数据都是key:value的形式,行与行之间使用\r\n进行分隔;响应头部的字段也是和请求头部大同小异。
  3. 响应正文
    响应正文即就是服务端具体返回给浏览器的信息。

http中重定向和请求转发

总的来说,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

  1. 转发过程:客户浏览器发送http请求 ➡ web服务器接受此请求 ➡ 调用内部的一个方法在容器内部完成请求处理和转发动作 ➡ 将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
  2. 重定向过程:客户浏览器发送http请求 ➡ web服务器接受后发送302状态码响应及对应新的location给客户浏览器 ➡ 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址 ➡ 服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

通俗来说:

  1. 重定向,其实是两次request,第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
  2. 请求转发是服务器内部把对一个request/response的处理权,移交给另外一个
    对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。

参考:https://blog.csdn.net/cai784921129/article/details/80177753

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值