httpClient学习笔记一
HTTP 协议概述
HTTP–Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。
HTTP协议是属于TCP/IP协议簇的,所以先简单介绍下与HTTP相关的TCP/IP知识。
TCP/IP协议簇
TCP/IP协议簇最重要的一个特性就是分层。TCP/IP协议簇按层次分别分为以下四层:应用层、传输层、网络层和数据链路层(OSI参考模型分为七层)。
- 应用层
作用:应用层决定了向用户提供应用服务时通信的活动。eg. DNS、FTP、HTTP。 - 传输层
作用:传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。eg. UDP、TCP。 - 网络层
作用:网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传给对方。 - 链路层
作用:用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC及光纤等物理可见部分。
HTTP关系密切的协议:IP、TCP和DNS
-
1、 负责传输的IP协议
按层次分,IP位于网络层;
IP协议的作用是把各种数据包传送给对方,而要确保传送到对方那里,则需要满足各类条件,其中两个重要的条件是IP地址和MAC地址;
IP间的通信依赖MAC地址,采用ARP协议凭借MAC地址进行通信。 -
2、 确保可靠性的TCP协议
按层次分,TCP位于传输层,提供可靠的字节流服务
所谓字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。
一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据是否送达到对方。 -
3 、负责域名解析的DNS服务
DNS同HTTP协议一样位于应用层,提供域名到IP地址之间的解析服务。
各种协议与HTTP协议的关系
HTTP在发送请求时,如果请求的地址写的是域名,则先访问DNS服务器获取目标服务器的IP地址,
然后生成HTTP请求报文,发送给TCP层,按照TCP/IP通信传输流传输给目标服务器。
URI 和 URL
URI 是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成:
- 访问资源的命名机制
- 存放资源的主机名
- 资源自身的名称,由路径表示,着重强调于资源。
URL 是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
- 协议(或称为服务方式)
- 存有该资源的主机IP地址(有时也包括端口号)
- 主机资源的具体地址。如目录和文件名等
URI 和 URL 之间的关系
URI用字符串标识某一互联网资源,而URL表示资源的地址(互联网上所处的位置),可见是URI的子集。
URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。
HTTP 请求
HTTP请求由状态行、请求头、请求正文三部分组成:
状态行:包括请求方式Method、资源路径URL、协议版本Version;
请求头:包括一些访问的域名、用户代理、Cookie等信息;
请求正文:就是HTTP请求的数据。
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- GET 请求指定的页面信息,并返回实体主体。
- HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的页面。
- CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS 允许客户端查看服务器的性能。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
持久连接节省通信量
在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
假设这样的一个应用场景:使用浏览器请求一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求该HTML里面包含的其他资源。因此,每次的请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
为了解决上述TCP连接的问题,HTTP想出了持久连接(HTTP keep-alive)的方法。持久连接的特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
管线化 持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需要等待并收到响应后,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求,这样就能够同时并行发送多个请求,而不需要一个接一个地等待响应了。
HTTP 响应
服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动作要求,服务端做出具体的动作,将结果回应给客户端,称为HTTP响应。
HTTP响应也由三部分组成:状态行、响应头、响应正文;
状态行:包括协议版本Version、状态码Status Code、回应短语;
响应头:包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息;
响应正文:就是响应的具体数据。
一般我们程序员比较关注的状态码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
与HTTP协作的Web服务器
用单台虚拟主机实现多个域名
一台Web服务器可搭建多个独立域名的Web网站,也可作为通信路径上的中转服务器提升传输效率。如果我们在一台服务器上托管了两个域名,当收到请求时就需要弄清楚究竟要访问哪个域名,因此必须在Host首部内完整指定主机名或域名的URI。
通信数据转发程序:代理、网关、隧道
HTTP通信时,除客户端和服务器以外,还有一些用于通信数据转发的 应用程序和服务器,例如代理、网关和隧道,它们可以配合服务器工作。这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收服务器返回的响应并转发给客户端。
-
代理: 是一种有转发功能的应用程序
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求URI ,会直接转发给前方持有资源的目标服务器。
使用代理服务器的理由:利用缓存技术减少网络带宽的流量。
代理有多种使用方法,按两种基准分类。一类是 是否使用缓存 ,另一种是 是否会修改报文 。
1)缓存代理:代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上,下次请求相同的资源时,则将之前缓存的资源作为响应返回。
2)透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理,否则称为非透明代理。 -
网关: 是转发其他服务器通信数据的服务器
利用网关可以由HTTP请求转化为其他协议通信。
网关的工作机制和代理十分相似,而网关能使通信线路上的服务器提供非HTTP协议服务。 -
隧道: 是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保确保能与服务器进行安全通信,隧道本身不会解析HTTP请求,请求保持原样中转给之后的服务器。 -
保存资源的缓存
利用缓存可减少对源服务器的访问,可以节省通信流量和通信时间。
使用缓存的时候,要注意缓存的有效期限,确保我们发起请求获取的是最新的数据资源。
确保Web安全的HTTPS
通过上面的分析,我们了解到HTTP具有相当优秀和方便的一面,然而,HTTP并非只有好的一面,事物皆具两面性,主要存在以下几点不足:
通信使用明文(不加密),内容可能会被窃听
不验证通信方的身份,因此有可能遭遇伪装
无法证明报文的完整性,所以有可能已遭篡改
HTTP+加密+认证+完整性保护=HTTPS
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TSL协议代替而已,通常,HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS其实就是身披SSL协议这层外壳的HTTP。
当采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。而且SSL协议是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术。
在讲解SSL之前我们需要首先了解一下加密方法,加密分为对称加密和非对称加密。HTTPS协议则是采用的两者混合的实现方式,为什么要结合两种的实现方式呢?这是因为它们都各自存在自己的优缺点。对于对称加密来说,密钥的传输交换是不安全的,但是效率比较高,而对于非对称加密,是不用担心传输的密钥安全性的问题的,因为我们传递的是公开密钥,任何人都可以获得,但是缺点是效率比较低。
名词解释
OSI七层网络模型:OSI七层网络模型
HTTP:HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。
Socket:Socket是一组编程接口(API)。介于传输层和应用层,向应用层提供统一的编程接口。使得应用层不必了解TCP/IP协议细节便直接通过对Socket接口函数的调用完成数据在IP网络的传输。Socket基于传输层差异,可以分为四种类型:基于TCP的Socket、基于UDP的Socket、基于RawIp的Socket、基于链路层的Socket。HTTP使用的是基于TCP的Socket。
TCP建立连接时需要三次握手,在释放连接需要四次挥手;
连接建立的三次握手的过程如下:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
第二次握手:服务器收到syn包,并会确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
TCP释放连接的四次挥手模型:
参考网站:
https://www.w3.org/Protocols/rfc2616/rfc2616.html
http://www.akathink.com/2016/07/28/彻底搞懂HTTP协议/
https://www.bigwasbig.com/