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为例)
结构定义如下:
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路由器请求报文格式:
ICMP路由器通告报文格式:
类型9
|
代码0
|
检验和
|
地址数
|
地址项长度2
|
生存时间
|
路由器地址1
|
优先级1
|
路由器地址2
|
优先级2
|
...
|
地址数指的是报文重所包含得地址数。
地址项大小指的是每个路由器地址32bit的数目,始终为2。
生存时间指的是通告地址有效的时间(秒数)
IP地址必须是发送路由器的某个地址
优先级是一个有符号的32位整数,指出该IP地址作为默认路由器地址的优先等级,值越大说明优先级越高。优先级的默认值一般设定位0。
六、动态选路协议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封装格式:
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、多播地址包括为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
|
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、分组格式
操作码(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数据报中,格式如下:
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经