tcpip网络编程课后答案(tcpip协议分析及应用课后题答案)

http://www.itjxue.com  2023-02-04 10:12  来源:未知  点击次数: 

网络编程(五)TCP详解

考虑最简单的情况:两台主机之间的通信。这个时候只需要一条网线把两者连起来,规定好彼此的硬件接口,如都用 USB、电压 10v、频率 2.4GHz 等, 这一层就是物理层,这些规定就是物理层协议 。

我们当然不满足于只有两台电脑连接,因此我们可以使用交换机把多个电脑连接起来,如下图:

这样连接起来的网络,称为局域网,也可以称为以太网(以太网是局域网的一种)。在这个网络中,我们需要标识每个机器,这样才可以指定要和哪个机器通信。这个标识就是硬件地址 MAC。

硬件地址随机器的生产就被确定,永久性唯一。在局域网中,我们需要和另外的机器通信时,只需要知道他的硬件地址,交换机就会把我们的消息发送到对应的机器。

这里我们可以不管底层的网线接口如何发送,把物理层抽离,在他之上创建一个新的层次,这就是 数据链路层 。

我们依然不满足于局域网的规模,需要把所有的局域网联系起来,这个时候就需要用到路由器来连接两个局域网:

但是如果我们还是使用硬件地址来作为通信对象的唯一标识,那么当网络规模越来越大,需要记住所有机器的硬件地址是不现实的;

同时,一个网络对象可能会频繁更换设备,这个时候硬件地址表维护起来更加复杂。这里使用了一个新的地址来标记一个网络对象: IP 地址 。

通过一个简单的寄信例子来理解 IP 地址。

我住在北京市,我朋友 A 住在上海市,我要给朋友 A 写信:

因此,这里 IP 地址就是一个网络接入地址(朋友 A 的住址),我只需要知道目标 IP 地址,路由器就可以把消息给我带到。 在局域网中,就可以动态维护一个 MAC 地址与 IP 地址的映射关系,根据目的 IP 地址就可以寻找到机器的 MAC 地址进行发送 。

这样我们不需管理底层如何去选择机器,我们只需要知道 IP 地址,就可以和我们的目标进行通信。这一层就是 网络层 。网络层的核心作用就是 提供主机之间的逻辑通信 。

这样,在网络中的所有主机,在逻辑上都连接起来了,上层只需要提供目标 IP 地址和数据,网络层就可以把消息发送到对应的主机。

一个主机有多个进程,进程之间进行不同的网络通信,如边和朋友开黑边和女朋友聊微信。我的手机同时和两个不同机器进行通信。

那么当我的手机收到数据时,如何区分是微信的数据,还是王者的数据?那么就必须在网络层之上再添加一层: 运输层 :

运输层通过 socket(套接字),将网络信息进行进一步的拆分,不同的应用进程可以独立进行网络请求,互不干扰。

这就是运输层的最本质特点: 提供进程之间的逻辑通信 。这里的进程可以是主机之间,也可以是同个主机,所以在 android 中,socket 通信也是进程通信的一种方式。

现在不同的机器上的应用进程之间可以独立通信了,那么我们就可以在计算机网络上开发出形形式式的应用:如 web 网页的 http,文件传输 ftp 等等。这一层称为 应用层 。

应用层还可以进一步拆分出表示层、会话层,但他们的本质特点都没有改变: 完成具体的业务需求 。和下面的四层相比,他们并不是必须的,可以归属到应用层中。

最后对计网分层进行小结:

这里需要注意的是,分层并不是在物理上的分层,而是逻辑上的分层。通过对底层逻辑的封装,使得上层的开发可以直接依赖底层的功能而无需理会具体的实现,简便了开发。

这种分层的思路,也就是责任链设计模式,通过层层封装,把不同的职责独立起来,更加方便开发、维护等等。

TCP 并不是把应用层传输过来的数据直接加上首部然后发送给目标,而是把数据看成一个字节 流,给他们标上序号之后分部分发送。这就是 TCP 的 面向字节流 特性:

面向字节流的好处是无需一次存储过大的数据占用太多内存,坏处是无法知道这些字节代表的意义,例如应用层发送一个音频文件和一个文本文件,对于 TCP 来说就是一串字节流,没有意义可言,这会导致粘包以及拆包问题,后面讲。

前面讲到,TCP 是可靠传输协议,也就是,一个数据交给他,他肯定可以完整无误地发送到目标地址,除非网络炸了。他实现的网络模型如下:

对于应用层来说,他就是一个可靠传输的底层支持服务;而运输层底层采用了网络层的不可靠传输。虽然在网络层甚至数据链路层就可以使用协议来保证数据传输的可靠性,但这样网络的设计会更加复杂、效率会随之降低。把数据传输的可靠性保证放在运输层,会更加合适。

可靠传输原理的重点总结一下有: 滑动窗口、超时重传、累积确认、选择确认、连续 ARQ 。

停止等待协议

要实现可靠传输,最简便的方法就是:我发送一个数据包给你,然后你跟我回复收到,我继续发送下一个数据包。传输模型如下:

这种“一来一去”的方法来保证传输可靠就是 停止等待协议 (stop-and-wait)。不知道还记不记得前面 TCP 首部有一个 ack 字段,当他设置为 1 的时候,表示这个报文是一个确认收到报文。

然后再来考虑另一种情况:丢包。网络环境不可靠,导致每一次发送的数据包可能会丢失,如果机器 A 发送了数据包丢失了,那么机器 B 永远接收不到数据,机器 A 永远在等待。

解决这个问题的方法是: 超时重传 。当机器 A 发出一个数据包时便开始计时,时间到还没收到确认回复,就可以认为是发生了丢包,便再次发送,也就是重传。

但重传会导致另一种问题:如果原先的数据包并没有丢失,只是在网络中待的时间比较久,这个时候机器 B 会受到两个数据包,那么机器 B 是如何辨别这两个数据包是属于同一份数据还是不同的数据?

这就需要前面讲过的方法: 给数据字节进行编号 。这样接收方就可以根据数据的字节编号,得出这些数据是接下来的数据,还是重传的数据。

在 TCP 首部有两个字段:序号和确认号,他们表示发送方数据第一个字节的编号,和接收方期待的下一份数据的第一个字节的编号。

停止等待协议的优点是简单,但缺点是 信道利用率 太低。

假定AB之间有一条直通的信道来传送分组

这里的TD是A发送分组所需要的时间(显然TD = 分组长度 / 数据速率)再假定TA是B发送确认分组所需要的时间(A和B处理分组的时间都忽略不计)那么A在经过TD+RTT+TA时间后才能发送下一个分组,这里的RTT是往返时间,因为只有TD是采用来传输有用的数据(这个数据包括了分组首部,如果可以知道传输更精确的数据的时间,可以计算的更精确),所有信道利用率为

为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用 流水线传输 :就是发送方可以 连续的发送多个分组 ,不必每发完一个分组就停下来等待对方的确认。这样可使信道上一直有数据不间断地在传送。显然这种传输方式可以获得很高的信道利用率

停止等待协议已经可以满足可靠传输了,但有一个致命缺点: 效率太低 。发送方发送一个数据包之后便进入等待,这个期间并没有干任何事,浪费了资源。解决的方法是: 连续发送数据包 。

也就是下面介绍的 连续ARQ协议 和 滑动窗口协议

连续 ARQ 协议

模型如下:

和停止等待最大的不同就是,他会源源不断地发送,接收方源源不断收到数据之后,逐一进行确认回复。这样便极大地提高了效率。但同样,带来了一些额外的问题:

发送是否可以无限发送直到把缓冲区所有数据发送完?不可以。因为需要考虑接收方缓冲区以及读取数据的能力。如果发送太快导致接收方无法接受,那么只是会频繁进行重传,浪费了网络资源。所以发送方发送数据的范围,需要考虑到接收方缓冲区的情况。这就是 TCP 的 流量控制 。

解决方法是: 滑动窗口 。基本模型如下:

在 TCP 的首部有一个窗口大小字段,他表示接收方的剩余缓冲区大小,让发送方可以调整自己的发送窗口大小。通过滑动窗口,就可以实现 TCP 的流量控制,不至于发送太快,导致太多的数据丢失。

连续 ARQ 带来的第二个问题是:网络中充斥着和发送数据包一样数据量的确认回复报文,因为每一个发送数据包,必须得有一个确认回复。提高网络效率的方法是: 累积确认 。

接收方不需要逐个进行回复,而是累积到一定量的数据包之后,告诉发送方,在此数据包之前的数据全都收到。例如,收到 1234,接收方只需要告诉发送方我收到 4 了,那么发送方就知道 1234 都收到了。

第三个问题是:如何处理丢包情况。在停止等待协议中很简单,直接一个超时重传就解决了。但,连续 ARQ 中不太一样。

例如:接收方收到了 123 567,六个字节,编号为 4 的字节丢失了。按照累积确认的思路,只能发送 3 的确认回复,567 都必须丢掉,因为发送方会进行重传。这就是 GBN(go-back-n) 思路。

但是我们会发现,只需要重传 4 即可,这样不是很浪费资源,所以就有了: 选择确认 SACK 。在 TCP 报文的选项字段,可以设置已经收到的报文段,每一个报文段需要两个边界来进行确定。这样发送方,就可以根据这个选项字段只重传丢失的数据了。

第四个问题是:拥塞控制的问题

也是通过窗口的大小来控制的,但是检测网络满不满是个挺难的事情,所以 TCP 发送包经常被比喻成往谁管理灌水,所以拥塞控制就是在不堵塞,不丢包的情况下尽可能的发挥带宽。

水管有粗细,网络有带宽,即每秒钟能发送多少数据;水管有长度,端到端有时延。理想状态下,水管里面的水 = 水管粗细 * 水管长度。对于网络上,通道的容量 = 带宽 * 往返时延。

如果我们设置发送窗口,使得发送但未确认的包为通道的容量,就能撑满整个管道。

如图所示,假设往返时间为 8 秒,去 4 秒,回 4 秒,每秒发送一个包,已经过去了 8 秒,则 8 个包都发出去了,其中前四个已经到达接收端,但是 ACK 还没返回,不能算发送成功,5-8 后四个包还在路上,还没被接收,这个时候,管道正好撑满,在发送端,已发送未确认的 8 个包,正好等于带宽,也即每秒发送一个包,也即每秒发送一个包,乘以来回时间 8 秒。

如果在这个基础上调大窗口,使得单位时间可以发送更多的包,那么会出现接收端处理不过来,多出来的包会被丢弃,这个时候,我们可以增加一个缓存,但是缓存里面的包 4 秒内肯定达不到接收端课,它的缺点会增加时延,如果时延达到一定程度就会超时重传

TCP 拥塞控制主要来避免两种现象,包丢失和超时重传,一旦出现了这些现象说明发送的太快了,要慢一点。

具体的方法就是发送端慢启动,比如倒水,刚开始倒的很慢,渐渐变快。然后设置一个阈值,当超过这个值的时候就要慢下来

慢下来还是在增长,这时候就可能水满则溢,出现拥塞,需要降低倒水的速度,等水慢慢渗下去。

拥塞的一种表现是丢包,需要超时重传,这个时候,采用快速重传算法,将当前速度变为一半。所以速度还是在比较高的值,也没有一夜回到解放前。

到这里关于 TCP 的可靠传输原理就已经介绍得差不多。最后进行一个小结:

当然,这只是可靠传输的冰山一角,感兴趣可以再深入去研究

Python网络编程 -- TCP/IP

首先放出一个 TCP/IP 的程序,这里是单线程服务器与客户端,在多线程一节会放上多线程的TCP/IP服务程序。

这里将服务端和客户端放到同一个程序当中,方便对比服务端与客户端的不同。

TCP/IP是因特网的通信协议,其参考OSI模型,也采用了分层的方式,对每一层制定了相应的标准。

网际协议(IP)是为全世界通过互联网连接的计算机赋予统一地址系统的机制,它使得数据包能够从互联网的一端发送至另一端,如 130.207.244.244,为了便于记忆,常用主机名代替IP地址,例如 baidu.com。

UDP (User Datagram Protocol,用户数据报协议) 解决了上述第一个问题,通过端口号来实现了多路复用(用不同的端口区分不同的应用程序)但是使用UDP协议的网络程序需要自己处理丢包、重包和包的乱序问题。

TCP (Transmission Control Protocol,传输控制协议) 解决了上述两个问题,同样使用端口号实现了复用。

TCP 实现可靠连接的方法:

socket通信模型及 TCP 通信过程如下两张图。

[图片上传失败...(image-6d947d-1610703914730)]

[图片上传失败...(image-30b472-1610703914730)]

socket.getaddrinfo(host, port, family, socktype, proto, flags)

返回: [(family, socktype, proto, cannonname, sockaddr), ] 由元组组成的列表。

family:表示socket使用的协议簇, AF_UNIX : 1, AF_INET: 2, AF_INET6 : 10。 0 表示不指定。

socktype: socket 的类型, SOCK_STREAM : 1, SOCK_DGRAM : 2, SOCK_RAW : 3

proto: 协议, 套接字所用的协议,如果不指定, 则为 0。 IPPROTO_TCP : 6, IPPRTOTO_UDP : 17

flags:标记,限制返回内容。 AI_ADDRCONFIG 把计算机无法连接的所有地址都过滤掉(如果一个机构既有IPv4,又有IPv6,而主机只有IPv4,则会把 IPv6过滤掉)

AI _V4MAPPED, 如果本机只有IPv6,服务却只有IPv4,这个标记会将 IPv4地址重新编码为可实际使用的IPv6地址。

AI_CANONNAME,返回规范主机名:cannonname。

getaddrinfo(None, 'smtp', 0, socket.SOCK_STREAM, 0, socket.AP_PASSIVE)

getaddrinfo('', 'ftp', 0, 'socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG | socket.AI_V4MAPPED)

利用已经通信的套接字名提供给getaddrinfo

mysock = server_sock.accept()

addr, port = mysock.getpeername()

getaddrinfo(addr, port, mysock.family, mysock.type, mysock.proto, socket.AI_CANONNAME)

TCP 数据发送模式:

由于 TCP 是发送流式数据,并且会自动分割发送的数据包,而且在 recv 的时候会阻塞进程,直到接收到数据为止,因此会出现死锁现象,及通信双方都在等待接收数据导致无法响应,或者都在发送数据导致缓存区溢出。所以就有了封帧(framing)的问题,即如何分割消息,使得接收方能够识别消息的开始与结束。

关于封帧,需要考虑的问题是, 接收方何时最终停止调用recv才是安全的?整个消息或数据何时才能完整无缺的传达?何时才能将接收到的消息作为一个整体来解析或处理。

适用UDP的场景:

由于TCP每次连接与断开都需要有三次握手,若有大量连接,则会产生大量的开销,在客户端与服务器之间不存在长时间连接的情况下,适用UDP更为合适,尤其是客户端太多的时候。

第二种情况: 当丢包现象发生时,如果应用程序有比简单地重传数据聪明得多的方法的话,那么就不适用TCP了。例如,如果正在进行音频通话,如果有1s的数据由于丢包而丢失了,那么只是简单地不断重新发送这1s的数据直至其成功传达是无济于事的。反之,客户端应该从传达的数据包中任意选择一些组合成一段音频(为了解决这一问题,一个智能的音频协议会用前一段音频的高度压缩版本作为数据包的开始部分,同样将其后继音频压缩,作为数据包的结束部分),然后继续进行后续操作,就好像没有发生丢包一样。如果使用TCP,那么这是不可能的,因为TCP会固执地重传丢失的信息,即使这些信息早已过时无用也不例外。UDP数据报通常是互联网实时多媒体流的基础。

参考资料:

求TCP/IP协议高手解答,一道选择题

计算机网络形式多样,内容繁杂。网络上的计算机要互相通信,必须遵循一定的协议。目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议

网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定 Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。

网上找的希望能帮上忙!

2016 福师《TCP/IP协议原理与编程》在线作业一、二 以及离线作业 全部答案???

福师《TCP/IP协议原理与编程》在线作业一的参考答案:

一、单选题

1、D 2、C 3、C 4、B 5、D 

1. 关于UDP的说法不正确的是()。

A. UDP提供不可靠的服务

B. UDP源端口是可选的

C. UDP是无连接的

D. UDP目的端口是可选的

2. 按照OSI参考模型分层,其第2层,第4层分别为( )

A. 数据链路层,会话层

B. 数据链路层,网络层

C. 数据链路层,传输层

D. 网络层,会话层

3. IP地址202.100.80.110是()地址。

A. A类

B. B类

C. C类

D. D类

4. 下面协议是动态路由协议的是()。

A. UDP

B. RIP

C. ARP

D. TCP

5. RIP协议是使用()进行传输的。

A. TCP

B. HTTP

C. ICMP

D. UDP

6. UDP校验和的计算方法是将数据分为16位长的段,然后对它们进行()。

A. 与运算

B. 或运算

C. 同或运算

D. 异或运算

7. 提供可靠的端到端的服务是()。

A. 物理层

B. 数据链路层

C. 网络层

D. 传输层

8. TCP滑动窗口的功能是什么?

A. 使得窗口尺寸更大,以便一次可以发送更多的数据,从而更加有效地利用带宽。

B. 窗口的尺寸根据每个数据报进行滑动以接收数据,从而更有效地利用带宽。

C. 在TCP会话过程中,允许动态协商窗口尺寸的大小,从而更加有效地利用带宽。

D. 限制进入的数据,使得分段必须逐个发送,不是有效的带宽的利用方式。

9. IP协议提供的是()。

A. 面向连接的数据报服务

B. 无连接的数据报服务

C. 面向连接的虚电路服务

D. 无连接的虚电路服务

10. 你是公司网管,网络中包括一个单独的IP子网,使用DHCP分配IP。你安装了WINS服务以减少名称解析中的广播交通。过了一些天,用户报告网络太慢了。你调查发现广播没有减少。下一步应如何查看?

A. 检查WINS服务器是否有客户机的注册记录

B. 检查WINS服务器是否有其他WINS服务器的注册记录

C. 检查WINS服务器服务是否开启

D. 检查WINS服务器是否存在静态记录

11. 下列哪种说法是错误的()。

A. IP层可以屏蔽各个物理网络的差异。

B. IP层可以代替各个物理网络的数据链路层工作。

C. IP层可以隐藏各个物理网络的实现细节。

D. IP层可以为用户提供通用的服务。

12. 关于PPP协议, 下列哪一句(或几句)话是错误的?

A. 支持IPX及AppleTalk协议

B. 提供面向连接服务

C. 支持身份认证

D. 动态IP地址分配可由NCP完成

13. 关于网络协议,下列()选项是正确的。

A. 是网民们签订的合同

B. 协议,简单的说就是为了网络信息传递,共同遵守的约定

C. TCP/IP协议只是用于Internet,不能用于局域网

D. 拨号网络对应的协议是IPX/SPX

14. IP校验和的计算方法是将数据分为16位长的段,然后对它们进行()。

A. 同或运算

B. 异或运算

C. 与运算

D. 或运算

15. 接收端发现有差错时,设法通知发送端重发,直到正确的码字收到为止,这种差错控制方法称为()

A. 前向纠错

B. 自动请求重发

C. 冗余检验

D. 混合差错控制

16. IP头部中,"总长"字段指的是()。

A. 数据长度

B. 头部长度+选项长度

C. 头部长度+数据长度

D. 选项长度

17. 传输数据时,FTP服务器和FTP客户机之间建立了()连接。

A. 1个

B. 2个

C. 3个

D. 4个

18. 安装Windows 2003时,TCP/IP网络协议是默认安装的。按照OSI协议,有关该协议的工作层,下面的哪项描述是正确的?

A. TCP在会话层进行工作,IP在传输层进行工作

B. TCP在传输层进行工作,IP在网络层进行工作

C. TCP在网络层进行工作,IP在传输层进行工作

D. TCP和IP都在传输层进行工作

19. IGMP的长度是固定的,其大小为()。

A. 8位

B. 16位

C. 32位

D. 64位

20. IP头部中,"目的IP地址"字段的长度是()。

A. 8位

B. 16位

C. 32位

D. 64位

21. 在OSI模型中表示层的功能由对应TCP/IP层次模型的哪一层完成:

A. 应用层

B. 传输层

C. 网络层

D. 物理层

22. 停-等协议的主要缺点是()。

A. 通信不可靠

B. 信道利用率不高

C. 不能进行全双工通信

D. 需要大容量的存储器

23. 假定MAC地址不在ARP表中,如何找到目的地址的MAC地址()。

A. 发送广播信息到整个局域网

B. 发送广播信息到整个网络

C. 以上都不是

D. A和B都是

24. 各种网络在物理层互连时要求()。

A. 数据传输率和链路协议都相同

B. 数据传输率相同,链路协议可不同

C. 数据传输率可不同,链路协议相同

D. 数据传输率和链路协议都可不同

25. 关于ARP的说法错误的是()。

A. 使用询问/回答机制

B. 缓存用于减少地址解析需要的通信

C. 从物理地址到IP地址的映射

D. 在同一个物理网络中使用

26. "TimeToLive"字段的最大值是()。

A. 127

B. 128

C. 255

D. 256

27. 在DNS区域中创建邮件交换记录时,需要设置优先级来指明邮件服务器的优先选择顺序。请问,哪个数字表示服务器具有最高的优先级?

A. 10

B. 9

C. 1

D. 0

28. Intranet技术主要由一系列的组件和技术构成,Intranet的网络协议核心是()。

A. ISP/SPX

B. PPP

C. TCP/IP

D. SLIP

29. 流量控制实际上是对()的控制。

A. 发送方数据流量

B. 接收方数据流量

C. 发送方和接收方数据

D. 以上都不对

30. 某台客户机手工静态设置了WINS服务器的地址,但同时在DHCP服务器中,又通过服务器选项、作用域选项和客户保留选项分别指定了不同WINS服务器的地址。在客户机进行名称解析时,会采用哪个配置的WINS服务器的地址?

A. 手工静态设置的WINS服务器地址

B. 服务器选项指定的WINS服务器地址

C. 作用域选项指定的WINS服务器地址

D. 客户保留选项指定的WINS服务器地址

31. 对已经是分片的IP数据包再进行分片后得到的每个分片中的标志位是()。

A. 一定是1

B. 一定是0

C. 可能是0

D. 以上皆错

32. 形式为202.117.35.170的IP地址按分类方法划分属于()。

A. A类

B. B类

C. C类

D. D类

33. 您的一台WINS服务器出现复制故障。您希望检查"计算机管理"控制台中的WINS统计资料。下列各项统计信息中,哪一项所显示的信息是关于WINS服务器在最后一次指定复制间隔到来时所启动的复制过程的?

A. 最后一次周期复制。

B. 最后一次手动复制。

C. 最后一次网络复制更新。

D. 以上都不对。

34. 一个网络中的计算机要与其他计算机直接通信,必须有什么?()。

A. 使用相同的操作系统

B. 使用相同的硬件

C. 使用相同的协议

D. 在同一公司内部

35. ping命令就是利用()协议来测试网络的连通性。

A. TCP

B. ICMP

C. ARP

D. IP

36. 在互连网中,以下哪些设备具备路由选择功能()。

A. 具有单网卡的主机

B. 具有多网卡的宿主主机

C. 路由器

D. 以上设备都需要

37. 浏览器和WWW服务器之间传输网页使用的协议是()。

A. IP

B. HTTP

C. FTP

D. Telnet

38. 域名服务器上存放有internet主机的()。

A. 域名

B. IP地址

C. 域名和IP地址

D. E-mail地址

39. ICMP的类型字段中,字段值为0表示的是()。

A. 超时

B. 目标不可达

C. 回显应答

D. 回显请求

40. 网络协议主要要素为()。

A. 数据格式、编码、信号电平

B. 数据格式、控制信息、速度匹配

C. 语法、语义、同步

D. 编码、控制信息、同步

(责任编辑:IT教学网)

更多

推荐CGI/Perl教程文章