HTTP协议相关


目录
  • 4.1 请求头
  • 4.2 Content-Type
  • 5.1 响应行:
  • 5.2 响应头
  • HTTP

    1. HTTP简介

    • HTTP协议(Hypertext transfer protocol)是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

    • HTTP协议作为TCP/IP模型中的应用层协议也不例外。HTTP协议通常承载与TCP协议之上,有时也承载与TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。

    • HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

      • 无状态:不会记录某个浏览器访问该网站的任何状态信息,服务器不知道客户端是什么状态

      • 无状态不代表不能保持TCP链接,从HTTP/1.1开始,都默认开启了keep-alive保持连接特性,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问该服务器,会继续使用这条已经建立的连接

        在 Tomcat 里是允许配置长连接的,配置 conf/server.xml 文件,配置 Connector 节点,该节点负责控制浏览器与 Tomcat 的连接,其中与长连接直接相关的有两个属性,它们分别是:keepAliveTimeout,它表示在 Connector 关闭连接前,Connector 为另外一个请求 Keep Alive 所等待的微妙数,默认值和 connectionTimeout 一样;另一个是 maxKeepAliveRequests,它表示 HTTP/1.0 Keep Alive 和 HTTP/1.1 Keep Alive / Pipeline 的最大请求数目,如果设置为 1,将会禁用掉 Keep Alive 和 Pipeline,如果设置为小于 0 的数,Keep Alive 的最大请求数将没有限制。也就是说在 Tomcat 里,默认长连接是打开的,当我们想关闭长连接时,只要将 maxKeepAliveRequests 设置为 1 就可以。

      • 解决无状态的方法:

        可以通过Cookie和Session来保存状态信息。
        Cookie和Session有以下明显的不同点:
        1)Cookie将状态保存在客户端,Session将状态保存在服务器端;
        2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
        3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
        4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。
        ————————————————
        版权声明:本文为CSDN博主「向小凯同学学习」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        原文链接:https://blog.csdn.net/wd2014610/article/details/78116791

    • HTTP默认的端口号:80,HTTPS默认的端口号:443

    • 浏览网页是HTTP的主要应用,但并不代表HTTP只能应用于网页的浏览。HTTP是一种协议,只要通信双方都遵守这个协议就可以进行通信

    2. HTTP特点

    • 简单快速:C2S只需发送请求方法(GET、POST...)和路径(http://localhost:8080/firstServlet),使HTTP服务器的程序规模更小,因而通信速度很快
    • 灵活:HTTP可以传任意类型的数据对象。正在传输的类型由Content-Type加以标记
    • (非)持续连接:
      • HTTP0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户的应答后即断开连接
      • HTTP1.1使用持续连接:不必为每一个web对象创建一个新的连接,一个链接可以传送多个对象,采用这种方式可以节省传输时间。允许HTTP设备在事务处理结束以后将TCP连接保持在打开状态,后面的HTTP Request/Response 依然可以通过这个TCP连接继续传送。(类似于SpringMVC中,只有一个Servlet的情况,客户端会一直访问这一个Servlet和端口)
        • 如果客户端不想在连接上发送其他请求了,就应该在最后一条请求中发送Connection:close请求首部
    • 管道化连接
      • 允许在持久连接上可选的使用请求管道。是相对于keep-alive连接的又一性能优化。在响应到达之前,可以将多条请求放入队列,当第一条请求通过网络流向服务器时,第二条和第三条请求也可以开始发送了。在高时延网络条件下,这样做可以降低网络的环回时间,提高性能。
        • 如果HTTP客户端不能确定连接持久,就不该使用管道
        • 必须按照与请求相同的顺寻回送HTTP响应
        • HTTP客户端必须做好连接会在任意时刻关闭的准备,还要准备好重发所有未完成管道化的请求
        • 出错的时候,管道连接会阻碍客户端去了解服务器执行的是这些管道化中的哪些请求。由于无法安全的重试POST这样非幂等请求,所以要做好万一出错,某些方法就永远不会被执行的风险。
    • 支持B/S,C/S以及APP模式

    3. HTTP版本

    • HTTP/1.0
      • 发送请求,创建一次连接,获得一个web资源,连接断开
    • HTTP/1.1
      • 发送请求,创建一次连接,获得多个web资源,连接断开
    • http请求包括:请求行、请求头、请求体
    • http响应包括:相应行、响应头、响应体

    4. HTTP请求报文

    4.1 请求头

    • referer:它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。

      • 比如在网页中的a标签链接访问,会有referer这个属性,如果是浏览器直接输入的地址,这个值将为null,因为他并没有包含在某一个网站中

      • 常用于防盗链:比如图片服务器可以通过这个判断来访问我图片的是不是规定的网站,如果不是将会跳转到特定的网站来访问或者拦截。

    • Accept:该请求所能支持的响应数据类型,MIME类型

    • Cookie:客户端的Cookie就是通过这个报文头属性传给服务端的

    • User-Agent:浏览器与用户操作系统信息

    • Connection:表示客户端与服务器连接类型:keep-alive持久连接,close已关闭

    • Host:请求的服务器主机名

    • Content-Length:请求体的长度

    • Content-Type:请求与尸体对应的MIME信息。如果是post请求,会有这个头,默认为application/x-www-form-urlencoded,表示请求体内容使用URL编码

    • Accept-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如gzip

    • Accept-Language:浏览器通知服务器,浏览器支持的语言

    • Cache-Control:指定请求和响应遵循的缓存机制

    更多参见:http://tools.jb51.net/table/http_header

    4.2 Content-Type

    Content-Type 解释
    text/html html格式
    text/plain 纯文本格式
    text/css CSS格式
    text/javascript js格式
    image/gif gif图片格式
    image/jpeg jpg图片格式
    image/png png图片格式
    application/x-www-form-
    urlencoded
    POST专用:普通的表单提交默认是通过这种方式。form表单数据被编码为
    key/value格式发送到服务器
    application/json POST专用:用来告诉服务端消息主体是序列化后的JSON字符串
    text/xml POST专用:发送xml数据
    multipart/form-data POST专用:

    5. HTTP响应报文

    5.1 响应行:

    报文协议及版本

    • 例如:HTTP/1.1 200 OK
      • 状态码:由3位数字组成,第一个数字定义了响应的类别
        • 1xx:指示信息,表示请求已接收,继续处理
        • 2xx:成功,表示请求已被成功接收,处理
          • 200 OK:客户端请求成功
          • 204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面
          • 206 Partial Content:服务器已完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容
        • 3xx:重定向
          • 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置
          • 302 Found:临时重定向,表示请求的资源临时搬到了其他位置
          • 303 See Other:临时重定向,应使用Get定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用Get访问
          • 307 Temporary Redirect:临时重定向,与302功能一样,但POST不会变成GET
          • 304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF..)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3xx,但是和重定向没关系。
        • 4xx:客户端错误
          • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
          • 401 Unauthorized:请求未经授权,这个状态码必须个WWW-Authenticate报头域一起使用
          • 403 Forbidden:服务器收到请求,但是拒绝提供服务
          • 404 Not Found:请求资源不存在,错误的路径、url
          • 415 Unsupported Media Type:不支持的媒体类型
        • 5xx:服务器端错误
          • 500 Internal Server Error:服务器发生不可预期的错误
          • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
    • 更多状态码:https://blog.csdn.net/origination_star/article/details/54341293

    5.2 响应头

    响应头也是用键值对key:value

    服务器通过响应头来控制浏览器的行为,不同浏览器操作不同

    常见响应头 描述
    Location 指定响应的路径,需要与状态码302配合使用,完成跳转
    Content-Type 响应正文的类型(MIME类型)
    取值:text/html;charset=UTF-8
    Content-Disposition 通过浏览器以下载方式解析正文
    取值:attachment;filename=xx.zip
    Set-Cookie 与会话相关技术。服务器向浏览器写入cookie
    Content-Encoding 服务器使用的压缩格式
    取值:gzip
    Content-length 响应正文的长度
    Refresh 定时刷新。格式:秒数;url=路径。url可省略,默认值为当前页
    取值:3;url=localhost:8000/multipart/menus
    Server 指的是服务器名称,默认值:Apache-Coyote/1.1。可以通过conf/server.xml配置进行修改
    Last-Modified 服务器通知浏览器,文件的最后修改时间。与If-Modified-Since一起使用
    Cache-Control 响应输出到客户端后,服务端通过该报文头告诉客户端如何控制响应内容的缓存。
    常见的取值有private、public、no-cache、max-age、no-store,默认为private:365天