一、 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、 搜索路由表,寻找能与目的网络号相匹配的表目,如果找到,则将数据报发给该表目指定的下一站路由器或直接连接的网络接口。
TCP/IP学习笔记(二)
作者:肖进 来源于: 发布时间:2007-4-18 17:53:00 | |||||||||||||||||||||||||||||||||||||||||||||||||||
一、 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地址。
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的特殊地址为广播地址。
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规定,除非是地址掩码的授权代理,否则不能发送地址掩码应答。
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端口不可达差错
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学习笔记(三)
作者:肖进 来源于: 发布时间:2007-4-18 17:55:00 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//pingICMP回显请求和回显应答报文格式如下:(以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程序也可以识别返回的信息。
code:IP选项类型,RR选项为7。
◆ 20字节的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) > 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主机不可达的差错报文。
代码说明:0-网络重定向
ICMP路由器通告报文格式:
地址数指的是报文重所包含得地址数。
RIP报文包含在UDP数据报中。
度量是相连通过的接口数,如果是直接相连,则度量是1。如果一个路由器到一个网络有多条路由,则路由器将选择最短的路由。 度量最大值是15,16表示无路由到达该IP地址。 3、 RIP2
选路域是一个选路守护程序的标识符,指出了这个数据报的所有者。一般是进程号。 |
TCP/IP学习笔记(四)
作者:肖进 来源于: 发布时间:2007-4-18 17:56:00 | |||||||||||||||||||||||||||||||||||||||||||||||||
1、UDP首部:
端口号表示发送和接收的进程。
前12个字节就是UDP伪首部。
IP报即使丢失一片数据报也要重传整个数据报。为什么呢?因为IP层没有超时重传的机制,必须由更高层负责超时重传。
可以用Traceroute确定路径MTU。要做的是发送分组,并设置“不分片”标志位。发送的第一个分组的长度正好与出口MTU相等,每次收到ICMP“不能分片”差错时,就减少分组的长度。如果路由器发送的ICMP差错报文是上面格式,包含出口的MTU,那么就用该MTU值来发送,否则就用下一个最小的MTU值来发送。MTU值的个数是有限的,因此可以取得路径的MTU。
二、广播
三、多播
1、多播地址包括为1110地最高4位和多播组号: 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、多播地址到以太网地址的转换:
IGMP类型位1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。
3、实现细节
4、生存时间字段 |
TCP/IP学习笔记(五)
作者:肖进 来源于: 发布时间:2007-4-18 17:57:00 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一、 DNS系统
◆ 标识字段由客户程序设置并由路由器返回结果。客户程序通过它来确定响应与查询是否匹配。
QR-1位,0表示查询,1表示响应报文。
查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为0结束,长度为0的标识符是根标识符。计数字节的值必须为0-63,因为标识符的最大长度仅为63。该字段无需以整32为为边界,即无需填充字节。 6gemini3tuc4noao3edu0 每个问题有一个查询类型,而每个响应(资源记录)也一个类型。最常见的查询类型是A类型(值为1),表示期望获得查询名的IP地址,一个PTR查询(值为12)则请求获得一个IP地址对应的域名。
域名是记录中资源数据对应的名字,它的格式和前面的查询名字段格式一样。 8、 高速缓存:
TFTP报文的头两个字节表示操作码。对于读请求和写请求(WRQ),文件名字段说明客户要读写的位于服务器上的文件,这个文件字段以0字节作为结束。模式字段是一个ASCII码串netascii或octet,同样以0字节结束。Netascii表示数据以成行的ASCII码字符组成,以两个字节回车换行作为结束符。这两个行结束字符在这种格式和本地主机使用的行定界符之间进行转换。Octet则将数据看作8位一组的字节六而不作任何解释。
操作码:1表示请求,2表示应答。 |
TCP/IP学习笔记(六)
作者:肖进 来源于: 发布时间:2007-4-18 18:00:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一、TCP协议 1、TCP 通过以下方式提供可靠性: 另外,TCP对字节流的内容不作任何解释。
TCP首部格式如下:
说明: Kind=1:选项表结束(1字节) Kind=1:无操作(1字节) Kind=2:最大报文段长度(4字节) Kind=3:窗口扩大因子(4字节) Kind=8:时间戳(10字节) 三、TCP的超时和重传 |
TCP/IP学习笔记(七)
作者:肖进 来源于: 发布时间:2007-4-18 18:02:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
一、SNMP:简单网络管理协议
(4) 共同体为一个字符串,这是管理进程和代理进程之间的口令,是明文格式,默认为public。
(7) 在get、get-next和set的请求数据报中,包含变量名称和变量值的表,对于get和get-next操作,变量值部分被忽略。
在udpTable中有2个变量:
5、 实例标识
(3) 字典式排序
在表格中,一个给定变量的所有实例都在下个变量的所有实例之前显示。这意味表格的操作顺序是先行后列的。
(4) 协商选项
(5) 子选项协商 |
TCP/IP学习笔记(八)
作者:肖进 来源于: 发布时间:2007-4-18 18:04:00 |
一、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、信封、首部和正文 =?charset?encoding?encoded-text?= charset表示字符集,有效值时us-ascii和iso-8859-x。 ---------END-------- 作者:肖进 |