Http

文章路线。先解释下http,与https的区别,然后列出http请求里面包含什么。

然后分析android中的源码。

借鉴:http和https的区别

1 http简介

http(HyperText Transfer Protocol)汉语译为超文本传输协议。是互联网应用最广泛的一种网络协议。所有的www文件都必须遵守这个标砖。设计http最初的目的就是为了提供一种发布和接受html页面的方法。android开发过程中经常用到它。

2 http请求包里都有什么

http 数据包

http的请求由四个部分构成,请求行,请求头,空行和请求数据。

请求行

请求行,由三部分组成, 请求方法 请求url http版本,他们是用空格符号分开的。比如 GET /index.html HTTP/1.1

其中请求方法是个比较重要的点,有8种。

get:向特定的资源发出请求,一般用于数据截获,他只会获取资源,并不会对资源进行更改,不会影响资源的状态。

    get请求一般是以查询字符串的形式附在URL里面,如果数据是英文字母或者数字的话,原样发送,如果是空格的话,转换为+,如果是中文的话或者其他字符的话,就直接把字符进行base64加密,得出如 %E4%BD%A0%E5%A5%BD ,存在一定的安全隐患。

         get提交的数据大小是有限的,因为get是通过URL来进行提交数据,那么,get可提交的数据限制就直接跟URL的长度有直接的欢喜。然而在事实上,URL不存在参数上限的问题,但是,IE等浏览器,自行对其进行了限制。

post:向指定的资源提交数据进行处理请求,比如提交表单或者上传文件。 数据被包含在请求体中,post请求可能会导致新的资源的创建或者已有资源的修改。

        根据http规范,post表示可能修改服务器上的资源的请求。

        post是将表单中的数据放在from的数据体中,表单中的参数值是通过 request body发送给服务器,post的所有操作对于用户而言是不可见的,。

        post理论上是没有限制的,可以大量的传输数据。

 

put:用于向服务器发送请求,如果URL不存在,则要求服务器根据请求创建资源,如果存在,服务器就接收请求内容,并修改url原始版本。

delete:请求服务器删除request-url所表示的资源。

connect:http/1.1协议中预留给能够将连接改为管道方式的代理服务器。

head:向服务器索要与get请求相一致的响应,只不过响应体不会被返回。这一方法可以在不必传输整个应用内容的情况下,就可以获取包含在响应消息头中的元信息。

oprions:返回服务器针对特定资源所支持的http请求方法,也可以利用向web服务器发送的 '*'请求来进行测试,服务器的功能性。

delete:请求服务器删除request-url 所标识的资源。

 

get,put,post,delete

  • get请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。
  • put 是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
  • post同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
  • delete就是用来删除某一个资源的,该请求就像数据库的delete操作。

请求行的三大元素,只讲方法即可。其余的url和http版本,很简单。

请求头标

请求头标由关键字/键值对组成,每行一对,关键字和值用冒号分开

请求头标通知服务器有关于客户端的功能和标识,典型的请求头有,User-Agent客户端厂家和版本

Accept 客户端可识别的内容类型列表

Content-Length附加到请求的数据字节数。

空行

最后一个请求头标之后是一个空行,发送回车符和退行通知服务端以下不再有头标

请求数据

使用post传送数据,最常用的是content-type 和 content-length头标。

3 http响应包里面有什么

web服务器解析请求,定位指定资源,服务器将资源副本写至套接字,在此处由客户端读取。一个响应由四个部分组成,状态行,响应头标, 空行,响应数据。

状态行

状态行由三个标记组成, Http版本,响应代码和响应描述。

http版本指的是,向客户端知名其可理解的最高版本

响应代码,3位的数字代码,之处请求的成功或者失败,如果失败会给出原因。

响应描述:为相应代码的可读性解释。

其中响应代码有下面的规则:

1xx 信息,请求收到了,继续处理

2XX 成功,行为被成功接收理解和采纳

3XX 重定向,为了完成请求,必须进一步执行的动作

4XX 客户端错误,请求包含语法错误或者请求无法实现

5XX 服务端错误,服务器不能实现一种明显无效的请求。

响应头标

就像请求头标一样,之处服务器的功能,标识出响应数据的细节。

空行

最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不会再有头标。

响应数据

HTML文档和图像等,也就是HTML本身。

Http模型是无状态的,表明在处理一个请求的时候,Web服务器并不会记住来自同一客户端的请求。

更多具体的规则请看链接中的文章。

4 http是如何完成一次请求的

android网络通信之-Http(Android操作HTTP实现与服务器通信)

首先先简略说一下,一个硬件如何和另外一个硬件进行数据传输。截图如下

好吧,物理层面的目前就这些吧。也就是数据通过了咱们的一些物理方面的原因传到了其他设备上。

那么看看软件层面。就拿http说。http是手机联网常用的协议之一,是建立在TCP协议之上的一种协议。

http最显著的特点就是客户端发送的每次请求都需要服务端回送响应,请求结束后就会主动释放。因此,http具有短连接无状态的特性。那么如果要保持客户端程序的在线状态的话,就需要不断地向服务器发送连接请求。即使不需要获取任何数据,每隔一段时间就要像服务器发送所谓的保持连接的请求,来让服务端知道客户端实则是在线的。对于服务端如果长时间没有接到客户端的请求,认定是下线,,对于客户端,长时间接不到服务端的回复,认为是网络断开。

4.1 http在TCP/IP协议栈中的位置:

Http协议承载与TCP协议之上,有时也承载于SSL协议层之上(当然这个时候就是https了)。如图所示:

http的默认端口号是80, https默认端口号是443.

并且HTTP永远都是由客户端发起,服务端进行响应,这样就限制了HTTP协议,无法实现在客户端没有发起请求的时候,服务端就将消息推送给客户端。我想你也没见过哪家的聊天软件使用的是http吧哈哈。

4.2 建立TCP链接之后发起http请求

http是建立在TCP协议的基础上的,目前在internet中所有的传输其实都是通过TCP/IP进行的,http协议作为TCP/IP模型中应用层的协议自然也不例外。TCP是一种可靠的端到端的面向链接的协议,所以http基于传输层TCP协议不用担心数据传输的各种问题。他的链接过程以及断开过程依然遵从着三次握手四次分手的规则。

参考以下链接: 完整的HTTP请求会经历以下过程http协议详解

Http在最开始建立链接的时候,也会经历三次握手的环节来和服务端建立链接,并且这个建立过程只能是客户端发起的。

wKioL1LSW6rjI1nhAAE63Uv8ZRY731.jpg

以上这张图也就是著名的TCP三握四分。如果不了它描述的过程,请参考TCP/IP简略描述

假设当前客户端向服务端发起了连接,那么他的包大约是下图所示这样的,前三条TCP请求,是TCP三次握手环节。第四条就是客户端向服务端发起的http请求。

wKioL1LSXDmgmVT_AAFUErYF2ys832.jpg

那么接下来,就是服务端接到请求并且给客户端传送数据的过程,那么到底是哪些数据呢?假设我们请求的是百度官网,那么百度官网的html代码总得返回来吧。这些东西都是靠着tcp协议传过来的,我猜测13号到31号包,是传输数据的,数据传送完毕,服务端给客户端返回一个http请求。32号包就是服务端返回客户端的响应包。响应包里面的内容,上面有介绍。

wKiom1LSXVeQETJrAAaV9VlbbBo896.jpg

一般情况下,一旦服务器向浏览器发送了响应http,他就要关闭tcp连接,进行四次分手。但是如果咱们在客户端请求信息中的请求头标中携带了这行代码:

Connection:keep-alive

那么TCP连接在发送后仍然保持打开状态,于是客户端可以继续通过相同的链接发送请求。保持连接状态节省了为每个请求建立新连接的时间,并节约网络宽带。服务器将相应信息传给客户端,响应体中可能是html页面也可能是图片或者其他信息。

4.4 android中用到的关于http请求的API。

使用起来很简单,但是要了解其中的原理还是得深入看这些API是怎么实现的。

private void post(){
    try{
        URL url = new URL(mMsgContent.url);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        //設置輸入流採用字节流
        connection.setDoInput(true);
        //设置输出流采用字节流
        connection.setDoOutput(true);
        //设置post
        connection.setRequestMethod("POST");
        //post是不允许缓存的
        connection.setUseCaches(false);
        //设置meta参数
        connection.setRequestProperty("Content-Type", "application/x-www-urlrncode");
        connection.setRequestProperty("Charset", "utf-8");
        //连接服务端发送消息
        connection.connect();

        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
        outputStream.writeBytes("param" + URLEncoder.encode("卡卡", "utf-8"));
        //清空缓存
        outputStream.flush();
        outputStream.close();


        //接收工作开始
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder resut = new StringBuilder("");
        String nextLine = null;
        if ((nextLine = bufferedReader.readLine()) != null) {
            resut.append(nextLine);
        }

        bufferedReader.close();
        connection.disconnect();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

private void get(){
    try {
        URL url = new URL(mMsgContent.url);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStreamReader reader = new InputStreamReader(connection.getInputStream());//向服務器發送消息
        BufferedReader bufferedReader = new BufferedReader(reader);
        StringBuilder stringBuilder = new StringBuilder("");
        String readLine = null;
        while ((readLine = bufferedReader.readLine()) != null) {
            stringBuilder.append(readLine);
        }
        //關閉輸入流
        reader.close();
        //斷開連接
        connection.disconnect();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

static class Content {
    public String url = "";
    enum  HttpMethod {GET, POST};
    public HttpMethod mMethod = HttpMethod.GET;
}

当然还有另外的API也可以完成这个操作。叫httpClient。这种不多做讨论了就。

5 http和https

先讲下http 与 https的区别与关系。谈到这个,大家估计就会说https比http安全。但是为什么安全呢?原因是https在http的基础上加了一个SSL层进行加密。 所以说https相当于http的安全版。

HTTPS与HTTP之间的区别:

1 https协议需要到ca申请证书,一般免费的证书不多,需要交费

2 http是超文本传输协议,信息是明文传输,而https则是具有安全性的ssl加密传输协议

3 http和https使用的是完全不同的连接方式,包括用的端口也是不同的,http用的是80, https用的是443.

4 http的连接是比较简单的,是无状态的,HTTPS是右 SSL + HTTP协议构建的可进行加密传输,身份认证的网络协议。比http安全。

最最关键的一点就是SSL层加密。所以这点要好好解释:对于加密这点,,有加密就得有解密这个是必须的。SSL是网景公司提出来的安全保密协议,在浏览器和web服务器之间构造安全通道来进行数据传输,SSL运行在TCP/IP层与应用层之间,为应用层提供加密数据通道。它采用了RC4,MD5,以及RSA等加密算法,使用40位的秘钥,适用于商业信息的加密。

HTTPS协议就是使用SSL在发送方把原始数据进行加密,然后在接收方进行解密,加密和解密需要发送方和接收方通过交换公知的秘钥来实现。因此所传输的数据不容易被黑客截获并解密。但是也正是因为多了这么些处理,加密和解密的过程是需要消耗系统大量的开销的,严重降低机器的性能。只有http工作效率的10%,所以https一般在安全性较强的情况下用。因为一般来说不是所有的数据都要那么高的安全保密级别。。通常在支付系统,银行系统对账户信息要求会比较高,会采用https。

有关于https 与 http 之间比较详细的区别,以及涉及到的加密算法,请参考我写的其他文章《https》。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

娅娅梨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值