参考:关于HTTP协议,一篇就够了,感谢作者认真细致的总结,本文在理解的基础上修改了内容,加深印象的同时也希望对大家有所帮助

HTTP是什么?

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,用于万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传输协议

HTTP基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)

HTTP协议工作与客户端上,通过URL向HTTP服务器发送所有请求,服务器接收到请求后向客户端发送响应信息

HTTP特点

  1. 简单快速:客户端向服务端发送请求,只需传送请求方法和路径,请求方法常有GETPOSTPUTDELETEOPTIONS等,每种方法规定了客户端与服务端联系的类型不同。由于HTTP协议简单,使得HTTP服务器的

    程序规模小,因而通信速度很快
  2. 灵活:HTTP能传输任意类型的数据,正在传输的内容用Content-Type加以标记
  3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户端请求信息,并得到客户应答后,即断开连接。采用这种方式能节省传输时间
  4. 无状态:HTTP协议是无状态协议,这就意味着对事务处理没有记忆功能。后续处理需要前面的信息,必须重新传输,这样可能导致每次连接传输的数据量很大,另一方面,在服务器不需要先前信息时它的应答很快

HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求到Web页面,以及服务器是如何向客户端响应Web页面。HTTP采用了请求/响应模型,客户端向服务器发送一个请求报文,请求报文里面包含请求方法、URL、协议版本,请求头部以及请求数据。服务器以一个状态行作为响应,响应内容包括协议版本、成功或者错误代码、服务器信息、响应头部与响应数据

一个事务(从发出请求到响应结束)会经历以下阶段:

1. 客户端连接到服务端

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认80)建立一个TCP套接字连接,例如在地址栏输入http://tangj.cn

2. 发送HTTP请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据

3. 服务器接收请求并发送响应

Web服务器解析请求,定位资源,服务器将资源副本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据组成

4. 释放TCP连接

若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP;若connection为keepalive,则该连接会保持一段时间,在该时间可以继续接受请求

5. 客户端浏览器解析HTML内容

客户端浏览器会首先解析状态行,查看表明请求是否成功的状态码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档字符集。客户端浏览器读取响应数据HTML,根据HTML语义化对其格式化,并在浏览器窗口显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下阶段:

  1. 浏览器向DNS服务器请求解析该URL中域名对应的IP地址
  2. 解析出IP地址后,根据该IP地址和默认端口80,和服务器建立TCP连接
  3. 浏览器发出读取文件(URL中域名后面部分对应的文件)HTTP请求,该请求报文作为TCP三次握手的第三次报文的数据发送给服务器
  4. 服务器对浏览器请求作出响应,并把对应的HTML文本发送给浏览器
  5. 释放TCP连接
  6. 浏览器将该html文本解析并显示内容

HTTP之URL

HTTP用统一资源标识符(Uniform Resource Identifiers,URI)来传输数据和建立连接。URL(Uniform Resource Locator,URL),统一资源定位符是一种特殊类型的URI,包含了用于查找某个资源足够的信息,标识某一处资源的地址。

http://www.tangj.cn:80/news/index.asp?name=tangj&age=24#profile

  1. 协议部分:http:代表网页使用的是HTTP协议,//表示分隔符,在Internet中有多种协议,比如HTTP、HTTPS、FTP等
  2. 域名部分:www.tangj.cn为URL域名,也可以使用IP当做域名
  3. 端口部分:域名后面会指定端口号,HTTP默认端口号为80,HTTPS默认端口号为443
  4. 虚拟目录部分:从域名后面的第一个/到最后一个/为止,本例的虚拟目录是news
  5. 文件名部分:从域名最后一个/到?是文件部分,如果没指定文件,则使用默认文件名
  6. 参数部分:?到#之间是参数
  7. 锚部分:从#开始到结束都是锚部分,本例中的锚点是profile

HTTP之请求消息

客户端向服务端发送一个请求消息的格式如下:

Get请求例子,使用Charles抓取的request:

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

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

请求方式是GET,请求资源是/562f25980001b1b106000338.jpg,协议版本为HTTP/1.1

2. 请求头部 用来说明服务器要使用的附加信息

User-Agent判断客户端类型、Accept文件格式...

3. 空行

即使第四部分是空内容也要空行

4. 请求数据

POST请求例子,使用Charles抓取的request:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley

第一部分:请求行,第一行明了是post请求,以及http1.1版本。

第二部分:请求头部,第二行至第六行。

第三部分:空行,第七行的空行。

第四部分:请求数据,第八行。

HTTP之响应消息

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP/1.1 200 OK

Date: Fri, 22 May 2009 06:07:21 GMT

Content-Type: text/html; charset=UTF-8

<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

第二部分:消息报头,用来说明客户端要使用的一些附加信息

第二行和第三行为消息报头,

Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

第三部分:空行,消息报头后面的空行是必须的

第四部分:响应正文,服务器返回给客户端的文本信息。

空行后面的html部分为响应正文。

HTTP之状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息--表示请求已接收,继续处理

2xx:成功--表示请求已被成功接收、理解、接受

3xx:重定向--要完成请求必须进行更进一步的操作

4xx:客户端错误--请求有语法错误或请求无法实现

5xx:服务器端错误--服务器未能实现合法的请求

常见状态码:

200 OK //客户端请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常


最后

再次感谢原作者的分享,跟着敲了一遍之后对HTTP协议理解更加深刻,相信这在以后工作中是一笔不小的财富,想了解更多HTTP协议,请点击这里

【学习笔记】深入理解HTTP协议的更多相关文章

  1. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

  2. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  3. 图解HTTP学习笔记——简单的HTTP协议

    简单的HTTP协议 前言 最近在学习Web开发的相关知识,发现<图解HTTP>这本书通俗易懂.所以花时间学习这本书,并记录下学习笔记. 如上图,我们每天都在浏览网页,一般我们都是在浏览器地 ...

  4. Python Web学习笔记之TCP/IP协议原理与介绍

    HTTP.FTP.SMTP.Telnet等等协议,哦!那个HTTP协议啊就是访问网页用的那个协议啊然后那个······其实······你懂得,我们应该从实际来了解他,理解网络协议的作用与功能,然后再从 ...

  5. Java_JVM学习笔记(深入理解Java虚拟机)___重点

    http://chenzhou123520.iteye.com/category/196061 转载 JVM学习笔记(一):运行时数据区 JVM学习笔记(二):JVM中对象访问的两种方式 JVM学习笔 ...

  6. 学习笔记之TCP/IP协议分层与OSI參考模型

    1.协议的分层      ISO在制定标准化OSI之前,对网络体系结构相关的问题进行了充分的讨论, 终于提出了作为通信协议设计指标的OSI參考模型.这一模型将通信协议中必要 的功能分成了7层.通过这些 ...

  7. 学习笔记之TCP/IP协议的重要性

    1. 随处可见的协议     在计算机网络与信息通信领域里,人们常常提及"协议"一词.互联网中常 用的具有代表性的协议有IP.TCP.HITP等. 而LAN(局域网)中经常使用的协 ...

  8. SpringMVC:学习笔记(1)——理解MVC及快速入门

    SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page C ...

  9. [Python学习笔记-005] 理解yield

    网络上介绍yield的文章很多,但大多讲得过于复杂或者追求全面以至于反而不好理解.本文用一个极简的例子给出参考资料[1]中的讲解,因为个人觉得其讲解最为通俗易懂,读者只需要对Python的列表有所了解 ...

  10. Objective-C学习笔记类目、协议

    不是所有的方法都可以被覆盖的!比如:intValue就不能被覆盖!! 原因正在查找中! 别人的电脑上却可以! 类目.h件 #import <Foundation/Foundation.h> ...

随机推荐

  1. [Hadoop]Hadoop章1 Hadoop原理解析

    Hadoop是Apache软件基金会所开发的并行计算框架与分布式文件系统.最核心的模块包括Hadoop Common.HDFS与MapReduce. HDFS HDFS是Hadoop分布式文件系统(H ...

  2. linux python 安装到用户目录

    在公司服务器中,python可能存在多个版本,而且python中的包也有多个不同版本,由于不同猿的需求不同,经常会引起程序冲突,影响工作效率.因此,给大家分享一个在没有root权限时,将python安 ...

  3. 初级PM要做什么

    首先让我们看下这张图,产品经理进入公司后将要面临着许多工作 或许你有疑问,如果是产品助理的话,上面这么多工作都要去做吗? 其实不然,初级产品经理由于工作经历有限,对行业的研究以及对市场的把控是有视野限 ...

  4. MySQL InnoDB特性:两次写(Double Write)

    http://www.ywnds.com/?p=8334 一.经典Partial page write问题? 介绍double write之前我们有必要了解partial page write(部分页 ...

  5. spoj GSS系列简要题解

    文章目录 GSS1 GSS2 GSS3 GSS4 GSS5 GSS6 GSS7 GSS8 传送门 这个GSSGSSGSS系列全部是跟子段有关的数据结构菜题. 于是来水一篇博客. GSS1 传送门 题意 ...

  6. php循环

    while 例子: /* example 1 */ $a = 0; while (true) { $a++; echo $a.'<br>'; if($a >= 10){ break; ...

  7. 如何监控redis的cpu使用率

    redis默认是单线程运行的,为了充分利用机器的cpu,正常情况下一台服务器上会装多个实例.如果通过top命令监控机器的cpu的话,监控值很笼统,不能精确到单redis实例的cpu使用率监控.而且ce ...

  8. java技术突破要点

    一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...

  9. 长方体类Java编程题

    1. 编程创建一个Box类(长方体),在Box类中定义三个变量,分别表示长方体的长(length).宽(width)和高(heigth),再定义一个方法void setBox(int l, int w ...

  10. 【leetcode】 算法题3 无重复字符的最长子串

      问题      给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度 ...