tcpip网络编程课后题答案(tcpip网络编程课程设计)

http://www.itjxue.com  2023-02-21 18:28  来源:未知  点击次数: 

网络编程(五)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详解卷1:协议的作品目录

译者序

前言

第1章 概述1

1.1 引言1

1.2 分层1

1.3 TCP/IP的分层4

1.4 互联网的地址5

1.5 域名系统6

1.6 封装6

1.7 分用8

1.8 客户-服务器模型8

1.9 端口号9

1.10 标准化过程10

1.11 RFC10

1.12 标准的简单服务11

1.13 互联网12

1.14 实现12

1.15 应用编程接口12

1.16 测试网络13

1.17 小结13

第2章 链路层15

2.1 引言15

2.2 以太网和IEEE 802封装15

2.3 尾部封装17

2.4 SLIP:串行线路IP17

2.5 压缩的SLIP18

2.6 PPP:点对点协议18

2.7 环回接口20

2.8 最大传输单元MTU21

2.9 路径MTU21

2.10 串行线路吞吐量计算21

2.11 小结22

第3章 IP:网际协议24

3.1 引言24

3.2 IP首部24

3.3 IP路由选择27

3.4 子网寻址30

3.5 子网掩码32

3.6 特殊情况的IP地址33

3.7 一个子网的例子33

3.8 ifconfig命令35

3.9 netstat命令36

3.10 IP的未来36

3.11 小结37

第4章 ARP:地址解析协议38

4.1 引言38

4.2 一个例子38

4.3 ARP高速缓存40

4.4 ARP的分组格式40

4.5 ARP举例41

4.5.1 一般的例子41

4.5.2 对不存在主机的ARP请求42

4.5.3 ARP高速缓存超时设置43

4.6 ARP代理43

4.7 免费ARP45

4.8 arp命令45

4.9 小结46

第5章 RARP:逆地址解析协议47

5.1 引言47

5.2 RARP的分组格式47

5.3 RARP举例47

5.4 RARP服务器的设计48

5.4.1 作为用户进程的RARP服务器49

5.4.2 每个网络有多个RARP服务器49

5.5 小结49

第6章 ICMP:Internet控制报文协议50

6.1 引言50

6.2 ICMP报文的类型50

6.3 ICMP地址掩码请求与应答52

6.4 ICMP时间戳请求与应答53

6.4.1 举例54

6.4.2 另一种方法55

6.5 ICMP端口不可达差错56

6.6 ICMP报文的4.4BSD处理59

6.7 小结60

第7章 Ping程序61

7.1 引言61

7.2 Ping程序61

7.2.1 LAN输出62

7.2.2 WAN输出63

7.2.3 线路SLIP链接64

7.2.4 拨号SLIP链路65

7.3 IP记录路由选项65

7.3.1 通常的例子66

7.3.2 异常的输出68

7.4 IP时间戳选项69

7.5 小结70

第8章 Traceroute程序71

8.1 引言71

8.2 Traceroute 程序的操作71

8.3 局域网输出72

8.4 广域网输出75

8.5 IP源站选路选项76

8.5.1 宽松的源站选路的traceroute

程序示例78

8.5.2 严格的源站选路的traceroute

程序示例79

8.5.3 宽松的源站选路traceroute程序

的往返路由80

8.6 小结81

第9章 IP选路83

9.1 引言83

9.2 选路的原理84

9.2.1 简单路由表84

9.2.2 初始化路由表86

9.2.3 较复杂的路由表87

9.2.4 没有到达目的地的路由87

9.3 ICMP主机与网络不可达差错88

9.4 转发或不转发89

9.5 ICMP重定向差错89

9.5.1 一个例子90

9.5.2 更多的细节91

9.6 ICMP路由器发现报文92

9.6.1 路由器操作93

9.6.2 主机操作93

9.6.3 实现93

9.7 小结94

第10章 动态选路协议95

10.1 引言95

10.2 动态选路95

10.3 Unix选路守护程序96

10.4 RIP:选路信息协议96

10.4.1 报文格式96

10.4.2 正常运行97

10.4.3 度量98

10.4.4 问题98

10.4.5 举例98

10.4.6 另一个例子100

10.5 RIP版本2102

10.6 OSPF:开放最短路径优先102

10.7 BGP:边界网关协议103

10.8 CIDR:无类型域间选路104

10.9 小结105

第11章 UDP:用户数据报协议107

11.1 引言107

11.2 UDP首部107

11.3 UDP检验和108

11.3.1 tcpdump输出109

11.3.2 一些统计结果109

11.4 一个简单的例子110

11.5 IP分片111

11.6 ICMP不可达差错(需要分片)113

11.7 用Traceroute确定路径MTU114

11.8 采用UDP的路径MTU发现116

11.9 UDP和ARP之间的交互作用118

11.10 最大UDP数据报长度119

11.11 ICMP源站抑制差错120

11.12 UDP服务器的设计122

11.12.1 客户IP地址及端口号122

11.12.2 目标IP地址122

11.12.3 UDP输入队列122

11.12.4 限制本地IP地址124

11.12.5 限制远端IP地址125

11.12.6 每个端口有多个接收者125

11.13 小结126

第12章 广播和多播128

12.1 引言128

12.2 广播129

12.2.1 受限的广播129

12.2.2 指向网络的广播129

12.2.3 指向子网的广播129

12.2.4 指向所有子网的广播130

12.3 广播的例子130

12.4 多播132

12.4.1 多播组地址133

12.4.2 多播组地址到以太网地址的转换133

12.4.3 FDDI和令牌环网络中的多播134

12.5 小结134

第13章 IGMP:Internet组管理协议136

13.1 引言136

13.2 IGMP报文136

13.3 IGMP协议136

13.3.1 加入一个多播组136

13.3.2 IGMP报告和查询137

13.3.3 实现细节137

13.3.4 生存时间字段138

13.3.5 所有主机组138

13.4 一个例子138

13.5 小结141

第14章 DNS:域名系统142

14.1 引言142

14.2 DNS基础142

14.3 DNS的报文格式144

14.3.1 DNS查询报文中的问题部分146

14.3.2 DNS响应报文中的资源记录部分147

14.4 一个简单的例子147

14.5 指针查询150

14.5.1 举例151

14.5.2 主机名检查151

14.6 资源记录152

14.7 高速缓存153

14.8 用UDP还是用TCP156

14.9 另一个例子156

14.10 小结157

第15章 TFTP:简单文件传送协议159

15.1 引言159

15.2 协议159

15.3 一个例子160

15.4 安全性161

15.5 小结162

第16章 BOOTP: 引导程序协议163

16.1 引言163

16.2 BOOTP的分组格式163

16.3 一个例子164

16.4 BOOTP服务器的设计165

16.5 BOOTP穿越路由器167

16.6 特定厂商信息167

16.7 小结168

第17章 TCP:传输控制协议170

17.1 引言170

17.2 TCP的服务170

17.3 TCP的首部171

17.4 小结173

第18章 TCP连接的建立与终止174

18.1 引言174

18.2 连接的建立与终止174

18.2.1 tcpdump的输出174

18.2.2 时间系列175

18.2.3 建立连接协议175

18.2.4 连接终止协议177

18.2.5 正常的tcpdump输出177

18.3 连接建立的超时178

18.3.1 第一次超时时间178

18.3.2 服务类型字段179

18.4 最大报文段长度179

18.5 TCP的半关闭180

18.6 TCP的状态变迁图182

18.6.1 2MSL等待状态183

18.6.2 平静时间的概念186

18.6.3 FIN_WAIT_2状态186

18.7 复位报文段186

18.7.1 到不存在的端口的连接请求187

18.7.2 异常终止一个连接187

18.7.3 检测半打开连接188

18.8 同时打开189

18.9 同时关闭191

18.10 TCP选项191

18.11 TCP服务器的设计192

18.11.1 TCP服务器端口号193

18.11.2 限定的本地IP地址194

18.11.3 限定的远端IP地址195

18.11.4 呼入连接请求队列195

18.12 小结197

第19章 TCP的交互数据流200

19.1 引言200

19.2 交互式输入200

19.3 经受时延的确认201

19.4 Nagle算法203

19.4.1 关闭Nagle算法204

19.4.2 一个例子205

19.5 窗口大小通告207

19.6 小结208

第20章 TCP的成块数据流209

20.1 引言209

20.2 正常数据流209

20.3 滑动窗口212

20.4 窗口大小214

20.5 PUSH标志215

20.6 慢启动216

20.7 成块数据的吞吐量218

20.7.1 带宽时延乘积220

20.7.2 拥塞220

20.8 紧急方式221

20.9 小结224

第21章 TCP的超时与重传226

21.1 引言226

21.2 超时与重传的简单例子226

21.3 往返时间测量227

21.4 往返时间RTT的例子229

21.4.1 往返时间RTT的测量229

21.4.2 RTT估计器的计算231

21.4.3 慢启动233

21.5 拥塞举例233

21.6 拥塞避免算法235

21.7 快速重传与快速恢复算法236

21.8 拥塞举例(续)237

21.9 按每条路由进行度量240

21.10 ICMP的差错240

21.11 重新分组243

21.12 小结243

第22章 TCP的坚持定时器245

22.1 引言245

22.2 一个例子245

22.3 糊涂窗口综合症246

22.4 小结250

第23章 TCP的保活定时器251

23.1 引言251

23.2 描述252

23.3 保活举例253

23.3.1 另一端崩溃253

23.3.2 另一端崩溃并重新启动254

23.3.3 另一端不可达254

23.4 小结255

第24章 TCP的未来和性能256

24.1 引言256

24.2 路径MTU发现256

24.2.1 一个例子257

24.2.2 大分组还是小分组258

24.3 长肥管道259

24.4 窗口扩大选项262

24.5 时间戳选项263

24.6 PAWS:防止回绕的序号265

24.7 T/TCP:为事务用的TCP扩展265

24.8 TCP的性能267

24.9 小结268

第25章 SNMP:简单网络管理协议270

25.1 引言270

25.2 协议270

25.3 管理信息结构272

25.4 对象标识符274

25.5 管理信息库介绍274

25.6 实例标识276

25.6.1 简单变量276

25.6.2 表格276

25.6.3 字典式排序277

25.7 一些简单的例子277

25.7.1 简单变量278

25.7.2 get-next操作278

25.7.3 表格的访问279

25.8 管理信息库(续)279

25.8.1 system组279

25.8.2 interface组280

25.8.3 at组281

25.8.4 ip组282

25.8.5 icmp组285

25.8.6 tcp组285

25.9 其他一些例子288

25.9.1 接口MTU288

25.9.2 路由表288

25.10 trap290

25.11 ASN.1和BER291

25.12 SNMPv2292

25.13 小结292

第26章 Telnet和Rlogin:远程登录293

26.1 引言293

26.2 Rlogin协议294

26.2.1 应用进程的启动295

26.2.2 流量控制295

26.2.3 客户的中断键296

26.2.4 窗口大小的改变296

26.2.5 服务器到客户的命令296

26.2.6 客户到服务器的命令297

26.2.7 客户的转义符298

26.3 Rlogin的例子298

26.3.1 初始的客户-服务器协议298

26.3.2 客户中断键299

26.4 Telnet协议302

26.4.1 NVT ASCII302

26.4.2 Telnet命令302

26.4.3 选项协商303

26.4.4 子选项协商304

26.4.5 半双工、一次一字符、一次

一行或行方式304

26.4.6 同步信号306

26.4.7 客户的转义符306

26.5 Telnet举例306

26.5.1 单字符方式306

26.5.2 行方式310

26.5.3 一次一行方式(准行方式)312

26.5.4 行方式:客户中断键313

26.6 小结314

第27章 FTP:文件传送协议316

27.1 引言316

27.2 FTP协议316

27.2.1 数据表示316

27.2.2 FTP命令318

27.2.3 FTP应答319

27.2.4 连接管理320

27.3 FTP的例子321

27.3.1 连接管理:临时数据端口321

27.3.2 连接管理:默认数据端口323

27.3.3 文本文件传输:NVT ASCII

表示还是图像表示325

27.3.4 异常中止一个文件的传输:

Telnet同步信号326

27.3.5 匿名FTP329

27.3.6 来自一个未知IP地址的匿名FTP330

27.4 小结331

第28章 SMTP:简单邮件传送协议332

28.1 引言332

28.2 SMTP协议332

28.2.1 简单例子332

28.2.2 SMTP命令334

28.2.3 信封、首部和正文335

28.2.4 中继代理335

28.2.5 NVT ASCII337

28.2.6 重试间隔337

28.3 SMTP的例子337

28.3.1 MX记录:主机非直接连到

Internet337

28.3.2 MX记录:主机出故障339

28.3.3 VRFY和EXPN命令340

28.4 SMTP的未来340

28.4.1 信封的变化:扩充的SMTP341

28.4.2 首部变化:非ASCII字符342

28.4.3 正文变化:通用Internet邮件

扩充343

28.5 小结346

第29章 网络文件系统347

29.1 引言347

29.2 Sun远程过程调用347

29.3 XDR:外部数据表示349

29.4 端口映射器349

29.5 NFS协议351

29.5.1 文件句柄353

29.5.2 安装协议353

29.5.3 NFS过程354

29.5.4 UDP还是TCP355

29.5.5 TCP上的NFS355

29.6 NFS实例356

29.6.1 简单的例子:读一个文件356

29.6.2 简单的例子:创建一个目录357

29.6.3 无状态358

29.6.4 例子:服务器崩溃358

29.6.5 等幂过程360

29.7 第3版的NFS360

29.8 小结361

第30章 其他的TCP/IP应用程序363

30.1 引言363

30.2 Finger协议363

30.3 Whois协议364

30.4 Archie、WAIS、Gopher、Veronica

和WWW366

30.4.1 Archie366

30.4.2 WAIS366

30.4.3 Gopher366

30.4.4 Veronica366

30.4.5 万维网WWW367

30.5 X窗口系统367

30.5.1 Xscope程序368

30.5.2 LBX: 低带宽X370

30.6 小结370

附录A tcpdump程序371

附录B 计算机时钟376

附录C sock程序378

附录D 部分习题的解答381

附录E 配置选项395

附录F 可以免费获得的源代码406

参考文献409

缩略语420

TCP/IP谁给我讲解下啊

TCP/IP应该是个协议集,根据OS的七层理论,TCP/IP分为四层.分别是应用,传输,Interne和网络界面.

我们一般说TCP在传输层,而IP在Internet层.

TCP/IP的应用程序包括我们平时经常用到的Ping,Telnet,Ftp,Finger等等

配置TCP/IP包括IP地址,子网掩码和缺省网关

正确检测TCP/IP的四个步骤:PIng 127.0.0.1(回环地址)如果通表示TCP/IP已经装入,Ping自己表明客户机正常(主要是网卡),Ping网关表示局域网正常,Ping路由外地址表示完全正常,当然你也可以直接进行第四步,一般来说没这么麻烦的,但理论是基础:-)

IP地址是四段八位的二进制数组成的,IP分为A,B,C,D,E五类地址

A类高端为0,从1.x.y.z~126.x.y.z .B类高端为10,从128.x.y.z~191.x.y.z C类高端为110,从192.x.y.z~223.x.y.z D类高端为1110是保留的IP地址 E类高端为1111,是科研用的IP地址

其中255是广播地址,127是内部回送函数

若公司不上Internet,那一定不会烦恼IPAddress的问题,因为可以任意使用所有的IPAddress,不管是AClass或是BClass, 这个时候不会想到要用SubNet,但若是上Internet那IPAddress 便弥足珍贵了,目前全球一阵Internet热,IPAddress已经愈来愈少了,而所申请的IPAddress目前也趋保守,而且只有经申请的IPAddress能在Internet使用,但对某些公司只能申请到一个CCLass的IPAddress,但又有多个点需要使用,那这时便需要使用到Subnet,这篇短文说明Subnet的原理及如 何规划。

SubnetMask的介绍

设定任何网路上的任何设备不管是主机、PC、Router等皆需要设定IPAddress,而跟随著IPAddress的是所谓的NetMask, 这个NetMask主要的目的是由IPAddress中也能获得NetworkNumber ,也就是说IPAddress和NetMask作AND而得到NetworkNumber,如下所 示

IPAddress 192.10.10.611000000.00001010.00001010.00000110

NetMask 255.255.255.011111111.11111111.11111111.00000000

AND -------------------------------------------------------------------

etworkNumber 192.10.10.011000000.00001010.00001010.00000000

NetMask有所谓的预设值,如下所示

ClassIPAddress范围NetMask

A 1.0.0.0-126.255.255.255255.0.0.0

B 128.0.0.0-191.255.255.255255.255.0.0

C 192.0.0.0-223.255.255.255255.255.255.0

在预设的NetMask都只有255的值,在谈到SubnetMask时这个值便不一定是255了。

在完整一组CClass中如203.67.10.0-203.67.10.255NetMask255.255.255.0, 203.67.10.0称之NetworkNumber(将IPAddress和Netmask作AND),而 203.67.10.255是Broadcast的IPAddress,所以这?两者皆不能使用,实际只能使用203.67.10.1--203.67.10.254等254个IPAddress,这是以 255.255.255.0作NetMask的结果,而所谓SubnetMsk尚可将整组C Class分成数组NetworkNumber,这要在NEtMask作手脚,若是要将整组CCLass分成2个NetworkNumber那NetMask设定为255.255.255.192, 若是要将整组CCLass分成8组NetworkNumber则NetMask要为 255.255.255.224,这是怎麽来的,由以上知道NetworkNumber是由IP Address和NetMask作AND而来的,而且将NetMask以二进位表示法知道是1的会保留,而为0的去掉

192.10.10.193--11000000.00001010.00001010.10000001

255.255.255.0--11111111.11111111.11111111.00000000

--------------------------------------------------------------

192.10.10.0--11000000.00001010.00001010.00000000

以上是以255.255.255.0为NetMask的结果,NetworkNumber是192.10.10.0, 若是使用255.255.255.224作NetMask结果便有所不同

192.10.10.193--11000000.00001010.00001010.10000000

255.255.255.224--11111111.11111111.11111111.11100000

--------------------------------------------------------------

192.10.10.192--11000000.00001010.00001010.10000000

此时NetworkNumber变成了192.10.10.192,这便是Subnet。

那要如何决定所使用的NetMask,255.255.255.224以二进位表示法为11111111.11111111.11111111.11100000,变化是在最后一组,11100000 便是224,以三个Bit可表示2的3次方便是8个NetworkNumber

NetMask二进位表示法可分几个Network

255.255.255.0 11111111.11111111.11111111.000000001

255.255.255.128 11111111.11111111.11111111.100000002

255.255.255.192 11111111.11111111.11111111.110000004

255.255.255.224 11111111.11111111.11111111.111000008

255.255.255.240 11111111.11111111.11111111.1111000016

255.255.255.248 11111111.11111111.11111111.1111100032

255.255.255.252 11111111.11111111.11111111.1111110064

以下使用255.255.255.224将C Class203.67.10.0分成8组NetworkNumber,各个NetworkNumber及其BroadcastIPAddress及可使用之IPAddress

序号NetworkNumberBroadcast可使用之IPAddress

1 203.67.10.0 203.67.10.31 203.67.10.1-203.67.10.30

2 203.67.10.32 203.67.10.63 203.67.10.33-203.67.10.62

3 203.67.10.64 203.67.10.95 203.67.10.65-203.67.10.94

4 203.67.10.96 203.67.10.127 203.67.10.97-203.67.10.126

5 203.67.10.128 203.67.10.159 203.67.10.129-203.67.10.158

6 203.67.10.160 203.67.10.191 203.67.10.161-203.67.10.190

7 203.67.10.192 203.67.10.223 203.67.10.193-203.67.10.222

8 203.67.10.224 203.67.10.255 203.67.10.225-203.67.10.254

可验证所使用的IPAddress是否如上表所示

203.67.10.115--11001011.01000011.00001010.01110011

255.255.255.224--11111111.11111111.11111111.11100000

--------------------------------------------------------------

203.67.10.96--11001011.01000011.00001010.01100000

203.67.10.55--11001011.01000011.00001010.00110111

255.255.255.224--11111111.11111111.11111111.11100000

--------------------------------------------------------------

203.67.10.32--11001011.01000011.00001010.00100000

其他的NetMask所分成的NetworkNumber可自行以上述方法自行推演出来。

Subnet的应用

使用Subnet是要解决只有一组CClass但需要数个NetworkNumber的问题,并不是解决IPAddress不够用的问题,因为使用 Subnet反而能使用的IPAddress会变少,Subnet通常是使用在总公司在台北,但分公司在台中,两者之间使用Router连线 ,同时也上Internet,但只申请到一组CCLassIPAddress,过Router又需不同的Network,所以此时就必须使用到Subnet,当然二办公司间可以RemoteBridge连接,那便没有使用Subnet的问题,这点在此不讨论,所以在以上情况下的网路连线架构及IPAddress的使用

TCP/IP(传输控制协议/ 网间协议)是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式。 TCP/IP是INTERNET的基础协议,也是一种电脑数据打包和寻址的标准方法。在数据传送中,可以形象地理解为有两个信封,TCP和IP就像是信封,要传递的信息被划分成若干段,每一段塞入一个TCP信封,并在该信封面上记录有分段号的信息,再将TCP信封塞入IP大信封,发送上网。在接受端,一个TCP软件包收集信封,抽出数据,按发送前的顺序还原,并加以校验,若发现差错,TCP将会要求重发。因此,TCP/IP在INTERNET中几乎可以无差错地传送数据。

在任何一个物理网络中, 各站点都有一个机器可识别的地址,该地址叫做物理地址. 物理地址有两个

特点:

物理地址的长度,格式等是物理网络技术的一部分, 物理网络不同,物理地址也不同.

同一类型不同网络上的站点可能拥有相同的物理地址.

以上两点决定了,不能用物理网络进行网间网通讯.

在网络术语中,协议中,协议是为了在两台计算机之间交换数据而预先规定的标准。TCP/IP并不是一个而是许多协议,这就是为什么你经常听到它代表一个协议集的原因,而TCP和IP只是其中两个基本协议而已。

你装在计算机-的TCP/IP软件提供了一个包括TCP、IP 以及TCP/IP协议集中其它协议的工具平台。特别是它包括一些高层次的应用程序和FTP(文件传输协议),它允许用户在命令行上进行网络文件传输。

TCP/IP是美国政府资助的高级研究计划署(ARPA)在二十世纪七十年代的一个研究成果,用来使全球的研究网络联在一起形成一个虚拟网络,也就是国际互联 网。原始的

Internet通过将已有的网络如ARPAnet转换到TCP/IP上来而形成,而这个Internet最终成为如今的国际互联网的骨干网。

如今TCP/IP如此重要的原因,在于它允许独立的网格加入到Internet或组织在一起形成私有的内部网(Intranet)。构成内部网的每个网络通过一种-做路由器或IP路由器的设备在物理上联接在一起。路由器是一台用来从一个网络到另一个网络传输数据包的计算机。在一个使用TCP/IP的内部网中,信息通过使用一种独立的叫做IP 包(IPpacket)或IP数据报(IPdatagrams)的数据单元进--传输。TCP/IP 软件使得每台联到网络上的计算机同其它计算机“ 看”起来一模一样,事实上它隐藏了路由器和基本的网络体系结构并使其各方面看起来都像一个大网。如同联入以太网时需要确认一个48位的以太网地址一样,联入一个内部网也需要确认一个32位的IP地址。我们将它用带点的十进制数表示,如128.10.2.3。给定一个远程计算机的IP地址,在某个内部网或Internet上的本地计算机就可以像处在同一个物理网络中的两台计算机那样向远程计算机发送数据。

TCP/IP提供了一个方案用来解决属于同一个内部网而分属不同物理网的两台计算机之间怎样交换数据的问题。这个方案包括许多部分,而TCP/IP协议集的每个成员则用来解决问题的某一部分。如TCP/IP协议集中最基本的协议-IP协议用来在内部网中交换数据并且执行一项重要的功能:路由选择--选择数据报从A主机到B主机将要经过的路径以及利用合适的路由器完成不同网络之间的跨越(hop)。

TCP是一个更高层次的它允许运行在在不同主机上的应用程序相互交换数据流。TCP将数据流分成小段叫做TCP数据段(TCPsegments),并利用IP协议进行传输。在大多数情况下,每个TCP数据段装在一个IP数据报中进行发送。但如需要的话,TCP将把数据段分成多个数据报,而IP数据报则与同一网络不同主机间传输位流和字节流的物理数据帧相容。由于IP并不能保证接收的数据报的顺序相一致,TCP会在收信端装配TCP数据段并形成一个不间断的数据流。FTP和Telnet就是两个非常流行的依靠TCP的TCP/IP应用程序。

另一个重要的TCP/IP协议集的成员是用户数据报协议(UDP),它同TCP相似但比TCP原始许多。TCP是一个可靠的协议,因为它有错误检查和握手确认来保证数据完整的到达目的地。UDP是一个“不可靠”的协议,因为它不能保证数据报的接收顺序同发送顺序相同,甚至不能保证它们是否全部到达。如果有可靠性要求,则应用程序避免使用它。同许多TCP/IP工具同时提供的SNMP( 简单网络管理协议)就是一个使用UDP协议的应用例子。

其它TCP/IP协议在TCP/IP网络中工作在幕后,但同样也发挥着重要作用。例如地址转换协议(ARP)将IP地址转换为物理网络地址如以太网地址。而与其对应的反向地址转换协议(RARP)做相反的工作,即将物理网络地址转换为IP地址。网际控制报文协议(ICMP)则是一个支持性协议,它利用IP完成IP数据报在传输时的控制信息和错误信息的传输。例如,如果一个路由器不能向前发送一个IP数据报,它就会利用ICMP来告诉发送者这里出现了问题。

网络设计者在解决网络体系结构时经常使用ISO/OSI(国际标准化组织/开放系统互连)七层模型,该模型每一层代表一定层次的网络功能。最下面是物理层,它代表着进行数据转输的物理介质,换句话说,即网络电缆。其上是数据链路层,它通过网络接口卡提供服务。最上层是应用层,这里运行着使用网络服务的应 用程序。

TCP/IP是同ISO/OSI模型等价的。当一个数据单元从网络应用程序下流到网络接口卡,它通过了一列的TCP/IP 模块。这其中的每一步,数据单元都会同网络另一端对等TCP/IP模块所需的信息一起打成包。这样当数据最终传到网卡时,它成了一个标准的以太帧(假设物理网络是以太网)。而接收端的TCP/IP软件通过剥去以太网帧并将数据向上传输过TCP/IP栈来为处于接收状态的应用程序重新恢复原始数据(一种最好的了解TCP/IP工作实质的方法,是使用探测程序来观察网络中的到处流动的帧中被不同TCP/IP模块所加上的信息)。

为了勾勒TCP/IP在现实网络世界中所扮演的角色,请考虑当使用HTTP(超文本传输协议)的Web浏览器从连接在Internet上的Web服务器上获取一页HTML数据时所发生的情况。为形成同Web服务器的虚链路,浏览器使用一种被抽象地称为套接口(socket)的高层软件。为了获取Web页,它通过向套接口向套接口写入HTTPGET命令来向Web 服务器发出该指令。接下来套接口软件使用TCP协议向 Web服务器发出包含GET命令的字节流和位流,TCP将数据分段并将各独立段传到IP模块,该模块将数据段转换成数据报并发送给Web服务器。

如果浏览器和服务器运--在不同物理网络的计算机上(一般情况如此),数据报从一个网络传到另一个网络,直到抵达服务器所在的那个网。最终,数据被传输到目的地址并被重新装配,这样Web服务器通过读自己的套接口来获得数据主干,并进而查看连续的数据流。对浏览器和服务器来说,数据在这一端写入套接口而在另一端出现如同魔术一般,但这只是底下发生的各种复杂的交互,它创造了数据经过网络无 缝传输的假象。

这就是TCP/IP所做的:将许多小网联成一个大网。并在这个大网也就是Internet上提供应用程序所需要的相互通信的服务。

评论:

对于TCP/IP有许多可谈的,但这里仅讲三个关键 点:

·TCP/IP是一族用来把不同的物理网络联在一起构成网际网的协议。TCP/IP联接独立的网络形成一个虚拟的网,在网内用来确认各种独立的不是物理网络地址,而是IP地址。

·TCP/IP使用多层体系结构,该结构清晰定义了每个协议的责任。TCP和UDP向网络应用程序提供了高层的数据传输服务,并都需要IP来传输数据包。IP有责任为数据包到达目的地选择合适的路由。

·在Internet主机上,两个运行着的应用程序之间传送要通过主机的TCP/IP堆栈上下移动。在发送端TCP/IP 模块加在数据上的信息将在接收端对应的TCP/IP模块上滤掉,并将最终恢复原始数据。

如果你有兴趣学习更多的TCP/IP知识,这里有两个较高层次的信息源RFC(RequestforComment)1180——叫做“TCP/IP Tutorial”的文档,你可以从许多普及的RFC的Internet节点上下载。另一个是InternetworkingwithTCP/IP的第一卷:Principles,Protocols,and Architectures,作者DouglasE.Comer(1995,Prentice-Hall)。作为该系三部曲中的第一部分,许多人把看成是一本TCP/IP圣经。(原文刊载于Vol.15No.20)

二、传输层的安全性

在Internet应用编程序中,通常使用广义的进程间通信(IPC)机制来与不同层次的安全协议打交道。比较流行的两个IPC编程界面是BSD Sockets和传输层界面(TLI),在Unix系统V命令里可以找到。

在Internet中提供安全服务的首先一个想法便是强化它的IPC界面,如BSD Sockets等,具体做法包括双端实体的认证,数据加密密钥的交换等。Netscape通信公司遵循了这个思路,制定了建立在可靠的传输服务(如TCP/IP所提供)基础上的安全套接层协议(SSL)。SSL版本3(SSL v3)于1995年12月制定。它主要包含以下两个协议:

SSL记录协议它涉及应用程序提供的信息的分段、压缩、数据认证和加密。SSL v3提供对数据认证用的MD5和SHA以及数据加密用的R4和DES等的支持,用来对数据进行认证和加密的密钥可以通过SSL的握手协议来协商。

SSL握手协议 用来交换版本号、加密算法、(相互)身份认证并交换密钥。SSL v3 提供对Deffie-Hellman密钥交换算法、基于RSA的密钥交换机制和另一种实现在 Fortezza chip上的密钥交换机制的支持。

Netscape通信公司已经向公众推出了SSL的参考实现(称为SSLref)。另一免费的SSL实现叫做SSLeay。SSLref和SSLeay均可给任何TCP/IP应用提供SSL功能。Internet号码分配当局(IANA)已经为具备SSL功能的应用分配了固定端口号,例如,带SSL的 HTTP(https)被分配的端口号为443,带SSL的SMTP(ssmtp)被分配的端口号为465,带SSL的NNTP(snntp)被分配的端口号为563。

微软推出了SSL2的改进版本称为PCT(私人通信技术)。至少从它使用的记录格式来看,SSL和PCT是十分相似的。它们的主要差别是它们在版本号字段的最显著位(The Most Significant Bit)上的取值有所不同: SSL该位取0,PCT该位取1。这样区分之后,就可以对这两个协议都给以支持。

1996年4月,IETF授权一个传输层安全(TLS)工作组着手制定一个传输层安全协议(TLSP),以便作为标准提案向IESG正式提交。TLSP将会在许多地方酷似SSL。

前面已介绍Internet层安全机制的主要优点是它的透明性,即安全服务的提供不要求应用层做任何改变。这对传输层来说是做不到的。原则上,任何TCP/IP应用,只要应用传输层安全协议,比如说SSL或PCT,就必定要进行若干修改以增加相应的功能,并使用(稍微)不同的IPC界面。于是,传输层安全机制的主要缺点就是要对传输层IPC界面和应用程序两端都进行修改。可是,比起Internet层和应用层的安全机制来,这里的修改还是相当小的。另一个缺点是,基于UDP的通信很难在传输层建立起安全机制来。同网络层安全机制相比,传输层安全机制的主要优点是它提供基于进程对进程的(而不是主机对主机的)安全服务。这一成就如果再加上应用级的安全服务,就可以再向前跨越一大步了。

(责任编辑:IT教学网)

更多