目录

HTTP 协议

HTTP(Hyper Text Transfer Protocol 超文本传输协议), 是基于 TCP/IP 通信协议来实现数据传递的应用层协议. 用于 www 万维网服务器(Server-Side) 与 本地浏览器(Client-Side) 之间传输超文本的传输协议.

又因为 TCP/IP 协议是一个端到端的面向连接的协议, 所谓的端到端可以理解为进程到进程之间的连接, 所以 HTTP 协议在开始传输数据之前, 首先需要建立一个 TCP 连接, 而 TCP 连接的过程需要 三次握手. 在 TCP 三次握手之后, 成功建立了 TCP 连接, 此后 HTTP 协议就可以进行数据传输了.

HTTP 协议工作原理

  • Step 1: Client-Side 与 Server-Side 建立一个 TCP 套接字连接.
  • Step 2:Client-Side 通过 TCP 套接字向 Sever-Side 发送 HTTP Request(请求报文).
  • Step 3: Server-Side 接收并解析 HTTP Request 之后执行事物并返回 HTTP Response.
  • Step 4: 释放 TCP 连接, 若 connection mode 为 close, 则 Server-Side 主动关闭 TCP 连接, Client-Side 被动关闭连接, 最后释放 TCP 连接. 若 connection mode 为 keepalive, 则该连接会保持一段时间, 在该时间内 Server-Side 可以继续接收请求.

HTTP Request

HTTP Request 请求行 + Request_Header + Body 组成:

请求行

用于说明请求类型, 要访问的资源以及所使用的HTTP版本.

格式: Method Request-URI HTTP-Version <CR><LF>

  • Method: HTTP Method
  • Request-URI: 统一资源标识符
  • HTTP-Version: 表示请求的HTTP协议版本
  • : 表示回车和换行符(\r\n), 请求行必须由换行符结尾

其中 HTTP Method 有下列几种类型:

  • GET: (获取) 请求获取 Request-URI 标识的资源
  • POST: (创建) 请求在 Request-URI 标识的资源添加新的数据
  • PUT: (更新) 请求向 Request-URI 标识的资源上传其最新内容
  • DELETE: (删除) 请求删除 Request-URI 标识的资源
  • HEAD: 请求获取 Request-URI 标识的资源的 Response-Header
  • TRACE: 请求服务器回送请求信息, 一般用于测试或诊断
  • OPTIONS: 请求获取服务器的性能参数, 或者查询与资源相关的选项
  • CONNECT: 保留将来使用

因为这些 HTTP 协议提供了多种 Method, 所以 HTTP 协议除了作为传输协议之外, 还被作为应用协议.

Request Header

Request Header(请求报头) 是 HTTP Header 的其中一种类型, 用于指定服务器接受的附加信息, 由由若干个请求报头域键值对组成, 报头域的格式为 报头域名: 值 . 下面列出常用的请求报头域:

  • Host: 指定服务器的主机和端口号信息, 发送请求时, 该请求报头域是必需的

  • Authorization: 请求服务器鉴权, 如果服务器的响应代码为 401 未授权, 那么可以发送一个含有 Authorization 请求报头域的请求, 要求服务器对客户端进行鉴权验证.

  • Accept: 指定客户端接受的响应信息数据类型, E.G. 'Accept': 'application/json' 指定接受 JSON 格式数据

  • Accept-Charset: 指定客户端接受的响应信息字符集类型, E.G. Accept-Charset:iso-8859-1,gb2312,utf8

  • Accept-Encoding: 指定客户端接受的内容压缩类型, E.G. Accept-Encoding:gzip.deflate

  • Accept-Language: 指定客户端接受的自然语言类型, E.G. eg:Accept-Language:zh-cn

  • User-Agent: 将客户端操作系统、浏览器和其它本地属性传入服务器

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

  • Connection: 指定 TCP 连接模式

  • Cookie: 最重要的请求头之一, 将 cookie 发送给服务器

EXAMPLE:

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8

HTTP Response

HTTP Response 由 状态行 + Response_Header + Body 组成:

状态行

格式: HTTP-Version Status-Code Reason-Phrase <CR><LF>

  • HTTP-Version: 服务器 HTTP 协议版本
  • Status-Code: 服务器发回的响应状态码
  • Reason-Phrase: 状态码的文本描述
  • : 状态行也必须以换行符结尾

其中由服务器响应的状态码分为 5 大类型:

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

更多状态码

Response Header

用来指定客户端接收的的附加信息.

  • Server: 包含了服务器处理请求的软件环境信息

  • Allow: 服务器支持哪些 HTTP Method

  • Set-Cookie:最重要的响应报头域之一, 用于把 cookie 发送到客户端, 每一个写入 cookie 都会生成一个 Set-Cookie, E.G. Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

  • Location: 用于重定向到一个新的位置, 包含新的URL地址

EXAMPLE 1:

EXAMPLE 2:

HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84 <html>
<body>Hello World</body>
</html>

Body

在客户端发送 Request 或服务器响应 Response 时都可以传输一个 Body(实体), 其由 实体报头域 + 实体正文[可选]组成, 其中实体报头域用于定义了实体正文. 常用的实体报头域有下列几种类型:

  • Content-Type: 指定了发送给接收者的实体正文的媒体格式类型(MIME type), E.G. 'Content-Type': 'application/json'/Content-Type:text/html;charset=GB2312
  • Content-Length: 指定了实体正文的长度, 以十进制数字表示

  • Content-Encoding: 指定了附加在实体正文上的附加内容的压缩类型, E.G. Content-Encoding:gzip

  • Content-Language: 描述了资源所使用的自然语言

  • Expires: 指定了响应过期的日期和时间, 以此更新缓存数据, E.G. Expires:Thu,15 Sep 2006 16:23:12 GMT

  • Last-Modified: 描述了资源的最后修改日期和时间

NOTE: 因为无论 Request 或者 Response 都可能发送 Body, 所以上述的实体报头域是通用的.

HTTP 协议解析的更多相关文章

  1. ts 协议解析

    pes : http://wenku.baidu.com/link?url=KjcA0qXqZ1bWVQTa8i1YOmygofldSQL7Pjj-zGRw1e_6_LFmVLo5DIWF0SNwVn ...

  2. [转]netty对http协议解析原理

    本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

  3. twemproxyRedis协议解析探索——剖析twemproxy代码正编

    这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...

  4. B/S 架构中,网络模型的分解与协议解析

    前言 如果是C/S专业毕业的或者是学过计算机网络课程的童鞋们,相信大家都知道网络模型的划分,本文首先来聊一聊目前对于B/S结构中,网络模型分解的两种方式. 没错,相信大家看到这个图片的时候就已经明白了 ...

  5. 详解BLE 空中包格式—兼BLE Link layer协议解析

    BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

  6. netty对http协议解析原理解析

    本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...

  7. MODBUS协议解析中常用的转换帮助类(C#)

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  8. AOSP中的HLS协议解析

    [时间:2018-04] [状态:Open] [关键词:流媒体,stream,HLS, AOSP, 源码分析,HttpLiveSource, LiveSession,PlaylistFetcher] ...

  9. WebSocket协议解析

    WebSocket协议解析 转载请注明出处:WebSocket解析 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是指在特定的时间间隔(如每一秒),由浏览器对服务器发起HTTP请求,然后由服 ...

  10. SOCKS5 协议解析

    代理 根据 HTTP 1.1 的定义,proxy 是: An intermediary program which acts as both a server and a client for the ...

随机推荐

  1. levelDB SSTable-静态布局结构

    SSTable是Bigtable中至关重要的一块,对于LevelDB来说也是如此,对LevelDB的SSTable实现细节的了解也有助于了解Bigtable中一些实现细节.     本节内容主要讲述S ...

  2. 【sql server复制】不重新初始化快照的情况下新增表/存储过程/函数等

    转发自:https://www.cnblogs.com/datazhang/p/5498789.html sqlserver同步后在不重新初始化快照的情况下新增表        在已有事务复制中,时长 ...

  3. python 正确复制list,克隆list 的各种方案

    推荐4种方法 --------------------------------------------------------------- 方法一:extend L = [1, 2, 3] List ...

  4. 字典树(Trie树)实现与应用(转)

    一.概述 1.基本概念 字典树,又称为单词查找树,Tire数,是一种树形结构,它是一种哈希树的变种. 2.基本性质 根节点不包含字符,除根节点外的每一个子节点都包含一个字符 从根节点到某一节点.路径上 ...

  5. Python 特性?

    1.Python 是强语言类型还是弱语言类型? Python 是强类型的动态脚本语言.强类型:不允许不同类型相加.动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候.脚本语言: ...

  6. 如何在CentOS 7上安装Node.js和npm

    Node.js是一个跨平台的JavaScript运行时环境,允许在服务器端执行JavaScript代码.Node.js主要用于后端,但也作为全栈和前端解决方案而流行. npm,Node软件包管理器的缩 ...

  7. Dom选择器使用与调试记录

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【新手向】一个超简单的基于jQuery ajax的天气预报Demo

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. 解决GitHub push项目——Push failed: Unable to access 'https://********.git/': Failed to connect to 127.0.0.1 port 1080: Connection refused

    解决方法: 第一步:在git中设置http代理 git config --global http.proxy 第二步:在git中取消http代理 git config --global --unset ...

  10. centos误删除文件如何恢复

    当意识到误删除文件后,切忌千万不要再频繁写入了,否则你的数据恢复的数量将会很少. 而我们要做的是,第一时间把服务器上的服务全部停掉,直接killall 进程名 或者 kill -9 pid . 然后把 ...