本文章是读《图解http》之后的记录,文章的内容在此书中都可找到
历史
HTTP于1990年诞生,此时的HTTP尚未作为正式的标准建立,这时的HTTP被称为HTTP/0.9.HTTP作为标准被公布是在1996年,其被正式命名为HTTP/1.0。而后1997年公布的HTTP/1.1是目前主流的HTTP协议版本。HTTP至今没有怎么更新,显著用的最多的是是HTTP/1.1.
理解TCP/IP
什么是TCP/IP
我们的网络是运行在TCP/IP协议族的,而HTTP协议是其内部的一个子集,TCP/IP是互联网相关的各类协议族的总称,包括了众多内容,其中包括TCP,IP,DNS,UDP,ICMP等等。
TCP/IP的分层管理
TCP/IP协议族按层次分为四个层次,分别是应用层,传输层,网络层,和数据链路层。下面分别介绍
应用层
应用层决定了想用户提供应用服务时通信的活动,次层中有FTP(文件传输协议),和DNS(域名系统),HTTP等。
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
网络层(网络互连层)
网络层用来处理在网络上流动的数据包,数据包是数据传输的最小数据单位,该层规定了通过怎么样的路径到达对方计算机,并将数据包传送给对方。
链路层(数据链路层,网络接口层)
用来处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动,NIC(网卡),及光纤等物理设备。
TCP/IP通信传输流
图片来源TCP/IP 通信传输流,侵删。
在进行网络通信时,会通过分层顺序与对方进行通信,发送端从应用层往下走,接受层从应用层往上走。
我们模拟一下数据传输的过程,首先作为发送端的客户端在应用层发出一个想看到某个Web页面的HTTP请求。然后传输层把从应用层处收到的数据进行分割,并在各个报文上打上标记序号及端口号转发给网络层。在网络层,增加作为通信目的地的MAC地址后转发给链路层,这样发送端的工作就完成了。接受端的服务器在链路层接受到数据,按序往上层发送,一直到应用层。当传输到应用层,才算真正接受到有客户端发送过来的HTTP请求。
再传输过程中,发送端在进过每层时都必定会打上一个该层所属的首部信息,而接收端在层与层传输数据时,每经过一层时就会把对用的首部去掉。
一个简单的HTTP协议
从我们生活中的经验也可以知道,要建立一个连接,通常是客户端发送请求,而后服务器端响应请求。下面我们看一个实例。
下面陈列一个请求报文和响应报文。
请求报文
POST /form/entry HTTP/1.1
Host:google.com
Connection:keep-alive
Content-Type:appliaction/x-www-form-urlencoded
Content-Length:16
name=ueno&age=37
- 这里的POST是指方法,/form/entry是URL HTTP/1.1是http版本号
- Host,Connection,Content-Tpye,Content-Length部分是请求首部字段
- name部分则是内容实体
响应报文
HTTP/1.1 200 OK
Date:Thurs,28 Jul 2016 18.06.00 GMT
Content-Length:264
Content-Type:text/html
<html>...
- HTTP/1.1 是协议版本,200为状态码,ok是状态码的原因短语
- Date,Content-Length,Content-Tpye是响应首部字段
- \… 部分则是响应报文主体
通过上面的两个报文可以看出请求报文是由请求方法,请求URL,协议版本,可选的请求首部字段和实际内容组成,而响应报文则有协议版本,状态码,解释状态码的原因短语,可选的响应首部字段以及实体主体构成。尔后很大的篇幅都会用来讲解报文的构成。
HTTP是不保存状态的协议
http是不保留状态的协议,即无状态协议。也就是说http协议自身不对请求和响应之间的通信状态进行保存,在http这个级别,协议对于发送过的请求或响应都不做持久化处理。当有新的请求发送时,就会有对应的新响应产生。协议本省不对之前一切的请求和响应报文进行保存。这样子是为了处理大量事务,确保了协议的可伸缩性,所以才设计的这么简单。
但是无状态也会带来一些弊端,做过网页开发的人应该都知道cookie,cookie就是为了弥补协议的无状态化而出现的,可以参考细说cookie
HTTP方法
前面的请求报文有一个部分是“GET”,这就是http的方法,一般开发者比较熟悉的应该是GET和POST这两个。下面就挨个讲解。
- GET:用来请求访问已被URL识别的资源。
- POST:用来传输实体的主体。
- PUT:用来传输文件。
- HEAD:和GET方法一样,只不过不返回实体报文。
- DELETE:用来指定删除文件,与PUT方法相反。
- OPTION:用来查询针对请求URL指定的资源支持的方法。
- TRACE:让web服务器端将之前的请求通信还回给客户端的方法。
- CONNECT:要求的与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。
再来说说GET和POST方法的比较:
GET特点:
- 请求可被缓存
- 请求保留在浏览器历史记录中
- 请求不应在处理敏感数据时使用
- 请求有长度限制
- 请求只应当用于取回数据
POST的特点:
- 请求不会被缓存
- 请求不会保留在浏览器历史记录中
- 不能被收藏为书签
- 请求对数据长度没有要求
总的来说,当传递的数据不敏感并且比较小是才可以使用GET方法,GET方法会在链接中使用明文传递信息,可以被别人看到。
建立持久连接
在http协议的初始版本中,每进行一次HTTP通信就会断开一次TCP连接,但是现如今一共同个页面中经常包含很多图片,会多次请求资源,如果每次请求时都会有TCP的建立与断开的话就会增加通信录的开销,所以可以选择建立持久连接。持久连接后,只要没有一方明确提出断开连接,那么连接就会一直保持。在HTTP/1.1中,连接是默认持久连接的。
持久连接建立后就可以使用管线化来发送数据,管线化即指多个消息的发送并行进行,互不干扰,这样就不需要一个一个的等待响应了。
结语
这是http的基础部分,下一次将会记录http报文部分。