网络编程面试题整理(二)

1:什么是C/S和B/S架构?

C/S架构软件(即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。

B/S架构第一层是浏览器(即客户端)只有简单的输入输出功能,处理极少部分的事务逻辑。由于客户不需要安装客户端,只要有浏览器就能上网浏览, 所以它面向的是大范围的用户,所以界面设计得比较简单,通用。第二层是WEB服务器,扮演着信息传送的角色。当用户想要访问数据库时,就会首先向WEB服务器发送请求, WEB服务器统一请求后会向数据库服务器发送访问数据库的请求,这个请求是以SQL语句实现的。第三层是数据库服务器,它存放着大量的数据。当数据库服务器收到了WEB服务器的请求后, 会对SQL语句进行处理,并将返回的结果发送给WEB服务器,接下来,WEB服务器将收到的数据结果转换为HTML文本形式发送给浏览器。

2:什么是ARP协议?

ARP(Address Resolution Protocol) 是地址解析协议。最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。

3:什么是局域网和广域网?

广域网(WAN,公网,外网),就是我们通常所说的Internet,它是一个遍及全世界的网络。 局域网(LAN,私网,内网),相对于广域网(WAN)而言,主要是指在小范围内的计算机互联网络。这个“小范围”可以是一个家庭,一所学校,一家公司,或者是一个政府部门。 BT中常常提到的公网、 外网,即广域网(WAN);BT中常常提到私网、内网,即局域网(LAN)。 广域网上的每一台电脑(或其他网络设备)都有一个或多个广域网IP地址(或者说公网、外网IP地址),广域网IP地址一般要到ISP处交费之后才能申请到, 广域网IP地址不能重复;局域网(LAN)上的每一台电脑(或其他网络设备)都有一个或多个局域网IP地址(或者说私网、内网IP地址), 局域网IP地址是局域网内部分配的,不同局域网的IP地址可以重复,不会相互影响。

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

Socket又称”套接字”, 是系统提供的用于网络通信的方法.它并不是一种协议, 没有规定计算机应当怎么传递信息, 只是给程序员提供了一个发送消息的接口,程序员能使用这个接口的方法, 发送与接收消息.Socket描述了一个IP和端口对.它简化了程序员的操作, 知道对方的IP以及port 就可以给对方发送消息, 再由服务器处理发送的这些消息, Socket包含了通信的双方, 即客户端与服务端.

socket的过程如下图所示。

TCP编程的服务器端一般步骤是:   

1、创建一个socket,用函数socket();

SOCKET SocketListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   

2、设置socket属性,用函数setsockopt(); *可选   

3、绑定IP地址、端口等信息到socket上,用函数bind();

SOCKET_ERROR = bind(SocketListen, (const sockaddr *) & addr, sizeof(addr))   

4、开启监听,用函数listen();

SOCKET_ERROR == listen(SocketListen, 2)   

5、接收客户端上来的连接,用函数accept();

SOCKET SocketWaiter = accept(SocketListen, _Out_ struct sockaddr * addr _Inout_ int * addrlen);

6、收发数据,用函数send() 和recv(),或者read() 和write();

7、关闭网络连接;

closesocket(SocketListen);

closesocket(SocketWaiter);

8、关闭监听;

SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的。

TCP编程的客户端一般步骤是:   

1、创建一个socket,用函数socket();   

2、设置socket属性,用函数setsockopt(); *可选   

3、绑定IP地址、端口等信息到socket上,用函数bind(); *可选   

4、设置要连接的对方的IP地址和端口等属性;   

5、连接服务器,用函数connect();   

6、收发数据,用函数send() 和recv(),或者read() 和write();   

7、关闭网络连接; intsend( _In_SOCKETs, // 向哪个socket发送,accept返回的socket。 _In_const char * buf, _In_ int len, _In_ int flags );

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

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

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

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

接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区, 用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后, 而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。

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

1.当短连接的情况下,不用考虑粘包的情况 。

2. 如果发送数据无结构,如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包

3. 如果双方建立连接,需要在连接后一段时间内发送不同结构数据 处理方式: 接收方创建一预处理线程,对接收到的数据包进行预处理,将粘连的包分开

注:粘包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包。

6:什么是防火墙以及作用?

1.什么是防火墙

防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合。 它可通过监测、限制、 更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况, 以此来实现网络的安全保护。 在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动, 保证了内部网络的安全。

2. 使用Firewall的益处

保护脆弱的服务。通过过滤不安全的服务,Firewall可以极大地提高网络安全和减少子网中主机的风险。例如, Firewall可以禁止NIS、NFS服务通过, Firewall同时可以拒绝源路由和ICMP重定向封包。

控制对系统的访问。Firewall可以提供对系统的访问控制。如允许从外部访问某些主机,同时禁止访问另外的主机。例如, Firewall允许外部访问特定的Mail Server和Web Server。

集中的安全管理。Firewall对企业内部网实现集中的安全管理,在Firewall定义的安全规则可以运行于整个内部网络系统, 而无须在内部网每台机器上分别设立安全策略。 Firewall可以定义不同的认证方法, 而不需要在每台机器上分别安装特定的认证软件。外部用户也只需要经过一次认证即可访问内部网。

增强的保密性。使用Firewall可以阻止攻击者获取攻击网络系统的有用信息,如Figer和DNS。

记录和统计网络利用数据以及非法使用数据。 Firewall可以记录和统计通过Firewall的网络通讯,提供关于网络使用的统计数据,并且,Firewall可以提供统计数据, 来判断可能的攻击和探测。

策略执行。 Firewall提供了制定和执行网络安全策略的手段。未设置Firewall时,网络安全取决于每台主机的用户。

7:select、poll、epoll 模型的区别?

请先参看收藏的博客《几种典型的服务器网络编程模型归纳(select poll epoll)》!

select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。 这样所带来的缺点是:

1 单个进程可监视的fd数量被限制;

2 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大;

3 对socket进行扫描时是线性扫描。

 poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历, 如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。 它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。 poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。 在前面说到的复制问题上,epoll使用mmap减少复制开销。 还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd, epoll_wait便可以收到通知。

发布了61 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_33204444/article/details/93651541
今日推荐