-
国内外主流云服务提供商有哪些?
2021-01-07 16:48:45选择一家技术过硬、实力雄厚、信誉良好、服务到位的云服务提供商很重要,因为云服务不是一次性买卖,供需双方需要长久合作。 为了搞清楚一家云服务公司的产品线,我们首先要理解一个传统数据中心的组成,否则很难搞... -
局域网聊天系统__7.客户端调试与总结
2012-12-20 22:34:36调试遇到的问题不多,主要还是涉及到的一些指针问题,最主要的就是在构造函数中对指针成员的初始化问题,如果提供了自定义的构造函数,就容易忘记默认构造函数的初始化,以为默认构造函数自己不去掉用就不会有效,给...调试遇到的问题不多,主要还是涉及到的一些指针问题,最主要的就是在构造函数中对指针成员的初始化问题,如果提供了自定义的构造函数,就容易忘记默认构造函数的初始化,以为默认构造函数自己不去掉用就不会有效,给调试带来了一些麻烦。客户端整体来说不难,只要理清楚了哪些类负责完成什么任务,需要维护一些什么数据,就好办了。这里的主对话框类主要负责维护界面,和服务器交互,以及在必要条件下创建聊天窗口(如有离线消息,有用户连接请求,用户主动聊天等)。而聊天对话框则只负责和指定用户进行数据交互,需要维护两边用户信息以及一个聊天套接字。在收到或发送消息时,它还需要维护自身聊天窗口的更新。由于CSocket内置多线程 所以整个工程都并未涉及到多线程。适用于少量用户的局域网至于其他一些小功能,如保存聊天记录(客户端),保存用户信息(服务器),以及最小化时生成托盘图标等等。都与主要逻辑无关,都可以随时单独地加上即可。本实例缺点很多:最主要的就是用户每次上下线都需要服务器更新用户列表后将整个用户列表发送给用户,而用户收到之后需要复制整个列表并删除之前的列表再刷新整个窗口才能完成某用户的一次上下线头像更新。该缺点的改进方法是在聊天包中加入一个类型,如USERUPDATE 每次用户上线或下线服务器则发送该消息包,并指明需要更新用户状态的用户信息,而客户端在收到之后,对应更新即可。还有就是前面提到的聊天对话框的关闭问题,该问题在前面已经商讨了解决方案。再其次就是安全性和完善性,用户注册并没有提供足够的资料,以及用户信息只是简单的写入文件,服务器甚至没有安全性验证。考虑到这些与通信主体关系不大,因此都不够完善。到此整个局域网聊天也就有了大概框架以及简单功能实现,大部分代码和思想都来自于参考书籍,逐步加上自己的理解,完成了这系列的开发流程的总结。总的来说,收益很多,特别是在总结的过程中,同学有一句话,据说是爱因斯坦的:"如果你不能简单说清楚,说明你还没有完全明白"。 -
Nmap源码分析(主机发现)
2019-04-10 14:18:38例如,仅仅需要确定局域网内哪些IP在线,那么可用“主机发现”功能扫描所有机器,枚举出在线主机即可,而没有必要进行端口扫描、服务侦测、OS侦测等更加详细的操作。 1简单回顾 命令行参数 Nmap提供的主机发现...Nmap在进行真正的端口扫描之前,通常需要确定目标主机是否在线(主机发现过程),以免发送大量探测包到不在线的主机。主机发现作为Nmap的基本功能之一,用户也可以单独运用。例如,仅仅需要确定局域网内哪些IP在线,那么可用“主机发现”功能扫描所有机器,枚举出在线主机即可,而没有必要进行端口扫描、服务侦测、OS侦测等更加详细的操作。
1 简单回顾
命令行参数
Nmap提供的主机发现参数相对较少,易于掌握:
-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。 -sn: Ping Scan 只进行主机发现,不进行端口扫描。 -Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。 -PS/PA/PU/PY[portlist]: 使用TCP SYN/ACK或SCTP INIT/ECHO方式进行发现。 -PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。 -PO[protocol list]: 使用IP协议包探测对方主机是否开启。 -n/-R: -n表示不进行DNS解析;-R表示总是进行DNS解析。 --dns-servers <serv1[,serv2],...>: 指定DNS服务器。 --system-dns: 指定使用系统的DNS服务器 --traceroute: 追踪每个路由节点
2 实现框架
Nmap主机发现部分的源码比较简洁。在nmap_main()函数的主循环部分,通过nexthost()函数进行具体的主机发现过程,在nexthost()函数中主要分为两个阶段:地址解析阶段、实际探测阶段。地址解析阶段:主要负责从主机表达式中解析出目标主机地址,将之存放在hostbatch中,并配置该主机所需的路由、网口、MAC地址、源IP等信息。实际发现阶段:分别对解析出来的目标主机,进行实际的探测以及获取RDNS相关信息,例如采用ARP包发现局域网内主机是否在线。
流程图如下所示:
2.1 地址解析阶段
从主机表达式中获取目标主机地址,主要思想包括以下几个方面:
批量进行主机发现
批量处理,可以加快主机发现的速率。默认配置以4096个目标地址作为一批(batch),若配置了--randomize-hosts选项,每个batch大小为4096*4(以便能有更多的IP地址混合洗牌、乱序扫描)。
从主机表达式获取目标主机地址
主机表达式(hostexpression),是Nmap用于管理主机的方式,该数据结构对应到用户在命令行中传入的目标机地址。例如,命令行nmap192.168.1-10.1-254 scanme.nmap.org/24中,192.168.1-10.1-254为一个主机表达式,而scanme.nmap.org/24为另一个主机表达式。Nmap需扫描的目标地址,即逐个解析该表达式包含的各个IP分别是多少,如scanme.nmap.org/24,首先需要进行DNS域名查询,获取scanme.nmap.org对应的IP地址,然后将与此地址的高24位相同的C类IP地址都将被获取出来。
跳过被排除的地址
如果使用--exclude或--exclude-file指定了排除地址,主机发现时应当跳过该类型地址。
设置已转换地址
若该地址在已经被转换解析,即在解析主机表达式过程中(parse_expr()函数),已经处理了该地址,那么设置该地址对应的转换的地址或名字。例如,在上述例子中,scanme.nmap.org/24表达式在解析过程中,scanme.nmap.org的地址会被DNS查询出来,记录在主机表达式中。如果在从该表达式过程取地址时,取出的地址正好对应的scanme.nmap.org的IP地址,那么说明该地址之前已被转换解析,此时让该主机记录被转换解析的表达式名字(此处为scanme.nmap.org/24),并记录转换地址列表(同一域名可能对应到多个不同IP地址)。
获取所需源IP与网络设备
需要配置源端的IP地址与网卡信息,当且仅当:用户具有系统权限(以root运行),并至少满足以下三个条件之一:
1. PING类型为TCP/UDP/SCTP/PROTOCOL/ARP packet;
2. Nmap进行RawScan,即会对原始TCPIP协议packet进行定制,如控制TCP的flag类型等;
3. Nmap在Windows平台运行并且PING类型为ICMP ECHO/ICMP TIMESTAMP/ICMP MASK类型。
获取源端IP与网络设备,需要进行路由信息查询,调用nmap_route_dst()函数。根据目的地址与查询的路由表对表,决定将采用哪个网卡发送数据包,设置直连状态(目标机与源端是否直接相连)、设置接口类型(包括devt_ethernet,devt_loopback, devt_p2p, devt_other)、设置MAC地址、源端IP地址、设置诱骗地址、设置设备名字、设置MTU等信息。
判断是否需要重新划分批次
批量进行主机发现是为了加快发现速度,如果新发现的主机与本批次中其他主机差异较大,那么在进行主机发现时,反而可能降低性能。所以,这里需要检查该目标是否需要新的批次。需要划分新批次的情况有以下几种:
1. 目标主机的地址类型不同。例如,批次内的目标机为IPv4地址,当前主机为IPv6。
2. 目标主机需要网卡不同。例如,批次内目标机需要网卡A进行探测,当前需要网卡B。
3. 目标主机需要不同IP地址。例如,用户指定欺骗的IP地址。
4. 目标主机与源主机直接相连,而其他主机不直接相连,反之亦然。
5. 目标主机的IP地址与当前批次的其他目标机相同(此种情况下,无法判定回复包到底来自哪个目标主机)。
更换主机表达式
若当前主机表达式包含的目标主机已经被获取完毕,而且当前批次允许的最大目标主机数量还未饱和,那么会更换下一个主机表达式继续解析目标主机地址(若此时还有剩余主机表达式)。
2.2 实际发现阶段
在从主机表达式获取完毕了目标主机后,就开始批量进行实际发现的过程。这里主要包含以下几个方面的内容:
检查该批次是否为空
如果在地址解析阶段,无法找到有效目标地址,那么该批次可能是空的。此处若检查到hostbatch为空,就结束主机发现过程。
随机打乱
如果用户在命令行中使用--randomize-hosts,那么在对目标地址进行探测时需要打乱顺序执行(为防止某些防火墙或IDS检测到用户的扫描)。
方式1:ARP方式探测
如果该批次内所有的目标主机都在源主机所在的以太网内,并且用户没有指定--send-ip(表示偏好通过发送IP数据包探测目标主机)选项,那么采用ARP REQUEST的数据包探测所有的目标主机是否在线。依次在局域网内广播ARP查询包,例如:Broadcast ARP Who has192.168.1.100? Tell 192.168.1.102
该方式在arpping()函数中实现,arpping()函数最终调用ultra_scan()进行扫描(ultra_scan()是Nmap中统一的扫描函数,能完成丰富的功能,在端口扫描阶段大量运用,在主机发现阶段也有被调用)。
ETH报文设置
若用户指定偏好以使用ethernet数据包进行探测(命令行选项:--send-eth),那么需要设置该目标主机的下一跳的MAC地址,以便在之后构建ethernet包时能够找到传送的目的MAC地址。
方式2:列表扫描与无PING扫描
此方式其实并没有进行真正扫描,而是直接将目标主机的状态设置为HOST_UP。当用户指定列表扫描(选项-sL,仅仅列举出所有IP地址而不做真正的扫描,直接将IP地址输出,以用于后续的其他操作),或者当用户指定不需进行主机发现(选项-Pn,当用户确知目标主机在线,那么可用该选项跳过主机发现,以便加快扫描速度),此处将目标主机标识为在线的。
方式3:其他方式探测
上述两种发现方式没有覆盖的所有情况,都在此种方式中进行处理。Nmap默认情况下,会发送四种数据包探测目标主机是否在线:
1. ICMPecho request
2. aTCP SYN packet to port 443
3. aTCP ACK packet to port 80
4. anICMP timestamp request
只要收到任何一个探测包的回复,就说明目标主机在线。
此方式在massping()函数中实现,最终该函数会调用到ultra_scan()函数进行端口扫描。
RDNS解析
若用户没有配置-n选项(表示Never Dns Resolution),那么会对该主机进行reverse dns解析,尝试查询出该IP地址对应的域名,因为可能此IP对应到某个固定域名。这样就可以识别到目标主机更多的信息,而且便于维护信息的一致性。
3 代码分析
主机发现部分核心函数nexthost()的具体实现代码:
Target *nexthost(HostGroupState *hs, const addrset *exclude_group, struct scan_lists *ports, int pingtype) { int i; struct sockaddr_storage ss; size_t sslen; struct route_nfo rnfo; bool arpping_done = false; struct timeval now; ///当已经批量地探测一组主机,并将主机缓存在hostbatch中时,直接返回该主机对象指针即可 if (hs->next_batch_no < hs->current_batch_sz) { /* Woop! This is easy -- we just pass back the next host struct */ return hs->hostbatch[hs->next_batch_no++]; } /* Doh, we need to refresh our array */ /* for (i=0; i < hs->max_batch_sz; i++) hs->hostbatch[i] = new Target(); */ ///进行新一批的主机探测,以下do{}while(1)循环是先产生各个IP的主机对象并放入hostbatch[]中 ///真正确定主机是否在线,是在batchfull:代码段内 hs->current_batch_sz = hs->next_batch_no = 0; do { /* Grab anything we have in our current_expression */ while (hs->current_batch_sz < hs->max_batch_sz && hs->current_expression.get_next_host(&ss, &sslen) == 0) { Target *t; ///以下跳过被排除地址 if (hostInExclude((struct sockaddr *)&ss, sslen, exclude_group)) { continue; /* Skip any hosts the user asked to exclude */ } t = new Target(); t->setTargetSockAddr(&ss, sslen); /* Special handling for the resolved address (for example whatever scanme.nmap.org resolves to in scanme.nmap.org/24). */ if (hs->current_expression.is_resolved_address(&ss)) { if (hs->current_expression.get_namedhost()) t->setTargetName(hs->current_expression.get_resolved_name()); t->resolved_addrs = hs->current_expression.get_resolved_addrs(); } /* We figure out the source IP/device IFF 1) We are r00t AND 2) We are doing tcp or udp pingscan OR 3) We are doing a raw-mode portscan or osscan or traceroute OR 4) We are on windows and doing ICMP ping */ if (o.isr00t && ((pingtype & (PINGTYPE_TCP|PINGTYPE_UDP|PINGTYPE_SCTP_INIT|PINGTYPE_PROTO|PINGTYPE_ARP)) || o.RawScan() #ifdef WIN32 || (pingtype & (PINGTYPE_ICMP_PING|PINGTYPE_ICMP_MASK|PINGTYPE_ICMP_TS)) #endif // WIN32 )) { t->TargetSockAddr(&ss, &sslen); if (!nmap_route_dst(&ss, &rnfo)) { fatal("%s: failed to determine route to %s", __func__, t->NameIP()); } if (rnfo.direct_connect) { t->setDirectlyConnected(true); } else { t->setDirectlyConnected(false); t->setNextHop(&rnfo.nexthop, sizeof(rnfo.nexthop)); } t->setIfType(rnfo.ii.device_type); if (rnfo.ii.device_type == devt_ethernet) { if (o.spoofMACAddress()) t->setSrcMACAddress(o.spoofMACAddress()); else t->setSrcMACAddress(rnfo.ii.mac); } t->setSourceSockAddr(&rnfo.srcaddr, sizeof(rnfo.srcaddr)); if (hs->current_batch_sz == 0) /* Because later ones can have different src addy and be cut off group */ o.decoys[o.decoyturn] = t->v4source(); t->setDeviceNames(rnfo.ii.devname, rnfo.ii.devfullname); t->setMTU(rnfo.ii.mtu); // printf("Target %s %s directly connected, goes through local iface %s, which %s ethernet\n", t->NameIP(), t->directlyConnected()? "IS" : "IS NOT", t->deviceName(), (t->ifType() == devt_ethernet)? "IS" : "IS NOT"); } /* Does this target need to go in a separate host group? */ if (target_needs_new_hostgroup(hs, t)) { /* Cancel everything! This guy must go in the next group and we are out of here */ hs->current_expression.return_last_host(); delete t; goto batchfull; } hs->hostbatch[hs->current_batch_sz++] = t; } ///若当前batch数组还没有填满,并且还有更多主机表达式,那么尝试进行新的表达式解析 if (hs->current_batch_sz < hs->max_batch_sz && hs->next_expression < hs->num_expressions) { /* We are going to have to pop in another expression. */ while (hs->next_expression < hs->num_expressions) { const char *expr; expr = hs->target_expressions[hs->next_expression++]; if (hs->current_expression.parse_expr(expr, o.af()) != 0)///解析表达式 log_bogus_target(expr);///若解析出错,标记此表达式 else break;///解析成功,进行新一轮的目标地址IP解析 } } else break; } while(1); batchfull: if (hs->current_batch_sz == 0)///没有解析出有效地址,返回NULL return NULL; /* OK, now we have our complete batch of entries. The next step is to randomize them (if requested) */ if (hs->randomize) { ///若命令行指定randomize-hosts选项,那么将目标地址随机打乱 hoststructfry(hs->hostbatch, hs->current_batch_sz); } /* First I'll do the ARP ping if all of the machines in the group are directly connected over ethernet. I may need the MAC addresses later anyway. */ ///探测方式1:主机组内所有IP地址都直连在ethernet内,那么进行ARP PING报文探测 ///向局域网广播:ARP REQUEST包,询问谁持有xx.xx.xx.xxIP地址 if (hs->hostbatch[0]->ifType() == devt_ethernet && hs->hostbatch[0]->af() == AF_INET && hs->hostbatch[0]->directlyConnected() && o.sendpref != PACKET_SEND_IP_STRONG) { arpping(hs->hostbatch, hs->current_batch_sz);///局域网内主机发现的执行函数 arpping_done = true; } /* No other interface types are supported by ND ping except devt_ethernet at the moment. */ if (hs->hostbatch[0]->ifType() == devt_ethernet && hs->hostbatch[0]->af() == AF_INET6 && hs->hostbatch[0]->directlyConnected() && o.sendpref != PACKET_SEND_IP_STRONG) { arpping(hs->hostbatch, hs->current_batch_sz); arpping_done = true; } ///若命令行指定了--send-eth,并判断到当前接口类型为ethernet网卡, ///对每一个状态不是HOST_DOWN且未超时的主机,设置下一跳MAC地址 gettimeofday(&now, NULL); if ((o.sendpref & PACKET_SEND_ETH) && hs->hostbatch[0]->ifType() == devt_ethernet) { for (i=0; i < hs->current_batch_sz; i++) { if (!(hs->hostbatch[i]->flags & HOST_DOWN) && !hs->hostbatch[i]->timedOut(&now)) { if (!setTargetNextHopMAC(hs->hostbatch[i])) { fatal("%s: Failed to determine dst MAC address for target %s", __func__, hs->hostbatch[i]->NameIP()); } } } } /* TODO: Maybe I should allow real ping scan of directly connected ethernet hosts? */ /* Then we do the mass ping (if required - IP-level pings) */ ///探测方式2:若指定不进行PING操作(如命令行指定了-Pn或-sL都不会进行PING操作)而arpping_done为被标记 ///或指定扫描自己回环网口,那么都在此处将主机标记位HOST_UP. if ((pingtype == PINGTYPE_NONE && !arpping_done) || hs->hostbatch[0]->ifType() == devt_loopback) { for (i=0; i < hs->current_batch_sz; i++) { if (!hs->hostbatch[i]->timedOut(&now)) { initialize_timeout_info(&hs->hostbatch[i]->to); hs->hostbatch[i]->flags |= HOST_UP; /*hostbatch[i].up = 1;*/ if (pingtype == PINGTYPE_NONE && !arpping_done)///用户指定该主机为HOST_UP,例如用户已知某个目标已经开启, hs->hostbatch[i]->reason.reason_id = ER_USER;///就可以通过-Pn选项让Nmap不进行PING过程。 else hs->hostbatch[i]->reason.reason_id = ER_LOCALHOST;///本地主机,当然为HOST_UP } } } else if (!arpping_done) {///探测方式3:其他情况,则采用massping方式探测主机是否在线 massping(hs->hostbatch, hs->current_batch_sz, ports); } ///若命令行没有指定-n选项(含义是不做DNS/RDNS解析),那么这里对rdns进行解析 if (!o.noresolve) nmap_mass_rdns(hs->hostbatch, hs->current_batch_sz); ///返回hostbatch中当前next_batch_no所在的主机(next_host()会批量解析主机IP,下一次进入时直接返回已解析的地址)。 return hs->hostbatch[hs->next_batch_no++]; }
-
计算机网络原理 课后题5
2020-07-23 15:59:291.链路层协议能够向网络层提供哪些可能的服务? P177 1)组帧 2)链路接入 3)可靠交付 4)差错控制 2.为什么有些网络用纠错码而不用检错和重传机制?给出2个理由。 P178 1)服务的实时性要求,即使发现错误,...第一章 :https://blog.csdn.net/weixin_42835409/article/details/107481832
第二章: https://blog.csdn.net/weixin_42835409/article/details/107486191
第三章: https://blog.csdn.net/weixin_42835409/article/details/107494509
第四章: https://blog.csdn.net/weixin_42835409/article/details/107510967
第五章: https://blog.csdn.net/weixin_42835409/article/details/107532318
第六章: https://blog.csdn.net/weixin_42835409/article/details/107539747
第七章: https://blog.csdn.net/weixin_42835409/article/details/107552585
第八章: https://blog.csdn.net/weixin_42835409/article/details/107555576
第五章 数据链路层与局域网
1.链路层协议能够向网络层提供哪些可能的服务? P177
1)组帧
2)链路接入
3)可靠交付
4)差错控制2.为什么有些网络用纠错码而不用检错和重传机制?给出2个理由。 P178
1)服务的实时性要求,即使发现错误,也没有时间重发一次。但是数据必须连续发送,这里可使用前置纠错。
2)如果传输质量比较差,会导致错误率太高而不得不重发所有帧,而重发的帧也可能损坏。为了避免上述情况发生,前置纠错被用于提高到达帧的成功率。
3.差错编码的检错或纠错能力与什么有关?试举例说明。 P179
1)差错编码的检错或纠错能力跟该差错编码的编码集的汉明距离有关。
2)
①对于检错编码,如果编码集的汉明距离ds=r+1,则该差错编码可以检测r位的差错。
例如,如果差错编码采取一次重复码,即冗余信息是数据的一次复制,则编码集的汉明距离ds=2,因此可以检测1位差错。
②对于纠错编码,如果编码集的汉明距离ds=2r+1,则该差错编码可以纠正r位的差错。
例如,如果差错编码采取二次重复码,即冗余信息是数据的两次复制,则编码集的汉明距离ds=3,因此可以纠正1位差错。
4.假设在一个使用CSMA/CD协议的局域网中,两个结点同时经过一个速率为R的广播信道开始发送一个长度为L的帧,d(prop)为两个结点之间的单向传播延迟。如果d(prop)<L/R,是否会发生冲突?如果会发生冲突,两个结点能检测到冲突吗?为什么?P194
1)会发生冲突。d(prop) < L / R 意味着传输速率大于传播时延,当一个节点在传输数据的同时,又开始接收数据,故会发生冲突。
2)不能检测到冲突。若要检测到冲突,则需要满足下列式子:Lmin/R≥2Dmax/v。已知 d为单向传播延迟,d=Dmax/v,题中d<L/R,则Dmax/v<Lmin/R,不满足上述式子,故不能检测到冲突。
5.在一个CDMA网络中,某站点正接收另一码序列为(-1,1,1,-1,-1,-1,1,-1)的站点发送的数据,若该站点收到
(-111-1-1-11-1 1-1-1111-11 1-1-1111-11 -111-1-1-11-1),则该站点收到的数据是什么? P189
答:1001
解析:CDMA(码分多址),分配的码片序列不仅必须各不相同,还必须正交,自己与自己内积为 1,自己与反码内积为 -1 ,与其他码片序列正交都为 0 ,那么将站点收到的码片序列分 8 位与另一码序列内积得到 1 -1 -1 1,即 1001。
6.考虑在低负载情况下,纯ALOHA与时隙ALOHA相比,哪个延迟更小? P192
答:时隙ALOHA
7.ARP查询为什么要在广播帧中发送呢?ARP响应为什么要在一个特定目的MAC地址的帧中发送呢? P200
1)ARP查询是向子网中的全部节点发起询问,ARP查询分组的目的是询问子网上所有其他的主机和路由器,以确定对应与要解析的IP地址的MAC地址。
2)而ARP响应则是发给询问的人,每个主机的ARP模块,都检查自己的IP地址是否与ARP查询分组中目的IP地址相匹配,与之匹配的主机则给查询主机发送一个带有所希望映射的ARP响应分组。
8.试比较10BASE-T、100BASE-T和千兆位以太网的共同点与区别。 P203
9.如果10BASE-T以太网中的某个主机在尝试发送帧,连续很多次发生冲突,试问该主机在放弃尝试发送帧之前,可能的等待(退避)时间最长是多少?为什么?
答:51.2×(2^10-1)=52377.6us≈52ms
解析:
10.一个通过以太网传送的IP数据包总长度为60字节。是否需要在封装到以太网帧中时进行填充?如果需要,试问需要填充多少字节? P202
答:不需要填充。
11.什么是VLAN?划分VLAN主要有几种方法? P207
(1)定义:虚拟局域网是一种基于交换机的逻辑分割广播域的局域网应用形式。
(2)划分方法:
1)基于交换机端口划分
2)基于MAC地址划分
3)基于上层协议类型或地址划分12.
答:
-
命名管道和邮件槽
2011-03-28 16:32:00命名管道提供可靠的双向通信,然而邮件槽只提供不可靠的单向通信。邮件槽的一个优点在于它具有广播能力。在Windows 2000中,以上两种API都利用了Windows 2000的安全特性,这样就能让服务器精确地控制哪些客户可以...1.命名管道和邮件槽
并且广泛使用于Windows 2000系统的API函数。命名管道(namedpipe)和邮件槽(mailslot)是微软起初为OS/2局域网管理器开发的编程API,随后移植到 WindowsNT。命名管道提供可靠的双向通信,然而邮件槽只提供不可靠的单向通信。邮件槽的一个优点在于它具有广播能力。在Windows 2000中,以上两种API都利用了Windows 2000的安全特性,这样就能让服务器精确地控制哪些客户可以连接它。
名称服务器依照Windows 2000通用命名规范(UNC)为命名管道和客户指定名称Windows网络中用于定位资源的,有独立于协议的方法。
(1)命名管道的操作
命名管道通信由命名管道服务器和命名管道客户组成。命名管道服务器是创建命名管道、让 用户连入的应用程序。命名管道的名字格式为\\Server\Pipe\PipeName。其中Server指定了执行命名管道服务器的计算机名(命名管 道服务器无法在远程系统上创建命名管道),此计算机名可以是DNS名称(例如mspress.microsoft.com),NetBIOS名称 (mspress),或者是IP地址(255.0.0.0)。
格式中的Pipe就是字符串“Pipe”,而PipeName是给命名管道指定的唯一名称。此唯一名称可以包含子目录,例如,\LMyComputerXPipeXMyServerApp\ConnectionPipe。命名管道服务器使用CreateNamedPipeWin32函数来创建命名管道。函 数的输人参数之一是命名管道名字的指针,形式为\\.\Pipe\PipeName。“\\.\”是Win32为本地计算机定义的别名。其他参数则包括一 个可选的安全描述符用于保护对命名管道的访问,一个用于指定管道以单向或双向方式工作的标志,一个最大的并发连接数的值,以及一个用于指定管道以字节方式 还是消息方式去工作的标志。
大多数网络API只以字节方式工作,也就是说,发送方发送的一条消息在接收方可能需要 多次接收,然后从碎片中重建完整的消息。以消息方式工作的命名管道简化了接收方的实现,因为一次发送意味着一次接收,它们是——对应的。因此每次接收完成 后,接收方总能得到—条完整的消息,它无需记录前前后后的消息碎片。
以一个特定的名字初次调用CreateNamedPipe创建了这个名字的第一个实 例,同时建立了所有与之相关的命名管道实例的行为。如果再次调用CreateNamedPipe,则服务器再创建一个实例,但不能超过第一次调用所指定的 最大连接数量。在创建了至少一个命名管道的实例之后,服务器执行ConnectNamedPipeWin32函数,用来让已有命名管道和客户建立连接。 CreateNamedPipe既可以同步执行,也可以异步执行,此调用直到客户与实例建立了连接(或错误产生)才算完成。命名管道客户使用 Win32CreateFile和CallNamedPipe函数连接服务,指定服务器创建的管道名称。如果服务器已执行了 ConnectNamedPipe调用,则客户的安全配置文件以及它所请求的对管道的访问权限(读、写)都通过命名管道安全描述符进行验证。如果客户被授 予访问命名管道的权限,它就会收到一个代表命名管道连接的客户端句柄,此时服务完成对ConnectNamedPipe的调用。
在建立命名管道的连接之后,客户和服务器可以使用ReadFile和WriteFileWin32函数从管道中读取和写入管道。命名管道支持同步和异步的传输操作。图7-4表示了服务器与客户之间通过命名管道的通信。
(2)邮件槽的操作
邮件槽提供一种不可靠的、单向广播机制。例如,使用这种通信方式的应用程序可以是时间同步服务,它可以每几秒就向域内广播源端时间。然而,对于网络中的每台计算机并不都需要接收源端时间的消息,因此,使用邮件槽是客户端网络应用的补充。
邮件槽像命名管道一样,与Win32 API集成在一起。邮件槽服务器用CreateMailslot函数创建—个邮件槽。CreateMailslot名称的输人格式为“\\.\Mailslot\MailslotName”。其中,邮件槽服务
器只能在执行它的机器上创建邮件槽,它的名称能包含子目录,这一点与命名管道相似。CreateMailslot也可以接收安全描述符用于控制客户对邮件 槽的访问。CreateMailslot返回的句柄会被重叠,即用此函数返回的句柄进行的操作是异步执行的,比如发送和接收消息。(3)命名管道和邮件槽的实现
正是由于命名管道和邮件槽与Win32紧密地结合在一起,因此它们都实现在 Kernel32.dll的Win32客户端DLL中。应用程序使用ReadFile和WriteFile函数来发送和接收命名管道和邮件槽的消息,这些 函数是基本的Win32I/O例程。用于创建CreateFile函数也是标准的Win32 I/O例程。然而, 由命名管道和邮件槽指定的名称确定了由命名管道文件系统驱动程序(\Winnt\System32\Npfs.sys)和邮件槽文件系统驱动程序 (\Winnt\System32\Drivers\Msfs.sys)所管理的系统名字空间。命名管道文件系统驱动程序创建了一个名 为\Device\NamedPipe的设备对象和一个相应的符号连接\??\Pipe,邮件槽文件系统驱动程序创建了名 为\Device\Mailslot的设备对象和它的符号连接\??\Mailslot。以\\.\Pipe\…和\\.\Mailslot\...为格 式的名称,这些名称通常传给CreateFile,它们都带有前缀\\.\。这些前缀会被译成\??\,这样,名称可以通过设备对象的符号连接进行析。 CreateNamedPipeCreateMailslot是两个比较特别的函数,它们使用相应的本地函数NtCreateNamedPipeFile 和NtCreateMailslotFile。
-
Radmin远控精灵
2014-04-09 12:46:17其实,有时候我们在一个局域网中,被人下载搞死,开个网页半天都搞不出来,之前我推荐过一款局域网查看软件,我们如果在局域网电脑上都安装上被控制端的话,那么我们就可以窥见究竟是哪些人在搞鬼,因为他的一举一动... -
什么是VLAN
2013-10-23 09:59:12IP 组播实际上也是一种VLAN的定义,即认为一个组播组就是一个VLAN,这种划分的方法将VLAN扩大到了广域网,因此这种方法具有更大的灵活性,而且也很容易通过路由器进行扩展,当然这种方法不适合局域网,主要是效率... -
文件加密软件——绿盾
2008-06-27 16:55:00提供应用程序白名单和黑名单功能,方便地限制员工可以运行哪些程序,不能运行哪些程序; 4、文件及目录操作记录:详细记录文件创建、重命名、删除的情况;详细记录文件夹(目录)创建、重命名、删除等情况。 5、... -
关于公司采购网络存储设备的可行性分析
2012-09-20 11:12:18现代企事业单位的管理和运作是离不开计算机和局域网的,企业在利用网络进行日常办公管理和运作时,将产生日常办公文件、图纸文件、ERP等企业业务数据资料以及个人的许多文档资料。传统的内部局域网内一般都没有文件... -
Deepin XP系统优化与设置专用工具 1.65_简体中文绿色免费版 环境模式的优化
2010-10-12 11:47:05而保留了在局域网办公环境下经常使用的网络文件夹共享、打印机服务等功能以及部分兼容性服务,同样开启了XP自带防火墙的支持。该模式适合在大多数办公主机除了完成家庭电脑的功能外,顺利的进行办公和开发环境下的... -
清华大学的计算机网络课件
2010-03-26 11:11:56问题4-17:一个大学能否就使用一个很大的局域网而不使用许多相互连接的较小的局域网? 问题4-18:一个10 Mb/s以太网若工作在全双工状态,那么其数据率是发送和接收各为5 Mb/s还是发送和接收各为10 Mb/s? 问题4-19:... -
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收... -
计算机网络1.0.docx
2020-07-08 17:47:09某单位局域网通过ISP提供的宽带线路与Internet相连,ISP分配的公网IP地址为202.117.12.32/29,局域网中一部分计算机通过代理服务器访问Internet,而另一部分计算机不经过代理服务器直接访问Internet。其网络连接方式... -
计算机网络第五版谢希仁习题答案
2010-11-02 21:50:531-01 计算机网络向用户可以提供那些服务? 答: 连通性和共享 1-02 简述分组交换的要点。 答:(1)报文分组,加首部 (2)经路由器储存转发 (3)在目的地合并 1-03 试从多个方面比较电路交换、报文交换和分组... -
湖南文理学院2019上学期(大三下)计算机科学与技术专业网络安全,密码学复习提纲(可直接打印).pdf
2019-07-19 10:16:19并指出分别存在哪些典型的攻击,机制与服务? 分组密码和流密码的主要区别在哪里;攻击密码体制的主要方法有两种 什么是一次一密,为什么说它是一种绝对安全的密码体制,它是否实用,为什么? 什么是单向陷门函数,... -
计算机网络第五版谢希仁答案
2010-03-29 22:51:591-01 计算机网络向用户可以提供那些服务? 答: 连通性和共享 1-02 简述分组交换的要点。 答:(1)报文分组,加首部 (2)经路由器储存转发 (3)在目的地合并 1-03 试从多个方面比较电路交换、报文交换和分组... -
cmd操作命令和linux命令大全收集
2012-04-24 11:58:23net start 查看开启了哪些服务 net start 服务名 开启服务;(如:net start telnet, net start schedule) net stop 服务名 停止某服务 net time 目标ip 查看对方时间 net time 目标ip /set 设置本地计算机... -
java 面试题 总结
2009-09-16 08:45:34GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收... -
数据结构课设
2013-01-03 02:51:25要求:建立至少30个成员,以较为直观的方式显示结果,并提供文稿形式以便检查。 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能。 存储结构:学生自己根据系统功能要求自己设计,但是... -
049《Web Server for Chrome》搭建本地Web服务器, 实现局域网共享文件夹 048《Words Discoverer》高亮标注单词,提升你的词汇量 047《Go to Tab》快速跳转到打开的网页 046《WhatFont》字体爱好者优雅查看网页...
-
计算机应用技术(实用手册)
2011-07-29 16:32:16这个项目允许你选择AGP装置的数据传输速率,更高的数据传输速率可对您的系统提供更快以及更佳的图形处理能力。请确认您的显示卡可以支持您所选择的模式,一般用默认的就可以。 4.Integrated Peripherals(集成... -
集成测试计划模板
2011-10-25 12:56:39如,每轮测试所有用例全部执行完毕,没有出现致命性错误,回归测试或执行新增测试用例时不再出现问题,且回归测试的周期不少于X天,回归测试执行的测试用例数比例不低于XX%,则测试工作通过。 测试启动/结束/暂停...
-
tbot:用于嵌入式Linux开发的AutomationTesting工具-源码
-
flink应用数据源不稳定导致程序宕机
-
RPA分享——RPA电力行业经典场景解析(专题一)
-
一种基于质谱图频率特征的化合物识别的有效方法。
-
比特币数量:-源码
-
LZW压缩解压数据结构课程设计源码
-
用Go语言来写区块链(一)
-
Windows系统管理
-
cryptoNotifier:cryptoNotifier-源码
-
小波熵阈值的心电信号去噪及 R 波检测算法
-
ShiroExploit.V2.3.zip
-
贴片天线的机械变形对其共振频率的影响
-
《网易云音乐》需求文档.docx
-
2021年软考系统规划与管理师-下午历年真题解析视频课程
-
这家公司不要求996,但照样市值万亿!
-
C和C++课程
-
vue3从0到1-超详细
-
盘一盘 QuantLib 系列 3 - 外汇市场和产品
-
作业1-源码
-
盘点:你可能不知道的Linux下开源云平台