TCP/IP 四层模型
应用层:SMTP、FTP、HTTP
传输层:TCP、UDP
TCP与UDP区别总结
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付。
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节。
socket和http的区别
- Http连接: http连接就是所谓的短连接,及客户端向服务器发送一次请求,服务器端相应后连接即会断掉。
- socket连接:socket连接及时所谓的长连接,理论上客户端和服务端一旦建立连接,则不会主动断掉;但是由于各种环境因素(网络故障、两者之间长时间没有数据传输)可能会是连接断开.
HTTP协议
http协议是一个基于请求与响应模式的无连接,无状态,应用层的协议,支持c/s模式,简单快速,灵活
http有两种报文:请求报文和响应报文
请求报文由请求行,请求报头,和请求数据组成
- 请求行:抓包第一行,包括请求方法,url和http版本
- 请求报头:指的就是题目中“里面的协议头部”
- 请求数据:指post方式提交的表单数据
响应报文由状态行,响应报头,响应正文组成
- 状态行:状态码
- 响应报头:同请求报头
- 响应正文:服务器返回的资源数据
http头部,既请求报头和响应报头,统称消息报头
消息报头可以分为通用报头,实体报头, 请求报头,响应报头等
通用报头和实体报头既可以出现在请求报头中,也可以出现在响应报头中.
- 通用报头包含的字段如:Date Connection Cache-Control…
- 实体报头中有:Content-Type Content-Length Content-Language Content-Encoding…
- 请求报头中包含的字段有:Host,User-Agent,Accept-Encoding,Accept-Language,Connection…
- 响应报头包含的字段:Location,Server…
http的get和post的区别
1.参数的传输方式:GET参数通过URL传递,POST放在Request body中。
2.GET请求在URL中传送的参数是有长度限制的,而POST没有。
3.对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。不过要注意,并不是所有浏览器都会在POST中发送两次包,比如火狐
4.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
5.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
6.GET请求只能进行url编码,而POST支持多种编码方式。
Volley
1、Volley的特点
Volley是谷歌大会上推出的网络通信框架(2.3之前使用HttpClient,之后使用HttpUrlConnection),它既可以访问网络获取数据,也可以加载图片,并且在性能方面进行了大幅度的调整,它的设计目的就是适合进行数据量不大但通信频繁的网络操作,而对于大数据量的操作,比如文件下载,表现很糟糕,因为volley处理http返回的默认实现是BasicNetwork,它会把返回的流全部导入内存中,下载大文件会发生内存溢出
2、Volley执行的过程:
默认情况下,Volley中开启四个网络调度线程和一个缓存调度线程,首先请求会加入缓存队列,,缓存调度线程从缓存队列中取出线程,如果找到该请求的缓存就直接读取该缓存并解析,然后回调给主线程,如果没有找到缓存的响应,则将这个请求加入网络队列,然后网络调度线程会轮询取出网络队列中的请求,发起http请求,解析响应并将响应存入缓存,回调给主线程
3、Volley为什么不适合下载上传大文件?为什么适合数据量小的频率高的请求?
1.volley基于请求队列,Volley的网络请求线程池默认大小为4。意味着可以并发进行4个请求,大于4个,会排在队列中。并发量小所以适合数据量下频率高的请求
2.因为Volley下载文件会将流存入内存中(是一个小于4k的缓存池),大文件会导致内存溢出,所以不能下载大文件,不能上传大文件的原因和1中差不多,设想你上传了四个大文件,同时占用了volley的四个线程,导致其他网络请求都阻塞在队列中,造成反应慢的现象
OKHttp
1、OKHttp的特点
1.相较于Volley,它的最大并发量为64
2.使用连接池技术,支持5个并发的socket连接默认keepAlive时间为5分钟,解决TCP握手和挥手的效率问题,减少握手次数
3.支持Gzip压缩,且操作对用户透明,可以通过header设置,在发起请求的时候自动加入header,Accept-Encoding: gzip,而我们的服务器返回的时候header中有Content-Encoding: gzip
4.利用响应缓存来避免重复的网络请求
5.很方便的添加拦截器,通常情况下,拦截器用来添加,移除,转换请求和响应的头部信息,比如添加公参等
6.请求失败,自动重连,发生异常时重连,看源码调用recover方法重连了一次
2、 OkHttp的缺点
1.消息回来需要切到主线程,主线程要自己去写。
2.调用比较复杂,需要自己进行封装。
3.缓存失效:网络请求时一般都会获取手机的一些硬件或网络信息,比如使用的网络环境。同时为了信息传输的安全性,可能还会对请求进行加密。在这些情况下OkHttp的缓存系统就会失效了,导致用户在无网络情况下不能访问缓存。
3、 OkHttp框架中都用到了哪些设计模式
1.最明显的Builder设计模式,如构建对象OkHttpClient,还有单例模式
2.工厂方法模式,如源码中的接口Call
3.观察者模式如EventListener,监听请求和响应
4.策略模式
5.责任链模式,如拦截器
TCP为什么三次握手不是两次握手,为什么两次握手不安全
为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个***, 以标识发送出去的数据包中, 哪些是已经被对方收到的。
三次握手的过程即是通信双方相互告知***起始值, 并确认对方已经收到了***起始值的必经步骤
如果只是两次握手, 至多只有连接发起方的起始***能被确认, 另一方选择的***则得不到确认
三次握手与四次挥手
三次握手: 建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立, 在Socket编程中,这一过程由客户端执行connect来触发,具体流程图如下:
- 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server, Client进入SYN_SENT状态,等待Server确认。 SYN:同步序列编号
-
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位 SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求
,Server进入SYN_RCVD状态。 - 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK 置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
四次挥手: 终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 在Socket编程中,这一过程由客户端或服务端任一方执行close来触发,具体流程图如下:
- 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入 FIN_WAIT_1状态
- 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同, 一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK 状态。
-
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手