/HttpStudy

Http协议学习

Primary LanguageJava

统一资源定位符(URL)也被称为网页地址。

URL的格式由三部分组成: 第一部分是协议; 第二部分是存有该资源的主机IP地址(有时也包括端口号); 第三部分是主机资源的具体地址。 如:eg.http//www.imooc.com/index.jsp

HTTP协议: HTTP协议是超文本传输协议定义了浏览器怎么向万维网请求万维网文档,及服务器怎么把文档传送给浏览器。 从层次的角度看,HTTP协议是面向应用层的协议。

HTTP协议特点:

HTTP协议特点包括以下几个方面:

支持客户机服务器模式

简单快速:客户机向服务器请求服务时,只需要传送请求方法和路径。请求的方法包括GET、HEAD、POST等。
          每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的规模小,通信速度快。

灵活: HTTP运行传输任何类型的数据对象。

无连接:限制每次连接只处理一个请求。服务器处理完用户的请求,并收到客户的应答后,即断开连接。
        采用这种方式可以节省传输时间。

无状态:HTTP协议是无状态协议。无状态是指协议对于事务的处理没有记忆的能力。缺少状态意味着
        如果后续处理需要前面的信息,则必须重传,这样可能导致每次连接传送的数据量增大。
        另一方面,在服务器不需要先前信息时它的应答就较快。

一个HTTP协议操作成为一个事务,其工作过程可以分为四步:

1:首先客户机和服务器之间建立相应的连接,只要单击某个超链接,HTTP就可以工作。

2:建立连接之后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、
协议版本号,后边的MIME信息包括请求标识符、客户机信息和可能的内容。

3:服务器接收到请求后 ,给予相应的相应信息。其格式为一个状态行,包括信息的协议版本号、
一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

4:客户端接收服务器所返回的信息通过浏览器显示在用户的现实屏上,然后客户机与服务器断开连接。

TCP三次握手:

SYN是TCP/IP建立连接时使用的握手信号。客户机和服务器之间建立连接,首先客户机发出一个SYN信号,
服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。

ACK即确认符,在数据通信中,接收站给发送站的一种传输类控制字符,表示发来的数据已确认接收无误。

建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k), 即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕, 客户端和服务器进入ESTABLISHED状态,完成三次握手。

HTTP请求:

Http请求由三部分组成,分别是:请求行、消息报头、请求正文。

请求行:
    请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本号,
    格式如下:Method Request-URI HTTP-Version CRLF
        其中Method表示请求的方法;
        Request-URI是一个统一资源标识符;
        HTTP-Version标识请求的HTTP协议版本;
        CRLF表示回车和换行(除了作为结尾的CRLF之外,不允许出现单独的CR或LF字符)。

请求方法(所有方法全为大写)有多种: GET 请求获取Request-URI所标识的资源

POST 在Request-URI所标识的资源后附加新的数据

HEAD 请求获取由Request-URI所标识的资源的响应消息报头

PUT 请求服务器存储一个资源,并用Request-URI作为其标识

DELETE 请求服务器删除Request-URI所标识的资源

TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断

CONNECT 保留将来使用

OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

HTTP响应:

在接收和解释请求消息后,服务器返回一个HTTP响应消息。
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文(服务器返回的资源的内容)。

状态行格式如下:
HTTP-Version Status——Code Reason-Phrase CRLF

    HTTP-Version标识服务器HTTP协议的版本;
    Status-Code标识服务器发回的响应状态代码;
    Reason-Phrase表示状态代码的文本描述

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
    1xx:指示信息–表示请求已接收,继续处理
    2xx:成功–表示请求已被成功接收、理解、接受
    3xx:重定向–要完成请求必须进行更进一步的操作
    4xx:客户端错误–请求有语法错误或请求无法实现
    5xx:服务器端错误–服务器未能实现合法的请求

常见状态代码、状态描述、说明:
    200 OK //客户端请求成功
    400 Bad Request //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    403 Forbidden //服务器收到请求,但是拒绝提供服务
    404 Not Found //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error //服务器发生不可预期的错误
    503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
    eg:HTTP/1.1 200 OK (CRLF)

HTTP1.0和HTTP1.1区别: HTTP/1.0 每次请求都需要建立新的TCP连接,连接不可复用。 HTTP/1.1 新的请求可以在上次请求建立的TCP连接之上发送,连接可以复用,优点是减少重复进行TCP三次握手的开销,提高效率。 HTTP/1.1 在Request消息头里多了一个HOST域,HTTP1.0则没有这个域。HOST:www.w3.org HTTP1.1 增加了OPTIONS,PUT,DELETE,TRACE,CONNECT这些Request方法。

HttpURLConnection: 在Android中发送HTTP请求的方式一般有两种,HttpURLConnection和HttpClient(Android 5.0中已弃用)

安卓中访问网络方式:

Android应用程序都会使用HTTP协议来发送和接收网络数据,而Android中主要提供了两种方式来进行HTTP操作,
HttpURLConnection和HttpClient。这两种方式都支持HTTPS协议、以流的形式进行上传和下载、
配置超时时间、IPv6、以及连接池等功能。

1、HttpClient:
    优点:DefaultHttpClient和AndroidHttpClient都是HttpClient具体的实现类,都拥有众多的API,
          而且实现比较稳定,bug数量也很少。
    缺点:很难在不破坏兼容性的情况下对它进行升级和扩展

2、HttpURLConnection:
    优点:HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多
          数的应用程序。API提供的比较简单,可以更加容易地去使用和扩展它。
    缺点:HttpURLConnection在2.3之前的版本中存在一些bug,比如说对一个可读的InputStream调用close()方
          法时,就有可能会导致连接池失效了。

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。 普通报头: Cache-Control:no-cache 用于指定缓存指令 请求报头: Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端 希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。 Accept-Charset请求报头域用于指定客户端接受的字符集 Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码 Authorization请求报头域主要用于证明客户端有权查看某个资源。

TCP/IP、Http的区别: TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包 装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时, 可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容, 如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等, 也可以自己定义应用层协议。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用T CP/IP做传输层协议将它发到网络上。”

HTTP与HTTPS有什么区别 : HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全, 为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer 安全套接层,对传输信息进行加密)协议用于对HTTP协议 传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、 身份认证的网络协议,要比http协议安全。