Android-Http

作者: cff70524f5cf | 来源:发表于2019-03-25 21:07 被阅读20次

HTTP相关知识使我们面试或者实际开发中经常用到的,今天我们来做个总结。

1.Http的简介

1.1 Http的含义

HTTP 全称是 HyperText Transfer Protocal 即超文本传输协议。我们知道OSI模型把网络通信的工作分为7层,分别是:是物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而Http协议是应用层协议。当你上网浏览网页的时候,浏览器和 web 服务器之间就会通过 HTTP 在 Internet 上进行数据的发送和接收。HTTP是一个基于请求/响应模式的、无状态的协议,即我们通常所说的 Request/Response。补充:HTTP,UDP都是无状态协议,而TCP,FTP是有状态协议,关于什么是无状态协议可以简单理解为:请求都是独立的,一次Request对应一次Response。两次相邻的请求没有直接联系。但开发中的实际情况通常是,在 http 协议的基础上,web 应用引入 cookies,session,application 来保持 web 应用之间的状态。

1.2 Http的特点

  • 支持客户端/服务器模式
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快
  • 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记
  • 无连接:无连接的含义是限制每次链接只处理一个请求。服务器处理完哭护的请求,并收到客户的应答后,即断开链接,采用这种方式可以节省传输时间
  • 无状态:HTTP 协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能会导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

1.3 网络协议四层?

我们刚才说了OSI模型把网络通信的工作分为7层,但实际应用中还是TCP/IP的四层结构,4层是指TCP/IP四层模型,主要包括:应用层、运输层、网际层和网络接口层。 4层协议和对应的标准7层协议的关系如下图:

image

我们来一张经典的4层结构图说明一下:

image

那我们就参考上图分别说一下与HTTP协议密切相关的协议:

1.3.1 传输层的TCP(确保可靠性的协议)

TCP 位于传输层,提供可靠的字节流服务。所谓的字节流服务( Byte Stream Service )是指,为了方便传输,将大块数据分割成以报文段( segment )为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方. 这里还要着重讲解一下TCP连接的3次握手

为了准确无误地将数据送达目标处, TCP 协议采用了三次握手( three-way handshaking )策略。 握手过程中使用了 TCP 的标志( flag ) —— SYN ( synchronize ) 和ACK ( acknowledgement )。发送端首先发送个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表 “ 握手 ” 结束。若在握手过程中某个阶段莫名中断, TCP 协议会再次以相同的顺序发送相同的数据包。 如图所示:

image
1.3.2 网络层的IP

IP 协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是 IP 地址和 MAC地址( Media Access Control Address )。IP 地址指明了节点被分配到的地址, MAC 地址是指网卡所属的固定地址。 IP 地址可以和 MAC 地址进行配对。 IP 地址可变换,但 MAC地址基本上不会更改。IP使用 ARP 协议凭借 MAC 地址进行通信

2.URL详解

2.1 URL含义

URL(Uniform Resource Locator)是统一资源定位符的简称,有时候也被俗称为网页地址(网址),是因特网上标准的资源的地址。

2.2 URL构成

URL构成的通用格式为:schema://host[:port#]/path/…/[?query-string][#anchor] 我们来分析各部分的含义:

image.png

用事实说话,比如: http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff 其中

image.png

再来张比较直观的图

image

3.Http 详解

3.1 Http请求详解

HTTP 的请求报文分为三个部分:请求行、请求头、请求体

3.1.1请求行

请求行(Request line)分为三个部分:请求方法、请求地址和协议版本 所以请求行的格式一般是:

image

举例: GET /app/appUserAction!getUserLogin.do.html HTTP/1.1

请求地址就是我们要请求服务器的地址,协议版本是我们Http的版本比如:Http1.0、Http1.1等版本。 我们主要来说一下请求方法: HTTP/1.1 协议中共定义了八种方法(也叫“动作”)来以不同的方式操作指定的资源.

image.png

其中,最常见的是 GET 和 POST 方法,如果是 RESful 接口的话一般会用到 PUT、DELETE、GET、POST(分别对应增删查改) 补充:

RESful 是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

3.1.2请求头

请求头可用于传递一些附加信息,格式为:键: 值,注意冒号后面有一个空格: 如图,是Fiddler抓包获取的请求头信息:

GET省略包含参数的请求......... HTTP/1.1
Host: 省略.........
Connection: keep-alive
User-Agent: Mozilla/5.0 (Linux; U; Android 9; zh-cn; DUK-AL20 Build/HUAWEIDUK-AL20) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/9.0 Mobile Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,image/sharpp,image/apng,image/tpg,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh-CN;q=0.8,en-GB;q=0.6,en-US;q=0.4

这个请求头信息并不能代表所有请求头信息,所以我们来说一说请求头的一些知识点: 首先,请求头通常用来传递一些附加信息,格式为:键: 值,注意冒号后面有一个空格: 请求和响应常见通用的 Header

image.png

请求Header内包含常用信息如下:

image.png
3.1.3 请求体

请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&连接,如果请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度,就是我们通常访问服务器需要传的参数信息,如: http://www.baidu.com/login.do?account=123456&password=99fe158e8abc9ffbd09eab0ec9d81781 根据应用场景的不同,HTTP 请求的请求体有三种不同的形式 第一种: 移动开发者常见的,请求体是任意类型的,服务器不会解析请求体,请求体的处理需要自己解析,如图:

image

第二种: 第二种和第三种都有固定的格式,是服务器端开发人员最先了解的两种。这里的格式要求就是 URL 中 Query String(可以理解为参数) 的格式要求:多个键值对之间用&连接,键与值之间用=连接,且只能用 ASCII 字符,非 ASCII 字符需使用UrlEncode编码。

image

第三种: 第三种请求体被分成多个部分,文件上传 时会被使用,这种格式最先是被用于邮件传输中,每个字段/文件都被 boundary(Content-Type中指定的)分成单独的段,每段以--加 boundary 开头,然后是该段的描述头,描述头之后空一行接内容,请求结束的标识为 boundary 后面加--

image

3.2 Http响应详解

HTTP 响应的格式上除状态行(第一行)与请求报文的请求行不一样之外,其他的就格式而言是一样的。 Http响应主药由三部分:响应状态行、响应头、响应体. 3.2.1 响应状态行 Http的响应状态行格式如下:

image

举例: HTTP/1.1 200 OK 那我们说一下常见响应码的含义:

image.png
3.2.2 响应头 响应头同样可用于传递一些附加信息,
注:只是部分信息。
Server: nginx/1.12.2
Date: Wed, 30 Jan 2019 02:06:41 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: JSESSIONID=96C4243B3715D585A3699BF9451D5FE3; Path=/; HttpOnly
Content-Language: zh-CN

常见的响应Header

image.png
3.2.3 响应体

响应体也就是网页的正文内容,一般在响应头中会用 Content-Length 来明确响应体的长度,便于浏览器接收,对于大数据量的正文信息,也会使用 chunked 的编码方式。

Http的相关知识其实有很多,我们这里只是说了常见的部分,大家可以深入了解一下,再次感谢参考文章。

最后,小编这里放上自己整理的Android学习思维脑图及架构资料。

image

资料领取

点赞+加群免费获取 Android IOC架构设计

加群领取获取往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

相关文章

  • Android-Http

    HTTP相关知识使我们面试或者实际开发中经常用到的,今天我们来做个总结。 1.Http的简介 1.1 Http的含...

  • Android-Http

    参考文章: https://mp.weixin.qq.com/s/38GrbReICfu54-nEWylqIQ h...

  • Android-http请求加密机制

    加密算法,蹦蹦蹦噔噔噔噔。。。 基本概念密码学的三大作用:加密(Encryption),认证(Authentica...

网友评论

    本文标题:Android-Http

    本文链接:https://www.haomeiwen.com/subject/rthivqtx.html