zoukankan      html  css  js  c++  java
  • HTTP协议概述

    HTTP协议概述

    URI(Uniform Resource Identifier)

    用来标识网络上特定的服务器资源,URI有两种形式,分别为URL和URN:

    URL(Uniform Resource Locator)

    URL是目前被最广泛使用的一种形式,URL描述了一台特定服务器上某资源的特定位置。这里的资源可以只一个文件,页面,图片等。

    标准URL格式定义如下:

    <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
    scheme 使用的协议(例如http(s), ftp, rtsp) URI.Scheme
    user 某些协议需要的用户名(例如ftp协议) URI.UserInfo
    password 用户名所对应的密码 URI.UserInfo
    host 服务器的主机名或者IP地址 URI.Host
    port 服务器监听端口号(http默认为80,https默认为443) URI.Port
    path 服务器上资源的本地名,也称相对路径 URI.AbsolutePath
    params 某些协议的输入参数,如包含多个用;分隔 URI.AbsolutePath
    query 某些协议的查询参数,http协议一般用&分隔多个参数 URI.Query
    frag

    某页面内部特定资源的引用,一般用来指定特定段落。

    用于客户端使用,服务器端会忽略这个字段

    URI.Fargment

    常见协议URL:

    http://cnblogs.com/qlluo/default.html#URL

    ftp://qlluo:psd@ftp.cnblogs.com/resource/info.txt

    协议标准请参考:rfc1738

    URN(Uniform Resource Name)

    URN与URL的最大区别在于,URN无需指定资源的具体位置,她标识网络上某一特定内容。该协议比较超前,目前几乎没有被使用,这里不做具体介绍。

    HTTP报文

    上图描述了最常见的HTTP报文流向,由客户端发往服务器端的报文称为请求(request)报文,由服务器会发给客户端的报文称为相应(response)报文。

    习惯上定义报文的流向为从上游(upstream)流向下游(downstream),在讲到代理服务器时会使用该术语。

    ps: 客户端和服务器端没有绝对严谨的定义,一般称主动发送请求的一方为客户端,监听某一特定端口等待连接的一方为服务器端。

    请求(Request)

     HTTP请求报文由起始行,首部,实体主体三部分组成:

    <method> <request-URL> <version>         //起始行
    <headers>                                //首部
    
    <entity-body>                            //实体主体

    起始行

    起始行包括方法,请求URL和版本号三部分:

    1. 方法:表示客户端希望服务器执行的操作类型,常见的有GET, POST, DELETE等。

    2. 请求URL:表示客户端需要请求的资源,一般为绝对URL。

    3. 版本号:表示报文使用的HTTP版本,格式为HTTP/<major>.<minor>,当前主流版本为HTTP/1.1

    GET http://www.cnblogs.com/ HTTP/1.1

    首部

    首部包括一些特定的键值对,对请求报文的一些属性做解释。

    首部有零行或多行组成,每行之间使用CRLF( )分隔。每行由冒号分隔名字和值,冒号后面可以跟一个可选的空格。

    首部是由一个空行结束的。

    Content-Type: text/plain
    Content-Length: 50

    HTTP协议预定义了很多首部,用于实现协议的基础和扩展功能。一般来讲,有效的HTTP请求报文都会包含多个首部。

    实体主体

    实体主体可以包含一个由任意文本数据块,对于某些特定的方法(GET, HEAD)也可能不包含实体主体。

    实体主体的格式由上层协议决定,并受Content-Type, Content-Length, Content-Encoding约束。

    下面是一个访问园子首页的请求报文,其中忽略掉了一些不常见的首部。

    GET http://www.cnblogs.com/ HTTP/1.1
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 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: en-US,en;q=0.8

    相应(Response)

     HTTP相应报文由起始行,首部,实体主体三部分组成:

    <version> <status> <reason-phrase>
    <headers>
    <entity-body>

    起始行

    起始行包括版本号,状态码和原因短语三部分组成:

    1. 版本号:表示报文使用的HTTP版本,格式为HTTP/<major>.<minor>,当前主流版本为HTTP/1.1,与请求报文的版本号格式一致。

    2. 状态码:用一个三位数字描述相应报文的状态(成功,出错等),下表简述了状态码的分类,后续会逐个介绍常见的状态码。

    状态码范围 预定义范围 分类 解释
    100-199 100-101 信息提示  
    200-299 200-206 成功 最常见的成功状态码是200,表示请求成功
    300-399 300-307 重定向

    一般配合一个Location首部使用,表示资源被永久或暂时移动到了Location指定的URL处。

    常见的重定向状态码有301,304,307

    400-499 400-417 客户端错误

    表示客户端向服务器发送的请求有错误。

    常见的有400(Bad Request), 401(Unauthorized), 403(Forbidden), 404(Not Found)

    500-599 500-505 服务器端错误

    表示服务器端在处理请求的过程中发生错误。

    常见的有500(Internal Server Error), 503(Services Unavailable)

    3. 原因短语:描述#2中状态码的一句短语,起解释作用,是状态码的可读版本。

    HTTP/1.1 200 OK

    首部

    格式与HTTP请求报文的首部一致,但包含的首部内容不同

    实体主体

    格式与HTTP请求报文的实体主体一致,用来承载响应的内容。

    常见的响应实体主体包括:页面,js,css,图片,文件,json或xml文本等。

    下面是访问园子首页的响应报文,其中省略掉了大部分实体主体内容。

    HTTP/1.1 200 OK
    Content-Type: text/html; charset=utf-8
    Connection: keep-alive
    Last-Modified: Wed, 25 Jan 2017 05:06:04 GMT
    Content-Length: 45005
    
    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>博客园 - 开发者的网上家园</title>
    ...
    </html>

    本文主要介绍了HTTP协议最基本,最常用的协议和报文部分。续集会深入介绍HTTP的首部,状态码,连接机制,代理,缓存以及认证相关的内容。

  • 相关阅读:
    java中级或者高级面试题分享
    java常使用的框架
    spring的定时器
    ArrayList源码理解
    缓存 Memached
    ORM框架
    Web处理方式
    git使用
    Entity Framework
    .net 学习笔记2
  • 原文地址:https://www.cnblogs.com/qlluo/p/6341370.html
Copyright © 2011-2022 走看看