Android 网络基础 -- Web发展及 TCP/IP 、HTTP 介绍

本文来自 图解 HTTP ,相关资料与图片均来自于该书

首先,当客户端在输入 URL 的时候,需要从服务端拿到 web 要显示的资源,这个过程,使用一种名为 HTTP 的超文本协议作为规范,完成客户端到服务端等一系列的运作流程。可以说, Web 是建立在HTTP协议上通信的。

Http 的制定就是为了解决文本传输的难题。在了解 Http 之前,先了解 TCP/IP 协议簇。

一、TCP/IP

通常使用的 网络,是在 TCP/IP 协议的基础上运作的,而 HTTP 只是属于他的一个子集。
定义:

计算机之间要相互通信,双方就必须基于相同的方法。比如,谁先通信?用什么语言?怎样结束等规则都需要事先确定。不同硬件,操作系统之间的通信,所有的这一切都需要规则,我们把这种规则叫做协议。
协议中存在各种各样的内容,比如 IP 地址,Web 页面显示等等,像这样把与互联网相关联的协议集合起来总称 TCP/IP。

TCP/IP 分为4层,分别是 应用层 - 传输层 - 网络层

  • 应用层 :决定了想用户提供应用服务时通信的活动。比如 FTP (文件传输协议),DNS (域名系统),HTTP 等处于该层。
  • 传输层 :只有两个协议,TCP 和 UDP。
  • 网络层 :又名网络互联层;网络层用来处理在网络流动的数据包,数据包是网络传输的最小单位。与多台计算机通信时,网络层就是在众多选项内选择一条传输路线,比如通过 IP.
  • 链路层 :用来处理连接网络的硬件部分,比如网卡,光纤等物理可见部分,硬件上范畴均在链路层的作用范围内。

如当客户端请求一个 Web 显示的页面到服务端,则需要经过以下流程:
在这里插入图片描述

  1. 在应用层上,使用HTTP 发送一个想看某个 Web 页面的 HTTP 的请求:
  2. 为了方便,在传输层中使用 TCP 对报文进行分割,并在报文上打上序号和端口号,发给网络层
  3. 在网络层 (IP 协议),增加作为通信目的地 MAC 地址后转发链路层
  4. 在链路层,打上自己的首部后,传递给服务端的链路层,再一路路解析回去。

发送端在层与层之间传输数据时,没经过一层都会打上该层所属的首部信息。反之,在接收端则是每经过一层,就会把该层的首部信息去掉。 如图:
在这里插入图片描述

二 与HTTP关系密切的协议:IP、TCP 和 DNS

下面分别对 TCP/IP 中与 HTTP 密不可分的 3 个协议做相关介绍。

2.1 IP协议:

把各种数据包传送给对方。而保证传输到对方那里,两个重要的条件就是 IP 地址 和 MAC 地址。

  • IP 地址:指明了节点分配到的地址;
  • MAC 地址: 网卡所属的固定地址。

IP 可变,但 MAC 地址基本不变,两则相互配合,IP 间的通信依赖 MAC 地址。两者通信则是通过 ARR 协议(ARR 是一种能解析地址的协议,根据通信的 IP 地址就可以反查对应的 MAC 地址)
通过路由的方式,就可以从一个 ip 访问另一个 ip了。如下图:
在这里插入图片描述

2.2 TCP 协议

TCP 位于传输层,提供可靠的字节流服务。

TCP 主要把大数据分割成以报文段为单位的数据包进行管理,并确保自身能够把数据传递给对方。而为了能把数据传递给对方,TCP 采用了三次握手的策略。

2.2.1 三次握手

为了确保数据能送到对方,TCP 使用了两个标志 SYN 和 ACK 两个标志。
首先,客户端发送一个带有 SYN 标志的数据包给 服务端; 服务端接收端之后,回送一个带有 SYN/ACK 标志的数据给客户端,表示确认信息。最后,发送端再传递一个带 ACK 标志的数据包,代表 “握手” 结束。若这个过程某个阶段中断,则表示这个传输中断,TCP 协议会再次以相同的顺序发送相同的数据包,如图:
在这里插入图片描述
当然除了三次握手,TCP 协议还有各种手段来保证通信的可靠性。

2.3 DNS 服务

DNS 也一样位于应用层,提供域名到 IP 地址之间的解析服务。
当客户端发送一个域名时,会通过 DNS 服务,从服务端拿到正确的ip,再去拿到对应的资源,如下图:
在这里插入图片描述

三、HTTP 协议

在上面减少了 TCP/IP 等知识后,接着认识 HTTP 协议相关的知识。
请求报文:
首先,如果客户端要请求某个 Web 的页面,在发送的报文组成如下所示:

GET /index.htm HTTP/1.1
Host: hackr.jp

起始的 GET 表示请求的类型,接着是请求访问的资源对象,最后则是版本号,所以请求报文的格式如下:
请求方法 - 请求URI - 协议版本 - 可选的请求首部字段 - 实体内容组成。
图解如下:
在这里插入图片描述
HTTP 的请求报文中的方法有以下几种:

  • GET : 请求的资源(url)为明文,即访问服务器的资源,不对服务器的资源做修改,由于 GET 请求会把参数拼接在 url 后面,后面造成安全问题。
  • POST :可以对服务器进行状态修改,常用来做数据提交,新增等操作;POST 的参数在请求体中,所以相对安全些。
  • PUT : 也可以对数据进行修改,但一般用于传输文件,由于 PUT 自身不带验证机制,任何人都可以上传,一般需要 Web 应用自身带有验证机制,否则有安全问题
  • DELETE :用于删除文件,同 PUT ,自身也不带验证机制。
  • HEAD : 获取报文首部,只是不返回报文主体,一般拥有确认URI有效性和时间等

除了上述方法,还有 OPTIONS,TRACE,CONNECT 等方法,感兴趣的可以自行查阅。

返回报文:
在接收到接收报文之后,服务器也会返回处理结果:

HTTP/1.1 200 OK 
Date: Tue, 10 Jul 2012 06:50:15 GMT 
Content-Length: 362 
Content-Type: text/html
<html>
 ……

其实开头为版本协议,紧挨着的 200 OK 是请求的处理结果的状态码原因短语。这里,可以总结它的规律为:
协议版本 - 状态码 - 原因短语 - 可选的响应首部字段 - 实体内容 组成
在这里插入图片描述

HTTP 是不保存状态的协议,即HTTP协议不对请求和响应的通信状态进行保存,也就是发送过的请求和响应都不做持久化处理。每一次请求都会对应新的响应,这是为了更好更快地处理事务,确保协议的伸缩性。

从上面知道,HTTP 是不保存状态的协议,但有时需要持久化,比如登录状态,这个时候,就可以和 Cookie 结合,实现持久化,关于Cookie 的知识后面再学习。

3.1 持久性

早起的 HTTP 是每响应一次都会断开一次,下次重新访问该资源时,又会重新请求资源;这样会增加通信的开销,为了解决这个问题,提出了持久性连接,keep-alive 的概念啊,即任何一端没有明确提出断开,则一直保持 TCP 连接。

3.2 管线化

以前发送请求后需要等待并受到相应,才能发送下一个请求, 在持久化实现后,则使用管线化技术,可以不用等相应到达即可发送下一次请求,实现并发请求。从而使网页打开更快:
在这里插入图片描述

3.3 使用 Cookie 实现状态管理

上面说到,HTTP 是不保存状态的协议,但是比如用户登录,再请求某个 web 时,是需要该状态的,总不能每次请求,都重新登录一遍。
但这个状态如果让服务器去记住客户端,那服务器肯定吃不消,所以引入了 Cookie 技术。
Cookie 是在请求报文响应报文中写入 Cookie 信息,来控制客户端的状态。
当客户端登录后,服务器会在响应报文中加入 Set-Cookie 的首部字段信息,此时需要客户端自身去存储这个 cookie 信息,当下次发送请求报文时,在首部字段加入 cookie 的值,既能告知服务器的状态,服务器则会根据 cookie 信息,去检查哪个客户端发送过来的请求,从而给回对应的响应。如下图:
在这里插入图片描述
服务器返回有 cookie 的报文如下:

HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache 
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed, 10-Oct-12 07:12:20 GMT> 
Content-Type: text/plain; 
charset=UTF-8

下次访问中,客户端就可以带上 cookie 的请求报文去告知服务器了:

GET /image/ HTTP/1.1
Host: hackr.jp
 Cookie: sid=1342077140226724

至此,网络基础部分讲完了,后面继续学习 HTTP 相关知识。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章