OKHTTP深入浅出(一)----基础理论

OSI模型

        个人理解,OSI七层模型,CS之间的通信流程如图所示。

  • 应用层:就好比浏览器,主要协议有Http、FTP(文本传输协议)、SMP(简单邮件传输协议)、POP3(邮件协议版本3)等。
  • 表示层:对信息进行加密、解密、压缩、解压缩。
  • 会话层:机器已机器之间通过端口建立会话。
  • 传输层:传输协议、TCP、UDP
  • 网络层:将传输过来的数据达成数据包、通过路由器选择最优的路径。
  • 数据链路层:控制网络和物理层之间的通信,保证在不可靠的物理线路上进行数据的可靠传输。交换机
  • 物理层:网线、光纤。

1.1 什么是HTTP

http 是超文本传输协议。超文本:就是超过了普通的文本,包括:文字、图片、视频等的混合体,最关键的是超链接。 传输:两点之间传输数据(允许中间有中转)

1.2 http报文组成

请求报文:

  • 请求行:请求方法、URL、协议/版本
  • 请求头(Request header)
  • 请求正文

响应报文:

  • 状态行
  • 响应头
  • 响应正文

            

 1.3 HTTP字段

 host字段:

       可以将请求发送到同一台服务器上不同的网站。例如,一个IP(111.111.111.11)地址可以对应多个域名A、B、C。然后通过域名供应商将ABC与服务器的IP地址关联起来,那么通过ABC任何一个域名最终都会访问到IP111.111.111.11。这时就需要host了,host可以看成服务器IP上的一个站点,每次通过ABC域名都会访问到同一个服务器,但是通过不同的HOST可以区分出访问的服务器的不同的站点。

                                           host:www.baidu.com

Content--Length字段:

          Content--Length:1000 表明此次回应的数据长度为1000字节,此长度后面的字节不属于此次回应的数据。

Connection字段:

          表明客户端要求服务器试用TCP持有连接,以便其他请求复用,直到客户端或者服务器主动断开连接。

          Connection:keep--alive

          http/1.1 版本的默认连接都是持久连接,但是为了兼容老版本,还是需要指定,不是标准字段。

Content--type字段:

            用于服务器回应时,告诉客户端,本次数据的格式。

            Content--Type:text/html;charset=utf-8 表明发送的是网页,编码是UTF-8。

            客户端在请求的时候,可以使用Accept字段表明可以接受的数据格式。

            Accept:*/* 表明客户端可以接受任何格式的数据。

Content-Encoding字段:

            表明数据的压缩方法,表示服务器返回的数据使用什么压缩格式。

           Content-Encoding:gzip 服务器返回的数据使用了gzip的压缩格式,客户端需要用此方式解压、

           客户端在请求的时候用Accept--Encoding字段说明接受哪些压缩方法:

           Accept--encoding:gzip , deflate

1.4 http状态码

  • 1XX:提示信息,协议处理中的一种中间状态,实际中用到的比较少。
  • 2XX:服务器成功处理了客户端的请求。
  • 3XX:重定向。客户端请求的资源发生了变动,需要客户端用新的URL请求资源。常见的有:301:永久重定向,请求的资源不存在了;302:临时重定向,资源还在,暂时需要用另一个URL访问;301、302都会在响应头中使用字段location,指明后续要跳转的URL,浏览器会自动重定向新的URL。304:不具有跳转的含义,资源未修改,重定向已存在的缓存文件,用于缓存控制。
  • 4XX:客户端发送的报文有错误,服务器无法处理。常见的有:400:笼统性的说明服务端报文有错误;403:服务器禁止访问资源;404:客户端请求的资源不存在。
  • 5XX:服务器内部发生了错误。常见的有:500:笼统性错误;501:还不支持客户端的请求;502:服务器作为网关或代理时返回的错误码,服务端自身正常,访问后端服务器发生了错误;503:服务器忙,稍后在试。

1.5 GET 与 POST 请求

get请求的含义是从服务获取资源,是安全幂等的,post请求是向URI指定的资源提交数据,不是安全幂等的,数据就放在报文的body。get类似看朋友圈,post则是评论朋友圈。

在http协议里,安全和幂等的概念,安全就是请求的方法不会破坏服务器的资源,幂等就是多次操作,服务器返回的资源相同。

GET是直接添加到URL后面的,直接就可以在URL中看到内容,而POST是放在报文内部的,用户无法直接看到。

GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。

1.6 http特性

1.6.1 http/1.1的优缺点:

优点:

  • 简单:http的基本报文格式就是header+body,头部信息也是key-value简单文本格式。
  • 灵活和易于扩展:http协议中的各种请求方法、URL/URI 、状态码、头字段等都没有固定死,允许开发人员自定义和扩充。同时http位于应用层(7),下层可以随意变化。HTTPS就是在http与tcp层增加了SSL/TLS 安全传输层,http3则将把TCP换成了基于UDP的QUIC。
  • 跨平台和应用广泛:

缺点:

  • 不安全:http是用明文传输,相当于裸奔;不验证通信方的身份,可能会遭遇伪装;无法证明报文的完整性,可能会被篡改。
  • 无状态:无状态的好处可能是,不需要额外的资源记录状态信息,能够减少服务器的压力,缺点就是每次操作都需要验证,连续的操作体检极差。解决无状态的方法,最常用的采用Cookie技术。Cookie通过在请求和响应报文中写入cookie信息来控制客户端的状态。相当于客户端在第一次请求后,服务器会下发一个带有客户端信息的tag,后续客户端请求服务器的时候,会带上这个tag,服务器就认识了。

1.6.2 http/1.1的性能

      http协议是基于TCP/IP协议的,使用了 请求--应答 的通信模式。因此性能关键在于这两点

     长连接:早期的http1.0 性能上的最大问题就是每次发起一个请求,都要新建一次TCP连接(三次握手),并且是串行去请求,做了无谓TCP连接和断开,增加了通信的开销。

为了解决连接问题,http1.1提出了长连接(持久连接)的通信方式,有效的减少了无谓TCP连接和断开。持久连接的特点就是,只要任意一段没有明确提出断开连接,就是保持连接状态。

     管道传输(pipeline):http1.1采用了长连接的方式, 使得管道传输成为了可能。即在同一个TCP连接,客户端可以在同一个TCP连接中发起多个请求,能够减少整体的响应时间。

例如:客户端需要两个资源。以前的做法就是在同一个TCP连接中,先发送A请求,然后等待服务端做出回应,收到之后在发送B请求.管道机制允许同时发出A和B,但是服务器还是按照顺序,先回应A请求,在回应B请求。要是A回应比较慢,那么B就要排队等待。这被称为“队头堵塞”。

      队头堵塞

     

2 TCP的三次握手和四次挥手

2.1 TCP的三次握手

     第一次握手:建立连接. 客户端(client) 发送连接请求.将SYN设置为1,SequenceNumber(seq)设置为x;接下来客户端进入SYN_SENT状态.等待服务器(service)的确认.

 第二次握手:服务器收到客户端的SYN报文段,对SYN报文进行确认,设置Acknowledgment Number(ACK)为x+1(seq+1),同时设置自己的SYN请求信息,设置SYN为1,将seq设置为y,服务端将上述所有的信息都放到SYN + ACK 报文之后,发送给客户端,此时服务端进入SYN_RCVD状态.

  第三次握手:客户端收到服务器的SYN+ACK报文后,将ACK设置为y+1,先服务器发送ACK报文,这个报文发送完毕后,客户端和服务器都进入ESTABLISHED(TCP链接成功)状态,完成TCP的三次握手.

 2.2 TCP 的四次挥手

      四次挥手的过程:

 第一次挥手: 客户端设置seq和ACK,向服务器发送一个FIN报文段.此时客户端进入FIN_WAIT_1状态,表示客户端没有数据向服务器发送了.

第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回了一个ACK报文.

 第三次挥手:服务端向客户端发送方FIN报文段,请求关闭连接,同时服务器进入LAST_ACK状态.

第四次挥手:客户端收到服务器的发送的FIN报文段,向服务器发送ACK报文段,然后客户端进入TIME_WAIT状态.服务器收到客户端的ACK报文后,就关闭链接.此时客户端等待两秒(最大报文生成时间)后,依然没有收到回复,说明服务器已经正常关闭了,这样客户端也可以关闭连接了.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值