Android-Http

参考文章:

1.Http的简介

1.1 Http的含义

HTTP 全称是 HyperText Transfer Protocal 即超文本传输协议。Http是一种基于TCP/IP协议的一种传输协议。我们知道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 网络协议四层?

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

6748497-4e1ede2a9578de10.png

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


image.png

那我们就参考上图分别说一下与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.png

从图中可以看出,建立连接经历了三次握手,当数据传输完毕,需要断开连接,而断开连接经历了四次挥手:

  • 第一次挥手:主机1(可以是客户端或服务器),设置seq和ack向主机2发送一个FIN报文段,此时主机1进入FIN_WAIT_1状态,表示没有数据要发送给主机2了

  • 第二次挥手:主机2收到主机1的FIN报文段,向主机1回应一个ACK报文段,表示同意关闭请求,主机1进入FIN_WAIT_2状态。

  • 第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,主机2进入LAST_ACK状态。

  • 第四次挥手:主机1收到主机2的FIN报文段,想主机2回应ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段后,关闭连接。此时主机1等待主机2一段时间后,没有收到回复,证明主机2已经正常关闭,主机1页关闭连接

1.3.2 网络层的IP

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

1.3.3 Http工作流程

参考:https://mp.weixin.qq.com/s/7sX3AY7gJomJ2ZEErUqmKA
第一步:地址解析,从url中解析协议名称,主机名,端口号和对应的页面地址。

第二步:封装http的请求数据包:这一步主要是封装自己的信息,比如在post请求时,我们会塞进一个data数据。

第三步:封装tcp包,建立连接:因为是基于tcp的协议,网络连接是tcp来完成的,必然要封装成tcp包,然后tcp再做自己工作,比如封装ip包,一层层往下传。

第四步:发送请求:数据整好了,连接也完事了,那就发送action了。

第五步:服务端响应:接受到请求,然后给出响应。

第六步:服务端关闭tcp的连接:一次通信完成之后,若conection的设置不是keep-live的话,服务端会自动关闭tcp的连接。

2.URL详解

3.1 URL含义

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

3.2 URL构成

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

名称 功能
schema 访问服务器以获取资源时要使用哪种协议,比如,http,https 和 FTP 等
host HTTP 服务器的 IP 地址或域名,IP地址是一个最原始的东西,必须通过IP地址才可以找到其他的计算机;而域名只是为了人们记的方便,给出的一个名字。域名的IP地址绑定了以后,当别人访问这个域名的时候就可以通过DNS解析成IP,再进行访问。
port HTTP 服务器的默认端口是 80,这种情况下端口号可以省略,如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080
path 访问资源的路径
query-string 发给 http 服务器的数据 ,比如参数
#anchor 锚,什么是锚呢?比如:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name这个链接,锚部分就是从“#”开始到最后。本例中的锚部分是“name”。锚不是一个URL必须的部分 。默认情况下,Google的网络蜘蛛忽视URL的#部分。但是,如果你希望Ajax生成的内容被浏览引擎读取,那么URL中可以使用"#!",这里我们不过多解释

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

名称 对应的字段
Schema http
host www.mywebsite.com
path /js/test/test.aspx
Query-string name=sviergn&x=true
anchor stuff

再来张比较直观的图

image

3.Http 详解

3.1 Http请求详解

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

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


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

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

方法名 功能
GET 向指定的资源发出“显示”请求,使用 GET 方法应该只用在读取数据上,而不应该用于产生“副作用”的操作中
POST 指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或者修改现有资源,或两者皆有。
PUT 向指定资源位置上传其最新内容
DELETE 请求服务器删除 Request-URI 所标识的资源
OPTIONS 使服务器传回该资源所支持的所有HTTP请求方法。用*来代替资源名称,向 Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作
HEAD 与 GET 方法一样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分,它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中关于该资源的信息(原信息或称元数据)
TRACE 显示服务器收到的请求,主要用于测试或诊断
CONNECT HTTP/1.1 中预留给能够将连接改为通道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器)

其中,最常见的是 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

名称 作用
Content-Type 请求体/响应体的类型,如:text/plain、application/json
Accept 说明接收的类型,可以多个值,用,(英文逗号)分开
Content-length 请求体/响应体的长度,单位字节
Content-Encoding 请求体/响应体的编码格式,如 gzip、deflate
Accept-Encoding 告知对方我方接受的 Content-Encoding
ETag 给当前资源的标识,和Last-Modified、If-None-Match、If-Modified-Since配合,用于缓存控制
Cache-Control 取值一般为no-cache、max-age=xx,xx为整数,表示资源缓存有效期(秒)

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

名称 作用
Authorization 用于设置身份认证信息
User-Agent 用户标识,如:OS 和浏览器的类型和版本
If-Modified-Since 值为上一次服务器返回的Last-Modified值,用于确定某个资源是否被更改过,没有更改过就从缓存中读取
If-None-Match 值为上一次服务器返回的 ETag 值
Cookie 已有的Cookie
Referer 标识请求引用自哪个地址,比如你从页面 A 跳转到页面 B 时,值为页面 A 的地址
Host 请求的主机和端口号

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

image.png

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

image.png

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

image.png
3.2 Http响应详解

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

image.png

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

状态码 对应信息
1xx 提示信息—表示请求已接收,继续处理
2xx 用于表示请求已被成功接收、理解、接收
3xx 用于表示资源(网页等)被永久转移到其它 URL,也就是所谓的重定向
4xx 客户端错误—请求有语法错误或者请求无法实现
5xx 务器端错误—服务器未能实现合法的请求

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

名称 作用
Date 服务器的日期
Last-Modified 该资源最后被修改的时间
Transfer-Encoding 取值一般为 chunked,出现在 Content-Length 不能确定的情况下,表示服务器不知道响应板体的数据大小,一般同时出现Content-Encoding响应头
Set-Cookie 设置 Cookie
Location 重定向到另一个 URL,如输入浏览器就输入 baidu.com 回车,会自动跳转到https://www.baidu.com 就是通过这个响应头控制的
Server 后台服务器

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容