目录
- 1. 客户端与服务器交互方式有几种?
- 2. OSI七层模型有哪些,每一层的作用
- 3. UDP/TCP含义,区别
- 4. TCP/IP协议栈各个层次及分别的功能?
- 5. 写出WWW的几个方法?
- 6. Socket粘包
- 7. Socket的封包、拆包
- 8. Socket 客户端 队列 的问题
- 9. 为什么会出现TCP 拥塞控制
- 10. 简述序列化与反序列化
- 11. 序列化的多种方案
- 12. 网络抖动什么是网络抖动
- 13. http与https的区别
- 14. 进程和线程的区别
- 15. 内存池、进程池、线程池
1. 客户端与服务器交互方式有几种?
- socket通常也称作"套接字",实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。
- 协议传输的主要有http协议 和基于http协议的Soap协议(web service),常见的方式是 http 的post 和get 请求,web 服务。
2. OSI七层模型有哪些,每一层的作用
-
应用层:是OSI参考模型的最高层
它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。 -
表示层:是OSI模型的第六层
它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。 -
会话层:是OSI模型的第5层:
是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。 -
传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。该层常见的协议:TCP/IP中的TCP协议、Novell网络中的SPX协议和微软的NetBIOS/NetBEUI协议。
传输层提供会话层和网络层之间的传输服务,这种服务从会话层获得数据,并在必要时,对数据进行分割。然后,传输层将数据传递到网络层,并确保数据能正确无误地传送到网络层。因此,传输层负责提供两节点之间数据的可靠传送,当两节点的联系确定之后,传输层则负责监督工作。 -
网络层:它是OSI参考模型中最复杂的一层,也是通信子网的最高一层。它在下两层的基础上向资源子网提供服务。其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题。 -
数据链路层:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
-
物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。
3. UDP/TCP含义,区别
-
UDP协议全称是用户数据报协议:
- 面向无连接
- 面向报文,
- 不可靠性,
- 有单播,多播,广播的功能
- 头部开销小,传输数据报文时是很高效的。
-
TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。三次握手、四次挥手
-
TCP:
- 面向连接
- 仅支持单播传输
- 面向字节流
- 可靠传输
- 提供拥塞控制
- TCP提供全双工通信
4. TCP/IP协议栈各个层次及分别的功能?
-
网络接口层:这是协议栈的最低层,对应OSI的物理层和数据链路层,主要完成数据帧的实际发送和接收。
-
网络层:处理分组在网络中的活动,例如路由选择和转发等,这一层主要包括IP协议、ARP、ICMP协议等。
-
传输层:主要功能是提供应用程序之间的通信,这一层主要是TCP/UDP协议。
-
应用层:用来处理特定的应用,针对不同的应用提供了不同的协议,例如进行文件传输时用到的FTP协议,发送email用到的SMTP等。
5. 写出WWW的几个方法?
- WWW.LoadFromCacheOrDownload:可被用于将Assets Bundles自动缓存到本地磁盘
- WWW.Dispose :释放现有的 WWW 对象。
- WWW.isDone:是否完成下载?(只读)
- WWW.progress:下载进度(只读)。
6. Socket粘包
-
什么是粘包?
答:顾名思义,其实就是多个独立的数据包连到一块儿。 -
什么情况下需要考虑粘包?
答:实际情况如下:- 如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题。
- 如果发送的数据无结构,比如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包。
- 如果双方建立连接,需要在连接后一段时间内发送不同结构数据,如连接后,有好几种结构:
1)”good good study”
2)”day day up”
那这样的话,如果发送方连续发送这个两个包出去,接收方一次接收可能会是”good good studyday day up” 这样接收方就傻了,因为协议没有规定这么奇怪的字符串,所以要把它分包处理,至于怎么分也需要双方组织一个比较好的包结构,所以一般可能会在头加一个数据长度之类的包,以确保接收。
所以说:Tcp连续发送消息的时候,会出现消息一起发送过来的问题,这时候需要考虑粘包的问题。
-
粘包出现的原因 (在流传输中,UDP不会出现粘包,因为它有消息边界。)
- 发送端需要等缓冲区满才发送出去,造成粘包 (发送端出现粘包)
- 接收端没有及时接收缓冲区包数据,造成一次性接收多个包,出现粘包 (接收端出现粘包)
-
解决粘包:
- 缓冲区过大造成了粘包,所以在发送/接收消息时先将消息的长度作为消息的一部分发出去,这样接收方就可以根据接收到的消息长度来动态定义缓冲区的大小。(这种方法就是所谓的自定义协议,这种方法是最常用的)
- 对发送的数据进行处理,每条消息的首尾加上特殊字符,然后再把要发送的所有消息放入一个字符串中,最后将这个字符串发送出去,接收方接收到这个字符串之后,再通过特殊标记操作字符串,把每条消息截出来。(这种方法只适合数据量较小的情况)
-
注:要记住这一点:TCP对上层来说是一个流协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间是没有分界线的,也就是没有包的概念。所以我们必须自己定义包长或者分隔符来区分每一条消息。
7. Socket的封包、拆包
- 为什么基于TCP的通信程序需要封包、拆包?
答:TCP是流协议,所谓流,就是没有界限的一串数据。但是程序中却有多种不同的数据包,那就很可能会出现如上所说的粘包问题,所以就需要在发送端封包,在接收端拆包。 - 那么如何封包、拆包?
答:封包就是给一段数据加上包头或者包尾。比如说我们上面为解决粘包所使用的两种方法,其实就是封包与拆包的具体实现。
8. Socket 客户端 队列 的问题
- 项目中采用了socket通信,通过TCP发送数据给服务器端,因为项目需要,要同时开启大量的线程去发送不同的数据给服务器端,然后服务器端返回不同的数据。由于操作频繁,经常会阻塞,或没有接收到服务器端返回的数据;
- 因此考虑到使用一个队列:将同一ip下的数据存入一个队列中,通过队列协调发送;当第一条数据发送出去没有收到服务器端返回的数据时,让第二条数据插入队列中排队,当第三条数据也发送出来后,继续排队,以此类推;
如果当第四条数据发出来的时候,存入队列中,第一条数据收服务器端返回数据后,队列中的第二条第三条数据就扔掉,直接发送第四条数据
9. 为什么会出现TCP 拥塞控制
- 拥塞的发生是因为路由器缓存溢出,拥塞会导致丢包,但丢包不一定触发拥塞。拥塞控制是快速传输的基础。一个拥塞控制算法一般包括慢启动算法、拥塞避免算法、快速重传算法、快速恢复算法四部分。
10. 简述序列化与反序列化
-
序列化 :简单理解成把对象转换为容易传输的格式的过程。
⽐如,可以序列化⼀个对象,然后使⽤HTTP通过Internet在客户端和服务器端之间传输该对象 -
反序列化 :将已经序列化过后的数据恢复成原先对象的过程。
11. 序列化的多种方案
- XML:指可扩展标记语言(eXtensible Markup Language)。是一种通用和重量级的数据交换格式。以文本结构存储。
- 优点:格式更为标准和统一、更容易和其它系统进行远程交互、数据共享比较方便
- 缺点: 相比于JSON,由于需要成对的数据标签,数据更加的冗余。 而JSON使用键值对,压缩了数据空间并且更加可读。
- JSON:是一种通用和轻量级的数据交换格式。以文本结构存储。
- 优点:
- 简单易用开发成本低、
- 跨语言、
- 轻量级数据交换、
- 非冗长性(对比xml标签简单括号闭环)
- 缺点:
- 体积大,影响高并发
- 无版本检查,自己做兼容
- 片段的创建和验证过程比一般的XML复杂
- 缺乏命名空间导致信息混合
- 没有XML格式这么推广的深入人心和使用广泛,没有XML那么通用性
- 优点:
- Protobuf
protocol buffer是Google的一种独立和轻量级的数据交换格式。以二进制结构进行存储。
Protobuf是一种以有效并可扩展的格式编码结构化数据的方式。- 优点:
- 跨平台多语言,可自定义数据结构。
- 字段被编号,新添加的字段不影响老结构。解决了向后兼容问题。
- 序列化后体积相比json和xml很小,适合网络传输。
- 序列化反序列化速度很快,快于Json的处理速度。
- 自动化生成代码,简单易用。
- 二进制消息,效率高,性能高。
- Netty等框架集成了该协议,提供了编×××提高开发效率。
- 缺点:
- 二进制格式,可读性差(抓包dump后的数据很难看懂)
- 对象冗余,字段很多,生成的类较大,占用空间。
- 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)
- 优点:
- 三者比较:
- json:一般的web项目中,最流行的主要还是json。因为浏览器对于json数据支持非常好,有很多内建的函数支持。
- xml:在webservice中应用最为广泛,但是相比于json,它的数据更加冗余,因为需要成对的闭合标签。json使用了键值对的方式,不仅压缩了一定的数据空间,同时也具有可读性。
- protobuf:是后起之秀,是谷歌开源的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为profobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。
12. 网络抖动什么是网络抖动
- 什么是网络抖动
- 如果网络发生拥塞,排队延迟将影响端到端的延迟,并导致通过同一连接传输的分组延迟各不相同,而抖动,就是用来描述这样一延迟变化的程度。
- 它是网络延时变化,最大延迟与最小延迟的时间差;
如最大延迟是20毫秒,最小延迟为5毫秒,那么网络抖动就是15毫秒,它主要标识一个网络的稳定性。
- 造成网络抖动的原因
- 如果网络发生拥塞,排队延迟将影响端到端的延迟,并导致通过同一连接传输的分组延迟各不相同;
- 当网络设备无法发送相同数据的流量,因此他们的数据包缓冲区已满并开始丢弃数据包。如果端点上的网络没有干扰,则每个数据包都会到达。
- 但是,如果端点缓冲区满了,会使数据包到达的越来越晚,导致抖动。而抖动,就是用来描述这样一延迟变化的程度。因此,抖动对于实时性的传输将会是一个重要参数,比如:VOIP,视频等。
- 解决方法
- 数据包接收端的抖动缓存;缓存指针队列对接收到的数据包进行排序后,将接收到的数据包插入抖动缓存指针队列的相应位置;
- 抖动缓存指针队列的出队线程定时器,以一定时间间隔触发出队线程,出队线程判断抖动缓存指针队列队头的数据包,是否应该在当前触发时刻出队,如果是,则将该数据包出队。
13. http与https的区别
- HTTP协议以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
- https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。并且https协议需要到ca申请证书。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
- HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
14. 进程和线程的区别
- 线程是指进程内的一个执行单元,也是进程内的可调度实体。与进程的区别:
- 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
- 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
- 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
- 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
15. 内存池、进程池、线程池
-
内存池(Memory Pool):
- 内存池是一种内存分配方式,用于分配大量大小相同的小内存块。使用内存池可以极大地加快内存分配与释放的速度,且能尽量避免内存碎片化。内存池在创建时先从系统中获取一大块内存(静态或动态),然后分成相同大小的多个小内存块,这些小内存块通过链表连接起来(此链表也称为空闲链表)。当需要分配内存时,系统从空闲链表中取出链头上第一个内存块,提供给申请者。当内存被释放时,它会被返回到空闲链表中,而不是直接返回给操作系统。
-
进程池(Process Pool):
- 进程池是一种用于并行处理的技术,它创建并管理一个固定数量(或动态数量)的进程集合。这些进程可以被用来并行地执行任务。当一个新任务提交到进程池时,如果池中有空闲的进程,该任务就会被分配给一个空闲进程去执行;如果没有空闲进程,任务通常会等待,直到有一个进程变得可用。进程池有助于减少创建和销毁进程的开销,提高系统资源的利用率。
-
线程池(Thread Pool):
- 线程池与进程池类似,但它是管理线程的集合,而不是进程。线程池中的线程数量可以是固定的,也可以是动态的。当需要执行一个新任务时,线程池会尝试使用一个现有的空闲线程来执行该任务,而不是创建一个新线程。这有助于减少线程的创建和销毁开销,并提高系统的吞吐量。线程池还提供了更好的控制和调度能力,例如可以设置线程的优先级、控制并发级别等。