HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地阅读器的传送协议。它可使阅读器更加高效,使网络传输减少。它不但保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪1部份,和哪部份内容首先显示(如文本先于图形)等。
在了解HTTP如何工作之前,我们先了解计算机之间的通讯。
互联网的关键技术就是TCP/IP协议。两台计算机之间的通讯是通过TCP/IP协议在因特网上进行的。实际上这个是两个协议:
TCP : Transmission Control Protocol 传输控制协议和IP: Internet Protocol 网际协议。
IP:计算机之间的通讯
IP协议是计算机用来相互辨认的通讯的1种机制,每台计算机都有1个IP.用来在internet上标识这台计算机。 IP 负责在因特网上发送和接收数据包。通过 IP,消息(或其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。IP 负责将每一个包路由至它的目的地。
IP协议仅仅是允许计算机相互发消息,但它其实不检查消息是不是以发送的次序到达而且没有破坏(只检查关键的头数据)。为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP.
TCP : 利用程序之间的通讯
TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCP在IP地址之上引端口(port),它允许计算机通过网络提供各种服务。1些端口号为不同的服务保存,而且这些端口号是尽人皆知。
服务或守护进程:在提供服务的机器上,有程序监听特定端口上的通讯流。例如大多数电子邮件通讯流出现在端口25上,用于wwww的HTTP通讯流出现在80端口上。
当利用程序希望通过 TCP 与另外一个利用程序通讯时,它会发送1个通讯要求。这个要求必须被送到1个确切的地址。在双方“握手”以后,TCP 将在两个利用程序之间建立1个全双工 (full-duplex) 的通讯,占用两个计算机之间全部的通讯线路。TCP 用于从利用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。
TCP/IP 就是TCP 和 IP 两个协议在1起协同工作,有上下层次的关系。
TCP 负责利用软件(比如你的阅读器)和网络软件之间的通讯。IP 负责计算机之间的通讯。TCP 负责将数据分割并装入 IP 包,IP 负责将包发送至接受者,传输进程要经IP路由器负责根据通讯量、网络中的毛病或其他参数来进行正确地寻址,然后在它们到达的时候重新组合它们。
HTTP是基于TCP协议之上的。在TCP/IP协议参考模型的各层对应的协议以下图,其中HTTP是利用层的协议。
HTTP由要求和响应构成,是1个标准的客户端服务器模型(B/S)。HTTP协议永久都是客户端发起要求,服务器回送响应。见下图:
HTTP是1个无状态的协议。无状态是指客户机(Web阅读器)和服务器之间不需要建立持久的连接,这意味着当1个客户端向服务器端发出要求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保存连接的有关信息.HTTP遵守要求(Request)/应对(Response)模型。客户机(阅读器)向服务器发送要求,服务器处理要求并返回适当的应对。所有HTTP连接都被构造成1套要求和应对。
1次HTTP操作称为1个事务,其工作全部进程以下:
1 ) 、地址解析,
如用客户端阅读器要求这个页面:http://localhost.com:8080/index.htm
从中分解出协议名、主机名、端口、对象路径等部份,对我们的这个地址,解析得到的结果以下:
协议名:http
主机名:localhost.com
端口:8080
对象路径:/index.htm
在这1步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。
2)、封装HTTP要求数据包
把以上部份结合本机自己的信息,封装成1个HTTP要求数据包
3)封装成TCP包,建立TCP连接(TCP的3次握手)
在HTTP工作开始之前,客户机(Web阅读器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的利用层协议,根据规则,只有低层协议建立以后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,1般TCP连接的端口号是80。这里是8080端口
4)客户机发送要求命令
建立连接后,客户机发送1个要求给服务器,要求方式的格式为:统1资源标识符(URL)、协议版本号,后边是MIME信息包括要求修饰符、客户机信息和可内容。
5)服务器响应
服务器接到要求后,给予相应的响应信息,其格式为1个状态行,包括信息的协议版本号、1个成功或毛病的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
实体消息是服务器向阅读器发送头信息后,它会发送1个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应对头信息所描写的格式发送用户所要求的实际数据
6)服务器关闭TCP连接
1般情况下,1旦Web服务器向阅读器发送了要求数据,它就要关闭TCP连接,然后如果阅读器或服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将依然保持打开状态,因而,阅读器可以继续通过相同的连接发送要求。保持连接节省了为每一个要求建立新连接所需的时间,还节俭了网络带宽。
首先我们看看客户端要求的时候,数据在各层协议的数据组织以下图:
而服务器解析客户机要求就是反向操作的进程,以下图:
客户机发起1次要求的时候:
客户机会将要求封装成http数据包-->封装成Tcp数据包-->封装成Ip数据包--->封装成数据帧--->硬件将帧数据转换成bit流(2进制数据)-->最后通过物理硬件(网卡芯片)发送到指定地点。
服务器硬件首先收到bit流....... 然后转换成ip数据包。因而通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。
有两种基本的加解密算法类型:
1)对称加密(symmetrcic encryption):密钥只有1个,加密解密为同1个密码,且加解密速度快,典型的对称加密算法有DES、AES,RC5,3DES等;
对称加密主要问题是同享秘钥,除你的计算机(客户端)知道另外1台计算机(服务器)的私钥秘钥,否则没法对通讯流进行加密解密。解决这个问题的方案非对称秘钥。
2)非对称加密:使用两个秘钥:公共秘钥和私有秘钥。私有秘钥由1方密码保存(1般是服务器保存),另外一方任何人都可以取得公共秘钥。
这类密钥成对出现(且根据公钥没法推知私钥,根据私钥也没法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
下面看1下https的通讯进程:
https通讯的优点:
1)客户端产生的密钥只有客户端和服务器端能得到;
2)加密的数据只有客户端和服务器端才能得到明文;
3)客户端到服务真个通讯是安全的。
但是这次IE比较大方,允许的最大长度是10MB
HTTP/1.0
HTTP/1.1
HTTP-NG
HTTP/1.0
建立连接->要求->响应->断开连接
每次连接只处理1次要求和相应,对资源的每次访问都要建立1个单独的连接。
阅读器到服务器的每次通讯都是完全分开的。
没有Host域,所以不可以创建基于主机头的虚拟主机。
HTTP/1.1
在1个TCP连接中可以传送多个HTTP要求和响应
不需要等待上次HTTP响应终了,可以多个HTTP要求同时进行。服务器会根据阅读器发送的要求顺序来按顺序进行响应,这被称作管线。
有Host域,可以建立虚拟主机。
结构:
要求行
若干消息头(可选)
(CRLF)
实体内容(可选)
GET无实体内容
结构:
状态行
若干消息头(可选)
(CRLF)
实体内容(可选)
对HTTP/1.1,如果消息中包括实体内容,且没有采取Transfer-Encoding: chunked传输编码方式,则必须要有Content-Length消息头。否则阅读器和服务器都不知道什么时候消息结束。
没有消息头。
其中,简单要求消息只可用于GET方式,且要求行中不指定HTTP版本号,
对简单要求消息,服务器将会返回简单响应消息,只返回实体内容。
如:
ROOT /index.html
阅读器通过消息头,比如可以告知服务器阅读器的国家语言版本信息,可以告知服务器访问者是从哪一个页面访问到当前页面的。
服务器通过消息头,比如可以告知阅读器隔多长时间刷新1下,用哪一种字符集显示内容,创建Cookie。
结构:
头字段名称(不辨别大小写):_值,值,值(CRLF)
头字段名称(不辨别大小写):_值,值,值(CRLF)
头字段名称(不辨别大小写):_值,值,值(CRLF)
(可以任意顺序排列)
分为:通用信息头、要求头、响应头、实体头4类。
结构:
要求方式_资源路径_HTTP版本号(CRLF)
如:
GET /index.htm HTTP/1.1
要求方式:
Method |
|
GET |
要求获得Request-URI所标识的资源 |
POST |
在Request-URI所标识的的资源后附加新的数据 |
HEAD |
要求获得Request-URI所标识的资源的响应消息报头 |
PUT |
要求服务器存储1个资源,并用Request-URI作为资源标识 |
DELETE |
要求服务器删除Request-URI所标识的资源 |
TRACE |
要求服务器回送收到的要求信息,主要用于测试和诊断 |
CONNECT |
保存将来使用 |
OPTIONS |
要求查询服务器的性能,或查询与资源相干的选项和需求 |
结构:
HTTP版本号_状态码_状态描写(CRLF)
如:
HTTP/1.1 200 OK
GET使用URL传递参数
如:
GET /List.aspx?Catagoryid=5&Cityid=23 HTTP/1.1
POST使用实体内容传递参数
如:
POST /List.aspx HTTP/1.1
Content-Type:application/x-www-form-urlencoded
Content-Length:22
Catagoryid=5&Cityid=23
在POST消息头中要设置Content-Type的值为application/x-www-form-urlencoded,和使用Content-Length 以标识实体内容的长度。
当Content-Length长度比实体内容长度短时,则会疏忽多出部份的实体内容。当Content-Length少于实体长度时,则会继续等待。
状态代码由3位数字组成,第1位定义了响应的种别:
1xx:唆使信息——表示要求已接收,继续处理。
2xx:成功——表示要求已被成功接收、理解、接受。
3xx:重定向——要完成要求必须进行更进1步的操作。
4xx:客户端毛病——要求有语法毛病或要求没法实现。
常见状态码:
Status-Code |
Reason-Phrase |
|
200 |
OK |
客户端要求成功 |
206 |
|
客户端发送了带有Range头的GET
|