在理解HTTP之前,先大概知道TCP/IP是什么。
当不同的硬件、操作系统或者不同的设备想要进行通信,那么双方就要遵循同一个协议才可以进行通信,而这个协议的通称就是TCP/IP,也就是说TCP/IP之中包含了挺多种协议,而这个协议就规定了从电缆的规格到IP地址的选定方法,寻找不同地域的用户等等内容。
TCP/IP的分层管理可以分为四层:应用层、传输层、网络层和数据链路层。如此做是有好处的,像是如果要修改协议中的一部分,就不用把全部协议重新修改,而是取出四个层次中的一部分来进行修改。
应用层是用来决定,要实现TCP/IP的应用,是通过FTP(File Transfer Protocol)协议还是DNS(Domain Name System)服务等等的其他协议,HTTP协议也包括在其中。
传输层是对上层应用层,提供处于网络连接状态的两台计算机之间的数据传输。在传输层上有两个协议:TCP(Transmission Control Protocol)协议和UDP(User Data Protocol)协议。
网络层是选定用什么样的路径将打包好的数据包传给对方。数据包是网络传输的最小单位。
数据链路层是用来控制连接网络的硬件部分。其中就包括控制操作系统、硬件的设备驱动、NIC(Network Internet Card)等等硬件范畴的部件。
在数据传输中,首先在应用层中,用户在客户端发出HTTP请求之后,传输层会根据TCP协议把HTTP请求分割成若干报文并打上标记序号以及端口号后转发给网络层,在网络层中会增加作为通信地目的地的MAC地址后转发给链路层。链路层再把封装好的数据包发给接收端。
接收端的服务器在链路层接受到数据包,按顺序一步步往上层送,直到数据传送到应用层的时候才算的是真正接受到数据。
而且需要注意的是,在发送端每一层封装中都会打上一个该层所属的首部信息。所以在接收端解开包装的时候就可以根据首部信息一层层地解开。
IP协议与IP地址是不一样的概念。IP协议的作用是把各种数据包传送给请求方,而发送到对方的保证就是IP地址和MAC地址。IP地址是指明了节点被分配到的地址,MAC地址是指网卡所属的固定的地址。而且IP地址可以跟MAC地址互换,不过IP地址可以变更,MAC地址是固定的。
但是在互联网中,很少设备是连接在同一区域网上面的,所以需要一个中转站来中转,中转时会根据采用ARP(Address Resolution Protocol)协议来解析地址,利用下一站的中转设备来搜索下一个中转目标。
TCP协议是提供可靠的字节流服务,而字节流服务简单说就是把一大块数据分割成一个个小包(报文段为单位的数据包)进行管理,并且,TCP协议可以确认对方是否收到了数据,确认的方法是------三次握手。三次握手使用两个标记:SYN(synchronize)和ACK(acknowledgement)。发送端首先发送一个带有SYN标识的数据包给对方,然后对方收到之后,就发送一个带有SYN/AKC的标识给发送方来确认传达信息。最后,发送端再传回一个AKC标识的数据包,表示握手结束。如果握手的过程中发送了中断,TCP协议会再次以相同的顺序发送相同的数据包。
而DNS协议是用于解析发送端请求访问地址的域名,查找到其IP地址后,供发送端访问。也可以逆向从IP地址反向查域名。
总结一下,就是IP协议、TCP协议、DNS协议分别是在网络层、传输层和应用层发挥作用,从上到下串起来,可以这么说,DNS把发送端请求的域名解析成IP地址,然后TCP协议将一大堆数据分割成报文段数据包进行传输,并且还可以根据“三次握手”来确认数据包是否真的传送给接受方,然后IP协议就可以根据IP地址和MAC地址照着规定的传送方式把数据传送出去。
有时候我们会混淆URI(Uniform Resourse Identifier)和URL(Uniform Resource Locator)。URI是用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。所以可见,URL是URI的子集。
绝对的URI格式:
http://user:pass@www.example.jp:80/dir/index.html?uid=1#ch1
登录信息(认证):指定用户名和密码作为从服务器获取资源时的必要登录信息,可选填。
服务器地址:使用绝对URI必须指定待访问的服务器地址
服务器端口号:指定服务器连接的端口号,可选填
带层次的文件路径:指定服务器上的文件路径来定位特指的资源
查询字符串:针对已指定的文件路径内的资源
片段标识符:使用片段标识符通常可标记处已获取资源中的子资源,可选填
--------------------------------------------------------------------------------------------------------------------------------
HTTP协议是作用于客户端和服务端的通信,而客户端和服务端是一个相对的角色,但是必须要通过请求和响应的交换来达成通信,而且HTTP协议规定,肯定是客户端先发出请求建立通信,服务器在没有接收到请求时是不会发送响应的。
请求报文是由请求方法、请求URI、协议版本、请求首部字段和内容实体构成的。
下面则是客户端给某个服务器端发送请求报文的格式:
接收到请求的服务器,会将请求内容的处理结果以响应的形式返回给服务器。
响应报文基本上由协议版本、状态码、状态码的原因短语和可选的响应首部字段以及实体主体构成。
以下是响应报文的构成的格式:
因为HTTP协议是不保存状态的协议,就是说自身不会对请求和响应之间的通信状态进行保存,这样会加快处理大量事物的速度,确保协议的可伸缩性。
因为HTTP协议是使用URI定位互联网上的资源,所以在互联网上的任意资源都可以用URI搜索到。指定请求URI的方式有两种:
URI为完整的请求URI | GET HTTP/1.1 |
在首部字段HOST中写明网络域名或IP地址 | GET /index.htm HTTP/1.1 Host: hackr.jp |
其中,告知服务器意图的HTTP方法如下表:
方法 | 说明 | 支持的HTTP协议版本 |
GET | 获取资源 | 1.0/1.1 |
POST | 传输实体主体 | 1.0/1.1 |
PUT | 传输文件 | 1.0/1.1 |
HEAD | 获得报文首部 | 1.0/1.1 |
DELETE | 删除文件 | 1.0/1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 建立和资源之间的联系 | 1.1 |
HTTP1.1相比起HTTP1.0来说,多了持续连接和管线化的特性,持续连接可以减少因为每次对话断开和连接的开销,而管线化可以实现并发发送多个请求的功能。
因为HTTP协议是一种无状态协议,所以为了实现保持登录状态的功能,引进了Cookie的技术。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据服务端发送的响应报文内的一个叫做"Set-Cookie"的首部字段信息,通知客户端保存Cookie。当下次客户端再次发送请求时,客户端会自动在请求报文中加入Cookie值后发送给服务端,服务端接收到客户端发送过来的Cookie之后,会去检查此Cookie是从哪个客户端发过来的,然后对于服务器之前的数据,最后得到之前客户端的状态信息。
--------------------------------------------------------------------------------------------------------------------------------
HTTP报文大致可分为报文首部和报文主体,一般报文首部和报文主体之间还有一个换行符。
而报文又可以分为两种---请求报文和响应报文。
请求报文的格式如下:
响应报文的格式如下:
HTTP在传输数据的时候有两种方法,一种是直接按照数据原貌进行传输,另一种是通过编码来提升传输效率,不过编码的过程需要计算机来进行操作,所以会消耗更多的CPU等等资源。
HTTP报文大的主体用于输出请求或响应实体主体,其中报文是HTTP通信的基本单温,实体作为请求或相应的有效载荷数据被传输,其内容由实体首部和实体主体组成。通常实体主体就是报文主体,但是当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
压缩传输的内容编码是用于指明应用在实体内容上的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接收并进行解压。
当用户请求显示较大的网页的时候,为了能让网页一点一点地加载并实现,而不是全部加载好了才实现,会用到分块传输编码。
为了发送多种数据的多部分对象集合,采用了MIME(Multipurpose Internet Mail Extensions)机制,它允许处理文本、图片视频等多个不同类型的数据,MIME扩展中会使用一种称为多部分对象集合我的方法,来容纳多份不同类型的数据。而在HTTP报文中使用多部分的对象集合时,需要在首部字段里加上Content-type。
为了实现让之前下载中断处恢复下载就需要指定下载的实体范围,而指定范围发送得到请求叫做范围请求。执行范围请求时,会用到首部字段Range来指定资源的byte范围。
当然,现在同一个Web网页存在着多份相同内容的页面并不少见,比如同一个网页有分英文版和中文版的(要International一点啦)。当浏览器默认某种语言,访问相同URI的Web网页就会显示对应的语言版本的网页,这种机制就是内容协议。内容协议机制是指客户端与服务器端就响应的内容资源进行交涉,然后提供最适合用户的资源。
内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。内容协商技术有以下三种类型:服务器驱动协商、客户端驱动协商和透明协商。
--------------------------------------------------------------------------------------------------------------------------------
状态码的职责就是在客户端发送请求之后,描述返回的请求结果,借助状态码,用户可以知道服务器端是否正常处理请求、
状态码的类别:
| 类别 | 原因短语 |
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作已完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
因为状态码的数量多达60余种,但是经常使用的也就14种,所以接下来会依次介绍。
一。200OK
表示从客户端发来的请求被服务端正常处理。
二、204 No Content
该状态码表示客户端发来的请求已经被服务器接收并且响应了,但是响应报文中不包括实体的主体部分。
三、206 Partial Content
该状态码表示客户端进行了范围请求,而服务端也成功执行了客户端发来的GET请求。
四、301 Moved Permanently
该状态码表示,请求的资源分配了新的URI(资源位置已经不一样了),以后应使用资源现在所指的URI。但是这个是永久性的重定向
五、302 Found
该状态码也是表示请求资源被分配了新的URI,但是这个是临时性的重定向。此状态码与301状态码的区别在于重定向是否是永久性的。
六、303 See Other
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。此状态码与302状态码的区别在于此状态码是明确规定用GET方法定向请求资源。
七、304 Not Modified
该状态码表示虽然资源已经找到了,但是不符合客户端发送的条件请求。
八、307 Temporary Redirect
该状态码也是临时重定向的功能,与302的区别是,此状态码不会从POST方法变成GET方法。
九、400 Bad Request
该状态码表示客户端发送的请求报文中出现了语法错误。
十、401 Unauthorized
该状态码第一次发送给客户端表示需要有通过HTTP认证的认证信息,第一次出现401之后,再次出现此状态码则表示认证失败。
十一、403 Forbidden
该状态码表示客户端发送的资源请求被服务器端拒绝了。
十二、404 Not Found
该状态码表示服务器上没有客户端所请求的资源。
十三、500 Internal Server Error
该状态码表示服务器端在执行请求的时候发生了错误。
十四、503 Service Unavailable
该状态码表示服务器暂时处于超负载或正在进行停机维护,现在无法进行事务处理。
--------------------------------------------------------------------------------------------------------------------------------
虚拟机的存在,可以使物理层面只有一台服务器,但是只要使用虚拟主机的功能就可以假象已具有多台服务器。在互联网上,域名通过DNS服务器映射到IP地址上,而同一服务器的上的域名的IP地址是相同的,所以,在相同的IP地址的情况下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名。
在HTTP通信时,除了客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关、隧道。
代理:
使用代理的原因:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的等等。代理有多种食用方法,按两种基准分类:是否使用缓存,是否修改报文。缓存代理就是时会预先将资源的副本保存在代理服务器上,当代理再次接收到对相同自愿的请求时们可以直接将之前缓存的资源作为响应返回。透明代理就是转发请求或响应时,不对报文做任何加工的代理。
网关:
隧道:
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。但缓存也是有时效性的,所以在请求缓存的时候会先确认缓存是否过期,如果过期了,客户端会再次向源服务器请求资源,而且缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中,如果浏览器的缓存有效,就不用向源服务器请求资源了。
--------------------------------------------------------------------------------------------------------------------------------