TCP/IP学习笔记

来源:互联网 发布:最优化计算方法袁亚湘 编辑:程序博客网 时间:2024/05/04 04:16

 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_protocol:1=ICMP,2=IGMP,3=TCP,17=UDP  错了

应该是
ip_protocol:1=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层就必须对数据报进行过滤,因为网卡可能收到主机不想接收的多播数据帧。

四、IGMPInternet组管理协议

  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--------

 

原创粉丝点击