# HTTP协议 # ——基本理解记录

一、 介绍

  1. HTTP协议是应用层协议,在互联网上广泛被使用,BS(browser浏览器-server服务端)结构通讯的基础协议。浏览器与服务端之间就是使用HTTP协议交互数据的,而HTTP协议要求必须建立在可靠的传输协议基础之上进行,所以底层的通讯协议通常使用TCP协议。

  2. HTTP协议规定了客户端(浏览器)与服务端之间传输的数据的格式及内容,并且也规定了两者之间的通讯方式。

  3. 在HTTP协议中要求的通讯方式为:一次请求一次响应。

  • 即:
    客户端主动连接服务端并发起请求(Request),服务端在收到请求后给予响应(Response)。
    服务端永远不会主动连接客户端,也不会主动发送任何响应。
  1. HTTP常见的两个版本:1.0和1.1,现在基本都是使用HTTP1.1。

    • 协议1.0与1.1协议有一个比较明显的改动:
      • 1.0协议在通讯时,客户端与服务端建立一次TCP连接后,发送一次请求,当服务端处理并给予响应后即断开连接。
      • 1.1协议则是在建立一次TCP连接后,可以经历多次请求与响应的过程后再断开连接。在当今互联网应用中,这样的做法可以减少不小的系统开销并提高响应效率。
  2. HTTP协议中所有字符信息所使用的字符集为:ISO8859-1,该字符集是一个欧洲编码集,里面不含有中文等字符信息。所以HTTP协议中的字符信息部分不得出现如中文这样的字符,一般只用字母,数字,符号。

二、内容

2.1 HTTP请求(Request)

一个请求应当包含三部分:请求行,消息头,消息正文
2.2.1 请求行:
  1. 请求行是由一行字符串组成的(以CRLF两个符号结尾表示一行结束)

  2. 格式:

    method  url  protocol(CRLF)
    
    method url protocol(CRLF)
    请求方式get/post 请求资源路径 协议版本(CRLF)
    • 例:

      GET    /index.html?a=1&b=2   HTTP/1.1(CRLF)
      //表示使用get方式进行请求,请求的资源是index.html,使用1.1协议版本(回车换行标记)
      
    • 注:
      - CR,LF是两个不可见符号,在ASC编码中对应的数字为13,10
      - CR:回车符 LF:换行符 用于解析时候做区分标记

  3. 请求方式method常见的有两种:

    • GET:地址栏请求,用户若传递数据则是直接拼在资源路径中(快而便捷,但由于明文传输不安全)
    • POST:将用户传递的数据包含在消息正文中传递(相对get略慢,但是相对更安全,传输密码之类加密信息可使用post)
  4. url后面可以加参数,通过?标记参数的开始,参数之间用&分隔

2.2.2 消息头
  1. 消息头是由若干行构成,每一行为一个消息头。

  2. 消息头是客户端通讯过程中传递给服务端的一些附加信息,比如有的用来告知服务端客户端的基本情况(浏览器内核,操作系统信息等),有的是用来维持通讯过程的必要信息,有的是用来说明是否含有消息正文以及正文内容及长度等等。

  3. 一个request中可以有很多个消息头以便传输多个数据

  4. 每个消息头的格式:

     name:value(CRLF)
    
    name value(CRLF)
    头的名字 值(CRLF)
  • 在最后一个消息头后面还会再单独跟一个CRLF,表示消息头部分结束

    • 例如:
      Host: localhost:8088(CRLF)
      Connection: keep-alive(CRLF)
      ……
      Accept-Language: zh-CN,zh;q=0.9(CRLF)(CRLF)
  • 消息正文

    • 一个请求中可以包含也可以不包含消息正文部分,消息正文是2进制数据。是用户提交给服务端的数据。具体消息正文有多少字节,这些字节表示的是什么类型的数据可以根据该请求中的两个消息头:Content-Type与Content-Length得知。
  • 一个请求的大致内容为:这里已经把(CRLF)省略因为实际上看不见

    GET /index.html HTTP/1.1
    Host: localhost:8088
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8
    

2.2 HTTP响应(Response)

  • 响应是服务端发送给客户端的内容,HTTP协议对应响应的格式有所规定。一个响应也有三个部分:状态行、响应头、响应正文。

  • 状态行:也是有一串字符串构成(CRLF结尾)

    • 格式:

      protocol status_code status_reason
      协议版本 状态码 状态描述
    • 状态码是由一个三位数组成,不同的状态码是用来告知客户端服务端对此请求的处理结果

      • 分5类:

        • 1xx:1.0协议视为保留部分,未启用
        • 2xx:成功
        • 3xx:重定向
        • 4xx:客户端错误
        • 5xx:服务端错误
      • 常见的状态码:
        200:请求处理成功,正常响应客户端
        302:要求客户端重定向到指定地址
        404:客户端请求错误,服务端无法处理该请求
        500:服务端处理请求时发生了错误

      • 状态代码与对应的描述:

        200    OK
        201    Created
        202    Accepted
        204    No Content
        
        301    Moved Permanently
        302    Moved Temporarily
        304    Not Modified
        
        400    Bad Request
        401    Unauthorized
        403    Forbidden
        404    Not Found
        
        500    Internal Server Error
        501    Not Implemented
        502    Bad Gateway
        503    Service Unavailable
        
  • 响应头

    • 响应头是服务端发送给客户端的附加信息。

    • 响应头的格式与请求中的消息头一样,由若干行组成,每行的

    • 格式:

      name value(CRLF)
      响应头名 值(CRLF)
    • 在最后一个响应头后面还会再单独跟一个CRLF,表示响应头部分发送完毕。

  • 响应正文

    • 响应正文也是2进制数据,是服务端响应客户端所请求的资源数据。这些数据可以是文本文件、二进制文件、文本数据等,正因为种类很多,所以统一使用二进制数据进行传输。
  • 一个响应大致内容如下:
    HTTP/1.1 200 OK(CRLF)
    Content-Type: text/html(CRLF)
    Content-Length: 3452(CRLF)(CRLF)
    10010110100101010100101001.......

三、web(http)服务器

  • 主要做的事情就是接受客户端请求,解析请求内容,根据请求内容寻找、处理资源,然后汇总信息创建响应最终给客户端返回包含各类资源的响应。
  • 他是一个运行在服务器端的软件
  • 常用的web服务器软件有:Tomcat、Apache-httpd、nginx。其中Tomcat是我们javaWeb常用的服务器,通过实战了解其内部原理——>Tomdog服务器——手动实现+从源头了解tomcat基本实现原理以及http协议

你可能感兴趣的:(# HTTP协议 # ——基本理解记录)