网络编程面试题

来源:互联网 发布:软件保护卡 编辑:程序博客网 时间:2024/04/27 21:25

1、connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?
TCP连接的建立涉及到一个三次握手的过程,且SOCKET中connect函数需要一直等到客户接收到对于自己的SYN的ACK为止才返回,这意味着每个connect函数总会阻塞其调用进程至少一个到服务器的RTT时间,而RTT波动范围很大,从局域网的几个毫秒到几百个毫秒甚至广域网上的几秒。这段时间内,我们可以执行其他处理工作,以便做到并行。在此,需要用到非阻塞connect。
答:最通常的方法最有效的是加定时器;也可以采用非阻塞模式。
设置非阻塞模式的方法:
1 创建socket,并利用fcntl将其设置为非阻塞
2 调用connect函数,如果返回0,则连接建立,如果返回-1,检查errno,如果值为EINPRGRESS,则连接正在建立
对于阻塞式套接字,调用connect函数将激发TCP的三次握手过程,而且仅在连接建立成功或者出错时才返回,对于非阻塞式的套接字,如果如果调用connect函数会之间返回-1(表示出错),若错误为EINPROGRESS,表示连接建立,建立启动但是尚未完成;如果返回0,则表示连接已经建立,这些都是立即返回的
之后我们可以再用select函数检查是否连接成功,在等待的这段时间里,可以做一些别的操作,或者可以用这种技术同时建立多个连接.在Web浏览器中很普遍;
3 .由于我们使用select来等待连接的完成,因此我们可以给select设置一个时间限制,从而缩短connect的超时时间. 如果select返回0,则表示建立连接超时;我们返回超时错误给用户,同时关闭连接
如果select返回大于0的值,则需要检查套接口描述符是否可读或可写
【1】 当连接成功建立时,描述符变成可写; 【2】 当连接建立遇到错误时,描述符变为即可读,
如果规定时间内成功建立,则描述符变为可写;否则,采用getsockopt函数捕获错误信息,如果连接建立成功,这个错误值将是0,如果建立连接时遇到错误,则这个值是连接错误所对应的errno值(如:ECONNREFUSED,ETIMEDOUT等).
4 恢复套接字的文件状态并返回。
2、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道?
答: 若客户端掉线或者重新启动,服务器端会收到复位信号,每一种tcp/ip得实现不一样,控制机制也不一样。


3.在子网210.27.48.21/30种有多少个可用地址?分别是什么?
 
答:30表示的是网络号(network number)是30位,剩下2位中11是广播(broadcast)地址,00是multicast地址,只有01和10可以作为host address。

210.27.48.21/30代表的子网的网络号是30位,即网络号是210.27.48.21 & 255.255.255.251=210.27.48.20,此子网的地址空间是2位,即可以有4个地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一个地址的主机号(host number/id)是0。
而主机号0代表的是multicast地址。最后一个地址的最后两位是11,主机号每一位都为1代表的是广播(broadcast)地址。所以只有中间两个地址可以给host使用。
 
其实那个问题本身不准确,广播或multicast地止也是可以使用的地址,所以回答4也应该正确,当然问的人也可能是想要你回答2。我个人觉得最好的回答是一个广播地址,一个multicast地址,2个unicast地址。

4.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
答:
 

简:TTL是Time To Live,一般是hup count,每经过一个路由就会被减去一,如果它变成0,包会被丢掉。
 
它的主要目的是防止包在有回路的网络上死转,浪费网络资源。ping和traceroute用到它。

详:TTL是Time To Live,目前是hup count,当包每经过一个路由器它就会被减去一,如果它变成0,路由器就会把包丢掉。
 
IP网络往往带有环(loop),比如子网A和子网B有两个路由器相连,它就是一个loop。
TTL的主要目的是防止包在有回路的网络上死转,因为包的TTL最终后变成0而使得此包从网上消失(此时往往路由器会送一个ICMP包回来,traceroute就是根据这个做的)。ping会送包出去,所以里面有它,但是ping不一定非要不可它。traceroute则是完全因为有它才能成的。ifconfig是用来配置网卡的,netstat -rn 是用来列路由表的,所以都用不着它。


5.路由表是做什么用的?在linux环境中怎么来配置一条默认路由?

答:

简:路由表是用来决定如何将包从一个子网传送到另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。
 
在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。


 
路由表的每一行至少有目标网络号、netmask、到这个子网应该使用的网卡。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的netmask和包里的目标IP地址做并逻辑运算(&)找出目标网络号,如果此网络号和这一行里的网络号相同就将这条路由保留下来做为备用路由,如果已经有备用路由了就在这两条路由里将网络号最长的留下来。
 
另一条丢掉,如此接着扫描下一行直到结束。如果扫描结束任没有找到任何路由,就用默认路由。确定路由后,直接将包送到对应的网卡上去。
在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。题外话:路由算法其实效率很差,而且不scalable,解决办法是使用IP交换机,比如MPLS。在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。
6.在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障?
答:测试这两台机器是否连通:从一台机器ping另一台机器如果ping不通,用traceroute可以确定是哪个路由器不能连通,然后再找问题是在交换设备/hup/cable等。
7.网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?

答案一:

1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
 
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。两者都可以提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
答案二:
根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1。速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
3。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。
等等。

 

原创粉丝点击