三、对HTTP的理解及HttpClient简单应用

开发交流
收藏
0 935
Sunny912
ramble 未认证 2019-07-26 10:21:08
付费话题:0 积分

1. Http协议

1.1 相关概念:

Http协议(HyperText Transfer Protocol,超文本传输协议):是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。是用于从WWW服务器传输超文本到本地浏览器的传送协议,它可以使浏览器更加高效,使网络传输减少,它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。是应用层协议,基于TCP/IP传输数据,由请求和响应构成,是一个标准的客户端服务器模型,是一个无状态的协议,默认端口号为80,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。

IP(Internet Protocol  网际协议):是计算机用来相互识别的通信的一种机制,每台计算机都有一个IP.用来在internet上标识这台计算机。  IP 负责在因特网上发送和接收数据包。通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。IP 负责将每个包路由至它的目的地。(IP协议仅仅是允许计算机相互发消息,但它并不检查消息是否以发送的次序到达而且没有损坏(只检查关键的头数据))

TCP(Transmission Control Protocol 传输控制协议) TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCPIP地址之上引端口(port),它允许计算机通过网络提供各种服务。服务或者守护进程:在提供服务的机器上,有程序监听特定端口上的通信流,例如大多数电子邮件通信流出现在端口25上,用于wwwwHTTP通信流出现在80端口上。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信,占用两个计算机之间整个的通信线路。TCP 用于从应用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。

->[TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。IP 负责计算机之间的通信。TCP 负责将数据分割并装入 IP 包,IP 负责将包发送至接受者,传输过程要经IP路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址,然后在它们到达的时候重新组合它们。 TCP/IP TCP IP 两个协议在一起协同工作,有上下层次的关系]

URI全称:Uniform Resource Identifier,即统一资源标识符 

URL全称:Uniform Resource Locator,即统一资源定位符。

->[URLURI的子集,也就是说每个URL都是URI,但不是每个URI都是URLURI还包括一个子类叫作URNUniversal Resource Name),即统一资源名称,它只命名资源并不指定如何定位资源]

HTTPSHTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

1.2 特点:

1.2.1 基于请求/响应模型的协议。请求和响应必须成对,先有请求后有响应;

1.2.2 HTTP 0.91.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间;

1.2.3 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快;

1.2.4 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GETHEADPOST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;

1.2.5 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记

1.3 工作流程

1.3.1 地址解析:假设访问页面为:http://localhost.com:8080/index.html,分解结果如下:

                协议名:http

                主机名:localhost.com

                端口:8080

                对象路径:/index.html

                在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址,域名解析过程:

                    

                ①查询浏览器自身缓存:以chrome为例:在浏览器地址栏输入: chrome://net-internals/#dns(chrome缓存1分钟,大概有1000条缓存)

                ② 查询OS自身缓存:cmd->   ipconfig  /displaydns

清除OS自身缓存:cmd  ->  ipconfig  /flushdns

                ③ 读取hosts文件:C:\Windows\System32\drivers\etc\hosts

                ④ 向本地DNS服务器请求,向本地配置的首选DNS服务器发起域名解析请求,

通过UDP协议向DNS53端口发起请求;

                ⑤ 查找NetBIOS name Cache,它就存在于客户端电脑中

1.3.2 通过ARP协议获得IP地址对应的物理机器的MAC地址

1.3.3 封装Http请求数据包

1.3.4 封装成TCP包,建立TCP连接(三次握手)


                ① Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接 请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client                己的 初始序号(seq = 0 就代表这是第0号帧),这时候Client进入syn_sent状态,表示客 户端等待服务器的回复;

                ② Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首 部中的SYN ACK都置1 ack = x + 1表示期望收到对方下一个报文段的第一个                  字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1, 就是期望客户端的第1个帧),seq = y 表示Server 自己的初始序号(seq=0                代表这是 服务器这边发出的第0号帧)。这时服务器进入syn_rcvd,表示服务器已经收到Client 的连接请求,等待client的确认;

                ③ Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个帧),Client自己的序号                 seq= x + 1(表示这就是我的第1个帧,相对于第0个帧来说的),一旦收到Client的确认之 后,这个TCP连接就进入Established状态,就可以发起http请求了

1.3.5 客户端发起http请求

1.3.6 服务器端响应http请求,浏览器得到html代码

1.3.7 浏览器解析html代码,并请求html代码中的资源

1.3.8 浏览器对页面进行渲染呈现给用户

                  1.3.9 客户端服务端断开连接,进行四次挥手

            

              客户端先发送FIN报文(第24帧),用来关闭主动方到被动关闭方的数据传送,也 就是客户端告诉服务器:我已经不会再给你发数据了(当然,在fin包之前发送出                的数 据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),但此时客户端 还可以接受数据;

                ② Server端接到FIN报文后,但是如果还有数据没有发送完成,则不必急着关闭Socket 可以继续发送数据。所以服务器端先发送ACK(第25帧),告诉Client端:请                求已经收 到了,但是我还没准备好,请继续等待停止的消息。这个时候Client端就进入FIN_WAIT 状态,继续等待Server端的FIN报文;

                ③ 当Server端确定数据已发送完成,则向Client端发送FIN报文(第26帧),告诉Client 端:服务器这边数据发完了,准备好关闭连接了;

                ④ Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,所以发 ACK后进入TIME_WAIT状态(第27帧), Server端收到ACK后,就知道可以断                开连 接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,最后, Client端也可以关闭连接了至此,TCP连接就已经完全关闭了

1.4 请求(请求行+请求头+空行+请求体)


    请求行:

格式:请求方式 资源路径 协议/版本;

请求行在http请求格式的第一行

请求方式:GET:将参数追加在url后面(不安全),向特定的资源发出请求,url 长度限制get请求方式数据的大 小;

POST:向指定资源提交数据进行处理请求(提交表单或上传文件)请求参数在 请求体中;

HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。 这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息 头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近 是否更新;

DELETE:请求服务器删除Request-URI所标识的资源;

OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法;

PUT:向指定资源位置上传其最新内容

TRACE回显服务器收到的请求,主要用于测试或诊断

CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器;

PATCH:用来将局部修改应用于某一资源,添加于规范RFC5789

->[GET/POST区别:


]

请求头:

AcceptAccept:告诉服务端,该请求所能支持的响应数据类型,专业术语称为MIME 类型(文件类型的一种描述方式)MIME格式:大类型/小类型[;参数]

if-Modified-Sincce:浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存;

Cookie:客户机通过这个头,将Coockie信息带给服务器;

User-Agent:浏览器通知服务器,客户端浏览器与操作系统相关信息;

Connection:表示客户端与服务连接类型;Keep-Alive表示持久连接,close已关 闭;

Host:请求的服务器主机名;

Content-Length:请求体的长度;

Content-Type:请求的与实体对应的MIME信息。如果是post请求,会有这个头, 默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码;

Accept-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如GZIP 压缩;

Accept-Language:浏览器通知服务器,浏览器支持的语言。各国语言(国际化 i18n)

Cache-Control:指定请求和响应遵循的缓存机制;

->[请求头属性对照表:


]

请求体:

                    当请求方式是post的时,请求体会有请求的参数,格式如下:

                        

        1.5响应(响应行+响应头+空行+响应体)

            

            响应行:

 报文协议及版本

② 状态码及描述(HTTP状态码由三个十进制数字组成,第一个十进制数字定 义了状态码的类型,后两个数字没有分类的作用)



响应头:


响应体:

                    服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲  显示页面内容。

        1.6 HTTP协议栈中各层数据流

请求时候,数据在各层协议的数据组织:


[客户机会将请求封装成http数据包-->封装成Tcp数据包-->封装成Ip数据包---> 装成数据帧--->硬件将帧数据转换成bit流(二进制数据)-->最后通过物理硬件(网          芯片)发送到指定地点]

服务器解析时候:


                [服务器硬件首先收到bit....... 然后转换成ip数据包。于是通过ip协议解析 Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接 着发现是http                据包通过http协议再解析http数据包得到数据]

2. HttpClient

    2.1 使用步骤:

2.1.1 创建HttpClient对象;

2.1.2  创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet 对象;如果需要发送POST请求,创建HttpPost对象;

2.1.3 如果需要发送请求参数,可调用HttpGetHttpPost共同的 setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可 调用setEntity(HttpEntity entity)方法来设置请求参数;

2.1.4 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回 一个HttpResponse

2.1.5 调用HttpResponsegetAllHeaders()getHeaders(String name)等方法可获取 服务器的响应头;调用HttpResponsegetEntity()方法可获取HttpEntity对象,该 对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容;

2.1.6 释放连接

    2.2 demo(Nutz mvc):

        

                   2.2.1  Get无参请求

            

            

            

            2.2.2  Get带参请求

                

                

                    

            2.2.3 Post无参请求

                

                

                

            2.2.4 Post带参请求

                    

                    

                

【如有不当之处,欢迎指正】

回帖
  • 消灭零回复