前言
做开发到现在,一直在重复用着别人造好的轮子,就拿网络框架来说吧,Retrofit和okHttp的组合用起来十分方便,功能也强大,但一直处于只会用,但不了解原理,也没有对网络编程进行过系统的学习,今天打算对网络编程进行系统的学习和整理。
Http请求和响应步骤
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 响应体
作用:用于存放需要返回给客户端的数据信息
使用方式:和请求体是一致的,同样分为:任意类型的数据交换格式、键值对形式和分部分形式,这里不作过多描述。