http协议
http协议简介
http协议都把tcp作为底层的传输协议。HTTP客户首先发起建立与服务器TCP连接一旦建立连接,浏览器进程和服务器进程就可以通过各自的套结字来访问。如前所述,客户套接字(socket)是客户进程和tcp连接之间的门,服务器套结字是服务器进程和同一TCP连接之间的门,客户往自己的套结字发送http请求消息,也从自己的套结字接受HTTP消息。类似服务器也是。客户或服务器一旦把某个消息送入各自的套结字,这个消息就完全落入TCP的控制之中。TCP给HTTP提供一个可靠的数据传输服务,这意味着由客户发出的每个HTTP请求消息最终会无损的到达服务器,由服务器发出的每个HTTP响应消息最终也无损地到达服务器。
可以看出分层网络的优势,HTTP不必担心数据的丢失,也无须关系TCP如何从数据的丢失和错序中恢复出来的细节。TCP还拥有一个拥塞控制机制。该机制迫使每个新的TCP连接一开始以相对缓慢的速率传输数据,只要网络不阻塞,每个连接会迅速上升到相对较高的速率。这个初始阶段称为慢启动。
由于 HTTP服务器不维护客户的状态信息,所以说HTTP是一个无状态的协议。
http协议的工作流程
HTTP协议的工作原理主要包括四个步骤
1)连接:web浏览器与服务器建立连接,打开一个成为socket(套结字)的虚拟文件,此文件的建立标志这连接建立成功。
2)请求:web浏览器通过socket向web服务器提供请求。http请求一般是GET或POST命令(POST用于FROM参数的传递)。GET命令的格式为:GET路径/文件名 HTTP/1/ 其中文件名指出所访问的文件,HTTP/1.0指出web浏览器使用的HTTP版本。
3)应答:web浏览器提供请求以后,通过HTTP协议传送给web服务器。Web服务器接受到后,进行事务处理,处理结果又通过HTTP传送给WEB了浏览器,从而在web浏览器上显示出所请求的页面。
例如:加入客户机与www.myconpany.com:8080/mydirindex.html建立连接,就会发出GET命令: GET /mydir/index.htmlHTTP/1.0/ 主机名为www.myconpamy。Com的web服务器从他的文档空间里搜索子目录mydir的文件Iindex.html。如果找到该文件。Web服务器把该文件内容床送给相应的web浏览器为了告知we浏览器传送的内容类型,web服务器首先会传送一些HTTP头信息,然后传送具体内容。HTTP头信息和HTTP体信息之间用一个空行分开。
4)关闭连接:当应答结束以后,web浏览器与服务器必须断开,以保证其他web浏览器能够与web服务器建立连接。
http非持久连接和和持久连接
HTTP1.0使用非持久连接,HTTP1.1使用的是持久连接
非持久连接:每次服务器发出一个对象以后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。
持久连接:在持久连接中,服务器在发出响应后让TCP连接继续打开着,同一客户服务器之间的后续请求和响应可以通过这个连接发送。通常,HTTP服务器在某个连接闲置一段时间后关闭它。
HTTP消息结构
先看Request 消息的结构, Request 消息分为3部分,第一部分叫请求行, 第二部分叫http header, 第三部分是body. header和body之间有个空行,
结构如下图
第一行中的Method表示请求方法,比如"POST","GET", Path-to-resoure表示请求的资源, Http/version-number 表示HTTP协议的版本号
当使用的是"GET" 方法的时候, body是为空的
比如我们打开博客园首页的request 如下
GET http://www.cnblogs.com/ HTTP/1.1
Host: www.cnblogs.com
我们再看Response消息的结构, 和Request消息的结构基本一样。 同样也分为三部分,第一部分叫request line, 第二部分叫request header,第三部分是body. header和body之间也有个空行, 结构如下图
get和post方法的区别
1)get是从服务器上获取数据,post是向服务器传送数据
2)get的参数是作为URL字符串的一部分传递过来的,在URL中可以看到,post的参数不属于url的一部分,用户看不到他们,通常是有web页面上的HTML表单生成的
3)get传递的数据量比较小,不能大于2KB,post的传送量较大
状态码
Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三b部分组成。
态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.
HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
条件GET方法
HTTP协议有一种机制,允许缓存器证实他的对象是最新的,这种机制就是条件GET方法,如果:请求报文用get方法,并且请求报文中包含有一个if-Modified-Since首部行,那么,这个HTTP请求报文就是一个条件GET请求报文。
与缓存相关的 HTTP扩展消息头
Expires:指示响应内容过期的时间,格林威治时间GMT
Last-Modified:响应中资源最后一次修改的时间
If-Modified-Since:客户端存取的该资源最后一次修改的时间,同Last-Modified。
Cache-Control:更细致的控制缓存的内容
cookie和session
http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态
cookie技术有4个组件在HTTP响应报文中有一个cookie首部行,在http请求报文中有一个cookie首部行,在用户端系统中保留有一个cookie文件,位于web站点的一个后端数据库
cookie可能用于标识一个用户,用户首次访问一个站点的时候,可能需要提供一个用户表识,在后继的会话中,浏览器向服务器传递一个cookie首部,从而向服务器标识了用户,因此cookie可以在无状态的HTTP之上建立一个用户会话层。
session机制
ession机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存
session的实现方式:
使用cookie实现:服务器给每个session分配一个唯一的JSEEIONID,并通过cookie发送给客户端,当客户端发起新的请求的时候,将在cookie头中接待这个JSESSIONID,这样每个服务器能够找到这个客户端对应的session
使用url回显来实现:
URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带会服务器。 如果直接在浏览器输入服务端资源的url来请求该资源,那么Session是匹配不到的。 Tomcat对Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用response.encodeURL()
https实现原理
有两种基本的加解密算法类型: 1)对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等; 2)非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。 下面看一下https的通信过程: