网络编程面试题

来源:互联网 发布:网络剧2017 古装 编辑:程序博客网 时间:2024/04/28 09:29

1.OSI七层模型和TCP/IP四层模型
OSI七层模型
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
TCP/IP四层模型
应用层 传输层 网际互联层 网络接口层
对应关系(图示)
这里写图片描述
2.tcp和udp的区别

(1)TCP和UDP都是传输层协议,TCP是面向连接的传输(通过三次握手保证有连接),UDP是无连接的传输。
(2)TCP是面向字节流的传输,他可以将信息分割成组,到了接收端将其重组,UDP是面向数据报的传输,没有分组开销。
(3)TCP因为有链接所以信息传输稳定可靠,无失序,无差错,无丢失,无重复,UDP传输不可靠,可能会发生失序,差错,丢失,重复等现象。
(4)TCP传输速度慢,UDP传输速度快。
(5)TCP提供拥塞控制和流量控制机制,UDP不提供拥塞控制和流量控制机制。

3.TCP三次握手四次挥手
三次握手:
(1)客户端向服务器发送连接请求connect
(2)服务器接收到客户端的连接请求(accept),给客户端回复收到连接请求
(3)客户端收到服务器的回复,给予服务器确认收到信息,即是对第二次握手的确认。
四次挥手
(1)断开连接的一端发送close请求是第一次握手,断开到接收端的数据传送
(2)接收端接收到关闭请求时,查看当前数据是否接收完毕,然后回应发送端表示接收到关闭请求
(3)接收端接受完当前数据后,向发送端发出close请求,并执行close //time_wait
(4)发送端接收到收端的close请求后,执行close

4.多线程如何同步
因为多个线程会共享进程的内存空间,因此为了避免资源竞争的问题,需要线程间同步机制。
线程间同步机制的实现方法有:
(1)信号量,实现线程间同步,具体对每个信号量实现相关的PV操作,来实现同步。
(2)互斥锁,实现线程间的同步,当有线程占用共享资源时,对该共享资源加锁保护,这时如果有其他线程发现资源被加锁就会等待,当对资源加锁的线程使用完毕后解锁释放该段共享资源,其他线程便可以使用共享资源。
(3)线程数据,每个线程数据创建一个键,它和这个键相关联,在各个线程里,都使用这个键来指代线程数据,但在不同的线程里, 这个键代表的数据是不同的,在同一个线程里,它代表同样的数据内容。以此来达到线程安全的目的。
(4)条件变量,而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程 改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来,条件变量被用来进行线程间的同步。

5.进程间通信的方式,以及各个方式的优缺点。
(1)无名管道( pipe ):优点:当进程间通信时管道被创建,存在于内存中,当最后一个进程终止时管道被自动销毁。缺点:半双工通信,管道单向流通,只能实现有亲缘关系的进程间通信。
(2)有名管道 (named pipe):优点:相比无名管道而言,有名管道可以实现不相关进程间的通信。缺点:当发生进程间通信时,管道文件被创建,存在于磁盘上,通信完毕需要手动删除,否则占用空间。
(3)信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(4)共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
(5)消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(6)信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(7)套接字(socket):套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机间的进程通信。
//(进程间通信详解:http://blog.csdn.net/cc_clear/article/details/75452191)

6.select、poll、epoll的区别
select、poll、epoll三者是实现IO多路复用的主要机制,I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。在实现性能上有以下差别。

select
既然是IO多路复用,就应该可以实现对多路IO的操作管理。select将所要进行IO操作管理的文件描述法fd放在一个集合中。实现过程是通过轮询的机制遍历组内所有的fd哪些已经准备好了,再对已经准备好的fd执行相应的IO操作。select的缺点很明显,首先这个集合所能管理的文件描述符的数目有限最大为1024,当集合中文件描述符的数目增多时,轮询的方式就及其浪费时间,极大的降低了效率,而且每次调用select需要将该集合中的文件描述符进行从用户空间到内核空间的拷贝工作。

poll
poll和select比较相似,也是需要以轮询的方式去遍历所有监听的文件描述符,但是比select好的是poll没有集合数目的限制,一般情况只要内存空间足够大就可以足够多。poll也是需要完成大量文件描述符的数组在用户空间到内核空间的拷贝,增大了系统开销,并且随着文件描述符的增多而线性增加。

epoll
epoll在select和poll上做了很大的改进
(1)epoll所能监听的文件描述符的数目上限是最大为能打开文件的数目。
(2)我们看一下epoll和select和poll的调用接口上的不同,select和poll都只提供了一个函数——select或者poll函数。而epoll提供了三个函数, epoll_create,epoll_ctl和epoll_wait,epoll_create是创建一个epoll句柄;epoll_ctl是注册要监听的事件类型;epoll_wait则是等待事件的产生。 每当有新的事件要注册到epoll句柄时,才会将所有的文件描述符拷贝到内核,而不是像select和poll一样,每次epoll_wait的时候进行重复拷贝, 这样减少了大量用户态到内核态的拷贝工作,从而大大节省了系统开销。
(3)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

以上是个人对网络编程知识体系的简单总结,希望读者多提建议和意见。

原创粉丝点击