zoukankan      html  css  js  c++  java
  • HTTP协议学习随笔

    简介

    HTTP(Hyper Text Transfer Protocol),超文本传输协议,是一种建立在TCP上的无状态连接。一次完整的传输过程的基本流程如下:

    1. 客户端向服务端发送一个HTTP请求,说明客户端想访问的资源及操作
    2. 服务端接受到请求,根据请求进行相应的操作
    3. 服务端向客户端发送一个HTTP响应,把响应结果返回给客户端

    一个请求的开始到一个响应的结束称为一个事务,。当一个事务结束后,服务端需要添加一条相应的日志记录。

       

    HTTP请求

    HTTP请求是客户端向服务端发送的报文 ,告知服务站自己的需求。

    HTTP请求的报文分为三部分:

    状态行

    包含3部分:请求方式(Method)、资源路径(URL)、协议版本(Version)

    请求头

    包含关于请求的细节信息

    请求正文

    对请求操作的进一步补充,通常为空

    举个例子,使用Charles抓包工具抓包的结果:

       

    HTTP请求报文的格式入下图:

    每个部分使用r 分隔,其中状态行的三个部分使用空格分隔。请求正文请求头间,又一组 分隔

       

    状态行的Method部分,在HTTP 1.0定义了三种方式:GETPOST、HEAD。在HTTP 1.1又新增了五种方式:OPTIONS、PUT、DELETE、TRACE、CONNECT。最常用的为GET和POST。详细可以参考《HTTP请求方法对照表》。

    状态行的URL部分,只保存分级路径部分,不保存服务器名。

    状态行的Version部分,保存HTTP协议版本,目前主流是HTTP/1.1。

       

    请求头部分,有多组头域组成,每个头域由一个域名,冒号(:)和域值三部分组成。下文《HTTP头域》小结会详细描述。

       

    HTTP请求报文的主体部分,通常不使用。

       

    HTTP响应

    服务端接受客户端的HTTP请求后,服务端会根据请求完成具体操作,之后将结果通过HTTP响应,返回给客户端。

    HTTP响应的报文分也为三部分:

    状态行

    包含3部分:版本(Version)、状态码(Status-Code)、短语(Phrase)

    响应头

    包含关于响应结果的细节信息

    响应正文

    请求的结果

    举个例子,使用Charles抓包工具抓包的结果:

       

    HTTP响应的报文格式如下:

    结构与HTTP请求的报文格式基本相同。

       

    状态行的Version部分,保存HTTP协议版本。

    状态行的Status-code部分,为一个3位数的整数,表示对请求的处理状态,常见的状态码有:

    • 200 - 请求成功
    • 301 - 资源(网页等)被永久转移到其它URL
    • 404 - 请求的资源(网页等)不存在
    • 500 - 内部服务器错误

    状态码的第一个数字,定义的状态码的类型,状态码共分为5类:

    1xx        

    表示HTTP请求已经接受,继续处理请求

    2xx        

    表示HTTP请求已经处理完成

    3xx        

    表示把请求访问的URL重定向到其他目录

    4xx        

    表示客户端出现错误

    5xx        

    表示服务端出现错误

    状态行的Phrase部分,是对状态码的简单描述。

    对状态码的详细描述,可以参考《HTTP状态码对照表》。

       

    响应头部分与请求头部分相同,同样有头域组成,是对响应结果的描述。通常会包含Content-Type头域,描述返回内容的MIME类型。HTTP协议支持的MIME类型可以参考《HTTP Content-type 对照表

       

    响应正文就服务端向客户端返回的内容,可以是文本、图片、音频等各种类型的二进制数据,类型由响应头的Content-Type头域描述。

       

    HTTP头域

    HTTP请求头(响应头)提供了关于请求,响应或者其他的发送实体的信息。HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。

    • 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
    • 请求头标:允许客户端传递关于自身的信息和希望的响应形式。
    • 响应头标:服务器和于传递自身信息的响应。
    • 实体头标:定义被传送资源的信息。即可用于请求,也可用于响应。

       

    常用的有:

    • Accept,指定客户端能够接受的内容格式
    • User-Agent,用户代理,向服务器说明自己的操作系统、浏览器等信息
    • Connection,是否开启持久连接
    • Host,服务器域名
    • Content-Type,返回内容的MIME类型

    其他跟多的请求头头域,可以参考《HTTP Request Header》、《HTTP头信息总结

       

    HTTP版本

    HTTP发展至今,经历的多个版本的更替,虽然已经提出了HTTP/2.0版本,但目前主流依然是HTTP/1.1版本

    HTTP/0.9

    仅支持GET方法,仅能访问HTML格式的资源

    HTTP/1.0

    添加了POST和HEAD方法;

    可以根据Content-Type,传输多种MIME类型的资源;

    支持cache。

    HTTP/1.1

    添加了OPTIONS, PUT, DELETE, TRACE 和 CONNECT方法;

    加入了持久连接(keepalive),一个TCP连接可以允许多个HTTP请求;

    加入了管道机制,一个TCP连接同时允许多个请求同时发送。

    HTTP/2.0

    增加双工模式;

    使用索引号访问头域信息,并以压缩的方式传输。

       

    进阶

    想深入学习HTTP协议,可以参考以下两本书籍:

    《图解HTTP》

    《HTTP权威指南》

       

    参考

    http://blog.51cto.com/13570193/2108347

       

       

  • 相关阅读:
    JSK42586.Tree(动态开点线段树+树上启发式合并)
    CF1188B.Count Pairsl(数学)
    2021ICPC亚洲区域赛(昆明)复盘
    1009F.Dominant Indices (树上启发式合并)
    246E.Bloods Counsin Return(离线+树上启发式合并)
    208E.Blood Cousins(离线+倍增LCA+树上启发式合并)
    208E.Blood Cousins (离线+树上启发式合并)
    570D.Tree Requests (离线+树上启发式合并)
    Java从入门到实战之(6)SSM框架使用
    Java从入门到实战之(5)Java集合对比汇总
  • 原文地址:https://www.cnblogs.com/foundkey/p/10243075.html
Copyright © 2011-2022 走看看