美文网首页
Android网络基础

Android网络基础

作者: 咊庭 | 来源:发表于2017-11-02 17:41 被阅读17次

    前言

    做开发到现在,一直在重复用着别人造好的轮子,就拿网络框架来说吧,Retrofit和okHttp的组合用起来十分方便,功能也强大,但一直处于只会用,但不了解原理,也没有对网络编程进行过系统的学习,今天打算对网络编程进行系统的学习和整理。

    Http请求和响应步骤

    image.png
    tcp三次握手

    所谓三次握手即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送三个包以确认连接的建立。

    第一次握手:客户端发送syn(syn=j)包到服务器,并进入SYN_SEND状态,等待服务器确认。
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即(syn+ack)包,并进入SYN_RECV状态。
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
    tcp一旦建立,在通信双方中的任一方主动关闭连接之前,TCP连接都将被一直保持下去。

    浏览器像服务器发送请求命令

    一旦tcp连接建立成功后,浏览器会向服务器发送请求命令。

    请求行 (请求方式 资源地址 协议脚本)
     GET http://baidu.com HTTP/1.1
    
    浏览器发送请求头信息

    浏览器发送其请求命令之后,要以头信息形式向web服务器发送用于描述浏览器的信息,之后用一行空白行通知服务器,表示结束头信息的发送。若是 Post 请求,发送完请求头信息之后还要发送请求体。

    服务器应答

    服务器响应客户发送的数据及其请求文档,最后以一行空白行表示头信息发送结束。

    服务器向浏览器发送数据

    服务器向浏览器发送头信息后,它就以 Content-type 对应头信息所描述的格式发送用户请求的实际数据。

    服务器关闭TCP连接

    一般情况下,一旦 web 服务器向浏览器发送了请求数据,它要关闭 TCP 连接,如果浏览器或服务器在头信息加入Connection:keep-alive 这行代码,TCP 连接在发送后仍要保持打开状态,浏览器可以继续通过相同的连接发送请求,保持连接节省了为每个请求建立新连接所需的时间, 还节约了网络带宽。

    Http请求与响应实体

    http请求由三部分组成,分别是请求行、请求头、请求体

    请求行

    用于说明请求报文、主机域名、资源路径和协议版本

    1 请求方法

    GET 请求获取Request-URI所标识的资源
    POST 请求获取Request-URI所标识的资源
    HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头
    PUT 请求服务器存储一个资源,并用 Request-URI 作为其标识
    DELETE 请求服务器删除 Request-URI 所标识的资源
    TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断

    2 请求路径

    定义:Uniform Resoure Locator,统一资源定位符,是一种自愿位置的抽象唯一识别方法。
    作用:用于表示资源位置和访问这些资源的方法
    组成:
    <协议>://<主机>:<端口>/<路径>
    协议:采用的应用层通信协议,比如在HTTP协议下的URL地址:
    HTTP://<主机>:<端口>/<路径>
    主机:请求资源所在主机的域名
    HTTP默认端口号80

    3 协议版本

    HTTP协议版本主要是1.0、1.1、2.0

    请求头

    作用:说明客户端、服务器或报文的部分信息
    使用方式:采用” header(字段名):value(值)“的方式
    header标头详解
    示例

    Accept:text/html,application/xhtml+xml,application/xml
    Accept-EncodingP:gzip,deflate,sdch
    Cache-Control:max-age=0
    Connection:keep-alive
    

    请求体

    作用:用于存放需要发送给服务器的数据信息
    使用方式:
    1 数据交换格式
    请求体可以是任意格式的,服务器需要解析,如 JSON

    2 键值对形式
    键与值之间用 ” = “ 连接,每个键值对间用 & 连接,且只能用ASCII字符,如 Query String

    3 分部分形式
    请求体被分为多个部分,应用场景是文件上传,比如邮件上传等等
    每段以-- {boundary} --开头
    然后是该段的描述头
    描述头之后空一行接内容
    每段以 -- {boundary} --结束

    Http响应

    Http响应也是由三个部分组成,分别是:状态行(协议版本,状态码,状态信息)、响应头、响应正文

    1 状态行 (空格不能省)

    协议版本 [空格] 状态码 [空格] 状态信息 [\r\n]

    状态码
    200 客户端请求成功
    400 由于客户端请求有语法错误,不能被服务器所理解
    401 请求未经授权
    403 服务器收到请求,但是拒绝服务
    404 资源不存在
    500 服务器发生不可预期的错误
    503 服务器当前不能够处理客户端的请求,一段时间后服务器可能会恢复正常

    2 响应头

    响应头详解

    3 响应体

    作用:用于存放需要返回给客户端的数据信息
    使用方式:和请求体是一致的,同样分为:任意类型的数据交换格式、键值对形式和分部分形式,这里不作过多描述。

    相关文章

      网友评论

          本文标题:Android网络基础

          本文链接:https://www.haomeiwen.com/subject/uqtapxtx.html