以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- TCP/IP学习笔记 (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=56971) |
-- 作者:一分之千 -- 发布时间:12/19/2007 7:13:00 PM -- TCP/IP学习笔记 本文来自网络,相关代码可以到vckbase下载。。 二、 IP地址和子网掩码 2、子网掩码: 三、 数据包的封装和分用 以太网
四、 IP首部: 4位
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; 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);} 五、 端口号:TCP/UDP都使用一个16bit地端口号来表示不同地程序。 六、 链路层:(以以太网为例,地址为48bit)
目的地址
对于ARP和RARP请求/应答数据报大小只有28字节,为了达到46字节的最小长度,必须在后面添加18字节的填充字节。 七、 环回地址: 九、 IP路由选择 C:\WINNT\system32>route PRINT ========================================================================== IP路由的主要功能:
|
-- 作者:一分之千 -- 发布时间:12/19/2007 7:15:00 PM -- TCP/IP学习笔记(二)
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 二、 ARP分组格式 以太网目的地址6 以太网源地址6 帧类型2 硬件类型2 协议类型2 硬件地址长度
先看定义: 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]; //填充字段}; 8位类型 8位代码 16位检验和
类型字段可以有15个不同的值(0、3-5、8-18)。某些报文还使用代码字段来进一步描述不同的条件。检验和字段覆盖整个ICMP报文,与IP首部检验和算法是一样的。 以下情况不会产生ICMP差错报文: 七、 ICMP地址掩码请求与应答: 类型(17或18) 代码(0) 检验和
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位子网掩码}; 八、 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; //传送时间戳}; 类型3 代码(0-15) 检验和
当代码为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个字节,也就是地址信息} -------------------------------------------------------------------------------- |
-- 作者:一分之千 -- 发布时间:12/19/2007 7:17:00 PM -- 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 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; 二、IP记录路由选项 PING程序为我们提供了查看IP记录路由(RR)选项的机会。每个处理PING请求的路由器都把它的IP地址放入选项字段中。当PING程序收到回显应答时,它就可以打印出这份IP地址清单。 code(1) len(1) ptr(1) 9个IP地址 多余1 IP地址为路由器的出口地址,同时原始主机收到带有RR选项的ICMP回响应答时也把它的入口IP地址放入清单。 三、IP时间戳选项: Code(1) Len(1) Ptr(1) OF(4bit) FL(4bit) 时间戳
Code:时间戳的代码为0x44。 如果路由器没有控件而不能增加时间戳选项时,那么将设置溢出字段的值。 四、Traceroute程序: ◆ 20字节的IP首部 超时报文格式: IP搜索路由表的步骤: ◆ 搜索匹配的主机地址 1、 路由表: DestinationGatewayFlags Refcnt use 140.252.13.65 140.252.13.35 UGH 0 0127.0.01127.0.01 UH10default 140.252.13.33 UG 00140.252.13.32 140.252.13.34 U 4 25043 每当初始化一个接口时,系统就为接口自动创建一个直接路由。如果到达主机和网络的路由不是直接相连的,就需要手工加入路由表。 > route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1 METRIC 3 IF 2destination^ ^mask ^gateway metric^ Interface^ 2、 ICMP重定向差错 如果我们发送一份IP报给R1路由器,R1收到数据报并且检查它的路由表,发线R2是发送该数据报的下一站。当它把数据报发送给R2时,R1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的LAN)。这样路由器R1就会发送重定向报文给主机。 类型5 代码(0-3) 检验和 代码说明:0-网络重定向 ◆ 新的路由器必须直接与网络相连接 3、 ICMP路由器发现报文 主机在引导以后要广播或多播传送一份路由器请求报文。一台或多台路由器响应一份路由器通告报文。另外,路由器定期关波或多播传送他们的路由器通告报文,允许每个正在监听的主机相应地更新它们地路由表。 类型10 代码0 检验和 六、动态选路协议RIP 当相邻路由器之间进行通信,以告知对方每个路由器当前所在的网络,这就出现了动态选路。路由器上有一个进程叫路由守护程序,它运行选路协议,并于其相邻的一些路由器进行通信。路由器根据它从相邻路由器接收到的信息,更新内核中的路由表。 1、 运行过程 初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。目的端口号时520。这种请求报文的命令字段为1,但地址系列字段设置为0,度量字段设置为16。这是一种要求另一端完整路由表的特殊请求报文。 接收到请求:如果这个请求时刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则就处理请求中的每一个表项:如果有连接到指定地址的路由,则将度量设置为我们的值,否则将度量设置为16,表示没有到达目的地地路由,然后发送相应。 接收到响应:使相应生效,可能会更新路由表或增加新表项,对已有地表项进行修改,或者删除已有表项。 定期更新选路:每过30秒,所有或部分路由器会将其完整地路由表发送给相邻的路由器,发送路由表一般是广播形式的。 触发更新:每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表,只需发送那些发生变化的表项。 每条路由都有与之相关的定时器:如果运行RIP的系统发现一条路由在3分钟未更新,就将该路由的度量设置为16,并标注为删除。 度量是相连通过的接口数,如果是直接相连,则度量是1。如果一个路由器到一个网络有多条路由,则路由器将选择最短的路由。 RIP2利用RIP报文中必须为0的字段来传递一些额外的信息。其报文格式如下:
|
-- 作者:一分之千 -- 发布时间:12/19/2007 7:18:00 PM -- TCP/IP学习笔记(四)
一、UDP协议 UDP 是一个简单的面向数据报的运输层协议,进程的每个输出操作都产生一个UDP数据报,并组装成一份待发送的IP数据报。UDP不提供可靠性。 2、 UDP检验和 UDP和TCP首部都包含一个12字节的伪首部,包含了IP首部和自身的一些字段,主要是为了计算检验和而设置的。伪首部是不占实际空间的。伪首部包含IP首部的一些字段,目的是让UDP两次检查数据是否已经到达目的地,以及IP层是否正确地传输了数据。 注意:UDP数据报的长度在检验和计算过程中出现两次。如果检验和的计算结果为0,则存入的值为全1(65535),如果传送的检验和是0,则说明发送端没有计算检验和。如果有错误,该报就被丢弃,不产生任何差错报文。 3、 IP分片 任何IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据,并查询该接口的MTU。IP把MTU与数据报的长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发送在中间路由器上。IP数据报分片后,只有到达目的主机后才进行重装。 (1)对于每份IP数据报来说,都有一个标识字段,该值在分片时被复制到每个片中。 (2)标志字段用其中一个bit表示“更多的片”,除最后一片外,其他每个分片都要设置为1。 (3)片偏移字段指的是该片偏移原始数据报开始处的位置。 (4)数据报被分片后,每个片的总长度要改为该片的长度值。 (5)标志字段中有一个bit表示“不分片”,如果该位1,IP将不对数据报进行分片。 4、ICMP不可达差错(需要分片) 当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志位。如果需要判断到达目的端的路途中最小MTU是多少,就可以通过这个差错实现。 可以用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数据报。 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就是一个指向所有子网的广播地址。 三、多播 1、多播地址包括为1110地最高4位和多播组号: 224.0.0.1-该子网内地所有系统组224.0.0.2-该子网内地所有路由器组224.0.1.1-网络时间协议NTP224.0.0.9-RIP2224.0.1.2-SGI公司的dogfight应用 四、IGMP:Internet组管理协议 IGMP 让一个物理网络上的所有系统知道主机当前所在的广播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。IGMP也被当作IP层的一部分,IGMP报文通过IP数据报进行传输,其报文格式如下: 4位版本1 4位类型(1-2) 未用 检验和 IGMP类型位1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。 1、加入一个多播组 进程以某种方式在给定的接口上加入某个多播组,进程也能离开先前加入的多播组。一个进程可以在多个接口上加入同一多播组。主机通过组地址和接口来标识一个多播组。主机必须保留一个表,该表中包含所有至少含有一个进程的多播组及多播组中的进程数量。 2、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报告。
|
-- 作者:一分之千 -- 发布时间:12/19/2007 7:19:00 PM -- TCP/IP学习笔记(五)
1、DNS的授权: 网络信息中心NIC负责分配顶极域和委派其他指定地区域的授权机构。一个独立管理的DNS子树称为一个区域,许多二极域将他们的子域划分为更小的区域。当一个系统加入到一个区域中时,该区域的DNS管理者为该新系统申请一个域名和一个IP地址,并将他们加入到名字服务器的数据库中。 2、DNS报文格式:由12个字节首部和4个长度可变的字段组成。 3、DNS查询报文中的问题部分: 格式如下,通常只有一个问题。 举例:gemini.tuc.noao.edu的存储: 6gemini3tuc4noao3edu0 4、DNS响应报文中的资源记录部分: DNS报文中的最后三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录(RR)的相同格式。RR格式如下: 域名 域名是记录中资源数据对应的名字,它的格式和前面的查询名字段格式一样。 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地址。 为了减少Internet上的DNS通信量,所有的名字服务器均使用高速缓存。 9、 用UDP还是TCP: DNS均支持UDP和TCP,端口号都是53。当查询请求响应的长度超过了512个字节,而仅返回前512个字节,在这种情况下,名字解析器通常使用TCP重发原来的查询请求。既然DNS主要使用UDP,因此好的重传和超时程序就很重要了。 二、TFTP:简单文件传送协议 1、协议 开始工作时,TFTP的客户域服务器交换信息,客户发送一个读请求或写请求给服务器。在一个无盘系统进行系统引导的正常情况下,第一个请求时读请求(RRQ)。
操作码4 块编号 2、 安全性 三、BOOTP:引导程序协议 先讲一下RARP的不足:(1)IP地址是唯一的返回结果(2)由于RARP使用链路层广播,因此RARP请求不会被路由器转发。 1、分组格式 2、端口号: BOOTP服务器端口号是67,BOOTP客户为68。
|
-- 作者:一分之千 -- 发布时间:12/19/2007 7:20:00 PM -- TCP/IP学习笔记(六)
一、TCP协议 1、TCP 通过以下方式提供可靠性: ◆ 应用程序分割为TCP认为最合适发送的数据块。由TCP传递给IP的信息单位叫做报文段。 2、TCP首部: 二、TCP连接的建立和终止 1、建立连接协议 2、连接终止协议 3、连接建立的超时 4、最大报文段长度MSS 5、 TCP的半关闭 6、2MSL连接 7、平静时间 10、同时打开 11、 同时关闭 12、TCP选项 Kind=1:选项表结束(1字节) Kind=1:无操作(1字节) Kind=2:最大报文段长度(4字节) Kind=3:窗口扩大因子(4字节) Kind=8:时间戳(10字节) 对于每个TCP连接,TCP管理4个不同的定时器。 1、往返时间测量 2、拥塞避免算法 3、快速重传和快速恢复算法 4、 ICMP差错 5、重新分组: 四、TCP的坚持定时器 ACK的传输并不可靠,也就是说,TCP不对ACK报文段进行确认,TCP只确认那些包含数据的ACK报文段。为了防止因为ACK报文段丢失而双方进行等待的问题,发送方用一个坚持定时器来周期性地向接收方查询。这些从发送方发出地报文段称为窗口探查。 五、TCP的保活定时器 六、TCP的一些性能 1、 路径MTU发现: 2、 长肥管道 3、窗口扩大选项: 4、时间戳选项:
--------------------------------------------------------------------------------
|
-- 作者:一分之千 -- 发布时间:12/19/2007 7:22:00 PM -- TCP/IP学习笔记(七)
基于TCP/IP的网络管理包括两部分:网络管理站(manager)和被管理的网络单元(被管设备)。这些被管设备的共同点就是都运行TCP/IP协议。管理进程和代理进程之间的通信有两种方式,一种是管理进程向代理进程发出请求,询问参数值,另一种方式是代理进程主动向管理进程报告某些重要的事件。 1、协议:SNMP定义了5种报文: IP首部 UDP首部 版本0 共同体 PDU类型(0-3) 请求标识 差错状态(0-5) 差错索引 名称 值 名称 值 ...
(1) SNMP报文的长度取决域变量的类型和值。 PDU类型 名称 2、 管理信息结构SMI 3、 对象标识符 4、 管理信息库MIB 6、 管理信息库MIB(2) 7、 Trap: 二、Telnet:远程登陆 Telnet是标准的提供远程登陆功能的应用。它能够运行在不同的操作系统的主机之间。Telnet通过客户进程和服务器进程之间的选项协商机制,从而确定通信双方可以提供的功能特性。
|
-- 作者:一分之千 -- 发布时间:12/19/2007 7:24:00 PM -- TCP/IP学习笔记补遗 作者:[URL=mailto:xiaoj@njb.swirebev.com]肖进[/URL] 经过我对网络上IP数据包的跟踪,对我写的《TCP/IP学习笔记》进行补充。通过本文,可以加深对TCP/IP的认识。 ●网络环境:ADSL宽带 3、关于TCP连接的步骤: 4、TCP连接的具体过程,包括P包的唯一标识符ID、TCP报文连接的sequence和ACK数据,这是一个完整的TCP连接建立和结束的过程: 5、程序说明: (1) 该程序收集通过本机网卡的所有协议为TCP的IP包。 6、由于笔者水平有限,上述内容难免有错误和不足之处,欢迎批评指正,先谢了。
-------------------------------------------------------------------------------- 作者:肖进
|
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
3,429.688ms |