超文本传输协议HTTP

冷暖自知 提交于 2019-11-27 08:31:48

        HTTP协议定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网,以及服务器怎样将文档传送给浏览器。从层次角度看,HTTP是面向事务的应用层协议,它是万维网上能够可靠的交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。  HTTP不仅可以传送完成超文本跳转所必须的信息,还可以传送任何可从互联网上得到的信息,如文本、超文本、声音和图像等。
        1、万维网的工作过程
        万维网的大致工作过程如下图所示:

        每个万维网网点都有一个服务器进程,它不断地监听TCP的端口80, 以便发现是否有浏览器(即万维网客户)向它发出连接建立请求,一旦监听到连接建立请求并建立了TCP连接之后,浏览器就向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应,最后,TCP连接就被释放了。在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则,这些格式和规则就是超文本传送协议HTTP。
        HTTP规定在HTTP客户与HTTP服务器之间的每次交互,都由一个ASCII码串构成的请求和一个类似的通用互联网扩充,即“类MIME (多用途互联网邮件扩展)” 的响应组成。HTTP报文通常都使用TCP连接传送。
        用户浏览页面的方法有两种,一种方法是在浏览器的地址窗口中键入所要找的页面的URL,另一种方法是在某一个页面中用鼠标点击一个可选部分,这时浏览器会自动在互联网上找到所要链接的页面。
        HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是HTTP 协议本身是无连接的,这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要建立HTTP连接。在1997年以前使用的是HTTP/1.0协议,现在普遍使用的升级版本HTTP/1.1。
        HTTP协议是无状态的,也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相应时间相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
        2、浏览器请求一个万维网文档到收到整个文档所需的时间
        从浏览器请求一个万维网文档到收到整个文档所需的时间如下图所示:

        用户在点击鼠标链接某个万维网文档时,HTTP协议首先要和服务器建立TCP连接,这需要使用三次握手,当建立TCP连接的三次握手的前两部分完成后(即经过了一个RTT时间后),万维网客户就把HTTP请求报文,作为建立TCP连接的三次握手中的第三次报文段中的数据,发送给万维网服务器,服务器收到HTTP请求报文后,就把所请求的文档作为响应报文返回给客户。
        从上图可以看出,请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间RTT(一个RTT用于连接TCP连接,另一个RTT用于请求和接收万维网文档,TCP建立连接的三次握手中的第三次报文段中的数据,就是客户对万维网文档的请求报文)。
        HTTP/1.0的主要缺点就是每请求一个文档需要两倍RTT的开销,若一个主页上有很多链接的对象(如图片等)需要依次进行链接,那么每一次链接下载都需要2倍的RTT开销,另一种开销就是万维网客户和服务器每一次建立新的TCP连接都要分配缓存和变量,特别是万维网服务器往往要同时服务于大量客户的请求,所以这种非持续连接会使万维网服务器的负担很重。好在浏览器都能够打开5 ~ 10个并行的TCP连接,而每一个TCP连接处理客户的一个请求,因此,使用并行TCP连接可以缩短响应时间。
        HTTP/1.1协议较好地解决了这个问题,它使用了持续连接,所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行。
        HTTP/1.1协议的持续连接有两种工作方式,即非流水线方式流水线方式
        非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT,这比非持续连接要用去两倍RTT的开销,节省了建立TCP连接所需的一个RTT时间。但非流水线方式还是有缺点的,因为服务器在发送完一个对象后, 其TCP连接就处于空闲状态,浪费了服务器资源。
        流水线方式的特点,是客户在收到HTTP的响应报文之前就能够接着发送新的请求报文,于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需花费一个RTT时间。流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档效率。
        3、HTTP的报文结构
       
HTTP有两类报文,请求报文响应报文。
        请求报文:客户向服务器发送的一个请求,即请求报文。
        响应报文:服务器为客户发送的请求做出应答,即响应报文。

         HTTP的请求报文和响应报文都是由开始行首部行实体主体三部分组成,由于HTTP是相面文本的,因此在保温中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的。
        开始行:用来区分是请求报文还是响应报文,在请求报文中的开始行叫做请求行,在响应报文中的开始行叫做状态行,在开始行的三个字段之间都以空格隔开,最后的“CR”和“LF”分别代表“回车”和“换行”。
        首部行:用来说明浏览器、服务器或报文主体的一-些信息。首部可以有好几行,但也可以不使用,在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”,整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
        实体主体:在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。
    (1)HTTP响应报文的主要特点
        请求行包括三个内容,方法请求资源URLHTTP版本。常见的HTTP请求方法如下表所示:

HTTP请求报文的一些方法
                 方法                        含义
              OPTION          请求一些选项的信息
                 GET          请求读取由URL所标志的信息
                HEAD          请求读取由URL所标志的信息的首部
                POST          给服务器添加信息(例如,注释)
                 PUT          在指明的URL下存储一个文档
              DELETE          删除指明的URL所标志的资源
              TRACE          用来进行回环测试的请求报文
             CONNECT          用于代理服务器

        这些方法中,OPTION、GET、HEAD和TRACE被视为安全的方法,因为它们只是从服务器获得资源或信息,而不对服务器进行任何修改,而POST、PUT、DELETE则影响服务器上的资源。另外,GET、HEAD、OPTION、TRACE、PUT和DELETE等请求方法被认为是等幂的, 即多次连续的、重复的请求和只发送一次该请求具有完全相同的效果,而POST方法则不同,连续多次发送同样一个请求可能进一步影响服务器上的资源。
        下面是HTTP请求行的格式,注意:在GET后面有一个空格,接着是某个完整的URL,其后面又有一个空格,最后是HTTP/1.1。
        GET http://www/xyz.edu.cn/dir/index.htm HTTP/1.1
        下面是一个完整的HTTP请求报文的例子:

GET /dir/index.htm HTTP/1.1        //请求行使用了相对URL
Host:www.xyz.edu.cn                     //首部行的开始,给出了主机的域名
Connection:close                            //告诉服务器发送完请求的文档后就可以释放连接
User-Agent:Mozilla/5.0                 //表明用户代理是使用火狐浏览器Firefox
Accept-Language:cn                      //表示用户希望优先得到中文版本的文档
                                                           //请求报文的最后还有一个空行

        在请求行使用了相对URL(即省略了主机域名),因为下面的首部行给出了主机的域名,第3行是告诉服务器不使用持续连接,表示浏览器希望服务器在传送完所请求的对象后立即关闭TCP连接,这个请求报文没有实体主体。
     (2)HTTP响应报文的主要特点
        每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行,状态行包括HTTP的版本状态码解释状态码的简单短语
        状态码都是三位数字的,分为5大类,这5大类的状态码都是以不同的数字开头的,常见的状态码和状态信息及含义如下表所示:

HTTP状态码、状态信息及含义
状态类型 状态码和状态信息 含义
1xx信息 100 Continue 服务器收到了客户端的请求行和头部信息,告诉客户端继续发送数据部分。客户端通常要先发送Expect: 100-continue头部字段告诉服务器自已还有数据要发送
2xx成功 200 OK 请求成功
3xx重定向 301 Moved Permanently 资源被转移了,请求将被重定向
302 Found 通知客户端资源能在其他地方找到,但需要使用GET方法来获得它
304 Not Modifed 表示被申请的资源没有更新,和之前获得的相同
307 Temporary Redirect 通知客户端资源能在其他地方找到。与302不同的是,客户端可以使用和原始请求相同的请求方法来访问目标资源
4xx客户端错误 400 Bad Request 通用客户请求错误
401 Unauthorized 请求需要认证信息
403 Forbidden 访问被服务器禁止,通常是由于客户端没有权限访问该资源
404 Not Found 资源没找到
407 Proxy Authentication Required 客户端需要先获得代理服务器的认证
5xx服务器错误 500 Internal Server Error 通用服务器错误
503 Service Unavailable 暂时无法访问服务器

        4、Session和Cookie的使用及区别    
        HTTP是一种无状态的协议,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户,为了分辨连接是谁发起的,就需自己去解决这个问题。SessionCookie就是为解决这个问题而提出来的两个机制。
        Session:Session是在服务器端保存用户数据。浏览器第一次发送请求时,服务器自动生成了Session ID来唯一标识这个用户并将其响应信息发送到浏览器,浏览器第二次发送请求时会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户的信息。一般这个Session ID会有个时间限制,默认30分钟,超时后会毁掉这次Session ID。
        Cookie:Cookie是在客户端保存用户数据。浏览器第一次发送请求后,服务器会返回一些数据给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的Cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。Cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储一些小量的数据。
         两者的区别:
    (1)Session是以对象的形式保存在服务器端,Cookie是以字符串的形式保存在客户端,所以Session的安全性要高于Cookie。
    (2)Session里的信息是通过存放在会话Cookie里的Session ID获取的。
    (3)Session 则可以存储任何类型的数据,而Cookie 只能存储 ASCII 码字符串。
    (4)Session是存放在服务器里的,Session里的东西不断增加会增加服务器的负担,因此不建议将所有的用户信息都存储到 Session 中。
        5、GET方法和POST方法的区别
        GET和POST是HTTP协议中的两种发送请求的方法,主要区别有以下几点:
    (1)传送方式
        GET方法通过地址栏传输,数据将作为URL的参数发送,这些参数通常是由&分隔的名称和对的字符串,而POST方法通过报文传输。
    (2)传送长度
        GET方法的参数有长度限制,只能发送有限数量的数据,因为数据是在URL中发送的,而POST方法的长度无限制,可以发送大量的数据,因为数据实在正文主体中发送的。
    (3)安全性
        GET方法发送的数据不受保护,因为GET方法通过地址栏传输,其URL参数直接暴露在地址栏上,而POST方法发送的数据在URL中不可见。
    (4)TCP数据包的个数
        GET方法产生一个TCP数据包,而POST方法产生两个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200 OK(返回数据),而对于POST方式,浏览器先发送header,服务器相应100 Continue,浏览器在发送data,服务器响应200 OK(返回数据)。
    (5)编码
        在表单中使用GET方法时,数据只能接受ASCII字符,在表单提交时,POST方法不绑定表单数据类型,并允许二进制和ASCII字符。
    (6)缓存
        GET方法的数据是可以缓存的,而POST方法的数据不可缓存。
       6、HTTPS和HTTP的区别
    (1)HTTPS协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
    (2)HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl加密传输协议。
    (3)HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    (4)HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!