第二部分 网络编程和并发(34题)

摘之武sir博客,用于个人汇总用~

参考博客:http://www.cnblogs.com/wupeiqi/p/9078770.html

网络编程与并发(34篇)

1.简述 OSI 七层协议。

 

 

1、物理层

主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。   

2、数据链路层

定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。   

3、网络层

在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。   

4、运输层

定义了一些传输数据的协议和端口号(WWW端口80等),如: 
TCP(transmission control protocol –传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据) 
UDP(user datagram protocol–用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。   

5、会话层

通过运输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)   

6、表示层

可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。   

7、应用层

是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
View Code

 

2.什么是C/S和B/S架构?

C/S 架构的概念

C/S是Client/Server,即客户端/服务器端架构,一种典型的两层架构。

客户端包含一个或多个在用户的电脑上运行的程序

服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。

C/S 优点和缺点

优点:(1)界面和操作可以很丰富 (2) 安全性能可以很容易保证,实现多层认证也不难 (3)由于只有一层交互,因此响应速度较快。

缺点:(1)适用面窄,通常用于局域网中

   (2)用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户
     (3)维护成本高。发生一次升级,则所有客户端的程序都需要改变。

 

B/S 架构的概念

B/S是Browser/Server,即浏览器/服务器架构。

Browser指的是Web浏览器,极少数事务逻辑在前端实现,但主要事务逻辑在服务器端实现,Browser客户端,WebApp服务器端和DB端构成所谓的三层架构。

B/S架构的系统无须特别安装,只有Web浏览器即可。

B/S 可以看做是瘦客户端架构

B/S架构中,显示逻辑交给了Web浏览器,事务处理逻辑在放在了WebApp上,这样就避免了庞大的胖客户端,减少了客户端的压力。因为客户端包含的逻辑很少,因此也被成为瘦客户端。

C/S 优点和缺点

优点:(1)客户端无需安装,有Web浏览器即可 (2)BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
         (3)BS架构无需升级多个客户端,升级服务器即可。

缺点:(1)在跨浏览器上,BS架构不尽如人意。(2)表现要达到CS程序的程度需要花费不少精力。
        (3)在速度和安全性上需要花费巨大的设计成本,这是BS架构的最大问题。
        (4)C和S交互是请求-响应模式,通常需要刷新页面,这并不是客户乐意看到的。(在Ajax风行后此问题得到了一定程度的缓解)
View Code

 

3.简述 三次握手、四次挥手的流程。  

 TCP三次握手和四次挥手的全过程如下图:

 

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种表示:

SYN(synchronous建立连接)

ACK(acknowledgement 表示响应、确认)

PSH(push表示有DATA数据传输)

FIN(finish关闭连接)

RST(reset表示连接重置)

URG(urgent紧急指针字段值有效)

三次握手:

第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

      握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

      确认号:其数值等于发送方的发送序号+1(即接收方期望接收的下一个序列号)。

 

四次挥手:

与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次挥手”。

第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。

第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

 

TCP的四次挥手过程(简言之):主动关闭方向被动关闭方发送不会再给你发数据了的信息;被动关闭方对收到的主动关闭方的报文段进行确认;被动关闭方向主动关闭方发送我也不会再给你发数据了的信息;主动关闭方再次对被动关闭方的确认进行确认。
View Code

 

4.什么是arp协议? 

 

①ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。


②在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。


③一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。


-------------------------------------------------------------------------
详细答案参考:
https://zhuanlan.zhihu.com/p/28771785
View Code

 

5.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个字节

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
------------------------------------------------------------------------
tcp协议和udp协议的差别 
               TCP           UDP 
是否连接     面向连接     面向非连接 
传输可靠性   可靠         不可靠 
应用场合     少量数据     传输大量数据 

速度           慢           快
View Code

 

6.什么是局域网和广域网?

 

局域网:(Local Area Network,LAN), 局域网是一个局部范围的计算计组,比如家庭网络就是一个小型的局域网,里面包含电脑、手机和平板等,他们共同连接到你家的路由器上。又比如学校的机房就是一个局域网,里面有几百几千台电脑,当机房无法上外网时,但是电脑之间仍可以通信,你们可以通过这个局域网来打CS 、玩红警。理论上,局域网是封闭的,并不可以上外网,可以只有两台电脑,也可以有上万台。

广域网:(WAN,Wide Area Network),广域网的范围就比较大了,可以把你家和别人家、各个省、各个国家连接起来相互通信。广域网和局域网都是从范围的角度来划分的,广域网也可以看成是很多个局域网通过路由器等相互连接起来。
View Code

 

7.为何基于tcp协议的通信比基于udp协议的通信更可靠?

 

Tcp协议一定是先建好双向链接,发一个数据包要得到确认才算发送完成,没有收到就一直给你重发;udp协议没有链接存在,udp直接丢数据,不管你有没有收到。

 

TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。

而UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。

不过UDP的速度是TCP比不了的,而且UDP的反应速度更快,QQ就是用UDP协议传输的,HTTP是用TCP协议传输的,不用我说什么,自己体验一下就能发现区别了。

再有就是UDP和TCP的目的端口不一样(这句话好象是多余的),而且两个协议不在同一层,TCP在三层,UDP不是在四层就是七层。
View Code

 

8.什么是socket?简述基于tcp协议的套接字通信流程。

Socket含义

英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。

TCP Socket通信的基本流程

①服务端创建一个ServerSocket对象,指定端口号,ServerSocket对象等待客户端的连接请求。
②客户端创建一个Socket对象,指定主机地址和端口号,向服务端发出连接请求。
③服务端接收到客户端的连接请求,建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信。
④服务端和客户端分别创建字节输入流和字节输出流,通过字节输入流获得对方发来的数据,通过字节输出流向对方发送数据。
⑤当一方决定结束通信时,向对方发送结束信息;另一方接收到结束信息后,双方分别关闭各自的TCP连接。
⑥ServerSocket对象停止等待客户端的连接请求。
View Code

 

9.什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

1、粘包的概念
粘包:多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

2、出现粘包的原因

出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。

发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。

接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。
————————————————
补充:
3、粘包的处理方式:
(1)当时短连接的情况下,不用考虑粘包的情况
(2)如果发送数据无结构,如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包
(3)如果双方建立长连接,需要在连接后一段时间内发送不同结构数据

接收方创建预处理线程,对接收到的数据包进行预处理,将粘连的包分开;

分包是指在出现粘包的时候我们的接收方要进行分包处理。(在长连接中都会出现) 数据包的边界发生错位,导致读出错误的数据分包,进而曲解原始数据含义。
View Code

 

10.IO多路复用的作用?

按我的理解,解决了线程切换的开销问题。IO 多路复用不一定比单线程阻塞效率高,但可以处理多个连接。

11.什么是防火墙以及作用?

防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。

作用:
防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
View Code

 

12.select、poll、epoll 模型的区别?

select

优点:单进程下支持高并发,可以跨平台

缺点:多次从内核到应用,应用到内核的数组拷贝;

   每次内核都会重置填写的数据

   最大支持1024客户端,原因在于fd_set定义使用了FD_SETSIZE,大小为1024;

POLL:

Poll的原理与select相同,比select改进的地方:

  1,请求和返回分离,避免每次都要重设数组

  2,可以突破1024限制,poll是由打开文件的上限决定,可以使用ulimit命令查看上限

  3,不能跨平台

EPOLL:

不管是select,还是poll,都需要遍历数组轮询,而且select仅支持1024个客户端,在大量并发,少量活跃的情况下效率较低,也就滋生了epoll模型。

  1,可以突破1024限制,不跨平台

  2,无须遍历整个文件描述符集,只需遍历被内核IO事件异步唤醒,而加入ready队列的文件描述符。

  3,除了select/poll的IO事件水平触发(level triggered)外,还提供边沿触发(edge Triggered),可以缓存IO状态,减少epoll_wait调用,提高效率
View Code

13.简述 进程、线程、协程的区别 以及应用场景?

14.GIL锁是什么鬼?

1. GIL是什么?

  首先需要明确的一点是GIL并不是python的特性, 它是在实现python解析器(Cpython)时所引入的一个概念。

而Cpython是大部分环境下默认的python执行环境,要明确一点:GIL并不是python的特性,python完全可以不依赖于GIL。

2. 为什么会有GIL?

    为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据的一致性和状态同步的完整性

(例如:线程2需要线程1执行完成的结果,然而线程2又比线程1代码量少,线程2执行完成,线程1仍然还在执行,这就是数据的同步性)

python为了利用多核,开始支持多线程,而解决多线程之间数据完整性和状态同步最简单的方式就是加锁。

3. GIL的影响

    GIL无疑就是一把全局排它锁,全局锁的存在会对多线程的效率有不小的影响。甚至就几乎等于python是个单线程的程序。

4. 如何避免受到GIL的影响

    既然python的多线程在多核主机上这么鸡肋,那有什么更好的方式实现多并发吗?
    用进程+协程 代替 多线程的方式
    在多进程中,由于每个进程都是独立的存在,所以每个进程内的线程都拥有独立的GIL锁,互不影响。

    但是,由于进程之间是独立的存在,所以进程间通信就需要通过队列的方式来实现。
View Code

15.Python中如何使用线程池和进程池?

16.threading.local的作用?

为每个线程创建一个独立的空间,使得线程对自己的空间中的数据进行操作(数据隔离)。

import threading
from threading import local
import time
 
obj = local()
 
 
def task(i):
    obj.xxxxx = i
    time.sleep(2)
    print(obj.xxxxx,i)
 
for i in range(10):  #开启了10个线程
    t = threading.Thread(target=task,args=(i,))
    t.start()
View Code

17.进程之间如何进行通信?

  现在最常用的进程间通信的方式有信号、信息量、消息队列、共享内存等。百度介绍8种 无名管道(pipe),高级管道(popen)、有名管道(nemed pipe)、消息队列(message queue)、信号量(semophore)、信号(sinal)、共享内存(shared memory)、套接字(socket)。

 

信号和信号量是不同的,它们虽然都可以用来同步和互斥,但是信号是使用信号处理器来进行的,信号量是使用P,V操作来实现的。

消息队列是比较高级的一种进程间通信方式,因为它真的是可以在进程间传送message,传送普通字符串也可以。

一个消息队列可以被多个进程所共享(IPC((Inter-Process Communication,进程间通信))就是在这个基础上进行的);如果一个进程消息太多,一个消息队列放不下,也可以用多于一个的消息队列(不管管理可能会比较复杂)。共享消息队列的进程所发送的消息除了message本身外还有一个标志,这个标志可以指明该消息将由哪个进程或者哪类进程接受。每一个共享消息队列的进程针对这个队列也有自己的标志,可以用来申明自己的身份。

共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信
View Code

18.什么是并发和并行?

19.进程锁和线程锁的作用?

20.解释什么是异步非阻塞?

21.路由器和交换机的区别?

路由器和交换机的区别:1、路由器可以为局域网自动分配IP,交换机只是用来分配网络数据;2、路由在网络层,交换机在中继层;3、路由器提供防火墙的服务,交换机是做端口扩展的。

工作层次不同:
交换机主要工作在数据链路层(第二层)
路由器工作在网络层(第三层)。

转发依据不同:
交换机转发所依据的对象时:MAC地址。(物理地址)
路由转发所依据的对象是:IP地址。(网络地址)

主要功能不同:交换机主要用于组建局域网,而路由主要功能是将由交换机组好的局域网相互连接起来,或者接入Internet。
交换机能做的,路由都能做。交换机不能分割广播域,路由可以。路由还可以提供防火墙的功能。路由配置比交换机复杂。

价格不同交换机是看门大爷,路由是邮差。
---------------------------------------------------------------------------
路由器实现了不同网络之间的数据转发,交换机实现了特定网络内的数据交换。
View Code

 

22.什么是域名解析?

域名解析就是需要我们手动把域名地址和IP地址的对应关系写到DNS服务器上,这样别人访问域名地址的时候就可以在DNS查询到对于的IP地址。
View Code

 

23.如何修改本地hosts文件?

修改的话,直接以管理员权限,打开notepad就可以修改了
------------------------------------------------------------------------
hosts文件是什么:

1、hosts文件是一个用于储存计算机网络中各节点信息的计算机文件。

2、这个文件负责将主机名映射到相应的IP地址。

3、hosts文件通常用于补充或取代网络中DNS的功能。

4、和DNS不同的是,计算机的用户可以直接对hosts文件进行控制。

5、hosts文件位置:C:\Windows\System32\drivers\etc
-------------------------------------------------------------------------
1、hosts文件也可以用于其它情况,例如可以将已知的广告服务器重定向到无广告的机器(通常是本地的IP地址:127.0.0.1)上来过滤广告。

同时也可以通过不下载网络广告,从而减少带宽。

使用hosts文件还可减少对DNS服务器的访问来加快访问速度并减少带宽消耗。

2、hosts文件的另一个重要用途就是用于拦截一些恶意网站的请求,从而防止访问欺诈网站或感染一些病毒或恶意软件。

但同时,这个文件也可能被病毒或恶意软件所利用来阻止用户更新杀毒软件或访问特定网站。

3、另外也可以通过修改hosts文件来强制将网站指定到正确的IP上,从而访问那些因为某些原因不能访问的站点。

此外一些软件的使用也经常用到hosts文件,原理就是屏蔽软件自动连接官方服务器验证信息。

hosts作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,对大家操作电脑有一定帮助!
View Code

 

24.生产者消费者模型应用场景及优势?

25.什么是cdn?

26.LVS是什么及作用?

27.Nginx是什么及作用?

28.keepalived是什么及作用?

29.haproxy是什么以及作用?

30.什么是负载均衡?

31.什么是rpc及应用场景?

32.简述 asynio模块的作用和应用场景。

33.简述 gevent模块的作用和应用场景。

34.twisted框架的使用和应用?

 

 

路由器和交换机的区别:1、路由器可以为局域网自动分配IP,交换机只是用来分配网络数据;2、路由在网络层,交换机在中继层;3、路由器提供防火墙的服务,交换机是做端口扩展的。

posted @ 2018-08-08 22:49  无我斋主人  阅读(181)  评论(0编辑  收藏  举报