【重读iOS】网络请求1:基础知识

  1. 基础知识
  2. HTTP基础知识(状态码,请求方法,请求头,cookies)
  3. socket/webSocket
  4. 系统请求库和开源请求库
  5. 缓存系统(LRU LFU)
  6. 应用场景:文件上传,断点续传,加密和签名。
  7. 特殊请求:流媒体协议,IM长连接

基础知识

1. TCP/IP

1.1 协议层:从下往上为网络访问层、网络层、传输层、应用层

1.2 TCP的3次握手和四次挥手: 博文详解

握手:3次信息发送,客户端、服务端和客户端,每次信息包括首部,3次分别为SYN,SYN+ACK,ACK,除了首部还有序列号,第一次发送一个序列号seq=x,第二次服务端序列号y,第三次客户端序列号x+1,然后还要回复之前的序列号,ack=x+1,数值是前面的序列号+1。

大写的那些部分表示的是这个命令是干嘛的,性质问题,seq是自己的标识,就像id一样,ack是表示回复的是那一条命令,ack=回复的命令的seq+1。

通过seq和ack就可以把命令串接起来,形成流程。

SYNFIN都是原始命令,而ACK是对它们的回复。所以握手就是:1. 同步 2.回复+同步 3.回复。挥手就是:1. 结束 2.回复 3.回复+结束 4.回复。2和3都是对1的回复,因为服务端接收到1的消息后,可能还没有把数据全部传给客户端,所以它回复2,告诉接收到1了,等把数据发完,再回复3,告诉客户端,它也可以结束了。

握手:

  • SYN=1,seq=x
  • SYN=1,ACK=1,seq=y,ack=x+1
  • ACK=1,seq=x+1,ack=y+1

挥手:

  • FIN=1,seq=u
  • ACK=1,seq=v,ack=u+1
  • ACK=1,FIN=1,seq=w,ack=u+1
  • ACK=1,seq=u+1,ack=w+1
  • 客户端等待2MSL,确认最后消息发送完成。

TimeWait(最后等待2MSL)作用:

1。防止上一次连接中的包,迷路后重新出现,影响新连接 (经过2MSL,上一次连接中所有的重复包都会消失) 2。可靠的关闭TCP连接 在主动关闭方发送的最后一个ack(fin) ,有可能丢失,这时被动方会重新发 fin, 如果这时主动方处于CLOSED 状态 ,就会响应rst 而不是ack。所以 主动方要处于TIME_WAIT 状态,而不能是CLOSED 。 TIME_WAIT 并不会占用很大资源的,除非受到攻击。

1.3 TCP和UDP的区别

TCP是面向连接的,并且保证数据接收,丢失会重发,还要保证数据的顺序,这一系列的手段保证TCP的数据传输是稳定可靠的,但同时也增加负担。

UDP则不保证数据的送达,所以有更高的实时性,更低的系统负担。

而且TCP只能一对一,而UDP可以一对多、多对多。

HTTP基础知识

1. HTTP 的报文结构

请求报文:

请求行,请求头,请求数据。请求行包括请求方法、URL和协议版本,请求头用key:value的形式存储。

响应报文:

响应行,响应头,响应数据。响应行包含协议版本和状态码。响应头用key:value的形式存储。

2. HTTP协议的性质
  • 无状态协议

每次请求都是独立的,即使是同一个客户端和服务端的多次请求也不会关联起来。服务端不会记录和保存请求的信息,用来关联和定位之后的请求。

如果多个请求是关联的,那么就有第1步、第2步...那么就有对于当前进行到哪的一个记录,这个就是我理解的状态

可以对比TCP的握手过程,它是有步骤的,多次数据交互之前是关联的(靠seq和ack标识),这就是有状态的。

  • 持续连接

HTTP基于TCP,请求前TCP肯定是要先连接的,但是一次请求结束后,如果短时间内还会多次请求,可以使用keep-alive保持TCP的连接,之后的请求可以避免再次建立TCP连接的消耗。持续连接指的就是这个TCP连接的维持。这个和HTTP的无状态性质是两码事

http1.1开始支持持续连接。

  • 简单的、可扩展的

简单的指结构简单直接易读,可扩展指可以在headers里加入自定义的内容来扩展协议的作用,只需客户端和服务端达成一致即可。

3. Hosts文件
  • 负责把域名映射为IP地址
  • 优先使用本地Hosts文件解析,没有则去知名DNS服务器请求。
4. 状态码

首先开头决定类型:2 成功 3 重定向 4 请求错误 5 服务器出错。然后常见的状态码:

  • 200 成功, 204 请求成功但无内容, 206 部分内容(如断点续传)
  • 301永久移动 302临时移动 305 使用代理
  • 304 上次请求后数据未修改,只返回响应头,不返回数据。这个需要配合Last ModifiedIf Modified Since使用,请求头带上If Modified Since询问xx时间后是否修改,返回头带上Last Modified表示数据的上次修改是什么时候。服务端把请求头里的时间和数据的实际修改时间做比较,如果没变化,则返回304。这样减少了网络的消耗。
  • 404 未找到数据 401 未授权 400 语法错误 405 方法(post/get...)不可用 408 请求超时 410 永久删除
  • 502 错误网关 504 网关超时 503 服务不可用(由于超载或停机维护) 505 HTTP版本不支持
5. 请求方法

get post head 这三个常用,还有: put上传文件 delete请求删除 options查看性能 connect更改为管道方式代理服务器 trace回复测试

6. cookies和session

都是保存请求状态的手段,cookies保存在客户端,请求返回头里包含Set-Cookie,则会在本地生成cookies.之后请求的时候携带cookies,通过相同的cookie来关联同一个站点的请求。

session是服务端保存的,在一个请求到来后,检查是否有session id,没有则构建一个session,把session id写入返回头。之后的请求通过session id来关联。服务端把相关的数据保存在session里,这样多个请求能够定位到同一个session,从而实现数据关联共享。

总结来说,核心还是给请求加入了标识id,通过相同的标识把多个请求关联。然后cookies把共享数据存在本地,session把共享数据存在服务端。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值