您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > linux网络编程复习题及知识点
1.3TCP连接的建立与终止和TCP状态转换图----2MSL状态难点:执行主动关闭的那端进入这种状态。这个端点在该状态的持续时间是2MSL(最长分节生命周期)。存在TIME_WAIT状态有两个理由:1.实现终止TCP全双工连接的可靠性(假设最后一个ack丢失的情况).2.允许老的重复分节在网络中消逝.2.4套接字基本函数----知道怎么用这些函数套接字类型:SOCK_STREA,:流式套接字[TCP支持];SOCK_DGRAM:数据包套接字[UDP支持];SOCK_RAW:原始套接字[允许对低于传输层的协议或物理网络直接访问;收发ICMP报、常用于检测新的协议]第三章各个函数和参数的作用【close()与shutdown()】区别:(1)close将描述字的访问计数减1,仅在此计数为0时才关闭套接口。用shutdown可以激发TCP的正常连接终止程序,而不管访问计数;(2)close终止了数据传送的两个方向:读和写。由于TCP连接是全双工的,有很多时候要通知另一端已完成了数据发送,即使那一端仍有许多数据要发送也如此。Shutdown函数可以仅仅关闭连接的读、写或两个方向都关闭。函数返回的描述符设置套接字选项第四章recvfrom和sendto函数的用法第五章默认为子进程先执行父进程后执行但是有sleep函数就不一样了进程:定义了一个计算的基本单元,可以认为是一个程序的一次运行。它是一个动态实体,是独立的任务。它拥有独立的地址空间、执行堆栈、文件描述符等父进程监听子进程进行通信wait和waitpid函数的用法僵尸进程:一个已经终止,但是其父进程尚未对其进行善后处理的进程线程的创建函数传递参数问题once函数#includepthread.hintpthread_once(pthread_once_t*once_control,void(*init_routine)(void))成功返回0,否则返回错误码如果本函数中,once_control变量使用的初值为PTHREAD_ONCE_INIT,可保证init_routine()函数在本进程执行序列中仅执行一次。一般在init_routine函数中完成一些初始化工作。LinuxThreads使用互斥锁和条件变量保证由pthread_once()指定的函数执行且仅执行一次,而once_control则表征是否执行过。如果once_control的初值不是PTHREAD_ONCE_INIT(LinuxThreads定义为0),pthread_once()的行为就会不正常;互斥锁pthread_mutex_lock(pthread_mutex_t*mptr)——返回:成功0,否则返回错误码如果互斥锁是静态分配的,就将mptr初始化为常值PTHREAD_MUTEX_INITIALIZER。pthread_mutex_unlock(pthread_mutex_t*mptr)用于互斥锁解锁操作。——返回:成功0,否则返回错误码线程的例子和I/O复用第六章要了解PPT上的各个函数,知道他们的作用uname函数等第9章第13章当客户处理多个描述字(一般是交互式输入和网络套接字),必须使用i/o复用五个I/O模型vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv4个宏函数vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvFD_ZREO/将所有位设为0/、FD_CLR/将fd位设为0/、FD_SET/将fd位设为1/、FD_ISSET/检测fd位是否为1/select函数该函数有三种执行结果:【永远等待下去】仅在有一个或以上描述字准备好i/o才返回,为此,我们将timeout设置为空指针。【等待固定时间】在有一个描述字准备好时返回,但不超过由timeout参数指定的秒数和微秒数。【根本不等待,检查描述字后立即返回,这称为轮询】这种情况下,timeout必须指向结构timeval,且定时器的值必须为0。每次调用select前都必须对等待描述字集合完成初始化和设置工作【Select()函数实现I/O多路复用的步骤】:vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv1)清空描述符集合;2)建立需要监视的描述符与描述符集合的联系;3)调用select()函数;4)检查所有需要监视的描述符,利用FD_ISSET宏判断是否已准备好;5)对已准备好的描述符进行I/O操作。区别:pselect函数使用结构timespec,而不是timevalvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvpselect函数不能更改参数timeout,以表示还剩余多少时间。函数pselect增加了第六个参数:指向信号掩码的指针。这允许程序禁止递交某些信号,测试由这些当前禁止的信号的信号处理程序所设置的全局变量,然后调用pselect,告诉它临时重置信号掩码【套接字可读的条件主要有】:套接字接收缓冲区中的数据字节数大于等于套接字接收缓冲区低潮限度的当前值;套接字是一个监听套接字且已完成的连接数为非0。如果对方tcp发送一个FIN(对方进程终止),套接字就变为可读且read返回0;有一个套接字错误待处理。【套接字可写的条件主要有】:套接字发送缓冲区的可用空间大于等于套接字发送缓冲区的低潮限度;套接字的写这一半关闭,对套接字的写将产生SIGPIPE信号;有一个套接字错误待处理【套接字的异常条件】:套接口带外数据的到达;控制状态信息的存在,可从一个已置为分组方式的伪终端读到Libpcap工作流程【Libpcap的工作流程】VVVVVVVVVVVVVVVVVVVVVVVVVVV1、查找网络设备(pcap_lookupdev);2、获取网络地址及网络掩码(pcap_lookupnet);查找有效的网络设施获得网络地址及网络掩码打开网络将用户输入的字符串编译到过滤程序设置过滤器捕获包处理捕获的包缓冲满?退出3、打开网络设备(pcap_open_live);4、将过滤字符串编译到过滤程序中(pcap_compile);5、设置过滤器(pcap_setfilter);6、捕获包(pcap_dispatch)非阻塞I/O模型当把一个套接字设置成非阻塞方式时,即通知内核:当请求的i/o操作非得让进程睡眠不能完成时,不要进程睡眠,而应返回一个错误。(返回不成功指示)【SO_LINGER选项】函数close缺省操作是立即返回,但如果有数据残留在套接字发送缓冲区,系统将试着将这些数据发送给对方;SO_LINGER(level:SOL_SOCKET)选项将改变tcp套接字关闭时的缺省行为。【原始套接字的输出遵循以下规则】:1)如果套接字已经连接,可以调用write、writev、send来发送数据,否则需要调用sendto或sendmsg;2)如果IP_HDRINCL选项未设置,则内核会将IP头部之后的第一个字节作为写数据的起始地址。3)如果设置了IP_HDRINCL,则内核会将IP头部的第一个字节作为写数据的起始地址。此时进程构造除了以下两项外的整个IP头部;(a)IPv4标识字段可以设为0,要求内核设置该值;(b)IPv4头部校验和由内核来计算和存储。4)IPv4数据报首部各个字段的内容均是网络字节序(对linux而言)5)对于超出外出接口的MTU的分组,内核将其分片【作用:原始套接字提供了一些使用tcp和udp协议不能实现的功能】1)使用原始套接字可以读/写ICMPv4、IGMPv4分组。如Ping程序,mroute程序等;2)使用原始套接字可以读/写特殊的IPv4数据包,内核不处理这些数据报的IPv4协议字段。如大多数内核只处理ICMP、IGMP、TCP、UDP的数据报。但协议字段还可以为其他值,如OSPF直接使用IP协议,将IP数据报的协议字段设为89,此时,就必须有专门的程序通过原始套接字来处理它们;3)利用原始套接字还可以创建自定义的IP数据报首部,编写基于IP协议的高层网络协议。【常用的网络命令】1、ping:检测主机连接状况2、ifconfig:显示当前有效网络接口的状态3、netstat:显示网络状态。如显示网络连接、路由表和网络接口信息。4、route:对内核的IP路由表进行操作5、tcpdump:用于分析网络上的数据流【简答题:】1、Select()函数实现I/O多路复用的步骤答:1.清空描述符集合;2.建立需要监视的描述符与描述符集合的联系;3.调用select()函数;4.检查所有需要监视的描述符,利用FD_ISSET宏判断是否已准备好;5.对已准备好的描述符进行I/O操作。2、I/O复用的应用场合•答:“一应两客三服”•当客户处理多个描述字(一般是交互式输入和网络套接字),必须使用i/o复用;•一个客户同时处理多个套接字是可能的(例如FTP客户程序),但很少出现;•如果一个tcp服务器既要处理监听套接字,又要处理连接套接字,一般也可以用i/o复用;(当然可以使用并发技术)•如果一个服务器既要处理tcp,又要处理udp,一般也要使用i/o复用;•如果一个服务器要处理多个服务或者多个协议,一般要使用i/o复用;•i/o复用并非只限于网络编程,许多正式应用程序也需要使用这项技术。3、常用Linux网络命令1、ping:检测主机连接状况2、ifconfig:显示当前有效网络接口的状态3、netstat:显示网络状态。如显示网络连接、路由表和网络接口信息。4、route:对内核的IP路由表进行操作5、tcpdump:用于分析网络上的数据流4、TCP连接的建立TCP连接的过程:服务器必须准备好接受外来的连接。通过调用socket,bind,listen函数完成。称为被动打开。客户通过调用connect进行主动打开。这引起客户TCP发送一个SYN分节,告诉服务器客户将在连接中发送的数据的初始序列号。服务器必须确认客户的SYN,同时自己也得发送一个SYN分节。服务器以单个分节向客户发送SYN和对客户的SYN的ACK。客户必须确认服务器的SYN。TCP连接终止TCP一般用四个分节终止一个连接:某个进程首先调用close,这一端的TCP于是发送一个FIN分节,表示数据发送完毕。主动关闭。另一端称为被动关闭。TCP对接收的FIN分节进行确认,并以文件结束标志传递给应用程序。一段时间后,接收到文件结束标志的应用程序调用close,这也导致向对方发送一个FIN分节。接收到这个FIN分节的原发送方TCP对它进行确认。还有一种关闭称为“半关闭”(half-close)5、服务器分类按连接类型分类面向连接的服务器(如tcp)面向无连接的服务器(如udp)按处理方式分类迭代服务器并发服务器6、进程的状态就绪:进程准备运行,但还没有得到CPU。根据调度算法决定将CPU分配给某个进程。运行:进程正在运行(即占用CPU)等待:进程正在等待某个事件的发生,如:输入\输出的完成、子进程的退出、进程睡眠期的结束。被交换:进程准备运行,但可能由于需要更多的内存而当前却没有足够的可用内存,因此被暂时存放在硬盘(交换空间)上。僵死:一个已经终止,但是其父进程尚未对其进行善后处理的进程。7、互斥锁在linux系统中,提供一种基本的进程同步机制—互斥锁,可以用来保护线程代码中共享数据的完整性。操作系统将保证同时只有一个线程能成功完成对一个互斥锁的加锁操作。如果一个线程已经对某一互斥锁进行了加锁,其他线程只有等待该线程完成对这一互斥锁解锁后,才能完成加锁操作。8、给新线程传递参数由于同一个进程内的所有线程共享内存和变量,因此在传递参数时需作特殊处理,下面参考如下几种方法:传递参数的普通方法通过指针传递参数通过分配arg的空间来传递参数还可以通过加锁等同步设施来实现传递参数;9、调用wait或waitpid函数时,正常情况下,可能会有以下几种情况:阻塞(如果其所有子进程都还
本文标题:linux网络编程复习题及知识点
链接地址:https://www.777doc.com/doc-2881129 .html