TCP/IP学习笔记(一)

一、  TCP/IP 结构:
     TCP/IP 是一个四层协议,结构如下:
     1 、应用层:各种应用程序和协议,如 Http 、 FTP 等。
     2 、传输层: TCP 和 UDP
     TCP 提供一种可靠的运输层服务,但 UDP 是不可靠的,不能保证数据报到正确到达目的地。
     3 、网络层: IP 、 IGMP 、 ICMP
     IP 提供的是一种不可靠的服务,也就是尽可能块地把分组从源节点送到目的节点,但并
不提供任何可靠性保证。 ICMP 是 IP 的附属协议,主要用来交换错误报文, IGMP 是组管理协议,用来将 UDP 数据报多播到多个主机。
     4 、链路层:设备驱动程序和网卡等

二、  IP 地址和子网掩码
     要学习 TCP/IP 协议,首先要提到的是 IP 地址。每台主机的 IP 地址是一个 32 位的二进制数。每个 IP 地址被分割位两部分:前缀和后缀。前缀用来确定计算机从属的物理网络,后缀用来确定网络上单独的计算机。互联网上每一个物理网络都有一个唯一的值作为网络号,该网络号必须全球一致。

    1 、 IP 地址分类:
    IP 地址分位五类: A 类、 B 类、 C 类、 D 类、 E 类,其中 A 类、 B 类和 C 类为基本类, D 类用于多播, E 类属于保留类,现在不用。它们的格式如下(其中 * 代表网络号):
    A 类: 0******* XXXXXXXX XXXXXXXX XXXXXXXX
    B 类: 10****** ******** XXXXXXXX XXXXXXXX
    C 类: 110***** ******** ******** XXXXXXXX
    D 类: 1110**** XXXXXXXX XXXXXXXX XXXXXXXX
    E 类: 1111**** XXXXXXXX XXXXXXXX XXXXXXXX

     这样, A 类地址的范围为: 0.0.0.0-127.255.255.255
    B 类地址的范围为: 128.0.0.0-191.255.255.255
    C 类地址的范围为: 192.0.0.0-223.255.255.255
    D 类地址的范围为: 224.0.0.0-239.255.255.255
    E 类地址的范围为: 240.0.0.0-247.255.255.266
     ◆ 几个特殊 IP 地址
     网络地址: IP 地址中主机地址全为 0 的地址,如 128.211.0.0 。
     广播地址: IP 地址中主机地址全为 1 的地址,如 128.211.255.255 。
     环回地址: 127.0.0.1 ,主要用于测试。

2 、子网掩码:
    现在的主机都要求支持子网掩码,不再把 IP 地址看成为由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。例如一个 B 类地址 (140.252) ,在剩下的 16 位中, 8 位用于子网号, 8 位用于主机号,这样就允许 254 个子网,每个子网就可以有 254 台主机。为了确定多少位用于子网号,多少位用于主机号,这就要用到子网掩码了。其中值为 1 的位留给网络号和子网号,为 0 的位留给主机号。

三、 数据包的封装和分用
    1 、 封装:
     应用程序 → TCP/UDP → IP → 以太网
    2 、 分用:
     以太网 ← IP ← TCP/UDP ← 应用程序
 
以太网
首部
(14)
IP 首部
(20)
TCP 首
部 (20)
应用数据
以太网
尾部 (4)

四、  IP 首部:
    IP 协议是 TCP/IP 协议族中最核心的协议,所有的 TCP 、 UDP 、 ICMP 和 IGMP 数据都以 IP 数据报格式传输。 IP 传输的两个特点:不可靠和无连接。 IP 协议并不保证数据报能成功地到达目的地,也不维护后续数据报的状态信息。必须由上层协议处理。
 
4 位
版本
4 位首
部长度
8 位服务类型
16 位总长度(字节数)
16 位标识
3 位
标志
13 位片偏移
8 位 TTL
8 位协议
16 位首部检验和
32 位源 IP 地址
32 位目的 IP 地址

IP 首部定义:
typedef struct ip_hdr
{
    unsigned char ip_verlen; // 4-bit 版本号
                             // 4-bit 首部长度 (in 32-bit words)
    unsigned char ip_tos; // IP 服务类型
    unsigned short ip_totallength; // 总长度(字节数)
    //第一个32位
    unsigned short ip_id; // 标识
    unsigned short ip_offset; //3位标志,13位分片偏移,
    #define IP_DF 0x4000 //0x4000 don''t fragment flag
    #define IP_MF 0x2000 //0x2000 more fragment flag
    #define IP_OFFMASK 0x1fff //0x1fff mask for fragmenting bits
    //第二个32位
    unsigned char ip_ttl; // 生存时间
    unsigned char ip_protocol; // 上层协议
    unsigned short ip_checksum; // 首部检验和
    //第三个32位
    unsigned int ip_srcaddr; // 源IP地址
    //第四个32位
    unsigned int ip_destaddr; // 目的IP地址
    //第五个32位
   } ip,IPV4_HDR, *PIPV4_HDR, FAR * LPIPV4_HDR;
说明: ip_verlen 前 4 位目前为 4 ,表示为 IPv4 ,后 4 位为 5 ,表示首部长度为 5X4=20 个字节。
      ip_tos 为服务类型 (type of service) , aaabbbbc , aaa 为优先权子字段,现在已被忽略, bbbb 为 TOS 子字段,代表:最小时延、最大吞吐量、最高可靠性和最小费用, c 未使用必须为 0 。如果 bbbb 均为 0 ,则表示为一般服务。目前大多数 TCP/IP 实现都不支持 TOS 特性。
      ip_totallength 为 IP 数据报的总长度,以字节为单位,因此理论最大值为 65535 ,但实际是不可能的。
      ip_id 为唯一标识主机发送的每一个数据报,通常每发一份它的值就会加 1 。
      ip_off 前 3 位标志 abc,a 为保留,必须为 0 , b 为不分片标志 ,c 为更多分片标志。
      ip_off 后 13 位为分片位置,以 8 字节为单位计算。因此,除最后一个分片外,其他每个分片都希望是一个 8 字节倍数的数据,从而使后面的分片从 8 字节边界开始。
      ip_ttl 为 IP 报的生存周期,每经过一个路由器就减 1 ,如果该字段为 0 ,则该数据报被丢弃。
      ip_protocol : 1=ICMP,2=IGMP,3=TCP,17=UDP
      ip_checksum 为数据报的首部检验和。计算方法如下:
USHORT checksum(ip *ip, int size) 
    unsigned long cksum=0;
    while (size > 1) 
   {   
     cksum += * ((USHORT*)ip )++;
     size -= sizeof(USHORT);
   }
   if (size) 
 {
     cksum +=(USHORT) *(UCHAR*)ip;
 }
 cksum = (cksum >> 16) + (cksum & 0xffff);
 cksum += (cksum >>16);
 return (USHORT)(~cksum);
}
ICMP 、 IGMP 、 TCP 和 UDP 协议也采用相同的检验和算法。

五、 端口号: TCP/UDP 都使用一个 16bit 地端口号来表示不同地程序。
    1 、 知名端口:一般介于 1 ~ 255 之间,例如: FTP 的 TCP 端口号是 21 。
    2 、 临时端口,由于客户端对端口号一般并不关心,只需保证唯一就可以了,所以系统一般分配临时端口号。

六、 链路层: ( 以以太网为例,地址为 48bit)
    1 、 链路层的功能:
    ◆ 为 IP 模块发送和接收 IP 数据报
    ◆ 为 ARP 模块发送 ARP 请求和接收 ARP 应答
    ◆ 为 RARP 模块发送 RARP 请求和接收 RARP 应答
   2 、 以太网的封装,以太网 IP 数据报的封装在 RFC 894 中定义的:
 
目的地址
(6)
源地址
(6)
类型
(2)
数据 (46-1500) ,包括 IP 、 ARP 、 RARP
CRC
(4)

     对于 ARP 和 RARP 请求 / 应答数据报大小只有 28 字节,为了达到 46 字节的最小长度,必须在后面添加 18 字节的填充字节。

七、 环回地址:
     一般把 127.0.0.1 分配给这个接口,并命名为 localhost ,一个发给环回接口的 IP 数据报不能在任何网络上出现。
   1 、 传给环回地址的任何数据均作为 IP 输入。
   2 、 传给广播地址和多播地址的数据报复制一份传给环回接口,然后送到以太网上。
   3 、 任何传给该主机 IP 地址的数据均送到环回接口。
八、 最大传输单元 MTU :
     以太网对数据帧的长度都有限制,其最大值为 1500 。链路层的这个特性叫做最大传输单元 MTU 。如果一个 IP 数据报比 MTU 大,那 IP 层就必须进行分片,把数据报分为若干片。如果两台主机间的通信要通过多个网络时,那么每个网络的链路层可能有不同的 MTU 。重要的不是两台主机所在网络的 MTU ,重要的是两台主机路径中的最小 MTU ,它被成为路径 MTU 。

九、  IP 路由选择
     如果目的主机与源主机直接相连或都在一个共享网络上,那么 IP 数据报就直接送到目的主机上。否则主机就会把数据报发送到一个默认的路由器上,由该路由器来转发该数据报。 IP 层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时, IP 首先检查目的 IP 地址是否为本机的 IP 地址之一或者 IP 广播地址。如果是这样,数据报就被送到由 IP 首部协议字段所指定的协议模块进行处理,否则如果 IP 层被设置为路由器的功能,那么就对数据报进行转发,否则丢弃数据报。
我们来看看路由表是什么:

C:/WINNT/system32>route PRINT
==========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x1000003 ...00 08 02 ca 2d 11 ...... Intel 8255x-based Integrated Fast Ethernet

==========================================================================
Active Routes:
Network Destination   Netmask       Gateway     Interface    Metric
目的地              掩码                  网关              主机
0.0.0.0         0.0.0.0            192.1.8.26      192.1.8.84    1
127.0.0.0       255.0.0.0          127.0.0.1       127.0.0.1     1
192.1.8.0       255.255.255.0      192.1.8.84      192.1.8.84    1
192.1.8.84      255.255.255.255    127.0.0.1       127.0.0.1     1
192.1.8.255     255.255.255.255    192.1.8.84      192.1.8.84    1
224.0.0.0       224.0.0.0          192.1.8.84      192.1.8.84    1
255.255.255.255 255.255.255.255    192.1.8.84      192.1.8.84 1
Default Gateway: 192.1.8.26
==================================================================

IP 路由的主要功能:
    1 、 搜索路由表,寻找与目的 IP 地址完全匹配的表目,如果找到,则将数据报发给该表目指定的下一站路由器或直接连接的网络接口。
    2 、 搜索路由表,寻找能与目的网络号相匹配的表目,如果找到,则将数据报发给该表目指定的下一站路由器或直接连接的网络接口。
网友评论:
ip_protocol1=ICMP,2=IGMP,3=TCP,17=UDP   错了

应该是
ip_protocol1=ICMP,2=IGMP,6=TCP,17=UDP
TCP/IP 学习笔记(二)


作者: 肖进

一、  ARP :地址解析协议
     先看:
    C:/Documents and Settings/xiaoj>arp -a
    Interface: 192.1.8.84 on Interface 0x1000003
    Internet Address Physical Address Type
    192.1.8.12 00-0b-cd-03-c4-27 dynamic
    192.1.8.15 00-0d-9d-93-09-f5 dynamic
    192.1.8.18 00-e0-18-c1-86-3d dynamic
    192.1.8.26 00-80-2d-78-4f-81 dynamic
    192.1.8.33 00-0b-cd-0f-a4-c5 dynamic
    192.1.8.38 00-30-6e-36-5f-99 dynamic
    192.1.8.86 00-0b-cd-b8-0c-ae dynamic
    192.1.8.247 00-50-ba-e5-20-af dynamic
    192.1.8.248 00-0d-56-19-ba-56 dynamic
     第一列显示的是主机的 IP 地址,第二列就是主机的网卡 MAC 地址。
    ARP 协议就是提供 IP 地址到对应的硬件地址提供动态映射。这个过程一般是系统自动完成的。 ARP 发送一份 ARP 请求给以太网上的主机 , 该请求中包含目的主机的 IP 地址,其意思是 “ 如果你是这个 IP 的拥有者,请回答你的硬件地址 ” 。当目的主机的 ARP 层收到这份广播报文时,识别出这是发送端在询问它的 IP 地址,于是就会发送一个 ARP 应答,这个 ARP 应答包括 IP 地址及对应的硬件地址。

二、  ARP 分组格式
 
以太网目的地址 6
以太网源地址 6
帧类型 2
硬件类型 2
协议类型 2
硬件地址长度
1
协议地址长度 1
请求应答 1
发送者硬件地址 6
发送者 IP 地址
4
目的硬件地址 6
目的 IP 地址 4

先看定义:
//ARP 首部
struct arphdr(
 u_short ar_hrd; //硬件类型
 u_short ar_pro; //协议类型
 u_char ar_hln; //硬件地址长度
 u_char ar_pln; //协议地址长度
 u_short ar_op; // 请求还是应答
 
 u_char arp_sha[6]; //发送者硬件地址
 u_char arp_spa[4]; //发送者IP地址
 u_char arp_tha[6]; //目的硬件地址
 u_char arp_tpa[4]; //目的IP地址
 u_char arp_zero[18]; //填充字段
};
说明: ◆ 以太网目的地址全为 1 的特殊地址为广播地址。
       ◆ 以太网帧类型 ARP 对应的值为 0x0806 。
       ◆ 硬件类型表示硬件地址的类型,以太网为 1 。
       ◆ 协议类型字段表示要映射的协议地址类型, IP 地址对应的值为 0x0800 。
       ◆ 硬件地址长度:以太网为 6 。
       ◆ 协议地址长度:以太网为 4 ,即 IP 地址长度。
       ◆ 操作字段: ARP 请求= 1 , ARP 应答= 2 , RARP 请求= 3 , RARP 应答= 4 。
       ◆ 当系统收到一份目的端为本机的 ARP 请求报文时,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为 2 ,最后把它发送出去。
三、  ARP 代理:
     如果 ARP 请求是从一个网络的主机发往另一个网络的主机,那么连接这两个网络的路由器可以回答该请求,这个过程称为 ARP 代理,这样可以欺骗发起 ARP 请求的发送端,使它误以为路由器就是目的主机。
四、 免费 ARP
      指主机启动时发送 ARP 查找自己的 IP 地址,主要作用:
     1 、 查找网络上有没有相同的 IP 地址。
     2 、 更新 ARP 缓存。
五、  RARP 协议:逆地址解析协议,这里就不详细介绍了。
     RARP 协议一般用于无盘工作站,根据硬件地址查找 IP 地址。
     RARP 分组格式与 ARP 分组格式相同。
六、  ICMP 协议: Internet 控制报文协议:
     ICMP 经常被认为是 IP 层的一个组成部分,它传递差错报文以及其他需要注意的事项。 ICMP 报文通常被 IP 层或更高层协议( TCP 或 UDP )使用。 ICMP 报文是在 IP 数据报内部被传输的。 ICMP 报文包差错报文和查询报文。报文格式如下:
 
8 位类型
8 位代码
16 位检验和
不同类型和代码有不同的内容

     类型字段可以有 15 个不同的值( 0 、 3 - 5 、 8 - 18 )。某些报文还使用代码字段来进一步描述不同的条件。检验和字段覆盖整个 ICMP 报文,与 IP 首部检验和算法是一样的。

     以下情况不会产生 ICMP 差错报文:
     ◆  ICMP 差错报文
     ◆ 目的地址为广播地址或者多播地址
     ◆ 作为链路层的数据报
     ◆ 不是 IP 分片的第一片
     ◆ 源地址不是单个主机的数据报,也即源地址不能为 0 地址、环回地址、广播地址或多播地址

七、  ICMP 地址掩码请求与应答:
     ICMP 地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码,系统广播它的 ICMP 请求报文。 ICMP 地址掩码请求和应答报文格式如下:
 
类型( 17 或 18 )
代码( 0 )
检验和
标识符
序列号
32 位子网掩码

ICMP 报文中的标识符和序列号由发送端任意选择设定,这些值在应答中将被返回。
struct icmp_mask{
 unsigned char icmp_type; //类型
 unsigned char icmp_code; //代码
 unsigned short icmp_checksum; //检验和
 unsigned short icmp_id; //标识符
 unsigned short icmp_sequence; //序列号
 unsigned long icmp_mask; //32位子网掩码
};
说明: RFC 规定,除非是地址掩码的授权代理,否则不能发送地址掩码应答。
向本机 IP 地址和环回地址发送地址掩码请求结果是一样的。

八、  ICMP 时间戳请求与应答:
     ICMP 时间戳请求允许系统向另一个系统查询当前时间,返回的是自午夜开始记算的毫秒数。调用者必须通过其他方法获取当前时间。
     ICMP 时间戳请求与应答报文格式如下:
 
类型( 13 或 14 )
代码( 0 )
检验和
标识符
序列号
发起时间戳
接收时间戳
传送时间戳

     请求端填写发起时间戳,然后发送报文。应答系统收到报文填写接收时间戳,发送应答时填写发送时间戳。实际上,大多数实现将后两个字段一般设置为一样的。
struct icmp_time{
 unsigned char icmp_type; //类型
 unsigned char icmp_code; //代码
 unsigned short icmp_checksum; //检验和
 unsigned short icmp_id; //标识符
 unsigned short icmp_sequence; //序列号
 unsigned long icmp_request_time; //发起时间戳
 unsigned long icmp_receive_time; //接收时间戳
 unsigned long icmp_send_time; //传送时间戳
};
九、  ICMP 端口不可达差错
     主机如果收到一份 UDP 数据报而目的端口与某个正在使用的进程,那么 UDP 返回一个 ICMP 不可达报文。报文格式如下:
 
类型 3
代码( 0 - 15 )
检验和
保留(必须为 0 )
IP 首部+原始 IP 数据报中数据的前 8 个字节

当代码为 4 时,路径 MTU 发现机制允许路由器把外出接口的 MTU 填在这个 32bit 的低 16bit 中。
struct icmp_unreach{
 unsigned char icmp_type; //类型
 unsigned char icmp_code; //代码
 unsigned short icmp_checksum; //检验和
 unsigned long icmp_zero; //保留
 unsigned char icmp_ip[28]; //IP首部+原始IP数据报中前8个字节,也就是地址信息
}
TCP/IP 学习笔记(三)

作者: 肖进

一、 Ping 程序:

  先看:
      //ping
      C:/WINNT/system32>ping svr00804
      Pinging svr00804.sccnj.swirebev.com [192.1.8.12] with 32 bytes of data:
      Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
      Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
      Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
      Reply from 192.1.8.12: bytes=32 time<10ms TTL=128
      Ping statistics for 192.1.8.12:
      Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
      Approximate round trip times in milli-seconds:
      Minimum = 0ms, Maximum = 0ms, Average = 0ms      
ICMP 回显请求和回显应答报文格式如下:(以 Ping 为例)
 
类型 0 或 8
代码 0
检验和
标识符
序号
结构定义如下:
typedef struct icmp_hdr
{
 unsigned char icmp_type; //类型
 unsigned char icmp_code; //代码
 unsigned short icmp_checksum; //检验和
 unsigned short icmp_id; //标识符
 unsigned short icmp_sequence; //序号
} ICMP_HDR, *PICMP_HDR, FAR *LPICMP_HDR;
   PING 程序把 ICMP 报文中的标识符字段设置为发送进程的 ID 号,这样即使在同一台主机同时运行多个 ping 实例, ping 程序也可以识别返回的信息。

二、 IP 记录路由选项

   PING 程序为我们提供了查看 IP 记录路由( RR )选项的机会。每个处理 PING 请求的路由器都把它的 IP 地址放入选项字段中。当 PING 程序收到回显应答时,它就可以打印出这份 IP 地址清单。
由于 IP 首部中的首部长度字段只有 4bit ,因此 IP 首部最大为 60 字节。由于 IP 首部固定长度为 20 个字节, RR 选项用去 3 个字节,因此存放 IP 地址的控件只有 37 个字节,也就是最多放 9 个 IP 地址。
 
code(1)
len(1)
ptr(1)
9 个 IP 地址
多余 1
code:IP 选项类型, RR 选项为 7 。
len : RR 选项总长度,为 39 。
ptr :指针字段,存放下一个 IP 地址的位置,开始为 4 ,放满为 40 。

   IP 地址为路由器的出口地址,同时原始主机收到带有 RR 选项的 ICMP 回响应答时也把它的入口 IP 地址放入清单。

三、 IP 时间戳选项:
 
Code(1)
Len(1)
Ptr(1)
OF(4bit)
FL(4bit)
时间戳

Code :时间戳的代码为 0x44 。
Len:  时间戳选项总长度,一般为 36 或者 40 。
Ptr :时间戳数据指针。
OF :溢出字段。
FL :标志字段: 0 -只记录时间戳
1 -每台路由七都记录 IP 地址和时间戳,在选项列表中只存放 4 对 IP 地址和时间戳。
3 -发送端对选项列表进行初始化,存放 4 个 IP 地址和 4 个取值为 0 的时间戳。只有当列表中的下一个 IP 地址与当前路由器地址相匹配时,才记录它的时间戳。

如果路由器没有控件而不能增加时间戳选项时,那么将设置溢出字段的值。

四、 Traceroute 程序:
   Traceroute 程序使用 ICMP 报文和 IP 首部的 TTL 字段,发送 ICMP 回显应答时一般把 TTL 设置为 255 。工作原理:开始时发送一个 TTL 字段为 1 的数据报,然后每次将 TTL 字段值加 1 ,以确定路径中的每个路由器。每个路由器在丢弃 UDP 数据报时都返回一个 ICMP 超时报文 2 ,而最终目的主机则产生一个 ICMP 端口不可到达的报文。
报文长度为 40 :
◆  20 字节的 IP 首部
◆  8 字节的 UDP 首部
◆  4 字节的序列号,每发一个就加 1
◆  4 个字节的 TTL 副本
◆  4 个字节的发送数据报的时间戳。

超时报文格式:
 
类型 11
代码 0 或 1
检验和
保留,必须为 0
IP 首部+原始 IP 数据报中数据的前 8 位
五、 IP 选路

IP 搜索路由表的步骤:

◆ 搜索匹配的主机地址
◆ 搜索匹配的网络地址
◆ 搜索默认选项
1 、 路由表:
DestinationGatewayFlags Refcnt use 
140.252.13.65 140.252.13.35 UGH 0 0
127.0.01127.0.01 UH10
default 140.252.13.33 UG 00
140.252.13.32 140.252.13.34 U 4 25043
说明: U -该路由可以使用 (use)
G -该路由似到一个网关。 (gateway)
H -该路由是到一个主机 (host)
Refcnt -是正在使用路由的进程数
Use -通过该路由发送的分组数

  每当初始化一个接口时,系统就为接口自动创建一个直接路由。如果到达主机和网络的路由不是直接相连的,就需要手工加入路由表。
> route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1 METRIC 3 IF 2
destination^ ^mask ^gateway metric^ Interface^ 
  如果表中没有默认项,又没有找到匹配项。如果数据报时本地主机产生的,那么就给发送该数据报的应用程序一个差错,或者是 “ 主机不可达差错 ” 或者是 “ 网络不可达差错 ” 。如果是被转发的数据报,那么就给原始发送端发送一份 ICMP 主机不可达的差错报文。

2 、  ICMP 重定向差错

  如果我们发送一份 IP 报给 R1 路由器, R1 收到数据报并且检查它的路由表,发线 R2 是发送该数据报的下一站。当它把数据报发送给 R2 时, R1 检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的 LAN )。这样路由器 R1 就会发送重定向报文给主机。
ICMP 重定向差错报文格式:
类型 5
代码( 0 - 3 )
检验和
应该使用的路由器 IP 地址
IP 首部+原始 IP 数据报中前 8 个字节
代码说明: 0 -网络重定向
1 -主机重定向
2 -服务类型和网络重定向
3 -服务类型和主机重定向
ICMP 重定向报文的接受者必须查看三个 IP 地址:( 1 )导致重定向的 IP 地址( 2 )发送重定向报文的路由器 IP 地址( 3 )因该采用的路由器 IP 地址。
ICMP 重定向报文只能由路由器生成,不能由主机生成。
主机收到重定向报文时,在修改路由表前必须做一些检查。

◆ 新的路由器必须直接与网络相连接
◆ 重定向报文必须来自当前到目的地所选择的路由器
◆ 重定向报文不能让主机本身作为路由器
◆ 被修改的路由必须是一个间接路由

3 、  ICMP 路由器发现报文

  主机在引导以后要广播或多播传送一份路由器请求报文。一台或多台路由器响应一份路由器通告报文。另外,路由器定期关波或多播传送他们的路由器通告报文,允许每个正在监听的主机相应地更新它们地路由表。
ICMP 路由器请求报文格式:
 
类型 10
代码 0
检验和
保留,必须为 0
ICMP 路由器通告报文格式:
 
类型 9
代码 0
检验和
地址数
地址项长度 2
生存时间
路由器地址 1
优先级 1
路由器地址 2
优先级 2
...
地址数指的是报文重所包含得地址数。
地址项大小指的是每个路由器地址 32bit 的数目,始终为 2 。
生存时间指的是通告地址有效的时间(秒数)
IP 地址必须是发送路由器的某个地址
优先级是一个有符号的 32 位整数,指出该 IP 地址作为默认路由器地址的优先等级,值越大说明优先级越高。优先级的默认值一般设定位 0 。

六、动态选路协议 RIP

  当相邻路由器之间进行通信,以告知对方每个路由器当前所在的网络,这就出现了动态选路。路由器上有一个进程叫路由守护程序,它运行选路协议,并于其相邻的一些路由器进行通信。路由器根据它从相邻路由器接收到的信息,更新内核中的路由表。
报文格式:
 
IP 首部
UDP 首部
RIP 报文
 
命令 1 - 6
版本 1
必须为 0
地址系列 2
必须为 0
32 位 IP 地址
必须为 0
必须为 0
度量( 1 - 16 )
最多 24 个另外的路由,与前 20 个字节格式相同
RIP 报文包含在 UDP 数据报中。
命令 1 表示请求, 2 表示应答, 3 和 4 不用, 5 和 6 为非正式的命令。请求表示要求其他系统发送其全部或部分路由表,应答则包含发送者全部或部分路由表。
版本字段通常为 1 ,根据实际设定。
地址系列为地址类型, IP 地址为 2 。
由于每个报文最多携带 25 个路由,因此为了发送整个路由表,经常需要发送多个报文。  

1 、 运行过程
  • 初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。目的端口号时520。这种请求报文的命令字段为1,但地址系列字段设置为0,度量字段设置为16。这是一种要求另一端完整路由表的特殊请求报文。
  • 接收到请求:如果这个请求时刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则就处理请求中的每一个表项:如果有连接到指定地址的路由,则将度量设置为我们的值,否则将度量设置为16,表示没有到达目的地地路由,然后发送相应。
  • 接收到响应:使相应生效,可能会更新路由表或增加新表项,对已有地表项进行修改,或者删除已有表项。
  • 定期更新选路:每过30秒,所有或部分路由器会将其完整地路由表发送给相邻的路由器,发送路由表一般是广播形式的。
  • 触发更新:每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表,只需发送那些发生变化的表项。
  • 每条路由都有与之相关的定时器:如果运行RIP的系统发现一条路由在3分钟未更新,就将该路由的度量设置为16,并标注为删除。
2 、度量:

  度量是相连通过的接口数,如果是直接相连,则度量是 1 。如果一个路由器到一个网络有多条路由,则路由器将选择最短的路由。
度量最大值是 15 , 16 表示无路由到达该 IP 地址。
3 、  RIP2

RIP2 利用 RIP 报文中必须为 0 的字段来传递一些额外的信息。其报文格式如下:
 
命令 1 - 6
版本 2
路由域
地址类 2
路由标记
32 位 IP 地址
32 位子网掩码
32 位下一站 IP 地址
度量( 1 - 16 )
最多 24 个另外的路由,与前 20 个字节格式相同
选路域是一个选路守护程序的标识符,指出了这个数据报的所有者。一般是进程号。
选路标记是为了指出外部网关协议存在的。
子网掩码是应用在相应的 IP 地址上的。
下一站 IP 地址指明发往目的 IP 地址的报文该发向哪里。该字段为 0 表示发往目的地址的报文应该发给发送 RIP 报文的系统。
RIP2 还支持多播,以减少不收听 RIP2 报文的主机的负载。
TCP/IP 学习笔记(四)

作者: 肖进

一、 UDP 协议

   UDP  是一个简单的面向数据报的运输层协议,进程的每个输出操作都产生一个 UDP 数据报,并组装成一份待发送的 IP 数据报。 UDP 不提供可靠性。
UDP 封装格式:
 
IP 首部( 20 )
UDP 首部( 8 )
UDP 数据
1 、 UDP 首部:
 
16 位源端口号
16 位目的端口号
16 位 UDP 长度
16 位 UDP 检验和
数据(如果有)
端口号表示发送和接收的进程。
   UDP 长度字段指的是 UDP 首部和 UDP 数据的字节长度,该字段的最小值是 8 ,表示没有数据。该长度不包括 IP 首部长度。
   UDP 检验和包括 UDP 首部和 UDP 数据的检验和。由于 UDP 数据报的长度可以为奇数字节数,因此计算时在最后增加填充字节 0 ,这只是为了检验和的计算。

2 、  UDP 检验和

   UDP 和 TCP 首部都包含一个 12 字节的伪首部,包含了 IP 首部和自身的一些字段,主要是为了计算检验和而设置的。伪首部是不占实际空间的。伪首部包含 IP 首部的一些字段,目的是让 UDP 两次检查数据是否已经到达目的地,以及 IP 层是否正确地传输了数据。
UDP 伪首部格式如下:
 
32 位源 IP 地址
32 位目的 IP 地址
0
8 位协议( 17 )
16 位 UDP 长度
16 位源端口
16 位目的端口
16 位 UDP 长度
16 位 UDP 检验和
数据(如果有)
前 12 个字节就是 UDP 伪首部。

注意 : UDP 数据报的长度在检验和计算过程中出现两次。如果检验和的计算结果为 0 ,则存入的值为全 1 ( 65535 ),如果传送的检验和是 0 ,则说明发送端没有计算检验和。如果有错误,该报就被丢弃,不产生任何差错报文。

3 、  IP 分片

  任何 IP 层接收到一份要发送的 IP 数据报时,它要判断向本地哪个接口发送数据,并查询该接口的 MTU 。 IP 把 MTU 与数据报的长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发送在中间路由器上。 IP 数据报分片后,只有到达目的主机后才进行重装。
IP 首部与分片有关的字段:
  • (1)对于每份IP数据报来说,都有一个标识字段,该值在分片时被复制到每个片中。
  • (2)标志字段用其中一个bit表示“更多的片”,除最后一片外,其他每个分片都要设置为1。
  • (3)片偏移字段指的是该片偏移原始数据报开始处的位置。
  • (4)数据报被分片后,每个片的总长度要改为该片的长度值。
  • (5)标志字段中有一个bit表示“不分片”,如果该位1,IP将不对数据报进行分片。
   IP 报即使丢失一片数据报也要重传整个数据报。为什么呢?因为 IP 层没有超时重传的机制,必须由更高层负责超时重传。

4 、 ICMP 不可达差错(需要分片)

  当路由器收到一份需要分片的数据报,而在 IP 首部又设置了不分片( DF )的标志位。如果需要判断到达目的端的路途中最小 MTU 是多少,就可以通过这个差错实现。
报文格式如下:
 
类型 3
代码 4
检验和
保留,必须为 0
下一站的 MTU
IP 首部+原始 IP 数据报中数据前 8 位
  可以用 Traceroute 确定路径 MTU 。要做的是发送分组,并设置 “ 不分片 ” 标志位。发送的第一个分组的长度正好与出口 MTU 相等,每次收到 ICMP“ 不能分片 ” 差错时,就减少分组的长度。如果路由器发送的 ICMP 差错报文是上面格式,包含出口的 MTU ,那么就用该 MTU 值来发送,否则就用下一个最小的 MTU 值来发送。 MTU 值的个数是有限的,因此可以取得路径的 MTU 。

5 、  UDP 服务器的设计:
  • (1)客户IP地址及端口号:Ip首部包括源端和目的端IP地址,UDP首部包括了远端和目的端的端口号。
  • (2)目的IP地址
  • (3)UDP输入队列:通常程序所使用的每个UDP端口都与一个有限大小的输入队列相联系。也就是来自不同客户的差不多同时到达的请求将由UDP自动排队,接收到的UDP数据报以其接收顺序交给应用程序。
  • (4)限制本地IP地址:大多数UDP服务器在创建UDP端口时都使其本地IP地址具有通配符的特点,表明进入的UDP数据报如果其目的地位服务器端口,那么在任何本地接口均可接收到它。如果该端口设置位某接口的端口号,则只有发送给该接口的UDP数据报能收到。可以在同一个端口上启动多个服务器,如以太网有一个,以太网广播有一个。
  • (5)限制远程IP地址:UDP也可以设定只能收到指定IP地址和端口号的UDP数据报。
二、广播
  • 1、受限的广播:受限的广播地址是255.255.255.255,该地址用于主机配置过程中IP数据报的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限广播地址的数据报,这样的数据报只出现在本地网络中。
  • 2、指向网络的广播:指向网络的广播地址是主机号全为1的地址,A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。
  • 3、指向子网的广播:指向子网的广播地址是主机号全为1的地址,作为子网直接广播的IP地址需要知道子网的掩码。如果B类网络128.1的子网掩码是255.255.255.0,则地址128.1.2.255就是对应子网的广播地址。
  • 4、指向所有子网的广播:指向所有子网的广播也需要知道目的网络的子网掩码。这些广播地址的子网号和主机号全为1。如果目的子网掩码是255.255.255.0,那么IP地址128.1.255.255就是一个指向所有子网的广播地址。
三、多播
   IP 多播主要向多个目的地发送数据,还可以无盘工作站启动时确定启动引导服务。多博地址是 D 类地址,格式如下:
 
1
1
1
0
28 位多播组 ID
1 、多播地址包括为 1110 地最高 4 位和多播组号:
  范围为: 224.0.0.0 到 239.255.255.255 。能够接收发往一个特定多播组地址数据地主机集合称为主机组,一个主机组可以跨越多个网络。主机组中成员可随时加入或离开主机组,主机组中对主机地数量没有限制,同时不属于某一主机组地主机可以向该组发送信息。
一些多播组地址为知名地址:
224.0.0.1-该子网内地所有系统组
224.0.0.2-该子网内地所有路由器组
224.0.1.1-网络时间协议NTP
224.0.0.9-RIP2
224.0.1.2-SGI公司的dogfight应用
2 、多播地址到以太网地址的转换:
   IANA 拥有一个以太网地址块,即高位 24 位为 00-00-5e ,这意味这该地址块所拥有的地址范围从 00-00-5e-00-00-00 到 00-00-5e-ff-ff-ff 。 IANA 将其中的一般分配为多播地址。为了指明一个多播地址,任何以太网地址的首字节必须为 01 ,这意味者与 IP 多播相对应的以太网地址范围从 01-00-5e-00-00-00 到 01-00-5e-7f-ff-ff 。
  这种地址分配将使以太网多播地址的 23 位与 IP 多播组号相对应起来,通过将多播组号中的低 23 位映射到以太网地址中的低 23 位事项。
  由于多播组号中的最高 5 位在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的, 32 个不同的多播组号被映射位一个以太网地址。例如,多播地址 224.128.64.32(16 进制为 e0-80-40-20) 和 224.0.64.32(16 进制为 e0-00-40-20) 都映射为同一以太网地址 01-00-5e-00-40-20 。
既然地址映射不是唯一的,那么设备驱动层或 IP 层就必须对数据报进行过滤,因为网卡可能收到主机不想接收的多播数据帧。

四、 IGMP Internet 组管理协议

   IGMP  让一个物理网络上的所有系统知道主机当前所在的广播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。 IGMP 也被当作 IP 层的一部分, IGMP 报文通过 IP 数据报进行传输,其报文格式如下: 
4 位版本 1
4 位类型( 1 - 2 )
未用
检验和
32 位组地址( D 类 IP 地址)
IGMP 类型位 1 说明是由多播路由器发出的查询报文,为 2 说明是主机发出的报告报文。
检验和的计算和 ICMP 协议一样。
组地址为 D 类 IP 地址,在查询报文中组地址设置为 0 ,在报告报文中组地址为要参加的组地址。

1 、加入一个多播组

  进程以某种方式在给定的接口上加入某个多播组,进程也能离开先前加入的多播组。一个进程可以在多个接口上加入同一多播组。主机通过组地址和接口来标识一个多播组。主机必须保留一个表,该表中包含所有至少含有一个进程的多播组及多播组中的进程数量。

2 、 IGMP 报告和查询
  多播路由器通过 IGMP 报文来记录与该路由器相连网络中组成员的变化情况,规则如下:
  • (1)当第一个进程加入组时,主机就发送一个IGMP报告。如果主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
  • (2)进程离开一个组时,主机不发送IGMP报告,即使时组中最后一个进程离开。主机知道在确定的组中已不再由组成员后,在随后的IGMP查询中就不再发送报告报文。
  • (3)多播路由器定时发送IGMP查询是否还有任何主机包含有属于多播组的进程。多播路由器必须向每一个接口发送IGMP查询。因为路由器希望主机对它加入的每个多播组均返回一个报告,因此IGMP查询报文中的组地址被设置为0。
  • (4)主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。
3 、实现细节
  • (1)当一个主机首次发送IGMP报告时,并不保证该报告被可靠地接收,下一个报告将在间隔一段时间后发送。
  • (2)当一个主机收到从一个路由器发出地查询后,并不立即响应,而是经过一定的时间间隔后才发出一些响应。
  • (3)一个主机在等待发送报告的过程中,却收到了发自其他主机的相同报告,则该主机的响应就不用发送了。
  • (4)在没有任何多播路由器的单个物理网络中,仅有的IGMP通信量就是在主机加入一个新的多播组时,支持IP多播的主机发送的报告。
4 、生存时间字段

   IGMP 报告和查询的生存时间( TTL )均设置为 1 ,这将使多播数据报仅限于同一子网内传送。更大的 TTL 值能被多播路由器转发。 224.0.0.0-224.0.0.255 的特殊地址使打算用于多播范围不超过 1 跳的应用,不管 TTL 是多少,多播路由器均不转发目的地址为这些地址中的任何一个地址的数据报。

5 、所有主机组

   224.0.0.1 地址称为所有主机组地址,它涉及在一个物理网络中所有具备多播能力的主机和路由器。当接口初始化后,所有具备多播能力接口上的主机均自动加入这个多播组。这个组的成员无需发送 IGMP 报告。
TCP/IP 学习笔记(五)


作者: 肖进

一、  DNS 系统

1 、 DNS 的授权:

  网络信息中心 NIC 负责分配顶极域和委派其他指定地区域的授权机构。一个独立管理的 DNS 子树称为一个区域,许多二极域将他们的子域划分为更小的区域。当一个系统加入到一个区域中时,该区域的 DNS 管理者为该新系统申请一个域名和一个 IP 地址,并将他们加入到名字服务器的数据库中。
  一个名字服务器负责一个或多个区域,一个区域的管理者必须为该区域提供一个主名字服务器和至少一个辅助名字服务器。
每个主名字服务器都必须知道根名字服务器的 IP 地址,根服务器必须知道所有二极域中每个授权名字服务器的名字和 IP 地址。

2 、 DNS 报文格式:由 12 个字节首部和 4 个长度可变的字段组成。  
 
标识
标志
问题数
资源记录数
授权资源记录数
额外资源记录数
查询问题
问答(资源记录数可变)
授权(资源记录数可变)
额外信息(资源记录数可变)
  ◆ 标识字段由客户程序设置并由路由器返回结果。客户程序通过它来确定响应与查询是否匹配。
  ◆ 标志字段被划分为若干子字段:  
 
QR
opcode
AA
TC
RD
RA
(zero)
rcode
QR - 1 位, 0 表示查询, 1 表示响应报文。
Opcode - 4 位, 0 表示标准查询, 1 表示反向查询, 2 表示服务器状态请求。
AA - 1 位,表示授权回答。
TC - 1 位,表示时可截断的,使用 UDP 时,它表示应当的总长度超过 512 字节时,只返回前 512 个字节。
RD - 1 位,表示期望递归。该位能在一个查询中设置,并在响应中返回。这个标志告诉名字服务器必须处理这个查询。如果该位为 0 ,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为叠代查询。
RA - 1 位,表示可用递归。如果名字服务器支持递归查询,则在响应中将该位置为 1 。
Rcode - 4 位返回码, 0 表示没有差错, 3 表示名字差错。名字差错只有从一个授权服务器上返回,它表示在查询中指定的域名不存在。
随后的 4 个 16 位的字段说明最后 4 个变长字段中包含的条目数。对于查询报文,问题数通常是 1 ,而其他 3 项均为 0 。对于应答报文,问答数至少为 1 ,剩下的 2 项可以是 0 或非 0 。

3 、 DNS 查询报文中的问题部分:

格式如下,通常只有一个问题。  
 
查询名
查询类型
查询类
  查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为 0 结束,长度为 0 的标识符是根标识符。计数字节的值必须为 0 - 63 ,因为标识符的最大长度仅为 63 。该字段无需以整 32 为为边界,即无需填充字节。

举例: gemini.tuc.noao.edu 的存储:
  6gemini3tuc4noao3edu0
  每个问题有一个查询类型,而每个响应(资源记录)也一个类型。最常见的查询类型是 A 类型(值为 1 ),表示期望获得查询名的 IP 地址,一个 PTR 查询(值为 12 )则请求获得一个 IP 地址对应的域名。
  查询类一般是 1 ,指互联网地址。

4 、 DNS 响应报文中的资源记录部分:

   DNS 报文中的最后三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录( RR )的相同格式。 RR 格式如下:  
域名
类型
生存时间
资源数据长度
 
资源数据
域名是记录中资源数据对应的名字,它的格式和前面的查询名字段格式一样。
类型说明 RR 的类型码,它和前面的查询类型值是一样的。通常为 1 ,表示互联网数据。
生存时间是客户程序保留该资源记录的秒数,资源记录通常的生存时间为 2 天。
  资源数据长度说明资源数据的数量,该数据的格式依赖域类型字段的值,对于类型 A 资源数据是 4 字节的 IP 地址。

5 、指针查询:给定 IP 地址,返回与该地址对应的域名。

  例如顶极域名 edu 和它下面的 noao 域,对应的是网络号为 140.252 的 B 类网络。 noao.edu 的下一级必须是该 IP 地址的第一个字节(这里是 140 ),再下一级为该 IP 地址的下一个字节(这里是 252 )。由于 DNS 名字是由 DNS 树的底部逐步向上书写的。这意味者 IP 地址为 140.252.13.33 的主机,它的 DNS 名字是 33.13.252.140.noao.edu 。

6 、主机名检查:

  当 IP 数据报到达一个作为服务器的主机时,无论时 UDP 数据报还是 TCP 连接请求,服务器进程所能获得的是客户的 IP 地址和端口号,某些服务器需要客户的 IP 地址来获得在 DNS 中的指针记录。

7 、 资源记录:

   IP 地址查询为 A 类型,指针查询为类型 PTR 。名字服务器返回的资源记录:回答 RR 、授权 RR 和附加信息 RR 。
·   ( 1 )  A -一个 A 记录定义了一个 IP 地址。
·   ( 2 )  PTR -指针记录用于指针查询, IP 地址被看作是 noao.edu 域下的一个域名。
·   ( 3 )  CNAME -表示规范名字,用来表示一个域名,而有规范名字的域名通常叫做别名。某些 FTP 服务器使用它向其他的系统提供一个易于记忆的别名。
·   ( 4 )  HINFO -表示主机信息,包括说明主机 CPU 和操作系统的两个字符串。
·   ( 5 )  MX -邮件交换记录。功能:如果有邮件要发往 use@foo.com ,就将邮件发送到 relay1.uu.net 。
·   ( 6 )  NS -名字服务器记录。它说明一个域的授权名字服务器,它由域名表示。
8 、 高速缓存:

  为了减少 Internet 上的 DNS 通信量,所有的名字服务器均使用高速缓存。

9 、 用 UDP 还是 TCP :

   DNS 均支持 UDP 和 TCP ,端口号都是 53 。当查询请求响应的长度超过了 512 个字节,而仅返回前 512 个字节,在这种情况下,名字解析器通常使用 TCP 重发原来的查询请求。既然 DNS 主要使用 UDP ,因此好的重传和超时程序就很重要了。

二、 TFTP :简单文件传送协议

1 、协议

  开始工作时, TFTP 的客户域服务器交换信息,客户发送一个读请求或写请求给服务器。在一个无盘系统进行系统引导的正常情况下,第一个请求时读请求( RRQ )。
TFTP 报文格式如下:( 5 种)  
 
IP 首部
UDP 首部
操作码 1 或 2
文件名
0
模式
0
 
操作码 3
块编号
数据
 
操作码 4
块编号
 
操作码 5
差错码
差错信息
0
   TFTP 报文的头两个字节表示操作码。对于读请求和写请求( WRQ ),文件名字段说明客户要读写的位于服务器上的文件,这个文件字段以 0 字节作为结束。模式字段是一个 ASCII 码串 netascii 或 octet ,同样以 0 字节结束。 Netascii 表示数据以成行的 ASCII 码字符组成,以两个字节回车换行作为结束符。这两个行结束字符在这种格式和本地主机使用的行定界符之间进行转换。 Octet 则将数据看作 8 位一组的字节六而不作任何解释。
  每个数据分组包含一个块编号字段,它以后要在确认分组中使用。以读一个文件为例, TFTP 客户需要发送一个读请求说明要读的文件名和文件模式。如果这个能被这个客户读取, TFTP 服务器就返回一个块编号为 1 的数据分组, TFTP 服务器又发送一个块编号为 1 的 ACK 。如此重复知道这个文件传送完。除了最后一个数据分组可含有不足 512 字节的数据,其他每个数据分组均含有 512 个字节的数据。当 TFTP 客户收到一个不足 512 字节的数据分组,就知道它收到了最后一个数据分组。
  在写请求的情况下, TFTP 客户发送 WRQ 指明文件名和模式。如果该文件能被该客户写, TFTP 服务器就返回块编号为 0 的 ACK 包,该客户就将文件的头 512 字节以块编号为 1 发出。服务器则返回块编号为 1 的 ACK 。
  这种协议的数据传输称为停止等待协议。
  最后一种 TFTP 报文类型是差错报文。它用于服务器不能处理读请求或写请求的情况。在文件传输过程中的读或写差错也会导致传送这种报文,接着停止传输。
既 TFTP 使用不可靠的 UDP , TFTP 就必须处理分组丢失和分组重复。

2 、 安全性
  由于 TFTP 设计用于系统引导过程,它不可能提供用户名和口令。

三、 BOOTP :引导程序协议

  先讲一下 RARP 的不足:( 1 ) IP 地址是唯一的返回结果 (2) 由于 RARP 使用链路层广播,因此 RARP 请求不会被路由器转发。
   BOOTP 使用 UDP ,且通常需要与 TFTP 协同工作。

1 、分组格式
 
IP 首部
UDP 首部
BOOTP 请求 / 应答
 
操作码( 1 , 2 )
硬件类型 1
硬件地址长度 6
跳数
事务标识
秒数
未使用
客户 IP 地址
你的 IP 地址
服务器 IP 地址
网关 IP 地址
客户主机硬件地址( 16 字节)
服务器主机名( 64 字节)
引导文件名( 128 字节)
特定厂商信息( 64 字节)
操作码 : 1 表示请求, 2 表示应答。
硬件类型 : 1 表示以太网。
跳数 :客户设置为 1 ,但也能被代理服务器设置。
事务标识 :客户设置并由服务器返回的 32 位整数,客户用它对请求和应答进行匹配。对每个请求,客户应将它设置位一个随机数。
秒数 :客户设置为一个时间制服务求能够看到这个时间值,备用服务器在等待时间超过这个时间值才会响应客户的请求,这意味着主服务器没有启动。
IP 地址 :如果客户已经知道自身的 IP 地址就写入,否则将该字段设置为 0 。对于后面的情况,服务器用该客户的 IP 地址写入 “ 你的 IP 地址 ” 字段。服务器字段由服务器填写,如果使用了代理服务器,则该代理服务器就填写 “ 网关 IP 地址 ” 字段。
客户硬件地址 :客户必须设置,尽管以太网数据帧头部和 UDP 首部都包括这个值。
服务器主机名 :为一个空值中止符,由服务器填写,服务器还将在 “ 引导文件名 ” 字段填写包括用于系统引导的文件名及其所在位置的路径全名。
特定厂商区域 :用于 BOOTP 扩展。
当一个客户使用 BOOTP 进行系统引导时,通常是采用链路层广播, IP 首部中的 IP 地址为 255.255.255.255 ,源地址通常是 0.0.0.0 ,因为此时客户还不知道自身的 IP 地址。

2 、端口号:

BOOTP 服务器端口号是 67 , BOOTP 客户为 68 。
TCP/IP 学习笔记(六)


作者: 肖进

一、 TCP 协议

1 、 TCP  通过以下方式提供可靠性:
·   ◆ 应用程序分割为 TCP 认为最合适发送的数据块。由 TCP 传递给 IP 的信息单位叫做报文段。
·   ◆ 当 TCP 发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能记时收到一个确认,它 就重发这个报文段。
·    ◆ 当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常延迟几分之一秒。
·   ◆  TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化如果收到报文段的检验和有差错, TCP 将丢弃这个报文段和不确认收到这个报文段。
·   ◆ 既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能失序,因此 TCP 报文段的到达也可能失序。如果必要, TCP 将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层。
·   ◆ 既然 IP 数据报会发生重复, TCP 连接端必须丢弃重复的数据。
·   ◆  TCP 还能提供流量控制, TCP 连接的每一方都有固定大小的缓冲空间。 TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
  另外, TCP 对字节流的内容不作任何解释。

2 、 TCP 首部:
   TCP 数据被封装在一个 IP 数据报中,格式如下:  
 
IP 首部 20
TCP 首部 20
TCP 首部
TCP 首部格式如下:  
 
16 位源端口号
16 位目的端口号
32 位序号
32 位确认序号
4 位首部长度
保留 6 位
U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
F
I
N
16 位窗口大小
16 位检验和
16 位紧急指针
选项
数据
说明
( 1 )每个 TCP 段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程。这两个值加上 IP 首部的源端 IP 地址和目的端 IP 地址唯一确定一个 TCP 连接。
( 2 )序号用来标识从 TCP 发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用序号对每个字节进行计数。
( 3 )当建立一个新连接时, SYN 标志变 1 。序号字段包含由这个主机选择的该连接的初始序号 ISN ,该主机要发送数据的第一个字节的序号为这个 ISN 加 1 ,因为 SYN 标志使用了一个序号。
( 4 )既然每个被传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当时上次已成功收到数据字节序号加 1 。只有 ACK 标志为 1 时确认序号字段才有效。
( 5 )发送 ACK 无需任何代价,因为 32 位的确认序号字段和 ACK 标志一样,总是 TCP 首部的一部分。因此一旦一个连接建立起来,这个字段总是被设置, ACK 标志也总是被设置为 1 。
( 6 ) TCP 为应用层提供全双工的服务。因此,连接的每一端必须保持每个方向上的传输数据序号。
( 7 ) TCP 可以表述为一个没有选择确认或否认的华东窗口协议。因此 TCP 首部中的确认序号表示发送方已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。
( 8 )首部长度需要设置,因为任选字段的长度是可变的。 TCP 首部最多 60 个字节。
( 9 ) 6 个标志位中的多个可同时设置为 1
    ◆  URG -紧急指针有效
    ◆  ACK -确认序号有效
    ◆  PSH -接收方应尽快将这个报文段交给应用层
    ◆  RST -重建连接
    ◆  SYN -同步序号用来发起一个连接
    ◆  FIN -发送端完成发送任务
( 10 ) TCP 的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端期望接收的字节数。窗口大小是一个 16 为的字段,因而窗口大小最大为 65535 字节。
( 11 )检验和覆盖整个 TCP 报文端: TCP 首部和 TCP 数据。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。 TCP 检验和的计算和 UDP 首部检验和的计算一样,也使用伪首部。
( 12 )紧急指针是一个正的偏移量,黄蓉序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
( 13 )最常见的可选字段是最长报文大小 MMS ,每个连接方通常都在通信的第一个报文段中指明这个选项。它指明本端所能接收的最大长度的报文段。

二、 TCP 连接的建立和终止

1 、建立连接协议
  ( 1 ) 请求端发送一个 SYN 段指明客户打算连接的服务器的端口,隐疾初始序号 (ISN) ,这个 SYN 报文段为报文段 1 。
  ( 2 ) 服务器端发回包含服务器的初始序号的 SYN 报文段(报文段 2 )作为应答。同时将确认序号设置为客户的 ISN 加 1 以对客户的 SYN 报文段进行确认。一个 SYN 将占用一个序号。
  ( 3 ) 客户必须将确认序号设置为服务器的 ISN 加 1 以对服务器的 SYN 报文段进行确认(报文段 3 )。
   这 3 个报文段完成连接的建立,称为三次握手。发送第一个 SYN 的一端将执行主动打开,接收这个 SYN 并发回下一个 SYN 的另一端执行被动打开。

2 、连接终止协议
  由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
 ( 1 )  TCP 客户端发送一个 FIN ,用来关闭客户到服务器的数据传送(报文段 4 )。
 ( 2 ) 服务器收到这个 FIN ,它发回一个 ACK ,确认序号为收到的序号加 1 (报文段 5 )。和 SYN 一样,一个 FIN 将占用一个序号。
 ( 3 ) 服务器关闭客户端的连接,发送一个 FIN 给客户端(报文段 6 )。
 ( 4 ) 客户段发回确认,并将确认序号设置为收到序号加 1 (报文段 7 )。

3 、连接建立的超时
   如果与服务器无法建立连接,客户端就会三次向服务器发送连接请求。在规定的时间内服务器未应答,则连接失败。

4 、最大报文段长度 MSS
  最大报文段长度表示 TCP 传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的 MSS 。
一般,如果没有分段发生, MSS 还是越大越好。报文段越大允许每个报文段传送的数据越多,相对 IP 和 TCP 首部有更高的网络利用率。当 TCP 发送一个 SYN 时,它能将 MSS 值设置为外出接口的 MTU 长度减去 IP 首部和 TCP 首部长度。对于以太网, MSS 值可达 1460 。
   如果目的地址为非本地的, MSS 值通常默认为 536 ,是否本地主要通过网络号区分。 MSS 让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小 MTU 连接到一个网络上的主机避免分段。

5 、  TCP 的半关闭
    TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是 TCP 的半关闭。
客户端发送 FIN ,另一端发送对这个 FIN 的 ACK 报文段。当收到半关闭的一端在完成它的数据传送后,才发送 FIN 关闭这个方向的连接,客户端再对这个 FIN 确认,这个连接才彻底关闭。

6 、 2MSL 连接
   TIME_WAIT 状态也称为 2MSL 等待状态。每个 TCP 必须选择一个报文段最大生存时间( MSL )。它是任何报文段被丢弃前在网络的最长时间。
  处理原则:当 TCP 执行一个主动关闭,并发回最后一个 ACK ,该连接必须在 TIME_WAIT 状态停留的时间为 2MSL 。这样可以让 TCP 再次发送最后的 ACK 以避免这个 ACK 丢失(另一端超时并重发最后的 FIN )。这种 2MSL 等待的另一个结果是这个 TCP 连接在 2MSL 等待期间,定义这个连接的插口不能被使用。

7 、平静时间
   TCP 在重启的 MSL 秒内不能建立任何连接,这就是平静时间。
8 、 FIN_WAIT_2 状态
  在 FIN_WAIT_2 状态我们已经发出了 FIN ,并且另一端也对它进行了确认。只有另一端的进程完成了这个关闭,我们这端才会从 FIN_WAIT_2 状态进入 TIME_WAIT 状态。这意味着我们这端可能永远保持这个状态,另一端也将处于 CLOSE_WAIT 状态,并一直保持这个状态直到应用层决定进行关闭。
9 、复位报文段
   TCP 首部的 RST 位是用于复位的。一般,无论合适一个报文端发往相关的连接出现错误, TCP 都会发出一个复位报文段。主要情况:
( 1 )到不存在的端口的连接请求;
( 2 )异常终止一个连接。

10 、同时打开
  为了处理同时打开,对于同时打开它仅建立一条连接而不是两条连接。两端几乎在同时发送 SYN ,并进入 SYN_SENT 状态。当每一端收到 SYN 时,状态变为 SYN_RCVD ,同时他们都再发 SYN 并对收到的 SYN 进行确认。当双方都收到 SYN 及相应的 ACK 时,状态都变为 ESTABLISHED 。一个同时打开的连接需要交换 4 个报文段,比正常的三次握手多了一次。

11 、 同时关闭
  当应用层发出关闭命令,两端均从 ESTABLISHED 变为 FIN_WAIT_1 。这将导致双方各发送一个 FIN ,两个 FIN 经过网络传送后分别到达另一端。收到 FIN 后,状态由 FIN_WAIT_1 变为 CLOSING ,并发送最后的 ACK 。当收到最后的 ACK ,状态变为 TIME_WAIT 。同时关闭和正常关闭的段减缓数目相同。

12 、 TCP 选项
  每个选项的开始是 1 字节的 kind 字段,说明选项的类型。
   Kind=1:选项表结束(1字节)
   Kind=1:无操作(1字节)
   Kind=2:最大报文段长度(4字节)
   Kind=3:窗口扩大因子(4字节)
   Kind=8:时间戳(10字节)
三、 TCP 的超时和重传

  对于每个 TCP 连接, TCP 管理 4 个不同的定时器。
  ( 1 ) 重传定时器用于当希望收到另一端的确认。
  ( 2 ) 坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
  ( 3 ) 保活定时器可检测到一个空闲连接的另一端何时崩溃或重启。
  ( 4 )  2MSL 定时器测量一个连接处于 TIME_WAIT 状态的时间。

1 、往返时间测量
   TCP 超时和重传重最重要的就是对一个给定连接的往返时间( RTT )的测量。由于路由器和网络流量均会变化,因此 TCP 应该跟踪这些变化并相应地改变超时时间。首先 TCP 必须测量在发送一个带有特别序号地字节和接收到包含该字节地确认之间的 RTT 。

2 、拥塞避免算法
  该算法假定由于分组收到损坏引起的丢失是非常少的,因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了阻塞。有两种分组丢失的指示:发生超时和收到重复的确认。拥塞避免算法需要对每个连接维持两个变量:一个拥塞窗口 cwnd 和一个慢启动门限 ssthresh 。
   (1)  对一个给定的连接,初始化 cwnd 为 1 个报文段, ssthresh 为 65535 个字节。
   (2) TCP 输出例程的输出不能超过 cwnd 和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。
   (3)  当拥塞发生时, ssthresh 被设置为当前窗口大小的一般 (cwnd 和接收方通告窗口大小的最小值,但最小为 2 个报文段 ) 。此外,如果是超时引起了拥塞,则 cwnd 被设置为 1 个报文段。
   (4)  当新的数据被对方确认时,就增加 cwnd ,但增加的方法依赖与是否正在进行慢启动或拥塞避免。如果 cwnd 小于或等于 ssthresh ,则正在进行慢启动,否则正在进行拥塞避免。

3 、快速重传和快速恢复算法
  如果我们一连串收到 3 个或以上的重复 ACK ,就非常可能是一个报文段丢失了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。
 ( 1 ) 当收到第 3 个重复的 ACK 时,将 ssthresh 设置为当前拥塞窗口 cwnd 的一半,重传丢失的报文段,设置 cwnd 为 ssthresh 加上 3 倍的报文段大小。
 ( 2 ) 每次收到另一个重复的 ACK 时, cwnd 增加 1 个报文段大小并发送一个 1 个分组,如果允许的话。
 ( 3 ) 当下一个确认新数据的 ACK 到达时,设置 cwnd 为 ssthresh ,这个 ACK 应该时在进行重传后的一个往返时间内对步骤 1 重重传的确认。另外,这个 ACK 也应该是对丢失的分组和收到的第一个重复的 ACK 之间的所有中间报文段的确认。

4 、  ICMP 差错
   TCP 如何处理一个给定的连接返回的 ICMP 差错。 TCP 能够遇到的最常见的 ICMP 差错就是源站抑制、主机不可达和网络不可达。
 ( 1 ) 一个接收到的源站抑制引起拥塞窗口 cwnd 被置为 1 个报文段大小来发起慢启动,但是慢启动门限 ssthresh 没有变化,所以窗口将打开直到它开放了所有的通路或者发生了拥塞。
 ( 2 ) 一个接收到的主机不可达或网络不可达实际都被忽略,因为这两个差错都被认为是短暂现象。 TCP 试图发送引起该差错的数据,尽管最终有可能会超时。

5 、重新分组:
  当 TCP 超时并重传时,它并不一定要重传同样的报文段,相反, TCP 允许进行重新分组而发送一个较大的报文段。这是允许的,因为 TCP 是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认。

四、 TCP 的坚持定时器

    ACK 的传输并不可靠,也就是说, TCP 不对 ACK 报文段进行确认, TCP 只确认那些包含数据的 ACK 报文段。为了防止因为 ACK 报文段丢失而双方进行等待的问题,发送方用一个坚持定时器来周期性地向接收方查询。这些从发送方发出地报文段称为窗口探查。

五、 TCP 的保活定时器
   如果一个给定的连接在 2 小时内没有任何动作,那么服务器就向客户发送一个探查报文段。客户主机必须处于以下 4 个状态之一。
    (1)  客户主机依然正常运行,并从服务器可达。客户的 TCP 响应正常,而服务器也知道对方的正常工作的。服务器在 2 小时内将保活定时器复位。
    (2)  客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的 TCP 都没有响应。服务器将不能收到对探查的响应,并在 75 秒后超时。总共发送 10 个探查,间隔 75 秒。
    (3)  客户主机崩溃并已经重新启动。这是服务器将收到一个对其保活探查的响应,但这个响应是一个复位,使得服务器终止这个连接。
   (4)  客户主机正常运行,但是从服务器不可达。

六、 TCP 的一些性能

1 、 路径 MTU 发现:
   TCP 的路径 MTU 发现按如下方式进行:在连接建立时, TCP 使用输出接口或对段声明的 MSS 中的最下 MTU 作为其实的报文段大小。路径 MTU 发现不允许 TCP 超过对端声明的 MSS 。如果对端没有指定一个 MSS ,则默认为 536 。
  一旦选定了起始的报文段大小,在该连接上的所有被 TCP 发送的 IP 数据报都将被设置 DF 位。如果中间路由器需要对一个设置了 DF 标志的数据报进行分片,它就丢弃这个数据报,并产生一个 ICMP 的 “ 不能分片 ” 差错。
  如果收到这个 ICMP 差错, TCP 就减少段大小并进行重传。如果路由器产生的是一个较新的该类 ICMP 差错,则报文段大小被设置位下一跳的 MTU 减去 IP 和 TCP 的首部长度。如果是一个较旧的该类 ICMP 差错,则必须尝试下一个可能的最小 MTU 。

2 、 长肥管道
  一个连接的容量=带宽 X 时延( RTT )。具有大的带宽时延乘积的网络称为长肥网络( LFN )。一个运行在 LFN 的 TCP 连接称为长肥管道。管道可以被水平拉长(一个长的 RTT ) , 或被垂直拉高(较高的带宽),或两个方向拉伸。

3 、窗口扩大选项:
  窗口扩大选项使 TCP 的窗口定义从 16 位增加到 32 位,这并不是通过修改 TCP 首部来实现的, TCP 首部仍然使用 16 位,而是通过定义一个选项实现对 16 位的扩大操作来完成的。

4 、时间戳选项:
  时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的 ACK 计算 RTT 。

TCP/IP 学习笔记(七)


作者: 肖进

一、 SNMP :简单网络管理协议

  基于 TCP/IP 的网络管理包括两部分:网络管理站 (manager) 和被管理的网络单元(被管设备)。这些被管设备的共同点就是都运行 TCP/IP 协议。管理进程和代理进程之间的通信有两种方式,一种是管理进程向代理进程发出请求,询问参数值,另一种方式是代理进程主动向管理进程报告某些重要的事件。
基于 TCP/IP 的网络管理包含 3 个组成部分:
  ( 1 ) 一个管理信息库( MIB )。管理信息库包含所有代理进程的所有可被查询和修改的参数。
  ( 2 ) 关于 MIB 的公用结构和表示符号,叫做管理信息结构 SMI 。例如: SMI 定义计数器是一个非负整数,它的计数范围是 0-4294967295 ,当达到最大值后,又从 0 开始。
  ( 3 ) 管理进程和代理进程之间的通信协议,叫做简单网络管理协议 SNMP 。 SNMP 包括数据交换的格式等,主要采用 UDP 协议。

   1 、协议: SNMP 定义了 5 种报文:
  ( 1 )  get-request 操作:从代理进程处提取一个或多个参数值。
  ( 2 )  get-next-request 操作:从代理进程处提取一个或多个参数的下一个参数值。
  ( 3 )  set-request 操作:设置代理进程的一个或多个参数值。
  ( 4 )  get-response 操作:由代理进程发出的一个或多个参数值。它是 3 种的响应操作。
  ( 5 )  trap 操作:代理进程主动发出的报文,通知管理进程由事情发生。
  前面 3 个操作是由管理进程向代理进程发出的,后两个是代理进程发给管理进程的。
  说明: ◆ 前 4 种操作是简单的请求-应答方式,由于采用 UDP 协议,因此一定要有超时和重传机制。
           ◆ 管理进程采用 UDP 的 161 端口,代理进程使用 UDP 的 162 端口,因此一个系统可以同时为管理进程和代理进程。
           ◆ 下面是 UDP 数据报 5 种操作的 SNMP 报文:
 
IP 首部
UDP 首部
版本 0
共同体
PDU 类型( 0 - 3 )
请求标识
差错状态( 0 - 5 )
差错索引
名称
名称
...
 
PDU 类型 4
企业
代理地址
Trap 类型( 0 - 6 )
特定代码
时间戳
名称
...

   (1) SNMP 报文的长度取决域变量的类型和值。
   (2)  版本字段为 0 ,表示为 SNMP V1 。
   (3) PDU 为协议数据单元,即分组。
 
PDU 类型
名称
0
Get-request
1
Get-next-request
2
Get-response
3
Set-request
4
Trap
    (4)  共同体为一个字符串,这是管理进程和代理进程之间的口令,是明文格式,默认为 public 。
   (5)  对于 get 、 get-next 和 set 操作,请求标识由管理进程设置,然后由代理进程在 get-response 中返回。这个字段的作用是使客户进程(目前是管理进程)能够将服务器进程(即代理进程)发出的响应和客户进程发出的查询进行匹配。这个字段允许管理进程对一个或多个代理进程发出多个请求,并且从返回的应答中分类。
   (6)  差错状态字段是一个整数,由代理进程设置,指明有错误发生。  
 
差错状态
名称
描述
0
NoError
没有错误
1
TooBig
代理进程无法把响应放在一个 SNMP 消息中发送
2
NoSuchName
操作一个不存在的变量
3
BadValue
Set 操作的值或语法有错误
4
ReadOnly
管理进程试图改变一个只读变量
5
genErr
其他错误
    (7)  在 get 、 get-next 和 set 的请求数据报中,包含变量名称和变量值的表,对于 get 和 get-next 操作,变量值部分被忽略。

   2 、 管理信息结构 SMI
   (1) INTEGER :有些整形变量没有范围限制,有些整形变量定义为特殊的数值。
   (2) OCTER STRING : 0 或多个 8 位字节,每个字节值在 0 - 255 之间。
   (3) DisplayString : 0 或多个 8 位字节,每个字节必须是 ASCII 码,所有该类型的变量不能超过 255 个字符。
   (4) OBJECT IDENTIFIER :
   (5) NULL :相关变量还没有值。
   (6) IPAddress : 4 字节的 OCTER STRING ,以网络序表示的 IP 地址,每个字节代表 IP 地址的一个字段。
   (7) PhyAddress : OCTER STRING 类型,代表物理地址。
   (8) Counter :非负整数,范围为 0 - 4294976295 ,达到最大后从 0 开始。
   (9) Gauge :非负整数,范围为 0 - 4294976295 ,或增或减,达到最大值后锁定,直到复位。
   (10) TimeTicks :时间计数器,以 0.01 秒递增,但是不同的变量可以有不同的递增幅度,所以定义该类变量时必须指定递增幅度。
   (11) SEQUENCE :类似于结构,包括 0 个或多个元素。
   (12) SEQUENCE OF :向量,其所有元素具有相同的类型。

   3 、 对象标识符
  对象标识是一种数据类型,它指明一种授权命名的对象。对象标识是一个整数序列,以点分隔。这些整数构成一个树型结构,类似于 DNS 和文件系统。对象标识从顶部开始,顶部没有标识,以 root 表示。所有的 MIB 变量都从 1.3.6.1.2.1 这个标识开始。树上的每个节点还有文字名,例如 1.3.6.1.2.1 就和 iso.org.dod.internet.memt.mib 对应。

   4 、 管理信息库 MIB
  管理信息库就是所有代理进程包含的,并且能够被管理进程进行查询和设置的信息的集合。 UDP 组中包含几个变量和一个表格。变量为: udpInDatagram(1) 、 udpNoPorts(2) 、 udpInErrors(3) 、 udpOutDatagram(4) ,表格为 udpTable(5) 。  
 
名称
数据类型
R/W
描述
udpInDatagram
Counter
R
UDP 数据报输入数
udpNoPorts
Counter
R
没有发送到有效端口的 UDP 数据报个数
udpInErrors
Counter
R
接收到的有错误的 UDP 数据报个数
udpOutDatagram
Counter
R
UDP 数据报输出数
     在 udpTable 中有 2 个变量:  
 
UDP 监听表,索引= <udpLocalAddress>.<udpLocalPort>
名称
数据类型
R/W
描述
udpLocalAddress
IpAddress
R
监听进程的本地 IP 地址, 0.0.0.0 代表接收任何接口的数据报
udpLocalPort
[0..65535]
R
监听进程的本地端口号
    5 、 实例标识
  对 MIB 变量进行操作,必须对 MIB 的每个变量进行标识。只有叶子节点是可操作的 SNMP 没法处理表格的一整行或一整列。
  ( 1 ) 简单变量:
对于简单变量的处理是通过在其对象标识后面添加 ".0" 处理。例如对象标识是         1.3.6.1.2.1.7.1 ,则实例标识是 1.3.6.1.2.1.7.1.0 。
  ( 2 ) 表格
  每个 MIB 中的索引都包含一个以上的索引。对于 UDP 监听表来说, MIB 定义了包含两个变量的联合索引。假定 UDP 监听表中有 3 行具体成员:
   0 . 0 . 0 . 0 67
   0 . 0 . 0 . 0 161
   0 . 0 . 0 . 0 520
  这表明系统将从端口 67 、 161 和 520 接收来自任何接口的 UDP 数据报。这三行数据处理后为:  
 
对象标识
简称
1
1.3.6.1.2.1.7.5.1.1.0.0.0.0.67
1.3.6.1.2.1.7.5.1.2.0.0.0.0.67
UdpLocalAddress.0.0.0.0.67
UdpLocalPort.0.0.0.67
0.0.0.0
67
2
1.3.6.1.2.1.7.5.1.1.0.0.0.0. 161
1.3.6.1.2.1.7.5.1.2.0.0.0.0. 161
UdpLocalAddress.0.0.0.0. 161
UdpLocalPort.0.0.0. 161
0.0.0.0
161
3
1.3.6.1.2.1.7.5.1.1.0.0.0.0. 520
1.3.6.1.2.1.7.5.1.2.0.0.0.0. 520
UdpLocalAddress.0.0.0.0. 520
UdpLocalPort.0.0.0. 520
0.0.0.0
520
     ( 3 ) 字典式排序
   MIB 中按照对象标识进行排序有一个隐含规则, MIB 表格是根据其对象标识按照字典的顺序进行排序的。上面表格排序后如下所示:  
 
对象标识
简称
1
1.3.6.1.2.1.7.5.1.1.0.0.0.0.67
1.3.6.1.2.1.7.5.1.1.0.0.0.0.161
1.3.6.1.2.1.7.5.1.1.0.0.0.0.520
UdpLocalAddress.0.0.0.0.67
UdpLocalAddress.0.0.0.0.161
UdpLocalAddress.0.0.0.0.520
0.0.0.0
0.0.0.0
0.0.0.0
2
1.3.6.1.2.1.7.5.1.2.0.0.0.0. 67
1.3.6.1.2.1.7.5.1.2.0.0.0.0. 161
1.3.6.1.2.1.7.5.1.2.0.0.0.0. 520
UdpLocalPort.0.0.0. 67
UdpLocalPort.0.0.0. 161
UdpLocalPort.0.0.0. 520
67
161
520
  在表格中,一个给定变量的所有实例都在下个变量的所有实例之前显示。这意味表格的操作顺序是先行后列的。
  表格中对行的排序和表格中索引的值有关。

   6 、 管理信息库 MIB ( 2 )
  ( 1 )  system 组:
   system 组包含 7 个变量,没有表格,分别是: sysDescr 、 sysObjectID 、 sysUpTime 、 sysContact 、 sysName 、 sysLocation 、 sysServices 。
  ( 2 )  interface 组
   interface 组只定义了一个简单变量,是系统的接口数量。该组还有一个表格变量,有 22 列。
  ( 3 )  at  组
   at 组是地址转换组,在该组中仅有一个由 3 列组成的表格变量。
  ( 4 )  ip 组
   ip 组定义了很多简单变量和 3 个表格变量(地址表、路由表、地址转换表)。
  ( 5 )  icmp 组
   icmp 组包含 4 个普通计数器变量( ICMP 报文的输出和输入数量以及 ICMP 差错报文的输入和输出数量)和 22 个其他 ICMP 报文数量的计数器, 11 个输出计数器, 11 个输入计数器。
  ( 6 )  tcp 组
   tcp 组包含 14 个简单变量,主要为 TCP 状态。还包含 1 个表格变量,即 TCP 连接表。

   7 、  Trap :
  一共有 6 中 trap PDU 的格式,第 7 中类型是供应商自己定义的特殊类型。

二、 Telnet :远程登陆

   Telnet 是标准的提供远程登陆功能的应用。它能够运行在不同的操作系统的主机之间。 Telnet 通过客户进程和服务器进程之间的选项协商机制,从而确定通信双方可以提供的功能特性。
  ( 1 )  Telnet 客户进程同时和终端客户及 TCP/IP 协议模块进行交互。通常我们所键入的任何信息的传输是通过 TCP 连接,连接的任何返回信息都输出到终端上。
  ( 2 )  Telnet 服务器进程经常要和 " 伪终端设备 " 打交道。
  ( 3 ) 仅仅使用了一条 TCP 连接。
   1 、 协议介绍:
  一种通用字符终端叫网络虚拟终端 NVT ,连接的客户机和服务器,都必须把他们的物理终端和 NVT 进行相互转换。不管客户进程终端是什么类型,操作系统必须把它转换 NVT 格式,同时,不管服务器进程的终端是什么类型,操作系统必须能够将 NVT 格式转换为终端所能够接收的格式。
   (1) NVT ASCII :
   NVT ASCII 代表 7 位的 ASCII 字符集,网间协议族都使用 NVT ASCII , 每个 7 位的字符都以 8 位格式发送,最高位为 0 。行结束符以两个字符 CR (回车)和紧接着的 LF (换行)这样的序列表示以 /r/n 表示。单独的一个 CR 表示为 /r/0 。
  ( 2 ) Telnet 命令:
  命令以字节 0xff 开头,后面的一个字节是命令字节。如果要发送数据 255 ,就必须连续发送两个 255 (设置选项才可以发送)。
 
名称
代码( 10 进制)
描述
EOF
236
文件结束符
SUSP
237
挂起当前进程
ABORT
238
异常终止进程
EOR
239
记录结束符
SE
240
子选项结束
NOP
241
无操作
DM
242
数据标志
BRK
243
中断
IP
244
中断进程
AO
245
异常终止输出
AYT
246
对方是否还在运行
EC
247
转义字符
EL
248
删除行
GA
249
继续进行
SB
250
子选项开始
WILL
251
选项协商
WONT
252
选项协商
DO
253
选项协商
DONT
254
选项协商
IAC
255
数据字节 255
     ( 4 ) 协商选项
   Telnet 连接双方首先进行交互的信息是选项协商数据。选项协商是对称的,也就是说任何一方都可以主动发送选项协商请求给对方。
   ◆  WILL :发送方将激活 enable 选项。
   ◆  DO :发送方想叫接收端激活选项
   ◆  WONT :发送方本身想禁止选项
   ◆  DON''T :发送方想让接收端去禁止选项。
  对于激活选项请求,有权同意或不同意。而对于使选项失效请求,必须同意。
选项协商需要 3 个字节,一个 IAC 字节 (0xff) ,接着一个字节是  WILL 、 DO 、 WONT 、 DON''T 四者之一,最后一个 ID 字节指明激活或禁止选项。  
 
选项标识( 10 进制)
名称
1
回显
3
抑制继续进行
5
状态
6
定时标记
24
终端类型
31
窗口大小
32
终端速率
33
远程流量控制
34
行方式
36
环境变量
     ( 5 ) 子选项协商
  以指定终端类型为例。首先连接的一方发送 3 个字节的字符序列来请求激活该选项: <IAC,WILL,24> ,如果收端同意,那么响应数据就是 <IAC,DO,24> ,然后服务器进程再发送如下字符串 <IAC,SB,24,1,IAC,SE> ,该字符串询问客户进程的终端类型。 SB 是子选项协商的其实命令标记, 24 表示这是终端类型选项的子选项, 1 表示发送你的终端类型,子选项协商的结束命令标记也是 IAC SE 。如果终端类型是 ibmpc ,客户的响应将是 <IAC,SB,24,0 ,  ''I'',''B'',''M'',''P'',''C'',IAC,SE> ,其中 0 表示我的终端类型是。
  ( 6 ) 半双工、一次一字符、一次一行或行方式
   ◆ 半双工: NVT 默认是一个半双工设备,在接收用户输入之前,它必须从服务器进程获得 GA 命令。用户的输入在本地回显,方向是从 NVT 键到 NVT 打印机,所以客户进程到服务器进程只能发送整行的数据。
   ◆ 一次一字符:每一个键入的字符都单独发送到服务器进程,服务器进程回显大多数的字符。
   ◆ 一次一行:准行方式,带远程回显的一次一个字符。
   ◆ 行方式:客户进程和服务器进程协商确定。
  ( 7 ) 同步信号
   Telnet 以 Data Mark(DM) 命令作为同步信号,该同步信号是以 TCP 紧急数据形式发送的。 DM 命令是随数据流传输的同步标记,它告诉收端回到正常的处理进程上来。当一端收到随访已进入紧急方式的通知后,它将开始读数据,一边读一边丢弃数据,直到读到 Telnet 命令紧急数据的最后一个字节就是 DM 字节。
  ( 8 ) 客户的转义符号
   Telnet 客户进程也可以使客户直接和客户进程进行交互,而不是发送到服务器进程。通常客户的转义字符是 Ctrl+] ,这使得客户显示它的提示符,通常是 telnet> 。
TCP/IP 学习笔记(八)


作者: 肖进

一、 FTP :文件传输协议

   1 、  FTP 协议:采用 2 个 TCP 连接来传输一个文件。
  ( 1 ) 控制连接:
  控制连接通常以客户服务器方式建立。控制连接始终等待客户与服务器的通信,该连接将命令从客户端传给服务器,并传回服务器的应答。
  ( 2 ) 数据连接:
  该连接用于数据传输。
   2 、 数据表示:
  ( 1 ) 文件类型:
   ◆  ASCII 文件:默认以 NVT ASCII 形式传输。这要求发送方将本地文本文件转换为 NVT ASCII 码,而接收方将 NVT ASCII 码再还原为本地文本文件。用 NVT ASVCII 码传输的每一行都以一个回车和一个换行结束。
   ◆  EBCDIC 文件:要求两端都是 EBCDIC 系统。
   ◆ 二进制文件类型:数据发送一个连续的比特流,通常用于传输二进制文件。
   ◆ 本地文件类型:再具有不同字节大小的主机之间传输二进制文件。
  ( 2 ) 格式控制,只对 ASCII 和 EBCDIC 文件类型有效。
   ◆ 非打印(默认):文件中不含垂直格式信息。
   ◆ 远程登录格式控制:文件含有向打印机解释的远程登录垂直格式控制。
   ◆  Fortran 回车控制:每行首字符是 Fortran 格式控制符。
  ( 3 ) 结构:
   ◆ 文件结构(默认):文件被认为是一个连续的字节流,不存在内部的文件结构。
   ◆ 记录结构:该结构只用于文本文件。
   ◆ 页结构:每页都带有页号发送,以便收方能随机存储各页。
  ( 4 ) 传输方式
   ◆ 流方式(默认):文件以字节流传输,对于文件结构,发送方在文件尾提示关闭数据连接。对于记录结构,有专用的两字节序列码标记记录结束和文件结束。
   ◆ 块方式:文件以一系列块来传输,每块前面都带有一个或多个首部字节。
   ◆ 压缩方式:
   3 、  FTP 命令:
  命令和应答在客户和服务器的控制连接上以 NVT ASCII 形式传送,这要求在每行结尾都要返回 CR/LF 。
   FTP 命令大家都很熟悉,这就不介绍了。
   4 、  FTP 应答:
  应答都是 ASCII 码形式的 3 位数字,并跟有报文选项。一些典型的应答:
   ◆  125 :数据连接已打开,传输开始
   ◆  200 :就绪
   ◆  214 :帮助报文
   ◆  331 :用户名就绪,要求输入口令
   ◆  425 :不能打开数据连接
   ◆  452 :错写文件
   ◆  500 :未知语法错误
   ◆  501 :无效参数
   ◆  502 :未实现的 MODE 类型
   5 、 连接管理:
  数据连接有 3 大用途:
  ( 1 ) 从客户向服务器发送一个文件
  ( 2 ) 从服务器向客户发送一个文件
  ( 3 ) 从服务器向客户发送文件或目录列表。
  每一个数据连接对传输一个文件或目录序列都要建立一个新的连接。
  ( 1 ) 客户发出命令要求建立数据连接
  ( 2 ) 客户在客户主机上未数据连接选择一个临时端口号
  ( 3 ) 客户使用 PORT 命令从控制连接上把端口号发给服务器。
  ( 4 ) 服务器在控制连接上接收端口号,并向客户端主机上的端口发出主动打开,服务器的数据连接使用端口 20 。

二、 SMTP :简单邮件传送协议

   1 、 SMTP 协议:

  用 TCP 进行的邮件交换是由报文传送代理 MTA(Message Transfer Agent) 完成的。两个 MTA 之间用 NVT ASCII 进行通信,客户向服务器发出命令,服务器用数字应答码和可选的字符串进行响应。
  常见的 SMTP 命令,其中只有 5 个 SMTP 命令用于发送邮件: HELLO 、 MAIL 、 RCTP 、 DATA 和 QUIT 。
  HELO:标识自己
  MAIL:启动用户代理
  RCPT:标识接收方
  DATA:邮件报文内容
  QUIT:退出
  RSET:异常中止当前的邮件事务并使两端复位
  VRFY:使客户能够询问发送方以验证接收方地址,而无需向接收方发送邮件。
  NOOP:强迫服务器响应一个OK应答码,不做任何事。
   2 、信封、首部和正文

  ( 1 ) 信封:由 MTA 用来交付。
   MAIL From:xiaoj@njb.swirebev.com
   RCPT To:xiaoj@hotmail.com
   (2)  首部:由用户代理使用。共有 9 个字段: Received 、 Message_Id 、 From 、 Data 、 Reply-To 、 X-Phone 、 X-Mailer 、 To 、 Subject 。每个首部字段都包含一个名、紧跟一个冒号,接着是字段值。
  ( 3 )正文:是发送给接收用户报文的内容。当用 DATA 命令发送时,先发送首部,紧跟一个空行,然后是正文。用 DATA 发送的各行都必须小于 1000 字节。

  用户接收正文部分,加上一些首部字段,并把结果传给 MTA 。 MTA 加上一些首部字段,加上信封,并把结果发给另以 MTA 。所有这一些都以 NVT ASCII 格式发送。

   3 、扩充的 SMTP :

  要使用 ESMTP ,首先通过 EHLO 命令而不是 HELO 命令启动与服务器的会话。它会显示扩充命令: EXPN 、 SIZE 、 HELP 、 8BITMIME 、 XADR 等。 SIZE 命令是让客户在 MAIL FROM 命令中以字节的多少指定报文的大小,这样服务器可以在客户开始发送报文之前验证它是否接收该长度的报文。 8BITMIME 允许客户把关键字 BODY 加到 MAIL FROM 命令中,指定正文中是否包含 NVT ASCII (默认)或 8 位数据。除非客户收到服务器响应 EHLO 命令发来的 8BITMIME 关键字,否则禁止客户发送任何非 NVT ASCII 字符。

  ( 1 ) 首部变化:非 ASCII 字符

  用途主要是为了允许发送方名、接收方名以及主题中使用其他的字符。
  首部字段中可以包含编码字 (coded word) ,其格式如下:
  =?charset?encoding?encoded-text?=
   charset 表示字符集,有效值时 us-ascii 和 iso-8859-x 。
   encoding 是一个单个字符用来指定编码方法,支持 2 个值:
   ◆  Q :意思是引号中可打印的,目的是用于拉丁字符集。大多数字符作为 NVT ASCII 发送的。任何要发送的字符若第 8 位是 1 则被作为 3 个字符发送,第一个字符是 "=" ,跟着两个 16 进制数,如 0xe9 ,则发送 3 个字符 "=E9" ,空格通常作为下划线或三个字符 "=20" 发送。
   ◆  B :意思是以 64 为基数的编码。文本中的 3 个连续字节( 24 位)被编码为 4 个 6 位值,用于表示所有可能的 6 位值的 64 个 NVT ASCII 字符。当要编码的个数不是 3 的倍数时,等号被用作填充符。

  ( 2 ) 正文变化:通用 Internet 邮件扩充可以把结构置入正文,这就是 MIME ,即通用 Internet 扩充。 MIME 不要求任何扩充,
但加入了一些告知收件者正文结构的新标题,正文仍然可以用 NVT ASCII 发送,而不考虑邮件内容。 MIME 定义 5 个新标题:
   Mime-version :当前版本是 1.0
   Content-Tyoe :内容类型是无格式 ASCII 文本,即 Internet 邮件的默认选择。可以为:   text,multipart,message,application,image,audio,video 。
   Content-Transfer-Encoding :内容传送编码有 5 中: 7bit( 即 NVT ASCII ) , quoted-printable,base64,8bit,binary 。
   Content-ID:
   Content-Description:

三、 NFS :网络文件系统

   1 、远程过程调用 RPC ( Remote Procedue Access ),主要过程如下:

  ( 1 ) 当客户程序调用远程的过程时,它实际上只调用了一个位于本机上的由 RPC 程序生成的函数,这个函数称为客户残桩 (stub) ,客户残桩将过程的参数封装为一个网络报文并将该报文发送给服务器程序。
  ( 2 ) 服务器主机上的一个服务器残桩负责接收这个网络报文,它从网络报文中提取参数,然后调用服务器进程。
  ( 3 ) 当服务器函数返回时,它返回到服务器残桩。服务器残桩提取返回值,把返回值封装成一个网络报文,然后将报文发送给客户残桩。
  ( 4 ) 客户残桩从接收的网络报文中取出返回值,将其返回给客户程序。

   2 、 XDR :外部数据表示

   XDR 用来对 RPC 调用报文和应答报文中的值进行编码,这些值包括 RPC 首部字段( XID 、程序号、接收状态等)、过程参数和过程结果。 XDR 定义了很多数据类型以及它们如何在一个 RPC 报文中传输的具体形式。发送者必须采用 XDR 格式构造一个 RPC 报文,然后接收者将 XDR 格式的报文转换为本机形式。

   3 、端口映射器

  包含远程过程的 RPC 服务器程序使用的是临时窗口,这就要求跟踪 RPC 程序使用了哪一个临时端口。端口映射器本身必须由一个知名端口 111 ,同时由一个程序号( 100000 ),一个版本号( 2 )。服务器程序使用 RPC 调用端口映射器注册本身,客户程序使用使用 RPC 调用端口映射器查询。
  端口映射器提供 4 个服务进程:
  ( 1 )  PMAPPROC_SET : RPC 服务器启动时调用这个过程,注册程序号、版本号和带有一个端口的协议。
  ( 2 )  PMAPPROC_UNSRET : RPC 服务器删除一个已经注册的映射。
  ( 3 )  PMAPPROC_GETPORT : RPC 客户启动时调用,根据给定的程序号、版本号和协议来获得注册的端口号。
  ( 4 )  PMAPPROC_DUMP :返回端口映射器数据库中所有记录。

   4 、 NFS 协议

  ( 1 ) 访问的是一个本地文件还是 NFS 文件对于客户是透明的,当文件被打开时,由内核决定。
  ( 2 )  NFS 客户通过它的 TCP/IP 模块向 NFS 服务器发送 RPC 请求。
  ( 3 )  NFS 服务器一般在端口 2049 接收作为 UDP 数据报的客户请求。
  ( 4 )  NFS 服务器收到客户请求时,它将这个请求传递给本地文件访问例程,后者访问服务器主机上的一个本地文件。
  ( 5 ) 大多数 NFS 服务器是多线程的,可以处理多个请求。
  ( 6 ) 客户也可以运行多个 NFS 客户。

   5 、文件句柄

  文件句柄是一个不透明的对象,用来引用服务器上的一个文件或目录。服务器创建文件句柄,把它传递给客户,然后客户访问文件时使用这个句柄。

   6 、安装协议

  客户必须在访问服务器上一个文件系统中的文件之前,使用安装协议安装哪个文件系统。一般时客户主机引导时完成。

   7 、 NFS 过程:前缀为 NFSPROC_

  ( 1 )  GETATTR :返回文件属性
  ( 2 )  SETATTR :设置文件属性
  ( 3 )  STATUS :返回一个文件系统的状态
  ( 4 )  LOOKUP :查找一个文件
  ( 5 )  READ :读数据
  ( 6 )  WRITE :写数据
  ( 7 )  CREATE :创建文件
  ( 8 )  REMOVE :删除文件
  ( 9 )  RENAME :重命名文件
  ( 10 )  LINK :为一个文件构造一个硬链接
  ( 11 )  SYMLINK :为一个文件构造一个符号链接
  ( 12 )  READLINK :读符号链接
  ( 13 )  MKDIR :建立目录
  ( 14 )  RMDIR :删除目录
  ( 15 )  READDIR :读目录。
---------END--------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值