您的位置:首页 > 理论基础 > 计算机网络

面试总结8--计算机网络相关问题Part2

2015-12-23 18:36 666 查看
1、关闭TCP连接一定需要4次挥手吗?不一定,4次挥手关闭TCP连接是最安全的做法。但在有些时候,我们不喜欢TIME_WAIT状态(如当MSL数值设置过大导致服务器端有太多TIME_WAIT状态的TCP连接,减少这些条目数可以更快地关闭连接,为新连接释放更多资源),这时我们可以通过设置SOCKET变量的SO_LINGER标志来避免SOCKET在close()之后进入TIME_WAIT状态,这时将通过发送RST强制终止TCP连接(取代正常的TCP四次握手的终止方式)。但这并不是一个很好的主意,TIME_WAIT对于我们来说往往是有利的。2、TCP/IP接受发送缓冲区相关概念Tcp收发需要缓冲区,udp不需要缓冲区。每个TCP套接口有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。当应用进程调用write往套接口写数据时,内核从应用进程缓冲区中拷贝所有数据到套接口的发送缓冲区,如果套接口发送缓冲区容不下应用程序的所有数据,或者是应用进程的缓冲区大于套接口的发送缓冲区,或者是套接口的发送缓冲区中有别的数据,应用进程将被挂起。内核将不从write返回。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区。所以,从写一个TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,它并不是告诉我们对方收到数据。TCP发给对方的数据,对方在收到数据时必须给予确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。由于应用程序调用send的速度跟网络介质发送数据的速度存在差异,所以,一部分应用数据被组织成tcp数据报之后,会缓存在tcpsocket的发送缓存队列中,等待网络空闲时再发送出去。同时,tcp协议要求对端在收到tcp数据报后,要对其序号进行ACK,只有当收到一个tcp数据报的ACK之后,才可以把这个tcp数据报(以一个structsk_buff的形式存在)从socket的发送缓冲队列中清除。UDP因为是不可靠连接,不必保存应用进程的数据拷贝,应用进程中的数据在沿协议栈向下传递时,以某种形式拷贝到内核缓冲区,当数据链路层把数据传出后就把内核缓冲区中数据拷贝删除。因此它不需要一个发送缓冲区。写UDP套接口的write返回表示应用程序的数据或数据分片已经进入链路层的输出队列,如果输出队列没有足够的空间存放数据,将返回错误ENOBUFS.3、IO多路复用相关问题?概念:IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。轮询(polling)用一个进程,但是使用非阻塞的I/O读取数据,当一个I/O不可读的时候立刻返回,检查下一个是否可读,这种方法比较浪费CPU时间,因为大多数时间是不可读,但是仍花费时间不断反复执行read系统调用。异步I/O(asynchronousI/O),当一个描述符准备好的时候用一个信号告诉进程,但是由于信号个数有限,多个描述符时不适用I/O多路转接(I/Omultiplexing)(貌似也翻译多路复用),先构造一张有关描述符的列表(epoll中为队列),然后调用一个函数,直到这些描述符中的一个准备好时才返回,返回时告诉进程哪些I/O就绪。select和epoll这两个机制都是多路I/O机制的解决方案,select为POSIX标准中的,而epoll为Linux所特有的。(1)Select、Epoll机制相关概念(Epoll与Select机制区别)epoll模型及优缺点?(很重要!)主要有3点,对应于select的3个缺点:1连接数受限2查找配对速度慢3数据由内核拷贝到用户态。1.select的句柄数目受限,在linux/posix_types.h头文件有这样的声明:#define__FD_SETSIZE1024表示select最多同时监听1024个fd。而epoll监视的描述符数量不受限制,它的限制是最大的打开文件句柄数目。2.epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,epoll是维护一个队列,直接看队列是不是空就可以了。epoll只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用callback函数(把这个句柄加入队列),其他idle状态句柄则不会,在这点上,epoll实现了一个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。epoll是通过每个fd定义的回调函数来实现的。只有就绪的fd才会执行回调函数,3.使用mmap加速内核与用户空间的消息传递。无论是select,poll还是epoll都需要内核把FD(文件描述符)消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。4、支持电平触发和边沿触发(只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发)两种方式,理论上边缘触发的性能要更高一些,但是代码实现相当复杂。poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。4、大端模式和小端模式?字节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:a)Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。b)Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。c)网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。写个小端模式转大端模式函数:判断大端还是小端大端返回1,小端返回0。intcheckCPU(void) { union { inta; charb; }c; c.a=1; return(c.b==1); }由于联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。5、Linux下du,df的区别?df和du的统计机制不一样。du会把指定目录下所有文件、目录、目录下的文件都统计。是建立在文件系统能看到的的确确是有这样一些文件的基础上的。也就是说我们能在文件系统里面看到的文件才会被du统计。linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。6、TCP中MTU和MSS?MTU:最大传输单元,通俗的理解就是在网络上传送的最大数据包,单位是字节。以太网对数据帧的长度都有一个限制,其最大值为1500,这个特性被称作MTU,不同类型的网络大多数都有一个上限。如果IP层有一个IP包要传,而且数据的长度比链路层上的MTU值还要大,那么就需要对这个数据包进行分片处理,而且要求被分片的每个数据包都要等于或小于这个MTU值,一般是最后一个数据包小于这个值。例如,一个大小为5000字节的数据包在穿越网络时,如果遇到一条MTU大小为1500字节的数据链路,即数据帧对多能容纳大小为1500字节的数据包。需要在数据成帧之前将数据包分片成多个小的数据包。被分片后,每片数据包的标示字段上打上相同的标记,以便接收者可以识别出属于同一个数据包的分片。如果不分片,该数据包就会被丢弃,从而造成数据包丢失。但是,如果因为MTU值设定得太小,以致于一个不是很大的数据包被分成许多片进行传输,这样就会产生很多数据包碎片,增加了设备负担,降低了网络使用率。TCP-MSS:MSS是MaxitumSegmentSize最大分段大小的缩写,意为TCP数据包每次能够传输的最大数据分段,是TCP协议里面的一个概念。
建立tcp连接的两端在三次握手时会协商tcpmss大小.单说拿TCP包做例子。报文传输1400字节的数据的话,那么mss就是1400,再加上20字节IP包头,20字节tcp包头,那么mtu就是1400+20+20.当然传输的时候其他的协议还要加些包头在前面,总之mtu就是总的最后发出去的报文大小。mss就是你需要发出去的数据大小。MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
7、mmap与malloc的比较?mmap并不分配空间,只是将文件映射到调用进程的地址空间里,然后你就可以用memcpy等操作写文件,而不用write()了.写完后用msync()同步一下,你所写的内容就保存到文件里了.不过这种方式没办法增加文件的长度,因为要映射的长度在调用mmap()的时候就决定了.brk和sbrk主要的工作是实现虚拟内存到内存的映射.每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理下将虚拟地址空间映射到内存,供malloc函数使用.8、TCP/IP四层参考模型?
第一层:网络接口层
  包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(AddressResolutionProtocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。
  第二层:网间层
  对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议(RoutingInformationProtocol,路由信息协议),负责数据的包装、寻址和路由。同时还包含网间控制报文协议(InternetControlMessageProtocol,ICMP)用来提供网络诊断信息。
  第三层:传输层
  对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。其中TCP协议(TransmissionControlProtocol)提供可靠的数据流运输服务,UDP协议(UseDatagramProtocol)提供不可靠的用户数据报服务。
  第四层:应用层
  对应于OSI七层参考模型的应用层和表达层。应用程序间沟通的层。因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻传输协议)等.
9、3次握手,4次挥手状态图。
10、实现防火墙的主流技术?
1.包过滤技术包过滤是最早使用的一种防火墙技术,包过滤技术工作的地方就是各种基于TCP/IP协议的数据报文进出的通道,它把这两层作为数据监控的对象,对每个数据包的头部、协议、地址、端口、类型等信息进行分析,并与预先设定好的防火墙过滤规则(FilteringRule)进行核对,一旦发现某个包的某个或多个部分与过滤规则匹配并且条件为“阻止”的时候,这个包就会被丢弃。2.应用代理技术由于包过滤技术无法提供完善的数据保护措施,而且一些特殊的报文攻击仅仅使用过滤的方法并不能消除危害(如SYN攻击、ICMP洪水等),因此人们需要一种更全面的防火墙保护技术,在这样的需求背景下,采用“应用代理”(ApplicationProxy)技术的防火墙诞生了。一个完整的代理设备包含一个服务端和客户端,服务端接收来自用户的请求,调用自身的客户端模拟一个基于用户请求的连接到目标服务器,再把目标服务器返回的数据转发给用户,完成一次代理工作过程。3.状态检测技术这种防火墙技术通过一种被称为“状态监视”的模块,在不影响网络安全正常工作的前提下采用抽取相关数据的方法对网络通信的各个层次实行监测,并根据各种过滤规则作出安全决策。
11、ATM?
ATM是异步传输模式的缩略语,ATM采用面向连接的交换方式,它以信元为单位。之所以称其为异步,是因为来自某一用户的、含有信息的信息元重复出现不是周期性的。
ATM信元总长度53字节,前5字节为信元头负责差错控制、流量控制、路由,后48字节为有用信息。
12、子网划分、求主机数?
子网划分是通过借用IP地址的若干位主机位来充当子网地址从而将原网络划分为若干子网而实现的。划分子网时,随着子网地址借用主机位数的增多,子网的数目随之增加,而每个子网中的可用主机数逐渐减少。以C类网络为例,原有8位主机位,2的8次方即256个主机地址,默认子网掩码255.255.255.0。借用1位主机位,产生2个子网,每个子网有126个主机地址;借用2位主机位,产生4个子网,每个子网有62个主机地址……每个网中,第一个IP地址(即主机部分全部为0的IP)和最后一个IP(即主机部分全部为1的IP)不能分配给主机使用,所以每个子网的可用IP地址数为总IP地址数量减2;根据子网ID借用的主机位数,我们可以计算出划分的子网数、掩码、每个子网主机数,主机数:子网掩码中主机号的位数n,主机数=2的n次方-2;
13、UDPsocket一个绑定端口号和不绑定的区别,不绑定是什么后果。不绑定IP又是什么后果?
对于UDP来说,socket函数建立一个插口;bind函数指明了本地地址/端口(包括ADDR_ANY,通配所有本地网络接口);connect可以用来指明目的地址/端口;
一般来说,UDP客户端在建立了插口后会直接用sendto函数发送数据,需要在sendto函数的参数里指明目的地址/端口。如果一个UDP客户端在建立了插口后首先用connect函数指明了目的地址/端口,然后也可以用send函数发送数据,因为此时send函数已经知道对方地址/端口,用getsockname也可以得到这个信息。UDP客户端在建立了插口后会直接用sendto函数发送数据,还隐含了一个操作,那就是在发送数据之前,UDP会首先为该插口选择一个独立的UDP端口(在1024-5000之间),将该插口置为已绑定状态。如果一个UDP客户端在建立了插口后首先用bind函数指明了本地地址/端口,也是可以的,这样可以强迫UDP使用指定的端口发送数据。(事实上,UDP无所谓服务器和客户端,这里的界限已经模糊了。)UDP服务器也可以使用connect,如上面所述,connect可以用来指明目的地址/端口;这将导致服务器只接受特定一个主机的请求。
l客户端1.TCP客户端:1)当TCP客户未绑定IP地址,当它调用connect时内核会根据外出接口给它绑定一个IP地址和一个临时端口号。并且TCP服务器在接到这个连接后会以这个IP地址作为回应数据报的目的IP地址。2)当TCP客户绑定了IP地址,它就为发出的数据连接指定了一个源IP地址,并且TCP服务器在接到这个连接后会以这个IP地址作为回应数据报的目的IP地址。3)TCP客户只能根据四元组(原端口号,原IP地址,目的端口号,目的IP地址)接受数据报。2.UDP客户端:1)当UDP客户未绑定IP地址,当它调用sendto时内核会根据外出接口给它绑定一个IP地址和一个临时端口号。(UDP客户可以接收到达它绑定的临时端口的任何UDP数据报)。2)当UDP客户绑定了IP地址,它就为发出的数据报指定了一个源IP地址,并且UDP服务器在接到这个数据报后会以这个IP地址作为回应数据报的目的IP地址。(UDP客户只能接收到达它绑定的临时端口并且目的地址为它绑定的IP地址的UDP数据报)。3)当UDP客户调用connect,内核记录下对方的IP地址和端口号,它们包含在传递给connect的套接口地址结构中,并为UDP客户绑定了一个临时端口号和IP地址。(UDP客户只能接收目的IP地址为它绑定的IP地址和端口号并且源IP地址为它指定对方的IP地址和端口号的数据报)。l服务器端1.TCP服务器:1)当TCP服务器绑定通配IP地址,套接口会接收到达它绑定端口的任何TCP连接。并以接收的目的IP地址作为它的源IP地址(用以确定四源组),以接收的源IP地址作为它的目的IP地址发回应答。2)当TCP服务器绑定本地IP地址,这就限制了套接口只接收到达它绑定端口并且目的地址为此IP地址的客户连接。以绑定的目的IP地址作为源IP地址(当然,绑定的IP地址肯定与接收连接的目的IP地址相同,否则它不会接收),并以接收的源IP地址作为它的目的IP地址发回应答。2.UDP服务器:1)当UDP服务器绑定通配IP地址,套接口会接收到达它绑定端口的任何UDP数据报。并以数据报的外出接口的主IP地址为源IP地址,以接收到的源IP地址作为它的目的IP地址发回应答。2)当UDP服务器绑定本机IP地址,这就限制了套接口只接收到达它绑定端口并且目的地址为此IP地址的UDP数据报。并以绑定的IP地址作为源IP地址,以接收的源IP地址作为它的目的IP地址发回应答。3)当UDP服务器调用connect,内核记录下对方的IP地址和端口号,它们包含在传递给connect的套接口地址结构中,并为UDP服务器绑定了一个临时端口号和IP地址。(UDP服务器只能接收目的IP地址为它绑定的IP地址和端口号并且源IP地址为它指定对方的IP地址和端口号的数据报)。
14、将文件或目录拷贝到另一个Linux系统下?(scp)
scp就是securitycopy,用于将文件或者目录从一个Linux系统拷贝到另一个Linux系统下。scp传输数据用的是SSH协议,保证了数据传输的安全,其格式如下:scp远程用户名@IP地址:文件的绝对路径本地Linux系统路径。scp本地Linux系统文件路径远程用户名@IP地址:远程系统文件绝对路径名。
目前我们处在IP为“192.168.60.133”的Linux系统下,计划将系统下的/home/ixdba/etc.tar.gz文件拷贝到IP为“192.168.60.168”的远程Linux系统中root用户下的/tmp目录下:scp/home/ixdba/etc.tar.gzroot@192.168.60.168:/tmp
15、SIGTERM和SIGKILL有什么不同?
程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: