《TCP/IP详解卷一:协议》学习笔记
目录
- 概论
- 链路层
- IP:网际协议
- IP路由选择
- 动态选路协议
- RIP:选路信息协议
- OSPF:开放最短路径优先
- BGP:边界网关协议
- CIDR:无类型域间选路
- IP分片
- ARP:地址解析协议
- RARP :逆地址解析协议
- ICMP:Internet控制报文协议
- ICMP地址掩码请求与应答
- ICMP时间戳请求与应答
- ICMP端口不可达差错
- ICMP报文的4.4BSD处理
- IGMP:Internet组管理协议
- 广播和多播
- 广播
- 多播
- 协议实现
- UDP:用户数据报协议
- UDP服务器的设计
- TCP:传输控制协议
- TCP连接的建立与终止
- 建立连接协议:三次握手
- 连接终止协议:四次握手
- TCP的状态变迁图
- 复位报文段
- 同时打开
- 同时关闭
- TCP选项
- TCP服务器的设计
- TCP的交互数据流
- TCP成块数据流
- TCP的超时与重传
- TCP的坚持定时器
- TCP的保活定时器
- TCP的未来和性能
- Ping程序
- Traceroute程序
- DNS:域名系统
- TFTP:简单文件传送协议
- BOOTP:引导程序协议
- SNMP: 简单网络管理协议
- Telnet和Rlogin:远程登录
- Rlogin协议
- Telnet协议
- FTP:文件传送协议
- SMTP: 简单邮件传送协议
- NFS:网络文件系统
- 其他的TCP/IP应用程序
概论
- TCP/IP分层
- 数据封装过程
- 客户-服务器模型
重复型 | 并发型 |
---|---|
等待一个客户请求的到来 | 等待一个客户请求的到来 |
处理客户请求 | 启动一个新的服务器来处理这个客户的请求 |
发送响应给发送请求的客户 | 处理结束后,终止这个新服务器 |
UDP | TCP |
- 常见知名端口号
RIP | DNS | BOOTP服务器 | BOOTP客户 | TFTP | FTP数据连接 | FTP控制连接 | Telnet | SNMP管理进程 | SNMP代理进程 |
---|---|---|---|---|---|---|---|---|---|
520 | 53 | 67 | 68 | 69 | 23 | 20 | 21 | 161 | 162 |
- 习题
- 用匿名F T P从主机n i c . m e r i t . e d u上获取文件n s f n e t / s t a t i s t i c s / h i s t o r y . n e t c o u n t。该文件包含在N S F N E T网络上登记的国内和国外的网络数。画一 坐标系,横坐标代表年,纵坐标代表网络总数的对数值。纵坐标的最大值是A类、B类和C类网络号数量。如果数据显示一个明显的趋势,请估计按照当前的编址体制推算,何时会用完所有 的网络地址
- RFC文档中TCP/IP协议每一层的稳健性原则:
- “quote of the day”协议的有名端口号:17 哪个RFC对该协议进行了定义:
- RFC这个术语从何而来:Request For Comments
链路层
- RFC 894:IEEE 802委员会定义的默认帧格式
- 以太网:数字设备公司、英特尔公司和Xerox公司在联合公布的标准,是当今TCP/IP采用的主要的局域网技术,采用 CSMA/CD的媒体接入方法
- SLIP:全称Serial Line IP。它是一种在串行线路上对IP数据报进行封装的简单形式,适用于家庭中每台计算机几乎都有的 RS-232串行端口和高速调制解调器接入Internet。以END(0xc0)的特殊字符结束,大多数实现在数据报的开始处也传一个END字符,不能协商IP地址,没有类型字段(如果一条串行线路用于 SLIP,那么它不能同时使用其他协议),没有检验和。
CSLIP:压缩SLIP。压缩了首部,缩短了交互响应的时间。 - PPP:点对点协议。包括在串行链路上封装 I P数据报的方法,建立、配置及测试数据链路的链路控制协议LCP,针对不同网络层协议的网络控制协议NCP。支持运行多种协议,有循环冗余检验,可以协商IP地址,可以压缩首部,可以设置数据链路选项。逐渐取代SLIP。
- 环回接口:允许运行在同一台主机上的客户 程序和服务器程序通过 T C P / I P进行通信。A类网络号127就是为环回接口预留的。IP地址127.0.0.1,命名为localhost。一个传给环回接口的I P数 据报不能在任何网络上出现。 下图是环回接口处理IP数据报的简单过程。
- 最大传输单元MTU:以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节
路径MTU:两台通信主机路径中的最小 MTU,被称作路径MTU。路径MTU在两个方向上不一定是 一致的。 - 串行线路吞吐量:
- 习题
netstat(1)命令确定系统上的接口及其 MTU:
netstat --help //得到使用说明. 没有可以看MTU的呀??
netstat -a //所有接口
netsh interface ip show interface //看MTU
IP:网际协议
- IP协议特点:1)不可靠,不能保证 I P数据报能成功地到达目的地;2)无连接,是I P并不维护任何关于后续数据报的状态信息。
- IP数据报:一般首部长20字节,最长60字节;传输次序是big endian字节序(又称作网络字节序);首部长以4字节为单位,总长度以1字节为单位,TTL(time-to-live生存时间字段设置了数据报可以经过的最多路由器数,每经过一个路由器TTL减1,计算检验和是将每16bit二进制反码求和,选项字段一直都是以 32 bit作为界限。下图是IP数据报格式
下图是TOS字段推荐值,最后一列中给出的是十六进制值,因为这就是在后面将要看到的tcpdump命令输出
- 子网寻址:子网对外部路由器透明,对内部路由器不透明。
子网掩码:网络号和子网号为1,主机号为0。IP地址一般以点分十进制方法表示,但是子网掩码却经常用十六进制来表示。 - 特殊IP地址
- ifconfig:配置主机上的每个接口。该命令在系统引导时自动执行。le指以太网接口,sl指SLIP接口,lo指环回接口
netstat:提供系统上的接口信息
IP路由选择
当收到一份数据报并进行发送时,它都要对路由表搜索一次。IP路由选择匹配过程目的IP地址-目的网络号-默认表项。IP路由选择是通过逐跳来实现的。数据报在各站的传输过程中目的 IP地址始终不变,但是封装和目的链路层地址在每一站都可以改变。
7. 主机和路由器的区别:主机不会把数据报从一个接口转发到另一个接口,路由器要转发数据报。
8. 路由表:包含目的IP、下一跳IP、5 bit标志、本地接口的IP地址、指向本地接口的指针。
使用netstat -rn查看
- G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。
- H 该路由是到一个主机,目的地址是一个完整的主机地址。如果没有设置该标志,说明该路由是到一个网络,而目的地址是一个网络地址,即一个网络号,或者网络号与子网号的组合。
网络拓扑决定路由表复杂程度: - 主机没有与任何网络相连 路由表只包含环回接口
- 主机连在一个局域网上 增加一项是局域网(如以太网)
- 主机能够通过单个路由器访问其他网络 增加加一个默认表项指向该路由器
- 要新增其他的特定主机或网络路由
- 初始化路由表:每当初始化一个接口时(通常是用ifconfig命令设置接口地址),就为接口自动创建一个直接路由。到达主机或网络的路由如果不是直接相连的,那么就必须加入路由表。运行路由守护程序或者用较新的路由器发现协议也可以初始化路由表。
- ICMP主机与网络不可达差错:当路由器收到一份IP数据报但又不能转发时,就要发送。
- ICMP重定向差错:当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送 ICMP重定向差错报文给IP数据报的发送端。主机在启动时只需一个默认路由,通过接收重定向报文来逐步学习完善路由表。(还可以通过route命令增加表项)
ICMP重定向报文只能由路由器生成而不能由主机生成,是为主机而不是为路由器使用的。主机作为路由器使用时,生成ICMP重定向报文和修改路由表之前要进行一系列检查。
- ICMP路由器发现报文:主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。路由器定期地广播或多播传送它们的路由器通告报文, 允许每个正在监听的主机相应地更新它们的路由表。
ICMP路由器请求报文
ICMP路由器通告报文
路由器操作 | 启动时不定期在所有广播或多播传送接口上发送通告报文;监听来自主机的请求报文,并发送路由器通告报文以响应;某个接口被关闭时,路由器在该接口上发送最后一份通告报文,生命周期设0;默认路由器会每隔10分钟发送通告报文,生命周期是30分钟;系统管理员为每个路由器设置优先等级 |
---|---|
主机操作 | 引导期间一般发送三份路由器请求报文,每三秒钟发送一次;监听来自相邻路由器的请求报文 |
动态选路协议
- 特点:相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络。路由守护程序( routing daemon)运行选路协议。路由是由路由守护程序动态地增加或删除,这种选路方式称为选路机制(routing mechanism)。
- 分类
内部网关协议IGP | 外部网关协议EGP |
---|---|
一个自治系统中各个路由器 | 不同自治系统之间的路由器 |
选路信息协议RIP、开放最短路径优先OSPF | EGP、边界网关协议BGP |
- 自治系统分类
残桩自治系统(stub AS) | 多接口自治系统(multihomed AS) | 转送自治系统(transit AS) |
---|---|---|
与其他自治系统只有单个连接,只有本地流量。 | 与其他自治系统有多个连接,但拒绝传送通过流量 | 与其他自治系统有多个连接,可以传送本地流量和通过流量 |
EGP | EGP | BGP |
- Unix选路守护程序:routed只使用RIP进行通信;gated,IGP和EGP都支持它。
RIP:选路信息协议
- 报文格式:RFC1058包含在UDP数据报中。命令字段1表示请求,2表示应答;度量以跳计数,直接连接接口的跳数为1,最大值是15,16表示到无路由到达该IP地址;可以通告多达25条路由。
- 运行
- 启动一个路由守护程序时,在每个接口上发送 一个请求报文,要求其他路由器发送完整路由表。
- 接收到请求,如果是上一条请求则发送完整的路由表;否则处理请求中的每一个表项,如果有连接到指明地址的路由,则将度量设置成我们的值,否则将度量置为16。发回响应。
- 接收到响应,更新路由表。
- 定期选路更新,每过30秒,所有或部分路由器会将其完整路由表发送给相邻路由器。
- 触发更新,一条路由的度量发生变化时,就对它进行更新。
- 如果发现一条路由在 3分钟内未更新, 就将该路由的度量设置成无穷大(16),并标注为删除。
- 缺陷:RIP没有子网地址的概念;在路由器或链路发生故障后需要很长的一段时间才能稳定下来,且可能发生路由环路;跳数作为路由度量忽略了其他应该考虑的因素,15限制了可以使用RIP的网络大小。
- RIP版本2:RFC1388选路域是一个选路守护程序的标识符,它指出了这个数据报的所有者;选路标记是为了支持外部网关协议而存在的;RIP-2除了广播外,还支持多播。
OSPF:开放最短路径优先
RFC1247
- 是链路状态协议。每个路由器主动地测试与其邻站相连链路的状态,将这些信息发送给它的其他邻站,邻站将信息在自治系统中传播出去。每个路由器接收这些链路状态信息,并建立起完整的路由表。直接使用IP。
- 优点:比距离向量协议收敛更快。当对同一个目的地址存在着多个相同费用的路由时,OSPF在这些路由上平均分配流量。 支持子网。采用多播。路由器之间的点对点链路不需要每端都有一个IP地址。采用了一种简单鉴别机制。
BGP:边界网关协议
RFC1267、RFC1268
是一个距离向量协议,不过BGP列举了到每个目的地址的路由,避免了一些问题。使用BGP的一个目的是减少通过流量。两个运行BGP的系统 之间建立一条TCP连接,然后交换整个BGP路由表,定期发送keepalive报文给其邻站来检测TCP连接对端的链路或主机失败。BGP允许使用基于策略的选路。使用TCP。
CIDR:无类型域间选路
RFC1518、RFC1519
防止Internet路由表膨胀的方法,它也称为超网( supernetting)。是采用一种分配多个IP地址的方式,使其能够将路由表中的许多表项总和(summarization)成更少的数目。最佳匹配总是最长的匹配。
IP分片
- 收到IP数据报-判断向那个接口发-查询接口MTU-分片-分片到达目的端后由IP层重新组装。标识字段都包含一个唯一值,分片时复制到每个片中;标志字段用1比特表示“更多的片”,除了最后一片外,其他每 个组成数据报的片都要把该比特置 1;片偏移字段指的是该片偏移原始数据报开始处的位置;当数据报被分片后,每个片的总长度值要改为该片的长度值;标志字段中有一个比特称作“不分片”位,置1则IP不对数据报进行分片,相反把数据报丢弃并发送一个ICMP差错报文。分片可以发生在原始发送端主机上和中间路由器上。 每一个分片独立选择路由。在分片时,除最后一片外,其他每一片中的数据部分(除 I P首部外的其余部分)必须是 8 字节的整数倍。任何运输层首部只出现在第1片数据中。
- ICMP不可达差错(需要分片):当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特,就发送ICMP不可达差错报文。如果某个程序需要判断到达目的端的路途中最小MTU是多少——称作路径MTU发现机制,那么这个差错就可以被该程序使用。
- 用Traceroute确定路径MTU:发送分组,并设置“不分片”标志比特。发送的 第一个分组的长度正好与出口MTU相等,每次收到ICMP“不能分片”差错时减小分组的长度,新格式ICMP差错报文中包含的MTU,或下一个最小的MTU值来发送。
- 习题
- TCP/IP协议族是基于一种数据报的网络技术,即IP层,其他的协议族则基于面向连接的网络技术,数据报网络层提供的优点是?
数据报降低了路由器中对连接状态的需求;数据报提供了基本的构件,在它上面可以构造不可靠(UDP)和可靠的(TCP)运输层;数据报代表了最小的网络层假定,使得可以使用很大范围的数据链路层服务。 - 为什么存在两类ICMP重定向报文—网络和主机?
当ICMP标准第1次发布时,RFC 792 [Postel 1981b]所述的划分子网技术还没有使用。另 外,使用一个网络重定向而不是N个主机重定向(对于目的网络中的所有 N个主机)也节 省了路由表的空间。 - 考虑有一电缆连接4.2BSD主机和4.3BSD主机。假定网络号是140.1。4.2BSD 主机把主机号为全0的地址识别为广播地址(140.1.0.0 ),而4.3BSD通常使用全1的主机号(140.1.255.255)发送广播。另外,4.2BSD主机在默认条件下要尽力转发接收到的数据报,尽管它们只有一个接口。 请描述当4.2BSD主机收到一份目的地址为140.1.255.255的IP数据报时会发生什么事?
主机收到目的地址是 140.1.255.255的数据报,发现它有一个通往该网络 (140.1)的路由,因此就试图转发数据报。它发送一个ARP广播来寻找140.1.255.255。 这个ARP请求没有收到任何应答,所以这个数据报最终被丢弃。如果在网线上有很多这样的4.2BSD主机,每一个都在差不多同一时刻发送ARP这个广播,将会暂时地阻塞网络。 - 假定有人在子网140.1上的某个系统ARP高速缓存中增加了一项(用arp命令)内容,指定IP地址140.1.255.255对应的以太网地址为全1(以太网广播地址)。请描述此时发生的情况。
这次,每一个ARP请求都收到一个应答,告诉每个4.2BSD主机向一个指定的硬件地址 (以太网广播)发送数据报。如果网线上有k个这样的4.2BSD主机,全部收到了它们自己 的ARP应答,使得每一个生成了另一个广播。每个主机都收到了每一个目的地址为140.1.255.255的广播IP数据报,既然现在每个主机都有一个ARP缓存项,这个数据报又 被转发给了广播地址。这个过程继续下去,就会产生一次以太网的熔毁 (Ethernet meltdown )。 - 假设一个路由器要使用R I P通告3 0个路由,这需要一个包含2 5条路由和另一个包含5条路 由的数据报。如果每过一个小时,第一个包含 2 5条路由的数据报丢失一次,那么其结果 如何?
丢失的数据报中通告的25条路由需要60秒才能得到更新。这不成问题,因为一般来说一 条路由如果连续3分钟没有得到更新,RIP才会声明它失效。 - OSPF报文格式中有一个检验和字段,而RIP报文则没有此项,这是为什么?
RIP运行在UDP上,而UDP提供了UDP数据报中数据部分的一个可选的检验和。 然而,OSPF运行在IP上,IP的检验和只覆盖了IP首部,所以OSPF必须增加它自己的检验和字段。 - 像OSPF这样的负载平衡,对于传输层的影响是什么?
负载平衡增加了分组被失序交付的机会,并且很可能使得运输层计算的环回时间出错。
ARP:地址解析协议
- 特点:RFC826为IP地址到对应的硬件地址之间提供动态映射,这个过程是自动完成的,对于应用程序或系统管理员来说一般是透明的。网络接口有一个硬件地址(一个 48 bit的值,标识不同的以太网或令牌环网络接口),在硬件层次上进行的数据帧交换必须有正确的接口地址,内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。 点对点链路不使用ARP,设置这些链路时需要IP地址。ARP可以用于其他类型的网络,可以解析IP地址以外的地址。
- 过程:发送ARP请求到以太网的每个主机,寻求目的主机的硬件地址-目的主机收到后发送ARP应答,包含IP地址和硬件地址-传送IP数据报。如果网络上没有目的主机,反复发送ARP请求直至超时。
- ARP高速缓存:每个主机上都有,存放了最近Internet地址到硬件地址之间的映射记录。在ARP高速缓存中的表项一般都要设置超时值,超时后从表内删除,每次使用重新设置。
- 分组格式:ARP请求和ARP应答的帧类型字段值相同;硬件类型字段表示硬件地址的类型;协议类型字段表示要 映射的协议地址类型;长度以字节为单位;
5.ARP代理:如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求。路由器识别出目的IP地址属于它的一个拔号主机,于是把自己的以太网接口地址作为硬件地址来回答,主机发送IP数据报到路由器,路由器把数据报转发到目的主机。ARP代理使得通过两个物理网络之间的路由器可以互相隐藏物理网络。 - 免费ARP:主机发送ARP查找自己的IP地址。通常发生在系统引导期间进行接口配置的时候。 作用是主机可以通过它来确定另一个主机是否设置了相同的IP地址,以及更新使其他主机高速缓存中旧的硬件地址。
- arp:- a来显示ARP高速缓存中的所有内容
- 习题
- 如何判断一个给定主机是否能正确处理接收到的非必要的 ARP请求:先发送目标IP是给定主机的ARP请求,给定主机中的高速缓存中就有了本机的映射-给本机换一个网卡接口,IP不变,发送免费ARP请求-查看给定主机的高速缓存是否有更新本机的硬件地址。
- ARP等待响应期间如何处理在这期间收到相同目的IP地址发来的多个数据包:
- 在一个由伯克利派生系统的客户端上,试图与一个正 在更换以太网卡而处于关机状态的服务器主机联系,这时会发生什么情况?如果服务器 在引导过程中广播一份免费ARP,这种情况是否会发生变化?
当服务器关闭时,保存了服务器的高速缓存,那么访问时会刷新20分钟的定时,直至20分钟后该表目删除。如果广播了免费的ARP,那么会刷新高速缓存中的服务器IP映射的内容。
RARP :逆地址解析协议
- 特点:RFC903被那些没有磁盘驱动器的系统使用(一般是无盘工作站或X终端),它需要系统管理员进行手工设置。
- 过程:无盘系统从接口卡上读取唯一的硬件地址-发送一份RARP请求(一帧在网络上广播的数据)-收到某个主机响应该无盘系统的IP地址(在RARP应答中)-它将发送TFTP请求来读取引导映象。网络上没有RARP服务器时一直发请求。
- 分组格式:类似ARP
- RARP服务器:服务器一般要为多个主机(网络上所有的无盘系统)提供硬件地址到IP地址的映射,一个网络上(例如一根电缆)要提供多个RARP服务器;RARP服务器的功能就由用户进程来提供, 而不是作为内核的TCP/IP实现的一部分;RARP服务器的实现是与系统捆绑在一起的。
- 习题
- RARP需要不同的帧类型字段吗?ARP和RARP都使用相同的值0x0806吗?
不需要,操作字段不同就行;ARP-0806, RARP-8035。 - 在一个有多个R A R P服务器的网络上,如何防止它们的响应发生冲突?
设置退避时间;设置服务器优先级。
ICMP:Internet控制报文协议
- 特点:RFC792传递差错报文以及其他需要注意的信息,常被IP层或更高层协议(TCP或UDP)使用。
- ICMP报文:类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不同的条件;检验和字段覆盖整个ICMP报文。
ICMP封装在IP数据报内部
ICMP报文格式
ICMP报文类型
ICMP差错报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。
ICMP地址掩码请求与应答
- 用于无盘系统在引导过程中获取自己的子网掩码。类似RARP获取IP地址。除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答。
- 报文格式:标识符和序列号字段由发送端任意选择设定。
- 向本机IP地址和环回地址分别发送地址掩码请求,返回的地址掩码对应的都是环回地址。
ICMP时间戳请求与应答
- 系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间。
- 报文格式:大多数的实现把后面两个字段都设成相同的值 。
- 网络时间协议NTP: 采用先进的技术来保证LAN或WAN上的一组系统的时钟误差在毫秒级以内。
- 分布式时间服务DTS:提供计算机之间的时钟同步。
- Unix系统提供守护程序timed:来同步局域网上的系统时钟。
ICMP端口不可达差错
- 例子:UDP端口不可达:如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符, 那么UDP返回一个ICMP不可达报文。
- 报文格式:
ICMP报文的4.4BSD处理
- 习题
- 5种不发送ICMP差错报文的特殊条件。如果这些条件不满足 而我们又在局域网上向一个似乎不存在的端口号发送一份广播 UDP数据报,这时会发生什么样的情况?
所有主机都回复ICMP端口不可达数据报,造成冲突。 - 生成一个ICMP端口不可达差错是否为“必须”,“应该” 或者“可能”。答案是“应该”。
- IP的服务类型字段是如何被ICMP设置 的?
发送一个ICMP差错总是讲TOS置为0。发送一个ICMP查询请求可以将TOS置为任何值,但是发送相应的应答必须将TOS置为相同的值。 - netstat命令,请用它来查看接收和发送的ICMP报文类型。
netstat -s
IGMP:Internet组管理协议
- 特点:RFC1112 用于支持主机和路由器进行多播的 Internet组管理协议,也被当做IP的一部分。
- 报文格式:有固定报文长度,没有可选数据,封装在IP数据报中。类型为1说明是多播路由器发出的查询报文,2是主机发出的报告报文;组地址为D类IP地址。
IGMP报文封装
IGMP报文格式
广播和多播
- 主机接收帧的过程:网卡查看由信道传送过来的帧,确定是否接收该帧,若接收后就将它传往设备驱动程序-设备驱动程序进行帧过滤,检查帧是否指定协议类型,检查主机是否属于多播地址说明的多播组,过滤后的帧传给下一层-IP根据源地址和目的地址进行过滤检测,UDP根据源端口号和目的端口号进行过滤检测。
- 概念:
单播 | 以太网帧仅发往单个目的主机,目的地址指明单个接收接口 |
---|---|
广播 | 一个主机要向网上的所有其他主机发送帧 |
多播 | 帧仅传送给属于多播组的 多个主机 |
广播
受限的广播 | 指向网络的广播 | 指向子网的广播 | 指向所有子网的广播 | |
---|---|---|---|---|
地址 | 255.255.255.255 | 主机号为全 1的地址 | 主机号为全1且有特定子网号的地址 | 子网号及主机号为全1 |
要求 | 在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报 | 一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择 | 需要了解子网的掩码 | 需要了解目的网络的子网掩码 |
受限的广播通常只在系统初始启动时才会用到。
RFC 922要求将一个指向所有子网的广播传送给所有子网,但当前的路由器没有这么做。更好的方式是使用多播而不是对所有子网的广播。
多播
- 多播提供的服务:向多个目的地址传送数据;客户对服务器的请求。
- 主机组:能够接收发往一个特定多播组地址数据的主机集合称为主机组,一个主机组可跨越多个网络,主机组中成员可随时加入或离开主机组。
- 多播组地址:范围从224.0.0.0到239.255.255.255。一些多播组地址被IANA确定为知名地址。
常见知名地址
224.0.0.1 | 224.0.0.2 | 224.0.2.2 | 224.0.0.9 | 224.0.1.2 |
---|---|---|---|---|
该子网内的所有系统组 | 该子网内的所有路由器 组 | 网络时间协议NTP | RIP-2 | SGI公司的dogfight应用 |
- 多播组地址到以太网地址的转换:多播的以太网地址范围从01:00:5e:00:00:00到01:00:5e:7f:ff:ff。多播组号中的低位23bit映射到以太网地址中的低位23bit,32个不同的多播组号被映射为一个以太网地址。
- 由于地址映射不唯一,设备驱动程序或IP层必须对数据报进行过滤:一种是网卡根据对多播地址的散列值实行多播过滤;另一种是网卡只接收一些固定数目的多播地址,主机想接收另外的多播地址时要将网卡设置为“多播混杂”模式。
- 过程:多播进程将目的IP地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,发送数据-接收进程通知它们的IP层,它们想接收发往给定多播地址的数据报-主机收到多播数据报,向属于那个多播组的每个进程均传送一个复制。多播组跨网络时,IGMP协议让多播路由器了解确定网络中属于确定多播组的任何一个主机。
协议实现
- IGMP报告和查询:当第一个进程加入一个组时,主机就发送一个IGMP报告;进程离开一个组时,主机不发送IGMP报告;多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程,IGMP查询报文中的组地址被设置为0;主机通过发送IGMP报告来响应一个IGMP查询。多播路由器对每个接口保持一个表记录多播组。
- 实现细节:一个主机首次发送IGMP报告并不保证该报告被可靠接收,下一个报告将在间隔一段时间后发送;当一个主机收到一个从路由器发出的查询后并不立即响应,而是经过一定的时间间隔后才发出响应;多播路由器并不关心有多少主机属于该组,而只关心该组是否还至少拥有一个主机。
- 生存时间TTL:TTL=0,多播数据报限制在同一主机;TTL=1,同一子网;TTL>1,能被多播路由器转发。224.0.0.0到224.0.0.255的特殊地址空间是打算用于多播范围不超过1跳的应用。
- 所有主机组:IP地址224.0.0.1,它涉及在一个物理网络中的所有具备多播能力的主机和路由器。这个组的成员无需发送 IGMP报告。
- 习题
- 广播是否增加了网络通信量?
广播本身不会增加网络通信量,但它增加了额外的主机处理时间。如果接收主机不正确 地响应了诸如ICMP端口不可达之类的差错,那么广播也可能导致额外的网络通信量。 - 考虑一个拥有50台主机的以太网:20台运行TCP/IP,其他30台运行其他的协议族。主机如何处理来自运行另一个协议族主机的广播?
每个主机都收到了所有广播分组的一个副本。接口层收到了帧,把它传递给设备驱动程 序。如果类型字段指的是其他协议,设备驱动程序就会丢弃该帧。 - 登录到一个过去从来没有用过的Unix系统,并且打算找出所有支持广播的接口的指向子 网的广播地址。如何做到这点?
首先执行netstat-r来看一下路由表,结果显示了所有接口的名字。然后对每个接口执行ifconfig:标志指出了一个接口是否支持广播,如果支持,相应的广播 地址也会被输出。 - 如果我们用ping程序向一个广播地址发送一个长1472的分组,它正常工作,但将分组的长度再增加一个字节后出现差错,为什么?
当我们说明了1472字节的长度,产生的IP数据报将是1500字节,正好是以太网的MTU。加了1字节,超过MTU,而伯克利演变的实现不允许对一个广播数据报进行分片。 - 一个局域网中的主机采取什么措施才能避免两台主机产生相同的随机时延?
生成随机数时要使用对于主机唯一的值。 IP地址和链路层地址是每个主机都应该不一样 的两个值。日期时间是一个不好的选择,尤其是在所有的主机都运行了一个类似于NTP 的协议来同步它们的时钟的情况下。 - 在[Casner and Deering 1992]中,他们提到UDP缺少两个通过MBONE传送音频采样数据的条件:分组失序检测和分组重复检测。你怎样在UDP上增加这些功能?
他们增加了一个包括一个序号和一个时间戳的应用协议首部。
UDP:用户数据报协议
- 特点:RFC768进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。 不提供可靠性,它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。
- 报文格式:端口号表示发送进程和接收进程;UDP长度字段指的是UDP首部和UDP数据的字节长度,最小为8。
- 检验和:UDP检验和覆盖UDP首部和UDP数据;是可选的;在数据部分最后增加填充字节0;包含一个12字节长的伪首部,伪首部包含IP首部一些字段,目的是让UDP两次检查数据是否已经正确送达;如果发送端没有计算检验和而接收端检测到检验和有差错,那么UDP数据报就要被悄悄地丢弃,不产生任何差错报文;UDP检验和是一个端到端的检验和,由发送端计算,接收端验证。
UDP检验和计算过程中使用的各个字段
- 采用UDP的路径MTU发现:没看明白
- UDP和ARP之间的交互作用:假设ARP缓存清空,发送需要分片的IP数据报。IP很快产生分片,每个分片都引发一个ARP请求;在收到第一个ARP应答时,IP只发送最后一个报文。在第一个数据报片出现时, IP层必须启动一个定时器,超时而该数据报的所有数据报片未能全部到达,那么将这些数据报片丢弃。
- 最大UDP数据报长度:理论上,IP数据报的最大长度是65535字节,UDP数据报中用户数据的最长长度为65507字节。在许多UDP应用 程序的设计中,其应用程序数据被限制成512字节或更小。超过时典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。
- ICMP源站抑制差错:接收数据报的速度比其处理速度快时,可能产生这个差错。
UDP服务器的设计
- 客户IP地址及端口号:当一个应用程序接收到UDP数据报时,操作系统必须告诉它是谁发送了 这份消息,即源IP地址和端口号。
- 目的IP地址:一些应用程序需要知道数据报是发送给谁的,即目的IP地址。
- UDP输入队列:大多数UDP服务器是交互服务器。来自 不同客户的差不多同时到达的请求将由UDP自动排队。应用程序并不知道其输入队列何时溢出,只是由UDP对超出数据报进行丢弃处理,且没有发回 任何信息告诉客户。U D P输出队列是FIFO(先进先出)的。
- 限制本地IP地址:进入服务器的UDP数据报如果其目的地为服务器端口,那么在任何本地接口均可接收到它。没看懂
- 限制远端IP地址:远端 IP地址和远端端口号都显示为 * . *,接受来自任何IP地址和任何端口号的UDP数据报。
- 每个端口有多个接收者:当UDP数据报到达的目的IP地址为广播地址或多播地址,而且在目的IP地址和端口号处 有多个端点时,就向每个端点传送一份数据报的复制。
- 习题
- 向UDP数据报中写入1473字节用户数据时导致以太网数据报分片。在 采用以太网IEEE 802封装格式时,导致分片的最小用户数据长度为多少? 存在8个额外的首部字节,所以 1 4 6 5个字节的用户数据是引 起分片的最小长度。
- 为什么除最后一片外,其他片中的数据长度均要求为 8字节的整数倍? P首部有13位片偏移来标识该分片所在用户数据的偏移,但是由于用户数据最大可以为2的16次方,相除。
- 假定有一个以太网和一份8 1 9 2字节的U D P数据报,那么需要分成多少个数据报片,每个 数据报片的偏移和长度为多少? 对于IP来说有8 2 0 0字节的数据需要发送, 8 1 9 2字节的用户数据和 8个字节的U D P首部。采用t c p d u m p记号,第1个分片是1 4 8 0 @ 0 +(1 4 8 0字节的数据,偏移为0,将“更多片” 比特置1)。第2个是1 4 8 0 @ 1 4 8 0 +,第3个是1 4 8 0 @ 2 9 6 0 +,第4个是1 4 8 0 @ 4 4 4 0 +,第5个 是1 4 8 0 @ 5 9 2 0 +,第6个是8 0 0 @ 7 4 0 0。1 4 8 0×5 + 800 = 8200,正好是要发送的字节。
- 假定这些数据报片要经过一条 M T U为5 5 2的S L I P链路。必须记住每一个数据报片中的数据(除 I P首部外)为8字节的整数倍。那么又将分成多少个数据报片? 每个数据报片的偏移和长度为多少? 每个1 4 8 0字节的数据报片被分成三小片:两个 5 2 8字节和一个4 2 4字节。小于5 3 2(5 5 22 0)的8的最大倍数是5 2 8。8 0 0字节的数据报片被分成两小片:一个 5 2 8字节和一个2 7 2 字节。这样,原来8 1 9 2字节的数据报变成了S L I P链路上的1 7个帧。
- 一个用U D P发送数据报的应用程序,它把数据报分成 4个数据报片。假定第 1片和第2片 到达目的端,而第3片和第4片丢失了。应用程序在1 0秒钟后超时重发该U D P数据报,并 且被分成相同的4片(相同的偏移和长度)。假定这一次接收主机重新组装的时间为6 0秒, 那么当重发的第3片和第4片到达目的端时,原先收到的第 1片和第2片还没有被丢弃。接 收端能否把这4片数据重新组装成一份I P数据报? 不。问题是当应用程序超时重传时,重传产生的 I P数据报有一个新的标识字段。而重新 装配只针对那些具有相同标识字段的分段。
- 在讨论分片时没有提及任何关于 I P首部中的选项——它们是否也要被复制到每个数据报 片中,或者只留在第一个数据报片中?不严格的和严格的源站选路选项被复制到每一个数据报片中。时间戳选项和记录路由选 项没有被复制到每一个数据报片中—它们只出现在第1个数据报片中。
- U D P数据报是根据目的U D P端口号进行分配的。这正确吗?不。很多实现可以根据目的 I P地址、源I P地址和源端口号来过滤 送往一个给定U D P端口号的输入数据报。
TCP:传输控制协议
RFC793
- TCP的服务:TCP提供一种面向连接的、可靠的字节流服务,仅有两方进行彼此通信;TCP为应用层提供全双工服务可靠性保证:应用数据被分割成TCP认为最适合发送的数据块;发出一个段后,它启动一个定时器,等待目的端确认,如果不能收到一个确认,将重发报文段;收到另一端的数据,它将发送一个确认;端到端的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发);TCP报文段的到达也可能会失序,可以重排;流量控制。
- TCP的首部:序号对每个字节进行计数;确认序号包含发送确认的一端所期望收到的下一个序号;当建立一个新的连接时,SYN标志变1;一旦一个连接建立起来, ACK标志设 置为1;首部长度给出首部中32 bit字的数目;检验和覆盖了整个的TCP报文段;只有当URG标志置1时紧急指针才有效;TCP报文段中的数据部分是可选的。
TCP数据在IP数据报中的封装
TCP包首部
TCP连接的建立与终止
建立连接协议:三次握手
- 请求端(通常称为客户)发送一个 SYN段指明客户打算连接的服务器的端口,以及初始序号;
- 服务器发回包含服务器的初始序号的 SYN报文段,将确认 序号设置为客户的ISN加1以对客户的SYN报文段进行确认;
- 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。
发送第一个SYN的一端将执行主动打开( active open)。接收这个SYN并发回下一个SYN的另一端执行被动打开。ISN随时间而变化,每个连接都将具有不同的ISN 。
连接终止协议:四次握手
- 应用关闭时,TCP客户端发送一个FIN,用来关闭从客户到服务器的数据传送。;
- 当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1,TCP服务器还向应用程序(即丢弃服 务器)传送一个文件结束符;
- 接着这个服 务器程序就关闭它的连接,导致它的TCP端发送一个FIN;
- 客户必须发回 一个确认,并将确认序号设置为收到序号加1。
4次握手是由TCP的半关闭(halfclose)造成的。一方完成它的数据发送任务后就能发送一个 FIN来终止这个方向连接,当一端收到一个FIN,它必须通知应用层另一端几经终止了那个方向的数据传送。
- 连接建立的超时:有很多情况导致无法建立连接,一种情况是服务器主机没有处于正常状态。大多数伯克利系统将建立一个新连接的最长时间限制为75秒。第一次超时时间在 5.59秒~ 5.93秒之间变化。然而,第二次超时时间则总是24.00秒。
- 最大报文长度MSS:当一个连接建立时, 连接的双方都要通告各自的MSS。以太网MSS值可达1460字节。如果目的IP地址为“非本地的(nonlocal)”,MSS通常的默认值为536。
- TCP的半关闭:连接的一端在结束它的发送后还能接收来自另一端数据的能力。如果应用程序不调用close而调用shutdown,且第2个参数值为1,则插口的API支持半关闭。收到半关闭的一端在完成它的数据传送后,发送 一个FIN关闭这个方向的连接,这将传送一个文件结束符给发起这个半关闭的应用进程。当对第二个FIN进行确认后,这个连接便彻底关闭了。
TCP的状态变迁图
左下角4个状态放在一个虚 线框内,并标为“主动关闭”。其他两个状态也用虚线框住,并标为“被动关闭”。 执行被动关闭(进入LISTEN),收到一个SYN,发送一个带ACK的SYN(进入SYN_RCVD), 然后收到一个RST,而不是一个ACK,便又回到LISTEN状态并等待另一个连接请求的到来。
- 2MSL等待状态:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。在连接处于2MSL等待时,任何迟到的报文段将被丢弃。因此,终止并立即重新启动一个客户程序,则这个新客户程序将不能重用相同的本地端口。对服务器程序,将不能把它的这个熟知端口赋值给它的端点,需要等1 ~ 4分钟。
- 平静时间:TCP在重启动后的MSL秒内不能建立任何连接。这就称 为平静时间(quiet time)。
- FIN_WAIT_2 状态:只有当另一端的进程完成这个关闭,我们这端才会从 FIN_WAIT_2状态进入TIME_WAIT状态。 这意味着我们这端可能永远保持这个状态。
复位报文段
一个报文 段发往基准的连接(由目的 I P地址和目的端口号以及源 I P地址和源端口号指明的连接)出现错误,TCP都会发出一个复位报文段
- 到不存在的端口的连接请求:当一个数据报到达目的端口时,该端口没在使用,它将产生一个ICMP端口不可达的信息,TCP则使用复位
- 异常终止一个连接:能发送一个复位报文段而不是FIN来中途释放一个连接。RST报文段中包含一个序号和确认序号。需要注意的是RST报文段不会导致另一端产生任何响应,另一端根本不进行确认
- 检测半打开连接:半打开指一方已经关闭或异常终止连接而另一方却还不知道。任何一端的主机异常都可能导致发生这种情况。
同时打开
两个应用程序同时彼此执行主动打开,每一方 必须发送一个SYN,且这些SYN必须传递给对方。仅建立一条连接而不是两条连接。交换 4个报文段。每一端既是客户又是服务器。
同时关闭
双方都执行主动关闭也是可能的。交换 4个报文段。
TCP选项
RFC793,RFC1323
每个选项的开始是1字节kind字段,长度是指总长度,包括kind字节和len字节。
TCP服务器的设计
- 大多数的TCP服务器进程是并发的。
- TCP服务器端口号:TCP使用由本地地址和远端地址组成的4元组-目的IP地址、目的端口号、源IP地址和源端口号来处理传入的多个连接请求。本地端口号相同,远端端口号不同,不会造成冲突。处于LISTEN状态的服务器进程一直存在,用于接收其他的连接请求。当传入的连接请求到达并被接收时,系统内核中的TCP模块就创建一个处 于ESTABLISHED状态的进程。
- 限定的本地IP地址:服务器不能任选其本地 I P地址而必须使用特定的 I P地址。
- 限定的远端IP地址:接口函数允许一个服务器在执行被动打开时,可指明远端 插口(等待一个特定的客户执行主动打开),也可不指明远端插口(等待任何客户)。一般不指明远端接口。
- 呼入连接请求队列: 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被 TCP接受(即三次握手已经完成),但还没有被应用层所接受。应用层指明队列的最大长度,称为积压值,积压值通常小于所能允许的最大接受连接数。当一个SYN到达时,TCP根据当前连接队列中的连接数来确定是否接收这个连接。还有空间则对SYN进行确认并完成连接的建立,没有空间则TCP将不理会收到的SYN,也不发回任何报文段。
TCP的交互数据流
- TCP通信量一半是交互数据流,一半是成块数据。成块数据的报文段基本上都是满长度,约90 %左右的用户数据小于10个字节)。
- 交互式输入:通常每一个交互按键都会产生一个数据分组,每次从客户传到服务器的是一个字节的按键。
按键确认与按键回显一 起发送,称为经受时延的确认。 - 经受时延的确认:TCP将以最大 200 ms的时延等待是否有数据,与ACK一起发送。
- Nagle算法:RFC896一个TCP连接上最多只能有一个未被确认的未完成的小分组,其他小分组被TCP收集起来并在确认到来时以一个分组的方式发出去。小消 息(鼠标移动)必须无时延地发送,此时可以关闭Nagle算法。
- 窗口大小通告:slip通告窗口大小为4096字节。
TCP成块数据流
- 滑动窗口:接收方通告的窗口称为提出的窗口,发送方 计算它的可用窗口,该窗口表明多少数据可以立即被发送。数据被发送和确认时,窗口合拢;另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时,窗口张开;收缩一般不允许。接收方的一个报文段确认数据并把窗口向右边滑动。
2. 窗口大小:4.3BSD为4096个字节。插口API允许进程设置发送和接收缓存的大小。
3. PUSH标志:发送方使用该标志通知接收方将所收到的数据全部提交给接收进程。
4. 慢启动:发送方和接收方之间存在多个路由器和速率较慢的链路时,发送方将拥塞窗口初始化为1,每收到一个ACK,拥塞窗口就增加一个报文段。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。指数增加。
5. 成块数据的吞吐量:通道的容量称为时延带宽积capacity(bit)=bandwidth(b/s)×round-trip time (s) 从大流量到小流量管道会发生拥塞,再回到大流量,分组间隔还是与最慢链路一致。
6. 紧急方式:使一端可以告诉另一端有些具有某种方式的 “紧急数据”已经放置在普通的数据流中。只要从接收方当前读取位置到紧急数据指针之间有 数据存在,就认为应用程序处于“紧急方式”。最常见的例子是Telnet和Rlogin。
TCP的超时与重传
- TCP管理四个定时器:重传定时器使用于当希望收到另一端的确认;坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口;保活定时器可检测到一个空闲连接的另一端何时崩溃或重启;2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
- 超时重传:重传间隔时间每次增加一倍直至64秒,称为指数退避。首次分组传输与复位信号传输之间的时间差 约为9分钟。
- 往返时间测量:在发送一个带有特别序号的字节和接收到包含该字节的确认之间的时间。如果ACK到达时数据没有被重传,则被平滑的RTT和被平滑的均值偏差将基于这个新测量进行更新。
- 拥塞避免:通常与慢启动在一起实现。维持两个窗口,拥塞窗口cwnd、慢启动门限ssthresh。初始化cwnd为1个报文段,ssthresh为65535个字节;TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小; 当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半,如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动);当新的数据被对方确认时,就增加cwnd,如果cwnd小于等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。
- ** 快速重传与快速恢复**:一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半,重传丢失的报文段,设置cwnd为ssthresh加上3倍的报文段大小;每次收到另一个重复的 ACK时,cwnd增加1个报文段大小并发送 1个分组;当下一个确认新数据的ACK到达时,设置cwnd为ssthresh,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。
- 按每条路由进行度量:被平滑的 RTT、被平滑的 均值偏差以及慢启动门限被保存在路由表中。
- ICMP差错:一个接收到的源站抑制引起拥塞窗口cwnd被置为1个报文段大小来发起慢启动,但是慢启动门限ssthresh没有变化; 一个接收到的主机不可达或网络不可达实际上都被忽略。
- 重新分组:当TCP超时并重传时,TCP允许进行重新分组而发送一个较大的报文段。
TCP的坚持定时器
- 发送方使用一个坚持定时器 (persist timer)来周期性地 向接收方查询,以便发现窗口是否已增大,防止ACK丢失造成的死锁。坚持定时器时使用了普通的TCP指数退避,对一个典型的局域网连接,首次超时时间1.5秒,第2次3秒,再下次6秒,之后12 秒等。
- 从发送方发出的报文段称为窗口探查 ,1字节。
- 糊涂窗口综合症(SWS):少量的数据将通过连接进行交换, 而不是满长度的报文段。避免该现象的措施:接收方不通告小窗口;只有以下条件之一满足时才发送数据:(a)可以发送一个满长度的报文段;(b)可以发送至少是接收方通告窗口大小一半的报文段;©可以发送任何数据并且不希望接收ACK。
TCP的保活定时器
- 可以没有任何数据流通过一个空闲的TCP连接。保活计时器不是必须的。主要是为服务器提供的。
- 如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段。客户主机依然正常运行,并从服务器可达,则服务器在两小时以后将保活定时器复位; 客户主机已经崩溃,并且关闭或者正在重新启动,则服务器总共发送10个这样的探查,每个间隔75秒,都没有收到响应,就认为客户主机关闭并终止连接; 客户主机崩溃并已经重新启动,则服务器收到一个响应,但是是复位,使得服务器终止这个连接;客户主机正常运行,但是从服务器不可达,视同情况2。
- 保活功能优点:通常激活keepalive选项比显式地编写应用程序探测报文更容易;keepalive探测报文比应 用程序探测报文占用更少的网络带宽(因为keepalive探测报文和应答不包含任何数据);如果连接不是空闲的,就不会发送探测报文。
- 保活功能缺点: keepalive选项可能会由于一个临时性的网络中断而引起一个非常好的连接断开;发送探测报文的间隔(2小时)一般不可以根据应用程序进行配置。
TCP的未来和性能
- 路径MTU发现:在连接建立时,TCP使用输出接口或对端声明的MSS中的最小MTU作为起始的报文段大小。一旦选定了起始的报文段大小,在该连接上的所有被TCP发送的IP数据报都将被设置DF比特。如果某个中间路由器需要对一个设置了DF标志的数据报进行分片,它就丢弃这个数据 报,并产生一个我们在ICMP的“不能分片”差错,TCP就减少段大小并进行重传。由于路由可以动态变化,因此在最后一次减少路径 MTU的一段时间以后,可以尝试使用一个较大的值。
- 长肥管道:具有大的带宽时延乘积的网络被称为长肥网络(LFN)。运行在LFN上的TCP连接被称为长肥管道。网络的速率达到千兆比的网络称为千兆比网络,时延 限制占据了主要地位,而带宽不再成为限制。
- 窗口扩大选项:窗口定义从16 bit增加为32 bit,通过定义一个选项实现。发送移位记数为 S,而接收移位记数则为 R。从另一端收到的每一个16 bit的通告窗口将被左移R位以获得实际的通告窗口大小。每次当我 们向对方发送一个窗口通告的时候,我们将实际的32 bit窗口大小右移S比特,然后用它来替 换TCP首部中的16bit的值。
- 时间戳选项:发送方在每个报文段中放置一个时间戳值,接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT。TCP首部长度将从正常的2 0字节增加为32字节。对于每个连接只保持一个时间戳的数值。
- PAWS:防止回绕的序号。接收方将时间戳视为序列 号的一个32 bit的扩展。由于在时间E重新出现的报文段的时间戳为2,这比最近有效的时间戳小(5或6),因此PAWS算法将其丢弃。
- T/TCP:为事务用的TCP扩展。增加三个报文段,一个对应于请求,一个对应于应答和对请求的确认,第三个对应于对应答的确认。为处理事务而需要进行的两个改动是避免三次握手和缩短 WAIT_TIME状态。
- TCP性能:
- 习题
- 我们已经介绍了以下几种分组格式:IP、ICMP、IGMP、UDP和TCP。对每种分组,说明检验和包括IP数据报中的哪些部分,以及该检验和是强制的还是可选的?除了UDP的检验和,其他都是必需的。IP检验和只覆盖了IP首部,而其他字段都紧接着IP首部开始。
- 为什么我们已经讨论的所有Internet协议(IP, ICMP, IGMP, UDP, TCP)收到有检验和错 的分组都仅作丢弃处理? 源IP地址、源端口号或者协议字段可能被破坏了。
- TCP提供了一种字节流服务,而收发双方都不保持记录的边界。应用程序如何提供它们自己的记录标识? 很多Internet应用使用一个回车和换行来标记每个应用记录的结束。这是 NVT ASCII采用的编码。
- 为什么在TCP首部的开始便是源和目的的端口号? 一个ICMP差错报文必须至少返回引起差错的IP数据报中除了IP首部的前8 个字节。当TCP收到一个ICMP差错报文时,它需要检查两个端口号以决定差错对应于哪个连接。因此,端口号必须包含在TCP首部的前8个字节里。
- 为什么TCP首部有一个首部长度字段而UDP首部中却没有?TCP首部的最后有一些选项,但UDP首部中没有选项。
- 半打开连接和半关闭连接的区别是什么?在一个半关闭的连接上,一个端点已经发送了一个FIN,正等待另一端的数据或者一个 FIN。一个半打开的连接是当一个端点崩溃了,而另一端还不知道的情况。
- 如果启动sock程序作为一个服务器程序,然后终止它(还没有客户进程与它相连接), 我们能立即重新启动这个服务器程序。这意味着它没有经历 2MSL等待状态。如何解释? 一个连接只有经过了已建立状态才能进入2MSL等待状态。
- 如果应用程序仅过11分钟后实行完全关闭(不是半关闭),许多具体的实现都将一个连接由这个状态转移到CLOSED状 态。如果另一端(处于CLOSE_WAIT状态)在宣布关闭(即发送FIN)之前等待了12分钟,这一端的TCP将如何响应这个FIN?因为在一个已经关闭的连接上到达了一个FIN,所以相应于这个FIN发送了一个复位。
- 为什么服务器不将对客户FIN的ACK与自己的FIN合并,从而将报文段数减少为3个? 首先,服务器对客户的 FIN的确认一般不会被延迟, 而是在FIN到达后立即发送。应用进程需要一些时间来接收EOF,告诉它的TCP关闭它这一端的连接。第二,服务器收到客户的FIN后,并不一定要关闭它这一端的连接,仍然可以发送数据。
- DNS使用TCP而不是UDP进行查询,试问需要交换多少个报文 段? 假设有3个分组用于建立连接,1个用于查询,1个用于确认查询,1个 用于响应,1个用于确认响应, 4个用于终止连接。这就是说每次查询需要 11个分组。如果对查询的确认和响应结合在一起,每个查询需要的分组可以减少到 10个。
- 分析处于TIME_WAIT状态的主机收到使其进入此状态的重复的FIN时 所发生的情况。 重复的FIN会得到确认,2MSL定时器重新开始。
- 分析处于TIME_WAIT状态的主机收到一个RST时所发生的情况。 引起状态过早地终止。这就叫作TIME_WAIT断开 。
- 并找出半双工TCP关闭的定义。 它是在具体实现不支持半关闭连接的时候。一旦应用进程引起发送一个FIN,应用进程 就不能再从这个连接读数据了。
- 考虑一个T C P客户应用程序,它发送一个小应用程序首部( 8个字节)和一个小请求 (1 2个字节),然后等待来自服务器的一个应答。比较以下两种方式发送请求时的处理情 况:先发送8个字节再发送1 2个字节和一次发送2 0个字节? 应用程序的两个写操作,跟着一个读操作,引起了迟延,因为 N a g l e算法很可能被激活。 第一个报文段(包含 8个字节的数据)被发送后,在发送后面 1 2个字节的数据之前必须 等待第一个报文段的确认。如果服务器实现了延迟的确认,在收到这个确认之前,可能 会有一个达到200 ms的时延(加上RTT)。
- 如果API提供一种方法,使得发送方可以告诉其TCP打开PUSH标志,而接收方可以查询 一个接收的报文段是否被设置了PUSH标志,试问该标志能否被用作一个记录标记? 不,因为TCP超时之后可能重新对数据进行分组。
- 当一个系统发送一个开始的SYN报文段,其窗口扩大因子为0,这是什么含义? 它意味着发送TCP支持窗口扩缩选项,但这个连接并不需要扩缩它的窗口。另一端(接收这个SYN的)可以说明一个窗口扩缩因子(可以是0或非0)。
- 与在建立连接时的固定窗口扩大因子不同,已经定义过的窗口扩大因子能否在扩大因子变化时也出现呢? 不。问题是确认没有可靠地交付(除非它们被数据捎带在一起发送),因此,一个确认 上的扩缩改变可能会丢失。
- 假定MSL为2分钟,那么在什么速率下序号回绕会成为一个问题呢 ? 232×8/120等于286Mb/s,2.86倍于FDDI数据率。
- PAWS被定义为只在一个单独的连接中进行。为了使 TCP将PAWS来替换2MSL等待(即TIME_WAIT状态),需要进行什么改动? 每个TCP将不得不记住从每个主机的任何一个连接上收到的上一个时间戳。
- 时间戳选项是如何影响Karn算法的? 使用这个选项,确认中回显的时间戳总是来自于引起确认的报文段。对哪个重传的报文段 进行确认没有疑问,但仍然需要Karn算法的另一部分,即处理重传的指数退避。
- 如果主动建立连接的TCP发送带有SYN标志的报文段(没有使用扩展),那么接收TCP应该怎样处理这些数据呢? 接收TCP对数据进行排队,但只有完成了三次握手后,数据才能传递给应用程序:当接收TCP进入了ESTABLISH状态。
- 如果我们实现了T/TCP,并测量两个主机之间的事务时间,那么可以通过比较什么指标来确定它的有效性?使用T/TCP的交互时间不可能比两个主机之间交换一个UDP数据报所需的时间短。因 为T/TCP涉及了UDP没有做的状态处理,所以T/TCP总是要花更多的时间。
Ping程序
- 简介:目的是为了测试另一 台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。两种报文格式如下。Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。
LAN输出:发送方发送回显请求,接收方按序发送回显应答。要打印出序列号和TTL,并计算往返时间。ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在ARP高速缓存中。
WAN输出:分组可能丢失,可能收到重复、失序的分组。往返时间发生了很大的变化。
线路SLIP链接:往返时间大约是1. 5秒, 但是程序仍然每间隔1秒钟发送一次ICMP回显请求,最后少一个分组,实际上分组并未丢失,很可能仍然在返回的途中。
- IP记录路由选项:ping程序为我们提供了查看IP记录路由(RR)选项的机会,参数-R。每个处理该数据报的路由器都把它的IP地址放入选项字段中,接收方将IP地址复制到ICMP回显应答中。路由器记录出口IP地址。ping程序收到回显应答时,它就打印出这份IP地址清单。缺点是有一些系统不把 ICMP请求中的IP清单复制到ICMP应答中,只能存放 9个IP地址。RR选项的一般格式如下图。ptr称作指针字段,指向存放下一个IP地址的位置
- IP时间戳选项:OF表示溢出字段。FL表示标志字段,指示时间戳选项的操作。时间戳的取值一般为自UTC午夜开始计的毫秒数。
Traceroute程序
- Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由。
- 用法:Traceroute程序使用ICMP报文和IP首部中的TTL字段(生存周期)。Traceroute程序发送一份TTL字段为1的IP数据报给目的主机,第一个路由器发回一份超时ICMP报文,这样就得到了该路径中的第一个路由器的地址,然后程序发送一份TTL值为2的数据报,直至数据报到达目的主机。Traceroute程序发送一份UDP数据报给目的主机,选择一个不可能的值作为UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,目的主机将产生一份“端口不可达”错误,以此判断数据报是否到达目的主机。
- 并不能保证现在的路由也是 将来所要采用的路由,甚至两份连续的IP数据报都可能采用不同的路由。不能保证ICMP报文的路由与traceroute程序发送的UDP数据报采用同一路由。返回的ICMP报文中的信源IP地址是UDP数据报到达的路由器接口的IP地址,从A主机到B主机上运行traceroute程序和从B主机到A主机上运行traceroute程序所得到的结果可能是不同的。
- IP源站选路选项:由发送者指定路由。严格的源路由选择:-G选项,发送端指明IP数据报所必须采用的确切路由。如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,那么它就返回一个“源站路由失败”的ICMP差错报文。宽松的源站选路:-g选项,发送端指明了一个数据报经过的IP地址清单,但是数据报在清单上指明的任意两个地址之间可以通过其他路由器。
- 习题
- 当IP将接收到的TTL字段减1,发现它为0时,将会发生什么结果?如果一个输入数据报的TTL为0,做减一操作然后测试会将把TTL设置为255,并且让数 据报继续传输。
- traceroute程序是如何计算RTT的?traceroute保存了它发送分组的时间,当收到一个ICMP应答时,取出当时的时间, 把两个值相减就可以得出RTT。
- 假设源主机和目的主机之间有三个路由器(R1、R2 和R3),而中间的路由器(R2)在进入TTL字段为1时,将TTL字段减1,但却错误地将该IP数据报发往下一个路由器。请描述会发生什么结果。在运行traceroute程序时会看到什么样的现象? R3看见进入的TTL是0就将超时的分组发送回来。是两个连续的输出行标识了同一个路由器。
- 假设源主机和目的主机之间有三个路由器。由于目的主机上存在错误,因此,它总是将进入TTL值作为外出ICMP报文的TTL值。请描述这将发生什么结果,你会看到什 么现象?TTL为1、2和3的行正确地标识了R1、R2和R3,接下来的三行每个都包含三个超时,再接下来 的TTL为7的行标识了目的地。TTL为4时,UDP数据报到达了目的地,其输入的TTL为1。ICMP端口不可达报文生成了,但它的TTL是1(错误地从进入的TTL复制而来)。这个ICMP报文到了R3,在那儿TTL被减1, 报文被丢弃。没有生成一个ICMP超时报文,因为被丢弃的数据报是一个ICMP的差错报文(端口不可达)。
- 比较ping和traceroute程序在处理同一台主机上客户的多个实例的不同点?ping的客户把ICMP回显请求报文的标识符字段设置为它的进程ID。ICMP回显应答报文包含同样值的标识符字段。每个客户都要查看这个返回的标识符字段,并且 只处理那些它发送过的报文。traceroute客户将它的UDP源端口号设置为它的进程ID和327*68的逻辑或。因为返回的ICMP报文总是包含产生错误的IP数据报的前8个字节,这8个字节包括了完整的UDP首部,所以这个源端口号在ICMP差错报文中被返回。
- 比较ping和traceroute程序在计算往返时间上的不同点? ping客户将ICMP回显请求报文的可选数据部分设置为分组发送的时间。这个可选的数 据必须在ICMP回显应答中返回。这样使得即使分组返回时失序,客户也能计算出精确的 回环时间。traceroute客户不能这样操作,因为在ICMP差错报文中返回的只是UDP首部, 没有UDP数据。因此,traceroute必须记住它发送一个请求的时间,等待应答,然后计算两者的时间差。
DNS:域名系统
- 简介:RFC1034域名系统是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。对 DNS的访问是通过一个地址解析器(resolver)来完成的。解析器并不是操作系统的内核。在一个应用程序请求TCP打开一个连接或使用UDP发送一个数据报之前。心须将一个主机名转换为一个IP地址。
- *DNS基础:命名树上任何一个结点的域名就是将从该结点到最高层的域名串连起来,中间使用一个点。域名树中的每个结点必须有一 个唯一的域名,但域名树中的不同结点可使用相同的标识。以点结尾的域名称为绝对域名或完全合格的域名。
网络信息中心NIC负责分配顶级域和委派其他指定地区域的授权机构。一个独立管理的DNS子树称为一个区域 (zone)。一个常见的区域是一个二级域。一旦一个区域的授权机构被委派后,由它负责向该区域提供多个名字服务器,一个主名字服务器和至少一个辅助名字服务器,主名字服务器从磁盘文件中调入该区域的所有信息, 而辅名字服务器则从主服务器调入所有信息。主名字服务器都必须知道根服务器的IP地址,根服务器则知道所有二级域中的每个授权名字服务器的IP地址。 - DNS报文格式:标识字段由客户程序设置并由服务器返回结果,客户程序通过它来确定响应与查询是否匹配。
DNS查询报文的问题部分:A类型,表示期望获得查询名的IP地址,一个PTR查询则请求获得一 个IP地址对应的域名。查询类通常是1,指互联网地址。
DNS响应报文的资源记录部分:资源记录(RR)通常的生存时间值为2天。
host程序它能将查询传递给名字服务器,并显示返回的结果 - 指针查询:指针查询方式,即给定一个IP地址,返回与该地址对应的域名。
- 资源记录:A-IP地址;PTR-指针查询;CNAME-规范名字;HINFO-主机信息;MX邮件交换记录;NS-名字服务器记录。
- 高速缓存:所有的名字服务器均使用高速缓存。
- DNS主要使用UDP。当名字解析器发出一个查询请求,并且返回响应中的 TC(删减标志)比特被设置为1时, 响应的长度超过了512个字节,使用TCP。当一个域的辅助名字服务器在启动时,将从该域的主名字服务器执行区域传送,使用TCP。
- 习题
- 一个DNS名字解析器和一个DNS名字服务器作为客户程序、服务器或同时作为客户和服务器的情况。一个解析器总是一个客户,但一个名字服务器既是一个客户又是一个服务器。
- 一个既可接受点分十进制形式的IP地址、也可接收主机名的应用程序,应先假定输入的是IP地址,如果失败,再假定是主机名。如果改变这个测试顺序会出现什么情况? 将顺序颠倒意味着首先使用DNS,如果使用DNS失败,然后才将参数翻转过来作为一个点分十进制数。这就是说每次说明一个点分十进制数,都要使用DNS,涉及一个名字服务器。这是对资源的一种浪费。
- 名字服务器更新的频度是怎样的?InterNIC的注册服务每一周更新三次根服务器。
- 维护一个名字服务器和一个无状态的名字解析器高速缓存的问题分别是什么? 就像应用是不定的一样,解析器也是不定的。如果系统配置成使用多个名字服务器,而 且解析器是无状态的,那么解析器就不能记住不同的名字服务器的往返时间。这样定时太短的解析器将会超时,引起不必要的重传。
TFTP:简单文件传送协议
- 简介:RFC1350,最初打算用于引导无盘系统 ,为了保持简单和短小,TFTP将使用UDP。
- 协议:客户发送一个读请求(RRQ)或写请求(WRQ)给服务器。 每个数据分组包含一个块编号字段,它以后要在确认分组中使用。TFTP客户收到一个不足512字节的数据分组,就知道它收到最后一个数据分组。 发送数据报,收到ACK后,再发送下一个数据报,这是停止等待协议。5种TFTP报文格式如图。
差错报文它用于服务器不能处理读请求或写请求的情况,或者在文件传输过程中的读和写差错。
TFTP使用不可靠的UDP,因此必须处理分组丢失和分组重复。TFTP报文中没有检验和,它假定任何数据差错都将被UDP的检验和检测到。TFTP服务器通过为每个客户提供一个新的UDP端口来提供并发。 - 安全性:TFTP分组中并不提供用户名和口令。可以手用于获取Unix口令文件的复制,然后来猜测用户口令。TFTP服务器提供了一个选项来限制只能访问特定目录下 的文件。TFTP服务器通常将它的用户ID和组ID设置为不会赋给任何真正用户的值。
- 习题
- 如果一个TFTP 服务器收到的请求的目的IP地址是一 个广播地址,它将做什么。 送往广播地址的TFTP请求应该被忽略。
- 当TFTP块号由65535跳回到0时,你认为会发生什么? 具体实现时应该能够传输最大为33553920(65535×512)字节的文件。但是当文件的长度超过16776704(32767×512)时,很多实现都会失败,因为它们将块数目错误地表示为一个有符号的16位整数,而不是一个无符号的整数。
- TFTP发送方采用超时重发来处理分组丢失。当TFTP作为引导进程的一部分时,这种方法对TFTP的使用有何影响? 简化了编写一个适合于只读内存的TFTP客户的工作,因为服务器是引导文件的发送者,所以服务器必须实现超时和重传机制。
- 使用TFTP时,影响传输文件所需时间的限制性因素是什么?利用它的停止等待协议,TFTP可以在每一次客户与服务器的往返过程中最多传输512字节 的数据。TFTP的最大吞吐量就是512字节除以客户与服务器之间的往返时间。在以太网上, 假设一个往返时间为3ms,那么最大的吞吐量就是大约170000字节/秒
BOOTP:引导程序协议
- 简介:RFC951用于无盘系统进行系统引导的替代方法,使用UDP,且通常需与TFTP协同工作
- ** BOOTP 的分组格式**:如果该客户已经知道自身的IP地址,它将写入“客户IP地址”字段。否则,它将该字段 设置为0。对于后面这种情况,服务器用该客户的IP地址写入“你的IP地址”字段。“服务器IP地址”字段则由服务器填写。如果使用了某个代理服务器,则该代理服务器就 填写“网关IP地址”字段。
引导请求通常是采用链路层广播,IP首部中的目的IP地址为255.255.255.255,源IP地址通常是0.0.0.0。选择两个端口而不是仅选择一个端口为BOOTP服务器用的原因是,服务器的应答可以进行广播。如果客户也使用服务器的知名端口(67)作为它的端口,那么网络内的所有服务器会被唤醒来查看每个广播应答。 - BOOTP服务器的设计:BOOTP 服务器的主机可能向那个IP地址发送一个ARP请求,但这个客户不知道它自己的IP地址所以不能响应。解决办法是服务器发一个ioctl(2)请求给内核, 为该客户在ARP高速缓存中设置一个条目,或广播这个BOOTP应答而不直接将应答发回该客户。
- BOOTP穿越路由器:使路由器支持BOOTP,称作中继代理。主要用于无盘路由器。收到一个BOOTP请求时,中继代理将它的IP地址填入收到BOOTP请求中的“网关IP地址字段”,然后将该请求发送到真正的BOOTP服务器。
- 特定厂商信息:
- 习题
- 我们说BOOTP优于RARP的一个方面是BOOTP能穿越路由器,而RARP由于使用链路层 广播则不能。如果在路由 器中增加允许转发RARP请求的功能会发生什么?一个路由器可以转发一个RARP请求到路由器连接的其他网络上的任何一台主机上。但是发送应答就成问题了,路由器还必须转发RARP应答。BOOTP没有这个应答问题,因为应答的地址是路由器知道如何转发的一般IP地址。问题是RARP只使用了链路层地址,路由器一般不知道在其他的、没有连接在路由器的网络上主机的链路层地址。
- 当有多个客户程序同时向一个服务器发出引导请求时,因为服务器要广播多 个BOOTP应答,BOOTP 客户就必须使用事务标识来使响应与请求相匹配。但在一个例子中,事务标识为0,表示这个客户不考虑事务标识。你认为这个客户将如何将这些响应 与其请求匹配?它可能使用了自己的硬件地址。该地址应该是唯一的,在请求报文中设置,在应答中返回。
SNMP: 简单网络管理协议
- 简介:被管设备端和管理相关的软件叫做代理程序(agent)或代理进程。网络管理的两种通信方式,管理进程向代理进程发出请求询问一个具体的参数值,代理进程主动向管理进程报告有某些重要的事件发生。RFC1157协议常用UDP。
- 协议:5种常见操作如图。trap指代理进程主动发出的报文,通知管理进程有某些事情发生。
报文格式如图。共同体字段是一个字符串。这是管理进程和代理进程之间的口令,是明文格式。差错索引字段是一个整数偏移量,指明当有差错发生 时,差错发生在哪个参数。
管理信息结构:SNMP有特殊的数据结构,包括整型、字节、ASCII码、空、IP地址、物理地址、时间计数器、序列号、序列向量等。
对象标识符:是一种数据类型,它指明一种“授权”命名的对象。是一个整数序列,树形结构,从顶部开始。
管理信息库:MIB所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合。划分为多个组,UDP组、system组、interface组、at组、ip组、icmp组、tcp组。
Case图真实地描述了一个给出的MIB组中变量之间的相互关系。如图。
实例标识:对MIB的每个变量进行标识。简单变量附加“ . 0”,表格指明一个以上的索引。MIB表格是根据其对象标识按照字典的顺序进行排序的。
首先从IP路由表中取到 SLIP连接(140.252.1.29)的接口号(ipRouteIfIndex),然后就可以用这个数值进入接口表并且取得想要的SLIP连接的MTU。
trap:类型如图。
在正式的SNMP规范中都是采用ASN.1(Abstract Syntax Notation 1)语法,且在SNMP报文中比特的编码采用BER。
SNMPv2:RFC1441 定义了新的分组类型和MIB,提供了鉴权和加密,安全性大有提高。
- 习题
- 采用两个不同的UDP端口(161和162 )可以使得一个系统既可以是管理进程,也可以 是代理进程。如果对管理进程和代理进程采用一个同样的端口,会出现什么情况? 如果一个系统运行了一个管理进程和一个代理进程,它们很可能是不同的进程。管理进程在UDP端口162监听trap告警,代理进程在UDP端口161等待请求。如果trap告警和SNMP请求使用了同样的端口,将很难区分管理进程和代理进程。
Telnet和Rlogin:远程登录
- 简介:远程登录采用客户-服务器模式。Telnet是标准的提供远程登录功能的应用,几乎每个TCP/IP的实现都提供这个功能,通过客户进程和服务器进程之间的选项协商机制, 从而确定通信双方可以提供的功能特性。客户-服务器模式的Telnet简图如下。 Rlogin起源于伯克利Unix。
登录外壳(shell)进程来讲是被Telnet服务器进程直接调用的,而且任何运行在登录外壳进程处的程序都感觉是直接和一个终端进行交互。 仅仅使用了一条TCP连接。
Rlogin协议
应用进程的启动:客户进程给服务器进程发送4个字符串,包括用户登录进客户进程主机 的登录名和登录服务器进程端主机的登录名,以及用户终端类型名。服务进程返回一字节0。服务器进程可以选择是否要求用户输入口令。通常可以在服务器进程的主目录(home directory)下生成一个文件,记录主机名和用户名,文件里有的用户不用输入口令。输入的口令将以明文的形式发送到服务器进程。服务器进程通常要给客户进程发送请求,询问终端的窗口大小。
流量控制:流量控制是由Rlogin的客户进程完成的。客户进程能够识别用户键入的STOP和START的ASCII字符(Control_S和Control_Q),并且终止或启动终端的输出。
窗口大小:窗口大小的变化发生在客户端,而运行在服务器端的应用程序需要知道窗口大小变化。
服务器到客户的命令:服务器要给客户发送命令时,服务器就进入紧急方式,并且把命令放在紧急数据的最后一个字节中。紧急方式的原因是第一个命令(“清仓输出”)需要立即发送给客户。服务器到客户的输出被流量控制所终止的情况经常发生,客户到服务器的数据流很少被流量控制 所终止。
客户到服务器的命令:只有一个,将当前窗口大小发送给服务器。在两个字节的0xff后面紧跟着发送4个1bit长数据说明窗口大小。
客户的转义符:有些时候,我 们并不需要把键入的信息传输到服务器,而是要和Rlogin客户进程直接通信,开头键入代字符(tilde)“~”,紧跟着四个字符之一,以一个句号结束客户进程,以文件结束符(通常是C o n t r o l _ D)结束客户进程,以任务控制挂起符(通常是C o n t r o l _ Z)挂起客户进程,以任务控制延迟挂起符(通常是 C o n t r o l _ Y)来挂起仅仅是客户进程的输入。
Telnet协议
- NVT:网络虚拟终端。连接的双方,即客户机和服务器, 都必须把它们的物理终端和NVT进行相互转换。NVT是带有键盘和打印机的字符设备。NVT ASCII代表7比特的ASCII字符集,网间网协议族都使用NVT ASCII。每个7比特的字符都以8比特格式发送,最高位比特为0。行结束符以两个字符CR(回车)和LF(换行)这样的序列表示,也是\r\n。
- Telnet命令:采用带内信令方式。字节0xff叫做IAC。该字节后面的一个字节才是命令字节。
- 选项协商:Telnet连接双方首先进行交互的信息是选项协商数据。
3个字节:一个IAC字节,接着一个字节是WILL, DO, WONT和DONT这四者之一,最后一个ID字节指明激活或禁止选项。 Telnet协议的大部分内容是对称的。
- 子选项协商:客户进程发送用一个ASCII字符串来表示终端类。终端类型可以用任何对方可理解的数据 进行表示。只要这些数据在 termcap或terminfo数据库中有定义。
- 操作方式:
- 半双工:默认,现在却很少使用。
- 一次一字符:char。用户在终端输入的每个字符都将由终 端发送到服务器进程,服务器进程的响应也将以字符方式回显到终端上。ECHO选项和SUPPRESS GO AHEAD选项必须同时有效。目前大多数 Telnet实现都把这种方式作为默认方式。
- 一次一行:kludge。准行方式。ECHO选项和SUPPRESS GO AHEAD选项其中之一无效。
- 行方式:linemode。 客户进程和服务器进程进行协商而确定的,它纠正了准行方式的所有缺陷。
- 同步信号:以Data Mark命令作为同步信号。以TCP紧急数据形式发送的。告诉收端回到正常的处理过程上来。
- 客户的转义符:Telnet客户进程可以使用户直接和客户进程进行交互,而不是被发送到服务器进程。的转义字符是Control_]。
- 习题
- Rlogin客户进程必须使用保留端口号。这会给主机带来什么限制?有没有解决的办法?
只有512个这样的保留端口(512~1023),限制了一个主机只能有512个远程登录的(Rlogin)客户。在实际生活中,这个限制一般小于512个,因为在这个范围中的一些端 口号被不同的服务器,如远程登录服务器,用作了知名端口。TCP的限制是一对插口定义的一个连接(4元组)必须是唯一的。因为Rlogin服务器总 是使用了同样的知名端口(513),一台主机上多个Rlogin客户只有在它们和不同的服务 器主机相连接时才可以使用相同的保留端口。然而,Rlogin客户没有采用重用保留端口的技术。如果使用了这种技术,理论限制就是在同一时刻最多有512个Rlogin客户和同一个的服务器主机相连。
FTP:文件传送协议
- 简介:将一个完整的文件从一个系统复制到另一个系统中。要使用FTP,就需要有登录服务器的注册帐号,或者通过允许匿名FTP的服务器来使用。FTP支持有限数量的文件类型(ASCII,二进制,等等)和文件结构(面向字节流或记录)。
- 采用两个TCP连接来传输一个文件。控制连接以通常的客户服务器方式建立,始终等待客户与服务器之间的通信,特点最大限度地减小迟延。每当一个文件在客户与服务器之间传输时,就创建一个数据连接,特点最大限度提高吞吐量。两个协议解释器根据需要激活文件传送功能,处理在控制连接中转换的命令和应答。
- 数据表示:文件类型包括ASCII码文件类型 、 EBCDIC文件类型、图像文件类型、本地文件类型 。格式控制包括非打印 、远程登录格式控制、Fortran 回车控制。结构包括文件结构、记录结构和页结构。传输方式包括流方式、块方式、压缩方式。
- FTP命令:命令和应答在客户和服务器的控制连接上以 NVT ASCII码形式传送。
- FTP应答:都是ASCII码形式的3位数字,每一位都有不同的含义,并跟有报文选项。
- 连接管理:数字连接的用途包括从客户向服务器发送一个文件,从服务器向客户发送一个文件,从服务器向客户发送文件或目录列表。 对每一个文件传输或目录列表来说都要建立一个全新的数据连接。服务器总是执行数据连接的主动打开,客户被动打开。
SMTP: 简单邮件传送协议
- 简介:用户与用户代理(user agent)打交道,用TCP进行的邮件交换是由报文传送代理MTA,系统管理员负责设置本地 的MTA。
- 协议:两个MTA之间用NVT ASCII进行通信。客户向服务器发出命令,服务器用数字应答码和可选的人可读字符串进行响应。
- SMTP命令:客户用HELO命令标识自己,MAIL命令标识出报文的发起人,RCPT标识接收方,邮件报文的内容由客户通过DATA命令发送,命令QUIT结束邮件的交换,RSET命令异常中止当前的邮件事务并使两端复位,VRFY命令使客户能够询问发送方以验证接收方地址,NOOP命令强迫服务器响应一个OK应答码,TURN命令使客户和服务器交换角色。
- 电子邮件:信封是MTA用来交付的,首部由用户代理使用, 正文是发送用户发给接收用户报文的内容。都用它用NVT ASCII表示。用户接收我们指定为正文的部分,加上一些首部字段,并把结果传到MTA,MTA加上一 些首部字段,加上信封,并把结果发送到另一个MTA。
- 中继代理:把所有非本地的向外的邮件发送到一台中继机上进行转发。
- 新的邮件报文传给它的MTA时,通常立即试图交付。如果交付失败,MTA 必须把该报文放入队列中以后再重试。推荐初始时间间隔至少为30分钟。发送方至少4 ~ 5天内不能放弃。
- ** SMTP的未来**:新加入SMTP命令。 信封-扩充的SMTP框架(ESMTP)。首部-可以发送非ASCII字符。正文-为允许把结构置入正文。称为MIME,即通用Internet邮件扩充。
- 习题
- 除了连接建立和终止外,要发送一个小的邮件报文的最小网络往返次数是多少? 6个来回:HELO命令、MAIL、RCPT、DATA报文主体和QUIT。
- TCP是一个全双工协议,但是SMTP用半双工的形式使用TCP。客户发送一个命令后停止等待应答。为什么客户不一次发送多个命令,如一行中包括HELO、MAIL、RCPT、DATA和QUIT命令(假定正文不是太大)? 这是合法的,称为流水线技术(pipelining)。不幸的是,有一些脑 子坏了(brain-damaged)的SMTP接收者实现,每处理完一条命令就要清除它们的输入 缓存,使得这种技术不可用。如果使用了这种技术,客户自然不能丢弃报文直到所有的 应答都已检查过,确信报文已被服务器接受了。
- 当网络在接近其容量运行时,SMTP的这种半双工操作如何欺骗缓慢的启动机制? 每个都是一个小命令(很可能是只有一个报文段),对网络几乎没有负载。如果所有5个都没有重传地送到了服务器,当报文主体发送时,拥塞窗口可能是6个报文段。如果报文主体很大,客户可能一次发送前 6个报文段,造成网络可能来不及处理。
- 当存在多个具有相同优先值的MX记录时,名服务器是否总能以相同的顺序返回它们?更新版本的BIND使用同样的值来正移MX记录,作为平衡负载的一种方式。
NFS:网络文件系统
- 简介:为客户程序提供透明的文件访问。基础是Sun RPC,远程过程调用。NFS内核检测到被访问的文件位于一个NFS服务器时,就会自动产生一个访问该文件的RPC调用。
- Sun远程过程调用:当客户程序调用远程的过程时,它实际上调用了一个位于本机上的、由RPC程序包生成的函数(称为客户残桩),客户残桩将过程的参数封装成一个网络报文发送给服务器程序。 服务器主机上的一个服务器残桩接收这个网络报文,提取参数,调用服务器过程。当服务器函数返回到服务器残桩,提取返回值封装成一个网络报文,发送给客户残桩。 客户残桩从接收到的网络报文中取出返回值,返回给客户程序。
- ** XDR: 外部数据表示**:用来对RPC调用报文和应 答报文中的值进行编码。使得一个系统中的客户可以调用另一个不 同架构的系统中的一个过程。发送者必须采用XDR格式构造一个RPC报文,然后接收者将XDR格式的报文转换为本机的表示形式。
- 端口映射器:跟踪哪一个RPC程序使用了哪一个临时端口。服务器程序使用RPC调用向端口映射器注册自身,客户程序使用RPC调用向端口映射器查询。当系统引导时,端口映射器必须首先启动。RPC服务器程序启动时,它为它所支持的程序的每一个版本创建一个TCP端点和一 个UDP端点。当RPC客户程序启动时,获得一个指定程序、版本和协议的临时端口号。 在端口映射器中,每一个程序号、版本号和协议 的组合都有自己的端口号映射。
- ** NFS协议**:任何能够访问一个本地文件的客户 程序不需要做任何修改,就应该能够访问一个NFS文件。 使用Sun RPC构造的客户服务器应用程序。NFS客户通过向一个NFS服务器发送RPC请求来访问其上的文件。NFS客户和一个NFS服务器的典型配置如图。
访问的是一个本地文件还是一个NFS文件对于客户来说是透明的。NFS主要使用UDP,最新的 实现也可以使用TCP。 当NFS服务器收到一个客户请求时,它将这个请求传递给本地文件访问例程,后者访 问服务器主机上的一个本地的磁盘文件。 大多数的NFS服务器都是多线程的。在客户内核中一般运行着多个NFS客户。
文件句柄:服务器创建文件句柄,把它传递给客户,然后客户访问文件时,使用对应的文件句柄,客户不会查看文件句柄的内容。
安装协议:客户必须在访问服务器上一个文件系统中的文件之前,使用安装协议安装那个文件系统。
NFS过程:返回一个文件的属性、设置一个文件的属性、返回一个文件系统的状态、查找一个文件、从一个文件中读数据、一个文件进行写操作、创建删除重命名文件、为一个文件构造一个硬链接符号链接、创建删除读目录。
最新的一些实现也支持TCP,主要用于广域网,它可以使文件操作更快。
- 第三版NFS:文件句柄变为64字节可变长度
;允许在更快的网络上读取更大的分组;允许读写更大的文件;写过程可以异步;增加了七个过程;每个影响文件属性值的调用都返回文件的属性。
- 习题
- tcpdump将分组理解为NFS的请求和应答,打印了XID。tcpdump可以为任何的RPC请求或者应答这样做吗? 不,因为tcpdump不能从其他UDP数据报中区别RPC请求或应答。它只有在源端口号或目的端口号为2049时,才将UDP数据报的内容理解为NFS分组。随机的RPC请求和应答可以使用两个端点上的一个临时的端口号
- 在一个Unix系统中,为什么RPC服务器程序使用的是临时端口,而不是知名端口?一个进程必须有超级用户权限才能给自己分配一个小于1024的端口号。尽管这对于系统提供的服务器没问题,如Telnet服务器、FTP服务器和端口映射器,但我们不想给所有的RPC服务器提供这个权限。
- 如果NFS服务器使用的是一个临时端口而不是2049,那么当服务器崩溃然后又重启动时, 一个NFS客户会发生什么情况呢?NFS服务器在重启动之后获得一个不同的端口号是可能的。这将使客户变得很复杂,因 为它需要知道服务器崩溃了,并且在服务器重启动之后与服务器主机的端口映射器联系以找到NFS服务器的新的端口号。 这种情况,即服务器主机崩溃然后重启动时,一个服务器的RPC应用程序获得一个新的临时性端口,可能发生在任何一个没有使用知名端口的RPC应用程序上。
- 如果一个NFS 服务器要求它的客户拥有保留端口(公共的端口),一个NFS客户使用TCP安装了N个不 同的服务器上的N个文件系统,那么客户对每个连接都需要一个不同的保留端口号吗?不。NFS客户可以为不同的服务器主机使用相同的本地的保留端口号。TCP要求由本地IP地址、本地端口、远端IP地址和远端端口组成的4元组是唯一的,对于每个服务器主机来说,远端的IP地址是不同的。
其他的TCP/IP应用程序
- ** Finger协议**:RFC1288知名的端口79。返回一个指定主机上一个或多个用户的信息。服务器必须在最后做一个主动的关闭操作。实现一个防火墙网关:在组织内部和Internet之间的一个路由器,负责过滤(也就是扔掉)从Internet进来的目的端口为79的TCP报文段。
- ** Whois协议**:RFC954知名的TCP端口43。客户向服务器发送一个在线的查询。服务器响应以任何可用的信息,然后关闭连接。InterNIC站点的服务器常使用。
- Archie:提供了Internet上几千个FTP服务器的目录,帮助我们查找名字中包含关键字的文件。
- ** WAIS**:广域信息服务系统,知道几百个包含了有关计算机主 题的和其他一般性主题信息的数据库。
- Gopher:是其他Internet资源服务如Archie、WAIS和匿名FTP的一个菜单驱动的前端程序。
- Veronica:是一个Gopher标题的索引。
- 万维网WWW:使用一个称为超文本的工具,使得我们可以浏览一个大的全球范围的服务和文档。
- X窗口系统:种客户-服务器应用程序,可以使得 多个客户(应用)使用由一个服务器管理的位映射显示器。客户与服务器之间通信的通用形式是TCP。键盘和显示器是属于服务器的, X提供的服务是对窗口、键盘和鼠标的访问。服务器创建一个TCP端点,在端口6000+n上做一个被动打开,其中n是显示器号。单个服务器处理多个客户请求。
- Xscope程序:检查X客户与它的服务器之间交换的信息的一个方便的程序。
- LBX低带宽X:为了将X用于局域网,对X协议使用的编码进行了优化。使用了快速缓存、只发送与前面分组的不同部分以及压缩技术来减少网络流量的数目。
《TCP/IP详解卷一:协议》学习笔记相关推荐
- 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术
本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...
- 第一行代码学习笔记第二章——探究活动
知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...
- 第一行代码学习笔记第八章——运用手机多媒体
知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...
- 第一行代码学习笔记第六章——详解持久化技术
知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...
- 第一行代码学习笔记第三章——UI开发的点点滴滴
知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...
- 第一行代码学习笔记第十章——探究服务
知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...
- 第一行代码学习笔记第七章——探究内容提供器
知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...
- 第一行代码学习笔记第五章——详解广播机制
知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...
- 第一行代码学习笔记第九章——使用网络技术
知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...
- 安卓教程----第一行代码学习笔记
安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...
最新文章
- 使用36-pin的STM32输出VGA, VGA output using a 36-pin STM32
- h5 php js实验总结,H5学习_番外篇_PHP数据库操作
- 学习笔记----linux下编译samba
- 苹果cmsv10精仿迅播影院2tu风格主题模板
- 第一章节 初始类和对象
- 2022年湖北师范大学招生简章--成人高等教育高起专、专升本学历提升
- 计算机桌面通过网络在拼接屏上显示,一种多个拼接屏实时同步显示方法与流程...
- 最新资料!工银亚洲开户见证业务受理网点(广东地区,除了深圳)
- 为什么网站打得开,却ping不通, 网站却打得开
- Win10右键菜单管理工具
- android截屏大小不一致,Android中的高分辨率屏幕截图
- 音频开发_Microphone Array Beamforming_Fractional Delays
- AXI_DMAC的寄存器说明
- 毕业设计-基于深度学习的数据融合方法研究
- 学习周报20200216 | 学习计划安排整理
- 菜鸟初识脚本 and 脚本语言
- CCNA(十五)思科ACL、NAT配置命令
- 小红书流量不好数据差,怎么解决?
- Gulp 编译Less和Sass
- JavaScript基础——第五章,jQuery与JavaScript