zoukankan      html  css  js  c++  java
  • 如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?

    一、如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平

    (1)掌握扎实、全面的理论基础知识
    只有熟悉理论知识,才能在实践中“游刃有余”。我们所说的理论知识不光是计算机网络理论知识,它还包括各个学科,如数学知识、物理知识、外语知识等。
    (2)熟悉计算机硬件设备
    包括路由器、交换设备及集线器等硬件的物理结构、性能、各项参数等。进行网络系统设计时,硬件的性能指标是网络工程师要充分考虑的因素,只有这样才能设计出性价比最高的网络。
    (3)精通最常用的网络操作系统
    这些网络操作系统主要包括Windows 2000/XP/2003、Unix和Linux等,对于平时在学习和工作中很少接触Unix和Linux的朋友来说,就要多看相关案例以弥补这方面的不足。Unix和Linux在安全性与稳定性方面明显优于Windows操作系统,这也使它们成为许多企业内部网络操作系统的首选。现在架设一个网络可能会用到多种操作系统,因而掌握它们能更快、更好地处理和解决问题。
    (4)掌握综合布线和网络集成的技能
    在网络设计时,要充分考虑设备的选型和网络拓扑的设计,就必须对综合布线有所了解,才可能做到组网科学、合理、安全、性价比最高。同时,作为一个合格的网络工程师,熟悉某种常用数据库如Oracle,Sybase、SQL Server等也是必需的,最好还能精通SQL语句。由于网络需求是随着社会的发展而千变万化的,因此网络工程师要注重在实践中培养创新能力,不能照搬别人的方案(好方案可以借鉴但不能全照搬),否则对自己的发展是非常不利的,因为你无法掌握核心的技术。在技术发展日新月异的今天,只有不断学习和成长,才能适应企业的需要,巩固并扩展自己的职业空间。
    (5)熟悉常用路由器与交换设备的配置
    这些主要包括Cisco、华为等主流厂商的产品配置,一名合格的网络工程师必须能够单独完成网络的配置与架构设计工作,这些都要求实施者具备丰富的理论知识和实践经验。有的朋友证书拿了好几张,但在实际工作中的表现却令人失望,连最基本的T568A、T568B线序都不清楚,路由器基本的调试与配置命令也不知道,更不用说三层交换机的配置。总之,他们在学习中只注重理论而忽略了实践能力的培养。
    要想成为合格的网络工程师,笔者认为参加适当的培训也是非常有必要的。真实的网络环境、经验丰富的培训讲师,会给你带来许多预想不到效果,在学习过程中掌握了网络的精髓,这样就能搭建合理、高效的网络。同时,理论与实践相结合,不仅能掌握学习领域中的内容,更重要的是能锻炼自己融会贯通、举一反三的能力。否则,缺乏真实的网络环境以及动手调试的机会,便不能获得必需的职业技能,在激烈的社会竞争中就会被淘汰。
    (6)出色的学习和适应能力
    作为一名卓越的网络工程师必须具备出色的学习和适应能力,要不断更新知识,因为网络技术更新的速度是很快的!

    二、Linux网络协议栈分析

    Linux TCP/IP协议栈源码分析

    1. linux内核ipv4网络部分分层结构:

     

    BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件主要有:/net/socket.c /net/protocols.c etc

    INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock结构。文件主要有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c 

    TCP/UDP层:处理传输层的操作,传输层用struct inet_protocol和struct proto两个结构表示。文件主要有:/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c  

    IP层:处理网络层的操作,网络层用struct packet_type结构表示。文件主要有:/net/ipv4/ip_forward.cip_fragment.c ip_input.c ip_output.c .

    数据链路层和驱动程序:每个网络设备以struct net_device表示,通用的处理在dev.c中,驱动程序都在/driver/net目录下。

    2. 数据发送流程图

    各层主要函数以及位置功能说明:
            1)sock_write:初始化msghdr{}结构 net/socket.c
            2)sock_sendmsg:net/socket.c
            3)inet_sendmsg:net/ipv4/af_net.c
            4)tcp_sendmsg:申请sk_buff{}结构的空间,把msghdr{}结构中的数据填入sk_buff空间。net/ipv4/tcp.c
            5)tcp_send_skb:net/ipv4/tcp_output.c
            6)tcp_transmit_skb:net/ipv4/tcp_output.c
            7)ip_queue_xmit:net/ipv4/ip_output.c
            8)ip_queue_xmit2:net/ipv4/ip_output.c
            9)ip_output:net/ipv4/ip_output.c
            10)ip_finish_output:net/ipv4/ip_output.c
            11)ip_finish_output2:net/ipv4/ip_output.c
            12)neigh_resolve_output:net/core/neighbour.c
            13)dev_queue_xmit:net/core/dev.c

    3. 数据接收流程图

    各层主要函数以及位置功能说明:
     
            1)sock_read:初始化msghdr{}的结构类型变量msg,并且将需要接收的数据存放的地址传给msg.msg_iov->iov_base.      net/socket.c
            2)sock_recvmsg: 调用函数指针sock->ops->recvmsg()完成在INET Socket层的数据接收过程.其中sock->ops被初始化为inet_stream_ops,其成员recvmsg对应的函数实现为inet_recvmsg()函数. net/socket.c
            3)sys_recv()/sys_recvfrom():分别对应着面向连接和面向无连接的协议两种情况. net/socket.c
            4)inet_recvmsg:调用sk->prot->recvmsg函数完成数据接收,这个函数对于tcp协议便是tcp_recvmsg net/ipv4/af_net.c
            5)tcp_recvmsg:从网络协议栈接收数据的动作,自上而下的触发动作一直到这个函数为止,出现了一次等待的过程.函数tcp_recvmsg可能会被动地等待在sk的接收数据队列上,也就是说,系统中肯定有其他地方会去修改这个队列使得tcp_recvmsg可以进行下去.入口参数sk是这个网络连接对应的sock{}指针,msg用于存放接收到的数据.接收数据的时候会去遍历接收队列中的数据,找到序列号合适的.
            但读取队列为空时tcp_recvmsg就会调用tcp_v4_do_rcv使用backlog队列填充接收队列.
            6)tcp_v4_rcv:tcp_v4_rcv被ip_local_deliver函数调用,是从IP层协议向INET Socket层提交的"数据到"请求,入口参数skb存放接收到的数据,len是接收的数据的长度,这个函数首先移动skb->data指针,让它指向tcp头,然后更新tcp层的一些数据统计,然后进行tcp的一些值的校验.再从INET Socket层中已经建立的sock{}结构变量中查找正在等待当前到达数据的哪一项.可能这个sock{}结构已经建立,或者还处于监听端口、等待数据连接的状态。返回的sock结构指针存放在sk中。然后根据其他进程对sk的操作情况,将skb发送到合适的位置.调用如下:
     
            TCP包接收器(tcp_v4_rcv)将TCP包投递到目的套接字进行接收处理. 当套接字正被用户锁定,TCP包将暂时排入该套接字的后备队列(sk_add_backlog).这时如果某一用户线程企图锁定该套接字(lock_sock),该线程被排入套接字的后备处理等待队列(sk->lock.wq).当用户释放上锁的套接字时(release_sock,在tcp_recvmsg中调用),后备队列中的TCP包被立即注入TCP包处理器(tcp_v4_do_rcv)进行处理,然后唤醒等待队列中最先的一个用户来获得其锁定权. 如果套接字未被上锁,当用户正在读取该套接字时, TCP包将被排入套接字的预备队列(tcp_prequeue),将其传递到该用户线程上下文中进行处理.如果添加到sk->prequeue不成功,便可以添加到 sk->receive_queue队列中(用户线程可以登记到预备队列,当预备队列中出现第一个包时就唤醒等待线程.)   /net/tcp_ipv4.c
     
            7)ip_rcv、ip_rcv_finish:从以太网接收数据,放到skb里,作ip层的一些数据及选项检查,调用ip_route_input()做路由处理,判断是进行ip转发还是将数据传递到高一层的协议.调用skb->dst->input函数指针,这个指针的实现可能有多种情况,如果路由得到的结果说明这个数据包应该转发到其他主机,这里的input便是ip_forward;如果数据包是给本机的,那么input指针初始化为ip_local_deliver函数./net/ipv4/ip_input.c
     
            8)ip_local_deliver、ip_local_deliver_finish:入口参数skb存放需要传送到上层协议的数据,从ip头中获取是否已经分拆的信息,如果已经分拆,则调用函数ip_defrag将数据包重组。然后通过调用ip_prot->handler指针调用tcp_v4_rcv(tcp)。ip_prot是inet_protocol结构指针,是用来ip层登记协议的,比如由udp,tcp,icmp等协议。 /net/ipv4/ip_input.c
    4、linux的tcp-ip栈代码的详细分析
     
    4.1.数据结构(msghdr,sk_buff,socket,sock,proto_ops,proto)
     
    bsd套接字层,操作的对象是socket,数据存放在msghdr这样的数据结构:
     
    创建socket需要传递family,type,protocol三个参数,创建socket其实就是创建一个socket实例,然后创建一个文件描述符结构,并且互相建立一些关联,即建立互相连接的指针,并且初始化这些对文件的写读操作映射到socket的read,write函数上来。
     
    同时初始化socket的操作函数(proto_ops结构),如果传入的type参数是STREAM类型,那么就初始化为SOCKET->ops为inet_stream_ops,如果是DGRAM类型,则SOCKET-ops为inet_dgram_ops。对于inet_stream_ops其实是一个结构体,包含了stream类型的socket操作的一些入口函数,在这些函数里主要做的是对socket进行相关的操作,同时通过调用下面提到的sock中的相关操作完成socket到sock层的传递。比如在inet_stream_ops里有个inet_release的操作,这个操作除了释放socket的类型空间操作外,还通过调用socket连接的sock的close操作,对于stream类型来说,即tcp_close来关闭sock
    释放sock。
     
    创建socket同时还创建sock数据空间,初始化sock,初始化过程主要做的事情是初始化三个队列,receive_queue(接收到的数据包sk_buff链表队列),send_queue(需要发送数据包的sk_buff链表队列),backlog_queue(主要用于tcp中三次握手成功的那些数据包,自己猜的),根据family、type参数,初始化sock的操作,比如对于family为inet类型的,type为stream类型的,sock->proto初始化为tcp_prot.其中包括stream类型的协议sock操作对应的入口函数。
     
    在一端对socket进行write的过程中,首先会把要write的字符串缓冲区整理成msghdr的数据结构形式(参见linux内核2.4版源代码分析大全),然后调用sock_sendmsg把msghdr的数据传送至inet层,对于msghdr结构中数据区中的每个数据包,创建sk_buff结构,填充数据,挂至发送队列。一层层往下层协议传递。一下每层协议不再对数据进行拷贝。而是对sk_buff结构进行操作。
     
    数据链路层:
      
       net_device{}结构,对应于每一个网络接口设备。这个结构中包含很多可以直接获取网卡信息的函数和变量,同时包含很多对于网卡操作的函数,这些直接指向该网卡驱动程序的许多函数入口,包括发送接收数据帧到缓冲区等。当这些完成后,比如数据接收到缓冲区后便由netif_rx(在net/core/dev.c各种设备驱动程序的上层框架程序)把它们组成sk_buff形式挂到系统接收的backlog队列然后交由上层网络协议处理。同样,对于上层协议处理下来的那些sk_buff。便由dev_queue_xmit函数放入网络缓冲区,交给网卡驱动程序的发送程序处理。
     
       在系统中存在一张链表dev_base将系统中所有的net_device{}结构连在一起。对应于内核初始化而言,系统启动时便为每个所有可能支持的网络接口设备申请了一个net_device{}空间并串连起来,然后对每个接点运行检测过程,如果检测成功,则在dev_base链表中保留这个接点,否则删除。对应于模块加载来说,则是调用register_netdev()注册net_device,在这个函数中运行检测过程,如果成功,则加到dev_base链表。否则就返回检测不到信息。删除同理,调用
    unregister_netdev。
     
     
    4.2.启动分析
     
       4. 2.1 初始化进程 :start-kernel(main.c)---->do_basic_setup(main.c)---->sock_init(/net/socket.c)---->do_initcalls(main.c)
     
    void __init sock_init(void)
    {
     int i;
     
     printk(KERN_INFO "Linux NET4.0 for Linux 2.4
    ");
     printk(KERN_INFO "Based upon Swansea University Computer Society NET3.039
    ");
     
     /*
      * Initialize all address (protocol) families. 每一项表示的是针对一个地址族的操作集合,例如对于ipv4来说,在net/ipv4/af_inet.c文件中的函数inet_proto_init()就调用sock_register()函数将inet_families_ops初始化到属于IPV4的net_families数组中的一项。
      */
      
     for (i = 0; i < NPROTO; i++) 
      net_families[i] = NULL;  
     
     /*
      * Initialize sock SLAB cache.初始化对于sock结构预留的内存的slab缓存。
      */
      
     sk_init();
     
    #ifdef SLAB_SKB
     /*
      * Initialize skbuff SLAB cache 初始化对于skbuff结构的slab缓存。以后对于skbuff的申请可以通过函数kmem_cache_alloc()在这个缓存中申请空间。
      */
     skb_init();
    #endif
     
     /*
      * Wan router layer. 
      */
     
    #ifdef CONFIG_WAN_ROUTER  
     wanrouter_init();
    #endif
     
     /*
      * Initialize the protocols module. 向系统登记sock文件系统,并且将其安装到系统上来。
      */
     
     register_filesystem(&sock_fs_type);
     sock_mnt = kern_mount(&sock_fs_type);
     /* The real protocol initialization is performed when
      *  do_initcalls is run.  
      */
    
     /*
      * The netlink device handler may be needed early.
      */
     
    #ifdef CONFIG_NET
     rtnetlink_init();
    #endif
    #ifdef CONFIG_NETLINK_DEV
     init_netlink();
    #endif
    #ifdef CONFIG_NETFILTER
     netfilter_init();
    #endif
     
    #ifdef CONFIG_BLUEZ
     bluez_init();
    #endif
     
    /*yfhuang ipsec*/
    #ifdef CONFIG_IPSEC            
     pfkey_init();
    #endif
    /*yfhuang ipsec*/
    }
     
     
        4.2.2 do_initcalls() 中做了其它的初始化,其中包括
     
                    协议初始化,路由初始化,网络接口设备初始化
     
    (例如inet_init函数以_init开头表示是系统初始化时做,函数结束后跟module_init(inet_init),这是一个宏,在include/linux/init.c中定义,展开为_initcall(inet_init),表示这个函数在do_initcalls被调用了)
     
        4.2.3 协议初始化
    此处主要列举inet协议的初始化过程。
     
    static int __init inet_init(void)
    {
     struct sk_buff *dummy_skb;
     struct inet_protocol *p;
     struct inet_protosw *q;
     struct list_head *r;
     
     printk(KERN_INFO "NET4: Linux TCP/IP 1.0 for NET4.0
    ");
     
     if (sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)) {
      printk(KERN_CRIT "inet_proto_init: panic
    ");
      return -EINVAL;
     }
     
     /*
      * Tell SOCKET that we are alive... 注册socket,告诉socket inet类型的地址族已经准备好了
      */
       
       (void) sock_register(&inet_family_ops);
     
     /*
      * Add all the protocols. 包括arp,ip、ICMP、UPD、tcp_v4、tcp、igmp的初始化,主要初始化各种协议对应的inode和socket变量。
     
    其中arp_init完成系统中路由部分neighbour表的初始化
     
    ip_init完成ip协议的初始化。在这两个函数中,都通过定义一个packet_type结构的变量将这种数据包对应的协议发送数据、允许发送设备都做初始化。
    
      */
     
     printk(KERN_INFO "IP Protocols: ");
     for (p = inet_protocol_base; p != NULL;) {
      struct inet_protocol *tmp = (struct inet_protocol *) p->next;
      inet_add_protocol(p);
      printk("%s%s",p->name,tmp?", ":"
    ");
      p = tmp;
     }
     
     /* Register the socket-side information for inet_create. */
     for(r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r)
      INIT_LIST_HEAD(r);
     
     for(q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)
      inet_register_protosw(q);
     
     /*
      * Set the ARP module up  
      */
     
     arp_init();
     
       /*
        * Set the IP module up
        */
     
     ip_init();
     
     tcp_v4_init(&inet_family_ops);
     
     /* Setup TCP slab cache for open requests. */
     tcp_init();
    
     /*
      * Set the ICMP layer up
      */
     
     icmp_init(&inet_family_ops);
     
     /* I wish inet_add_protocol had no constructor hook...
        I had to move IPIP from net/ipv4/protocol.c :-( --ANK
      */
    #ifdef CONFIG_NET_IPIP
     ipip_init();
    #endif
    #ifdef CONFIG_NET_IPGRE
     ipgre_init();
    #endif
     
     /*
      * Initialise the multicast router
      */
    #if defined(CONFIG_IP_MROUTE)
     ip_mr_init();
    #endif
     
     /*
      * Create all the /proc entries.
      */
    #ifdef CONFIG_PROC_FS
     proc_net_create ("raw", 0, raw_get_info);
     proc_net_create ("netstat", 0, netstat_get_info);
     proc_net_create ("snmp", 0, snmp_get_info);
     proc_net_create ("sockstat", 0, afinet_get_info);
     proc_net_create ("tcp", 0, tcp_get_info);
     proc_net_create ("udp", 0, udp_get_info);
    #endif  /* CONFIG_PROC_FS */
     
     ipfrag_init();
     
     return 0;
    }   
    module_init(inet_init);
                                                
       4. 2.4 路由初始化(包括neighbour表、FIB表、和路由缓存表的初始化工作)
     
            rtcache表 ip_rt_init()函数 在net/ipv4/ip_output中调用,net/ipv4/route.c中定义
     
            FIB初始化 在ip_rt_init()中调用 在net/ipv4/fib_front.c中定义
     
           neigbour表初始化  arp_init()函数中定义 
     
         2.5 网络接口设备初始化
                 
                 在系统中网络接口都是由一个dev_base链表进行管理的。通过内核的启动方式也是通过这个链表进行操作的。在系统启动之初,将所有内核能够支持的网络接口都初始化成这个链表中的一个节点,并且每个节点都需要初始化出init函数指针,用来检测网络接口设备。然后,系统遍历整个dev_base链表,对每个节点分别调用init函数指针,如果成功,证明网络接口设备可用,那么这个节点就可以进一步初始化,如果返回失败,那么证明该网络设备不存在或是不可用,只能将该节点删除。启动结束之后,在dev_base中剩下的都是可以用的网络接口设备。
     
            
     
    4.3网络连接
                tcp连接建立的代码如下:
                        
    server=gethostbyname(SERVER_NAME);
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    address.sin_family=AF_INET;
    address.sin_port=htons(PORT_NUM);
    memcpy(&address.sin_addr,server->h_addr,server->h_length);
    connect(sockfd,&address,sizeof(address));
           连接的初始化与建立期间主要发生的事情如下:
                          
           1)sys_socket调用:调用socket_creat(),创建出一个满足传入参数family、type、和protocol的socket,调用sock_map_fd()获取一个未被使用的文件描述符,并且申请并初始化对应的file{}结构。
            
           2)sock_creat():创建socket结构,针对每种不同的family的socket结构的初始化,就需要调用不同的create函数来完成。对应于inet类型的地址来说,在网络协议初始化时调用sock_register()函数中完成注册的定义如下:
     struct net_proto_family inet_family_ops={
                    PF_INET;
                    inet_create
            };
           所以inet协议最后会调用inet_create函数。
            
           3)inet_create: 初始化sock的状态设置为SS_UNCONNECTED,申请一个新的sock结构,并且初始化socket的成员ops初始化为inet_stream_ops,而sock的成员prot初始化为tcp_prot。然后调用sock_init_data,将该socket结构的变量sock和sock类型的变量关联起来。
     
           4)在系统初始化完毕后便是进行connect的工作,系统调用connect将一个和socket结构关联的文件描述符和一个sockaddr{}结构的地址对应的远程机器相关联,并且调用各个协议自己对应的connect连接函数。对应于tcp类型,则sock->ops->connect便为inet_stream_connect。
     
     
           5)inet_stream_connect: 得到sk,sk=sock->sk,锁定sk,对自动获取sk的端口号存放在sk->num中,并且用htons()函数转换存放在sk-&gt;sport中。然后调用sk->prot->connect()函数指针,对tcp协议来说就是tcp_v4_connect()函数。然后将sock->state状态字设置为SS_CONNECTING,等待后面一系列的处理完成之后,就将状态改成SS_CONNECTTED。
     
           6) tcp_v4_connect():调用函数ip_route_connect(),寻找合适的路由存放在rt中。ip_route_connect找两次,第一次找到下一跳的ip地址,在路由缓存或fib中找到,然后第二次找到下一跳的具体邻居,到neigh_table中找到。然后申请出tcp头的空间存放在buff中。将sk中相关地址数据做一些针对路由的变动,并且初始化一个tcp连接的序列号,调用函数tcp_connect(),初始化tcp头,并设置tcp处理需要的定时器。一次connect()建立的过程就结束了。
     
           连接的关闭主要如下:
     
            1)close: 一个socket文件描述符对应的file{}结构中,有一个file_operations{}结构的成员f_ops,它的初始化关闭函数为sock_close函数。
     
            2)sock_close:调用函数sock_release(),参数为一个socket{}结构的指针。
     
            3)sock_release:调用inet_release,并释放socket的指针和文件空间
     
            4)inet_release: 调用和该socket对应协议的关闭函数inet_release,如果是tcp协议,那么调用的是tcp_close;最后释放sk。
     
    三、计算机网络知识技能水平的测评试题
     
    选择题
    (1)计算机网络中使用最广泛的交换技术是( ) 【网课“计算机网络”测试题】
    A.电路交换 B.报文交换 C.分组交换 D.线路交换
    答案:C,最常用的TCP/IP协议数据传输形式为分组
     

    (2)下列网络设备中,能够抑制广播风暴的是______。【408】
    Ⅰ 中继器Ⅱ 集线器Ⅲ 网桥Ⅳ 路由器
    A.仅Ⅰ 和Ⅱ B.仅Ⅲ
    C.仅Ⅲ 和Ⅳ D.仅Ⅳ、

    参考答案:考查网络设备与网络风暴。
    物理层设备中继器和集线器既不隔离冲突域也不隔离广播域;网桥可隔离冲突域,但不隔离广播域;网络层的路由器既隔离冲突域,也隔离广播域;VLAN 即虚拟局域网也可隔离广播域。对于不隔离广播域的设备,他们互连的不同网络都属于同一个广播域,因此扩大了广播域的范围,更容易产生网络风暴。

    (3)在 TCP/IP 体系结构中,直接为 ICMP 提供服务的协议是(B)。【408】
    A.PPP
    B.IP
    C.UDP
    D.TCP
    解析:考查 ICMP 协议的特点。ICMP 是网络层协议,ICMP 报文作为数据字段封装在 IP 分组中。
     
    (4)主机甲与主机乙之间已建立一个TCP连接,主机甲向主机乙发送了3个连续的TCP段,分
    别包含300字节、400字节和500字节的有效载荷,第3个段的序号为900。若主机乙仅正
    确接收到第1和第3个段,则主机乙发送给主机甲的确认序号是(B)【408】
    A.300
    B.500
    C.1200
    D.1400
    解析:B。TCP段首部中的序号字段是指本报文段所发送的数据的第一个字节的序号。第
    三个段的序号为900,则第二个段的序号为900-400=500。而确认号是期待收到对方下一个报
    文段的第一个字节的序号。现在主机乙期待收到第二个段,故甲的确认号是500。
     
    (5)以太网的 MAC 协议提供的是(A)。【408】
    A.无连接不可靠服务
    B.无连接可靠服务
    C.有连接不可靠服务
    D.有连接可靠服务
    解析:
    考查以太网 MAC 协议。
    考虑到局域网信道质量好,以太网采取了两项重要的措施以使通信更简便:①采用无连接的工作方
    式;②不对发送的数据帧进行编号,也不要求对方发回确认。因此,以太网提供的服务是不可靠的服务,
    即尽最大努力交付。差错的纠正由高层完成。
     
    (6)下列关于交换机的叙述中,正确的是(A)【408】
    A.以太网交换机本质上是一种多端口网桥
    B.通过交换机互连的一组工作站构成一个冲突域
    C.交换机每个端口所连网络构成一个独立的广播域
    D.以太网交换机可实现采用不同网络层协议的网络互联
    解析:以太网交换机本质上就是一种多端口网桥,故选A。
    交换机隔绝了冲突域,B错。
    交换机所构成网络是一个广播域,非独立,C错。
    以太网交换机只能实现对等层的网络协议的网络互联,D错。
     
    (7)下列关于 IP 路由器功能的描述中,正确的(C) 。【408】
    Ⅰ.运行路由协议,设备路由表
    Ⅱ.监测到拥塞时,合理丢弃 IP 分组
    Ⅲ.对收到的 IP 分组头进行差错校验,确保传输的 IP 分组不丢失
    Ⅳ.根据收到的 IP 分组的目的 IP 地址,将其转发到合适的输出线路上
    A.仅Ⅲ、Ⅳ
    B.仅Ⅰ、Ⅱ、Ⅲ
    C.仅Ⅰ、Ⅱ、Ⅳ
    D.Ⅰ、Ⅱ、Ⅲ、Ⅳ
    解析:
    考查 IP 路由器的功能。
    Ⅰ、Ⅳ显然是 IP 路由器的功能。对于Ⅱ,当路由器监测到拥塞时,可合理丢弃 IP 分组,并向发出
    该 IP 分组的源主机发送一个源点抑制的 ICMP 报文。对于Ⅲ,路由器对收到的 IP 分组首部进行差错检
    验,丢弃有差错首部的报文,但不保证 IP 分组不丢失。
     
    (8) ARP 协议的功能是(A)。【408】
    A.根据 IP 地址查询 MAC 地址 B.根据 MAC 地址查询 IP 地址
    C.根据域名查询 IP 地址 D.根据 IP 地址查询域名
     解析:
    考查 ARP 协议的功能。
    在实际网络的数据链路层上传送数据时,最终必须使用硬件地址,ARP 协议是将网络层的 IP 地址
    解析为数据链路层的 MAC 地址。
     
    (9)下列关于 UDP 协议的叙述中,正确的是(B)【408】
     
    I.提供无连接服务
    II.提供复用/分用服务
    III.通过差错校验,保障可靠数据传输
    A.仅 I
    B.仅 I、II
    C.仅 II、III
    D.I、II、III
    解析:
    UDP 提供的是无连接的服务,I 正确;同时 UDP 也提供复用/分用服务,II 正确;
    UDP 虽然有差错校验机制,但是 UDP 的差错校验只是检查数据在传输的过程中有没有出错,
    出错的数据直接丢弃,并没有重传等机制,不能保证可靠传输,使用 UDP 协议时,可靠传
    输必须由应用层实现,III 错误;答案选 B。
     
    (10)下列选项中,对正确接收到的数据帧进行确认的MAC协议是(D)【408】
    A.CSMA
    B.CDMA
    C.CSMA/CD
    D.CSMA/CA
    解析:D。可以用排除法。首先CDMA即码分多址,是物理层的东西;CSMA/CD即带冲突检
    测的载波监听多路访问,这个应该比较熟悉,接收方并不需要确认;CSMA,既然CSMA/CD是
    其超集,CSMA/CD没有的东西,CSMA自然也没有。于是排除法选D。CSMA/CA是无线局域网标
    准802.11中的协议。CSMA/CA利用ACK信号来避免冲突的发生,也就是说,只有当客户端收到
    网络上返回的ACK信号后才确认送出的数据已经正确到达目的地址。
     
     
    应用题
    1.某网络拓扑如题47图所示,其中R为路由器,主机H1~H4的IP地址配置以及R的各接口IP地址配置如图中所示。现有若干台以太网交换机(无VLAN功能)和路由器两类网络互连设备可供选择。(2019年408第47题)     
    请回答下列问题: 
    (1)设备1.设备2和设备3分别应选择什么类型网络设备?
    (2)设备1.设备2和设备3中,哪几个设备的接口需要配置IP地址?并为对应的接口配置正确的IP地址。  
    (4)若主机H3发送一个目的地址为192. 168.1.127的IP数据报,网络中哪几个主机会接收该数据报?
     
    参考答案:
    (1)设备1:路由器,设备2:以太网交换机,设备3:以太网交换机
    (2)设备I的接口需要配置IP地址;设备1的IFI ,IF2和IF3接口的IP地址分别是:192.168.1.254.192.168.1.1和192.168.1.65。
    (3)R需要提供NAT服务
    (4)主机H4会接收该数据报。
     
    2.某网络拓扑如题47图所示,其中路由器内网接口、DHCP服务器、WWW服务器与主机1均采用静 态IP地址配置,相关地址信息见图中标注;主机2~主机N通过DHCP服务器动态获取IP地址等配置信息。(2015年408第47题)
     
    请回答下列问题。 
     (1)DHCP服务器可为主机2~主机N动态分配IP地址的最大范围是什么?主机2使用DHCP协议获取IP地址的 过程中,发送的封装DHCP Discover报文的IP分组的源IP地址和目的IP地址分别是什么?   
    (2)若主机2的ARP表为空,则该主机访问Internet时,发出的第一个以太网帧的目的M&C地址是什么?封装 主机2发往Internet的IP分组的以太网帧的目的MAC地址是什么?   
    (3)若主机1的子网掩码和默认网关分别配置为255.255.255.0和111.123.15.2,则该主机是否能访问WWW服 务器?是否能访问Internet?请说明理由。
    参考答案:

    (1)DHCP服务器可为主机2~主机N动态分配IP地址的最大范围是:111.123.15.5~111.123.15.254;主机2发送的封装DHCPDiscover报文的IP分组的源IP地址和目的IP地址分别是0.0.0.0和255.255.255.255。

    (2)主机2发出的第一个以太网帧的目的MAC地址是ff-ff-ff-ff-ff-ff;封装主机2发往Internet的IP分组的以太 网帧的目的MAC地址是00-al-al-al-al-al。

    (3)主机1能访问WWW服务器,但不能访问Internet。由于主机1的子网掩码配置正确而默认网关IP地址被 错误地配置为111.123.15.2(正确IP地址是111.123.15.1),所以主机1可以访问在同一个子网内的WWW服务器, 但当主机1访问Internet时,生机1发出的IP分组会被路由到错误的默认网关(111.123.15.2),从而无法到达目的主机。

    3.甲乙双方均采用后退N帧协议(GBN)进行持续的双向数据传输,且双方始终采用
    捎带确认,帧长均为1000 BSxyRxy分别表示甲方和乙方发送的数据帧,其中: x是发送
    序号; y是确认序号(表示希望接收对方的下一帧序号);数据帧的发送序号和确认序号字段均为
    3比特。信道传输速率为100 MbpsRTT=0.96 ms。下图给出了甲方发送数据帧和接收数据帧的
    两种场景,其中t0为初始时刻,此时甲方的发送和确认序号均为0t1时刻甲方有足够多的数据
    待发送。(2017年408第47题)  

    请回答下列问题。
    (1)对于图(a)t0时刻到t1时刻期间,甲方可以断定乙方已正确接收的数据帧数是多少?正确
    接收的是哪几个帧(请用Sxy形式给出)?
    (2)对于图(a),从t1时刻起,甲方在不出现超时且未收到乙方新的数据帧之前,最多还可以
    发送多少个数据帧?其中第一个帧和最后一个帧分别是哪个(请用Sxy形式给出)?
    (3)对于图(b),从t1时刻起,甲方在不出现新的超时且未收到乙方新的数据帧之前,需要重
    发多少个数据帧?重发的第一个帧是哪个(请用Sxy形式给出)?
    (4)甲方可以达到的最大信道利用率是多少?
     
    参考答案: (1)t0时刻到t1时刻期间,甲方可以断定乙方已正确接收了3个数据帧, (1)分别是S00
    S10S20(1)
    (2)t1时刻起,甲方最多还可以发送5个数据帧, (1)其中第一个帧是S52(1)最后一
    个数据帧是S12(1)
    (3)甲方需要重发3个数据帧, (1)重发的第一个帧是S23(1)
    (4)甲方可以达到的最大信道利用率是:

     【评分说明】
    答案部分正确,酌情给分。

     
    参考资料:
     
  • 相关阅读:
    <hdu2072>单词数(set容器,string类应用)
    志愿者选拔
    Game of Life
    <LightOJ 1338> Hidden Secret!
    Miss Kitty and Her Little Ice Cream Shop(水题)
    约瑟夫问题
    <FZU 1019>猫捉老鼠
    <cf>System of Equations(水题)
    Palindromic Numbers (III)(回文数,较麻烦)
    <cf>Solitaire(DFS or DP)
  • 原文地址:https://www.cnblogs.com/Liwj57csseblog/p/12177541.html
Copyright © 2011-2022 走看看