还不理解HTTP?一篇文章带你详细了解http。

352 阅读8分钟

http是什么

HTTP (HyperText Transfer Protocol),即超文本运输协议,是实现网络通信的一种规范。

在计算机和网络世界有,存在不同的协议,如广播协议、寻址协议、路由协议等等......。而HTTP是一个传输协议,即将数据由A传到B或将B传输到A,并且 A 与 B 之间能够存放很多第三方。传输的数据并不是计算机底层中的二进制包,而是完整的、有意义的数据,如HTML 文件, 图片文件, 查询结果等超文本,能够被上层应用识别。

在实际应用中,HTTP常被用于在Web浏览器和网站服务器之间传递信息,以明文方式发送内容,不提供任何方式的数据加密

特点如下:

  • 支持客户/服务器模式
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
  • 无状态:HTTP协议无法根据之前的状态进行本次的请求处理

经典五层模型

image.png

  1. 应用层:
    • 为应用软件提供很多服务,构建于协议之上。
  2. 传输层:
    • 数据的传输都是在这层定义的,数据过大分包,分片。
  3. 网络层:
    • 为数据在节点之间创建逻辑链路。
  4. 数据链路层:
    • 通信实体间建立链路连接。
  5. 物理层:
    • 主要作用是定义物理设备如何传输数据(光缆,网线)。

http发展历史

http 0.9:

  • 只要一个命令GET,没有header等描述数据的信息,服务器发送完毕就关闭tcp协议

http 1.0:

  • 增加了请求命令(GET,POST和HEAD)
  • status code
  • header
  • 多字符集支持
  • 权限
  • 缓存
  • 内容编码
  • 多部分发送

缺点:

http 1.0的主要缺点是,每个tcp连接只能发送一个请求,发送数据完毕后,连接就关闭,如果还要请求其他资源,就必须在新建一个连接。

TCP的连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢。所以http1.0版本性能比较差。随着网页加载的外部资源越来越多,这个问题就越来越突出。

为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。Connection:keep-alive,这个字段要求服务器不要关闭TCP连接,以便其他请求复用,服务器同样回应这个字段。一个可复用的TCP连接就建立了,直到客户端或服务端主动关闭连接。但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决方法。

http 1.1:

  • 增加了请求命令(OPTIONS,PUT,PATCH,DELETE,TRACE,CONNECT)
  • 持久连接
  • 增加host

缺点:

虽然1.1版本能复用TCP连接,但是同一个TCP连接里,所有的数据通信都是按次序进行的。服务器只有处理完一个回应,才能处理下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等候。这称为队头堵塞

为了避免这个问题,只有两种方法:

  1. 减少请求数
  2. 同时多开持久连接

这导致了很多网页优化技巧,比如合并脚本和样式表,将图片嵌入CSS代码,域名分片等等。如果http协议设计更好,这些额外的工作是可以避免的。

spdy协议:

  • 谷歌自行研发,主要用于解决http1.1效率不高的问题,被当作http2的基础,主要特性都被http2继承。

http2.0:

  • 二进制传输
  • 信道复用
  • 分帧传输
  • server push

http报文

  • 请求报文:
    • http请求组成:请求行、消息报头、请求正文
  • 响应报文
    • http响应组成:状态行、消息报头、响应正文

image.png

http请求方法

  • GET:请求获取Request-URL所标识的资源
  • POST:在Request-URL所标识的资源后附加新的数据
  • HEAD:请求由Request-URL所标识的资源的响应消息报头
  • PUT:请求服务器存储一个资源,并用Request-URL作为其标识
  • DELETE:请求服务器删除Request-URL所标识的资源
  • TRACE:请求服务器回送收到的请求信息,主要用于测试和诊断
  • CONNECT:HTTP1.1中预留能将连接改为管道方式的代理服务器
  • OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求

http状态码

状态码有三位数字组成,第一个数字定义的响应类型,且有5种可能取值。

  • 1xx:指示信息--表示消息已经接收,继续处理
  • 2xx:成功--表示请求已经接收、理解、接受
  • 3xx:重定向--要完成请求必须进行更进一步的操作
  • 4xx:客户端错误--请求有语法错误,或请求无法实现
  • 5xx:服务端错误--服务器未能实现合法的请求

HTTP常用的状态码

1xx

代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束

常见的有:

  • 100(客户端继续发送请求,这是临时响应):这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应
  • 101:服务器根据客户端的请求切换协议,主要用于websocket或http2升级

2xx

代表请求已成功被服务器接收、理解、并接受

常见的有:

  • 200(成功):请求已成功,请求所希望的响应头或数据体将随此响应返回
  • 201(已创建):请求成功并且服务器创建了新的资源
  • 202(已创建):服务器已经接收请求,但尚未处理
  • 203(非授权信息):服务器已成功处理请求,但返回的信息可能来自另一来源
  • 204(无内容):服务器成功处理请求,但没有返回任何内容
  • 205(重置内容):服务器成功处理请求,但没有返回任何内容
  • 206(部分内容):服务器成功处理了部分请求

3xx

表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向

常见的有:

  • 300(多种选择):针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择
  • 301(永久移动):请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置
  • 302(临时移动): 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
  • 303(查看其他位置):请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码
  • 305 (使用代理): 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理
  • 307 (临时重定向): 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求

4xx

代表了客户端看起来可能发生了错误,妨碍了服务器的处理

常见的有:

  • 400(错误请求): 服务器不理解请求的语法
  • 401(未授权): 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  • 403(禁止): 服务器拒绝请求
  • 404(未找到): 服务器找不到请求的网页
  • 405(方法禁用): 禁用请求中指定的方法
  • 406(不接受): 无法使用请求的内容特性响应请求的网页
  • 407(需要代理授权): 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理
  • 408(请求超时): 服务器等候请求时发生超时

5xx

表示服务器无法完成明显有效的请求。这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生

常见的有:

  • 500(服务器内部错误):服务器遇到错误,无法完成请求
  • 501(尚未实施):服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码
  • 502(错误网关): 服务器作为网关或代理,从上游服务器收到无效响应
  • 503(服务不可用): 服务器目前无法使用(由于超载或停机维护)
  • 504(网关超时): 服务器作为网关或代理,但是没有及时从上游服务器收到请求
  • 505(HTTP 版本不受支持): 服务器不支持请求中所用的 HTTP 协议版本