3.4. HTTP

在讲HTTP之前,我们先讲一下什么是协议

3.4.1. 什么是协议

通俗来讲,协议可以理解为约定,比如说下午一到6点,你就知道要下班了,这是因为公司有制度规定6点下班,协议可以很简单,但也可以很复杂,比如语言就是一种很复杂的协议,有大量的词汇代表不同的意思

3.4.2. 协议分层

在学HTTP前一定要理解协议分层这个概念,打个比方,打电话,你打开电话,拨通号码,跟需要通话的人建立了连接,然后你说一句话,声音通过话筒由声波信号转换成了电信号,然后电信号通过通讯媒介传输到对方电话,最后通过对方的听筒转化成声波。

声波转换成电信号,最后电信号又转换成声波,这就要遵守一定的协议,比如多少频率转化成多少伏的电压,如果双方协议不一样,转换出来的声音可能就完全不一样了。声波的传输是需要协议,同时双方通话的人也是,比如你是广东人,对方是上海人,两边各讲方言,结果都蒙逼了,然后双方使用一样的协议都讲普通话,OK,这要就可以HAPPY通信了。

../_images/tel.png

在这里,双方通话语言的协议就在声波和电信号转换的协议之上

那为什么要分层呢?这个问题比较好回答,比如如果你跟你老婆打电话,如果不通过声波和电信号之间的转换协议,你声音得多大她才能听到??这是必要情况。还有一种情况,可能不是必要的,但也要分层,这么做的目的是简化实现,降低耦合,大家可以先这么理解,有兴趣的话可以看一些专业书籍。

再看一下下面这个图,可以理解一下为什么要分层(这个图摘自图解TPC/IP)

../_images/tel2.png

3.4.3. TCP/IP协议

我们先看一下下面的百科介绍,写的比较专业,我来翻译一下:说白了,就是怎么样把你电脑上运行的程序的消息发送给网络上另一个电脑的程序的一系列协议

Note

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

我们来了看一下下面的图加深理解(这个图也摘自图解TCP/IP)

../_images/floors.png

3.4.4. HTTP

我们在这只需了解一下什么是HTTP,以及一些入门的知识,并不深入讨论,深入讨论半年也说不完

3.4.4.1. HTTP是什么

最开始HTTP是为了传输文件产生的,它属于应用层协议,基于传输层TCP协议,但随着互联网的演进,最初的静态文件传输已经演变成动态生成“文件”再传输

HTTP原理比较类似于去小卖铺买东西,你说要一个泡面( 请求 ),然后店员给你一个泡面( 响应 ),如果商店没有,店员告诉你没有货了( 404 ),如果买东西的人太多了,店员懒得给你找,就回复给你小店炸了,没空理你( 500 ),再或者,店员干脆懒得理你,回都不回( timeout

或者,商店里有很多种泡面,你得告诉店员要哪一种,然后你说要包装是纸桶装的( header )泡面

再或者,你在店里办了会员,每次不会花钱就能买东西,然后你到店里后,要把会员卡给店员,店员看一下你是不是会员,是会员了再看你有什么要求( cookies

再再或者,你买的东西比较私密,不想让旁边的人听到,然后你说了只有你和店员知道的暗语( 加密

同理HTTP就是你的电脑和服务器电脑通信的,你输入 http://www.baidu.com ,百度的服务器把网页数据返回给你

3.4.4.2. HTTP方法

这里只介绍四种常见的,也就是增删改查

  • GET 查,我需要查点资料
  • POST 增,我要增加点东西,如向数据库增加记录
  • PUT 改,修改某一项已经存在的数据的内容
  • DELETE 删,删除一些数据

但其实在实际使用过程中,程序员们并不严格遵守,大家了解一下就好啦

3.4.4.3. HTTP状态码

首先看一下状态码分类

状态码 类别 原因短语
1XX 信息性状态码 接收的请求正在处理
2XX 成功状态码 请求正确,处理完毕
3XX 重定向状态码 需要进行附加操作完成请求
4XX 客户端错误状态码 服务器无法处理请求
5XX 服务器错误状态码 服务器处理请求出错

大家对各种状态码先有一个大致了解,至于每组状态码之间有什么细微差别(如400和404),可以看一下这个百科: http://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

3.4.4.4. HTTP请求首部

首部也就是我们平常见到的HTTP headers,HTTP首部是除了传输数据外的一些额外信息,比如下面这个:

GET /en/latest/ HTTP/1.1
Host: test-study.readthedocs.io
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4
Cookie: csrftoken=NdDltTfq4fl3a70u7SrJ4amYJSezAQHK; __utmt=1; __utma=157584191.1561414775.1496201127.1496888218.1496925908.21; __utmb=157584191.1.10.1496925908; __utmc=157584191; __utmz=157584191.1496201127.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
If-None-Match: W/"59380209-24de"
If-Modified-Since: Wed, 07 Jun 2017 13:39:21 GMT

下面我们介绍几个比较重要的首部

Host

该首部指明了要访问的服务器地址和端口

Accept

表示客户端接受哪种类型的数据,如 text/html 表示客户端希望得到html文本,image/jpeg 表示希望得到图片,`` application/msword`` 表示希望得到word文档

Content-Type

表示客户端发送的数据类型,如 application/x-www-form-urlencoded 表示发送的是表单键对数据, application/json 表示发送的是序列化后的json数据

Cookie

表示客户端存储的Cookie发送给服务器