Android网络编程随想录(2)
上篇文章介绍了传输层TCP协议的理论知识,本文主要介绍了TCP协议基础之上HTTP协议和HTTPS协议的理论知识。
HTTP协议基于TCP协议定义了客户端向服务器请求数据的方式,它是面向事务的应用层协议具有灵活、简单快速、无连接和无状态的特点,是网络中交换各类数据的基础。
HTTP协议的请求与响应报文
HTTP报文的格式如下所示:

我们可以看出,HTTP协议的报文主要分为报文首部和报文主体两部分,中间用空行隔开。下面让我们详细介绍一下请求报文和响应报文:
请求报文
请求报文由三部分组成:请求行,请求报头,报文主体(请求数据)。如下图所示

请求行中包括了请求方法、URI、协议版本三部分信息。
其中请求方法包括以下八种,常用的是GET和POST:
- GET 请求获取Request-URI所标识的资源
- POST 在Request-URI所标识的资源后附加新的数据
- HEAD 请求获取由Request-URI所标识的资源的响应消息报头
- PUT 请求服务器存储一个资源,并用Request-URI作为其标识
- DELETE 请求服务器删除Request-URI所标识的资源
- TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT 保留将来使用
- OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
请求的URI标识了请求资源的位置,而协议版本主要有HTTP/1.0和HTTP/1.1两个版本。
请求报头中包含了有关请求的各种信息,例如
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host: 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
报文主体中存放了请求的数据,主要是在post方法中使用,适用于提交表单等场合。
响应报文
响应报文也由三部分构成:状态行,响应报头,报文主体,如下图所示:

状态行中包括HTTP协议版本,响应状态码以及状态码的文本描述。其中状态码有五类:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
响应报头中包含了有关响应的各种信息。在报文主体中包含了需要传输的响应数据,例如HTML,二进制的数据等等。
介绍完了HTTP协议的请求与响应报文,下面以浏览器请求HTML页面为例,我们看一下HTTP客户端与服务器之间的交互过程:
- 客户端浏览器分析URL,向DNS请求解析地址
- 域名系统DNS解析出服务器的IP地址返回给客户端
- 客户端与服务器建立TCP连接并发送GET请求报文
- 服务器给出响应,把相应html文件发送给客户端浏览器
- 释放TCP连接
- 浏览器显示HTML文件
HTTP使用了TCP协议保证了可靠传输,但其本身是无连接的,也就是说双方在发送报文之前无需建立连接。同时,HTTP协议也是无状态的,服务器不保存客户端信息,更容易支持大量并发的HTTP请求。在HTTP1.0中,每次请求一个连接对象,都要发起一次连接,这样会导致请求很低效。在HTTP1.1中,使用了持续连接,也就是说服务器在响应客户端请求后在一段时间内保持连接,这样客户端与服务器之间在一段时间内可以持续保持着条连接。HTTP1.1协议持续连接有两种工作方式:
- 非流水线方式:客户端在收到一个响应报文后才发送下一个请求。服务器在发送完一个对象后,TCP连接处于空闲状态,浪费了服务器资源。
- 流水线方式:客户端在收到响应报文之前就可以连续发送请求报文,提高了传输效率。
cookie
上面提到HTTP协议是无状态的,无论客户端还是服务端都不记录HTTP相关信息。但是可以通过cookie来保存客户端和服务端保存信息,机制如下:

cookie是一种很小的文本文件,用于在客户端保存由服务器确定的内容,请求报文会自动添加cookie中的内容。
HTTPS协议
HTTP协议在传输过程中采用明文,并且无认证和完整性验证。而HTTPS就是使用了SSL协议的HTTP协议,虽然牺牲了速度,但是保证了数据的安全性,适用于金融支付环境。
总结完HTTP协议的知识,下一篇文章将会介绍在Android开发中会用到的HttpClient和UrlConnection库。
Android网络编程随想录(2)的更多相关文章
- Android网络编程随想录(1)
本系列文章对整个Android网络编程进行了总结,包括基本的TCP/IP协议,HTTP协议,HTTPS协议,HttpClient,UrlConnection,一些网络通信的库到棉花糖新加入的OKHTT ...
- Android网络编程随想录(四)
前面三篇文章从最基础的TCP,HTTP协议理论开始,然后介绍了在Android的开发中所使用的HttpClient和HttpUrlConnection这两种Http客户端.在本文中,我们一起来学习一下 ...
- Android网络编程随想录(3)
大多数Android的app都会使用HTTP协议来发送和接收数据.在Android开发中,通常使用两种http客户端:一个是Apache的HttpClient,另一个是HttpURLConnectio ...
- Android网络编程只局域网传输文件
Android网络编程之局域网传输文件: 首先创建一个socket管理类,该类是传输文件的核心类,主要用来发送文件和接收文件 具体代码如下: package com.jiao.filesend; im ...
- Android网络编程基础
Android网络编程只TCP通信 TCP 服务器端工作的主要步骤如下.步骤1 调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上.步骤2 调用acc ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- Android网络编程系列 一 Socket抽象层
在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽 ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- Android网络编程概述
Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...
随机推荐
- HDU_1969_二分
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- MySQL NULL 值如何处理?
我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. 为了处理这种情况,MySQL提 ...
- 【转载】VMware完全卸载
出现安装时出现vmwareworkstationxxx.msi failed问题是官方解决方案...真心详细. http://kb.vmware.com/selfservice/microsites/ ...
- selenium使用Xpath+CSS+JavaScript+jQuery的定位方法(治疗selenium各种定位不到,点击不了的并发症)
跟你说,你总是靠那个firebug,chrome的F12啥的右击复制xpath绝对总有一天踩着地雷炸的你死活定位不到,这个时候就需要自己学会动手写xpath,人脑总比电脑聪明,开始把xpath语法给我 ...
- shell常用语法
for.if条件: https://blog.51cto.com/qiufengsong/1252889 一.for循环: );do echo $i done ###第一行:seq是指1到10,第二行 ...
- 【剑指Offer】9、变态跳台阶
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路: 当只有一级台阶时,f(1)=1:当有两级台阶时, ...
- 设置快捷键用sublime直接打开浏览器
1.安装sidebarenhancements插件 ctrl+shift+p —> Install Package —> 找到SideBarEnhancements 2.配置预览快捷键 / ...
- Leetcode 887 Super Egg Drop(扔鸡蛋) DP
这是经典的扔鸡蛋的题目. 同事说以前在uva上见过,不过是扔气球.题意如下: 题意: 你有K个鸡蛋,在一栋N层高的建筑上,被要求测试鸡蛋最少在哪一层正好被摔坏. 你只能用没摔坏的鸡蛋测试.如果一个鸡蛋 ...
- mysql查询昨天 一周前 一月前 一年前的数据
mysql 昨天 一周前 一月前 一年前的数据 这里主要用到了DATE_SUB, 参考如下 代码如下: SELECT * FROM yh_contentwhere inputtime>DATE_ ...
- java并发之停止线程
停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作.停止一个线程可以用Thread.stop()方法,但最好不要用它.虽然它确实可以停止一个正在运行的线程,但是这个方法是不安 ...