IT公司笔试题(三)

 1.请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢?TCP/IP的分层如下:

  应用层

  传输层

  网络层

  网络接口层

  IP处在互连网络层。负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收)。

  TCP与UDP在传输层。它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报包议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

  TCP和UDP都是建立在IP之上的,传输过程如下:

  发送:

  1 应用层层将数据传到传输层

  2 传输层层会自动把数据分成若干的tcp包或者udp包,分这些包时每个包上都加入tcp或udp包头(加入端口号等等很多信息)再将些包传给网络层。

  4 网络层把传来的每个tcp包或udp包再分成若干个ip包,加入ip包头(加入本地ip地址,目的ip地址等等信息),再往下就是网络接口层

  5 网络接口层就用到物理设备,网卡根据目的ip地址查询到mac地址,把数据传给接收方。

  接收:

  1 接收方的网络接口层向网络层提供ip包

  2 传输层再把这些ip包组合起来成为tcp或者udp包

  3 网络层把数据再向上返给应用层。

2.请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的?
主要功能不同 虽然三层交换机与路由器都具有路由功能,但我们不能因此而把它们等同起来,正如现在许多网络设备同时具备多种传统网络设备功能一样,就如现在有许多宽带路由器不仅具有路由功能,还提供了交换机端口、硬件防火墙功能,但不能把它与交换机或者防火墙等同起来一样。因为这些路由器的主要功能还是路由功能,其它功能只不过是其附加功能,其目的是使设备适用面更广、使其更加实用。这里的三层交换机也一样,它仍是交换机产品,只不过它是具备了一些基本的路由功能的交换机,它的主要功能仍是数据交换。也就是说它同时具备了数据交换和路由 由发两种功能,但其主要功能还是数据交换;而路由器仅具有路由转发这一种主要功能。 

主要适用的环境不一样 三层交换机的路由功能通常比较简单,因为它所面对的主要是简单的局域网连接。正因如此,三层交换机的路由功能通常比较简单,路由路径远没有路由器那么复杂。它用在局域网中的主要用途还是提供快速数据交换功能,满足局域网数据交换频繁的应用特点。 而路由器则不同,它的设计初哀就是为了满足不同类型的网络连接,虽然也适用于局域网之间的连接,但它的路由功能更多的体现在不同类型网络之间的互联上,如局域网与广域网之间的连接、不同协议的网络之间的连接等,所以路由器主要是用于不同类型的网络之间。它最主要的功能就是路由转发,解决好各种复杂路由路径网络的连接就是它的最终目的,所以路由器的路由功能通常非常强大,不仅适用于同种协议的局域网间,更适用于不同协议的局域网与广域网间。它的优势在于选择最佳路由、负荷分担、链路备份及和其他网络进行路由信息的交换等等路由器所具有功能。为了与各种类型的网络连接,路由器的接口类型非常丰富,而三层交换机则一般仅同类型的局域网接口,非常简单。 

性能体现不一样 从技术上讲,路由器和三层交换机在数据包交换操作上存在着明显区别。路由器一般由基于微处理器的软件路由引擎执行数据包交换,而三层交换机通过硬件执行数据包交换。三层交换机在对第一个数据流进行路由后,它将会产生一个MAC地址与IP地址的映射表,当同样的数据流再次通过时,将根据此表直接从二层通过而不是再次路由,从而消除了路由器进行路由选择而造成网络的延迟,提高了数据包转发的效率。同时,三层交换机的路由查找是针对数据流的,它利用缓存技术,很容易利用ASIC技术来实现,因此,可以大大节约成本,并实现快速转发。而路由器的转发采用最长匹配的方式,实现复杂,通常使用软件来实现,转发效率较低。 正因如此,从整体性能上比较的话,三层交换机的性能要远优于路由器,非常适用于数据交换频繁的局域网中;而路由器虽然路由功能非常强大,但它的数据包转发效率远低于三层交换机,更适合于数据交换不是很频繁的不同类型网络的互联,如局域网与互联网的互联。如果把路由器,特别是高档路由器用于局域网中,则在相当大程度上是一种浪费(就其强大的路由功能而言),而且还不能很好地满足局域网通信性能需求,影响子网间的正常通信。


  TCP/IP的分层如下:

  应用层

  传输层

  网络层

  网络接口层

  IP处在互连网络层。负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收)。

  TCP与UDP在传输层。它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报包议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

  TCP和UDP都是建立在IP之上的,传输过程如下:

  发送:

  (1)应用层层将数据传到传输层

  (2)传输层层会自动把数据分成若干的tcp包或者udp包,分这些包时每个包上都加入tcp或udp包头(加入端口号等等很多信息)再将些包传给网络层。

  (3)网络层把传来的每个tcp包或udp包再分成若干个ip包,加入ip包头(加入本地ip地址,目的ip地址等等信息),再往下就是网络接口层

  (4)网络接口层就用到物理设备,网卡根据目的ip地址查询到mac地址,把数据传给接收方。

  接收:

  (1) 接收方的网络接口层向网络层提供ip包

  (2) 传输层再把这些ip包组合起来成为tcp或者udp包

  (3) 网络层把数据再向上返给应用层。3.请问C++中的类和C的struct有什么不同?

  C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。

  C++中的结构体和类的异同:

  (1)相同之处:结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。但C中的结构体不允许有函数;

  也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。

  (2)不同之处:结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。

  实际上,C中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的,而到C++中一类或者一个结构体可以包含函数(这个函数在C++我们通常中称为成员函数),C++中的结构体和类体现了数据结构和算法的结合。

  3.局部变量、全局变量和静态变量的含义 

  (1)局部变量

  在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量.

  1.主函数main中定义的变量也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效.

  2.不同函数中可以使用名字相同的变量,它们代表不同的对象,互不干扰.

  3.形式参数也使局部变量.

  4.在一个函数内部,可以在复合语句中定义变量,这些变量只在本符合语句中有效.

  (2)全局变量

  在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束.

  1.设全局变量的作用:增加了函数间数据联系的渠道.

  2.建议不再必要的时候不要使用全局变量,因为

  a.全局变量在程序的全部执行过程中都占用存储单元.

  b.它使函数的通用性降低了c.使用全局变量过多,会降低程序的清晰性.

  3.如果外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量,如果不再文件开头定义,按上面规定作用范围只限于定义点到文件终了.如果在定义点之前的函数想引用该外部变量,则应该在该函数中用关键字extern作外部变量说明.

  4.如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用.

  (3)静态变量

  静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围就是这个函数.

  静态全局变量,只在本文件可以用,虽然整个程序包含多个文件,但静态全局变量只能用在定义它的那个文件里,却不能用在程序中的其他文件里.它是定义存储因型为静态型的外部变量,其作用域是从定义点到程序结束,所不同的是存储类型决定了存储地点,静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的,只有程序运行结束后,才释放所占用的内存.

  【attention】

  操作系统和编译器如何判断全局变量和局部变量?

  操作系统和编译器是根据程序运行的内存区域来获取该变量的类型.程序的全局数据放在所分配内存的全局数据区,程序的局部数据放在栈区.

  【attention】

  <1>static全局变量与普通的全局变量有什么区别?

  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的.而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误.从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围.

  <2>static函数与普通函数有什么区别?

  static函数与普通函数作用域不同.仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义.对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.

  <3>static局部变量和普通局部变量有什么区别?

  static局部变量只被初始化一次,下一次依据上一次结果值;

  4.解释堆和栈的区别。

  一个由C/C++编译的程序占用的内存分为以下几个部分

  (1)栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其

  操作方式类似于数据结构中的栈。

  (2)堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回

  收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

  (3)全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的

  全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另

  一块区域。 - 程序结束后由系统释放。

  (4)文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

  (5)程序代码区—存放函数体的二进制代码。

你可能感兴趣的:(笔试)