IP分组首部信息解析
- 格式:docx
- 大小:15.68 KB
- 文档页数:6
1.IP数据报首部的固定部分中的各字段[共4页]第4章网络互连与Internet93图4.20 IP数据报的格式1.IP数据报首部的固定部分中的各字段(1)版本:占4bit,指IP的版本。
通信双方使用的IP的版本必须一致。
目前广泛使用的IP协议版本号是4(即IPv4),以前的3个版本目前已经不使用。
(2)首部长度:占4bit,可表示的最大数值是15个单位(一个单位为4字节),因此IP 首部长度的最大值是60字节。
当IP分组的首部长度不是4字节的整数倍时,必须利用最后一个填充字段加以填充。
因此数据部分永远在4字节的整数倍时开始,这样在实现IP时较为方便。
首部长度限制为60字节的缺点是有时(如源站路由选择)不够用。
但这样做是希望用户尽量减少开销。
最常用的首部长度就是20字节,即不使用任何选项。
(3)服务类型:占8bit,用来获得更好的服务,其意义如图4.20的上面部分的所示。
①前3个比特表示优先级,它可使数据报具有8个优先级中的一个。
②第4个比特是D比特,表示要求有更低的时延。
③第5个比特是T比特,表示要求有更高的吞吐量。
④第6个比特是R比特,表示要求有更高的可靠性(即在数据报传送的过程中,被路由器丢弃的概率要更小些)。
⑤第7个比特是C比特,是新增加的,表示要求选择代价更小的路由。
⑥最后一个比特目前尚未使用。
在相当长的一段时间内并没有什么人使用服务类型TOS(Type Of Service)字段。
直到最近,当需要将实时多媒体信息在Internet上传送时,服务类型字段才重新引起人们的重视。
(4)总长度:总长度指首部和数据之和的长度,单位为字节。
总长度字段为16bit,因此数据报的最大长度为65535字节(即64KB)。
在IP层下面的每一种数据链路层都有其自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元(Maximum Transfer Unit,MTU)。
当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加。
ip分组首部信息解析#include <iostream> //输入输出流#include <fstream> //文件流#include <winsock2.h> //windows socket头文件 #include <ws2tcpip.h> //windows socket头文件 #include <conio.h> //控制台输入输出#pragma comment(lib,"ws2_32") //链接wsock32.lib库 using namespace std;typedef struct IP_SHOUBU{union{unsigned char Version; //版本占4位,目前广泛使用IPv4unsigned char HeadLen;}; //首部长度占4位,单位4字节,常用20字节,最长60字节unsigned char ServiceType; //区分服务占8位,一般情况下不用unsigned short TotalLen; //总长度占16位,pow(2,16)-1=65535字节unsigned short Identifier;union{ //标识占16位,以便数据报片正确重装unsigned short Flags; //标志占3位,用于分片unsigned short FragOffset;}; //片偏移占13位,某分片在原分组相对位置unsigned char TimeToLive; //生存时间占8位,数据报在网络中的寿命unsigned char Protocol; //协议占8位,数据所使用的协议unsigned short HeadChecksum; //首部检验和占16位,检验数据报的首部unsigned int SourceAddr; //源地址占32位unsigned int DestinAddr; //目的地地址占32位 }ip_shoubu;void main(){ofstream file1("e:\\解析结果.txt", ios::out);//把解析结果放入文件中WSADATA WSAData;//与Socket库绑定,建立一个WSADATA结构,wsaData用来存储系统传回的关于WINSOCK的资料int WSAS=WSAStartup(MAKEWORD(2,2), &WSAData);//调用WSAStartup函数,这个函数是连接应用程序与winsock.dll的第一个调用.其中,第一个参数是WINSOCK 版本号,第二个参数是指向WSADATA的指针SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);//创建原始Socket bool flag=TRUE;int set=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(flag));//(Socket描述符,通信协议,后三个指定操作)//获得本地主机名char hostName[128];int gethname=gethostname(hostName,100);hostent *pHostIP;pHostIP=gethostbyname(hostName);//获得本地IP地址sockaddr_in host_addr; //sockaddr_in结构的值必须是以网络字节顺序表示的值,不能直接使用本机字节顺序的值host_addr.sin_family=AF_INET; //协议族 AF_INEThost_addr.sin_port=htons(6000); //honts函数可以将主机数据转换为网络字节顺序的数据host_addr.sin_addr=*(in_addr *)pHostIP->h_addr_list[0];//存储IP地址int bin=bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr));//Socket 绑定本地网卡DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;int WSA=WSAIoctl(sock , _WSAIOW(IOC_VENDOR,1) ,&dwBufferInLen , sizeof(dwBufferInLen) ,&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);//设置为混杂模式,截获流经网卡的所有IP数据报char buffer[65535];//IP数据报的最大长度是65535for(int i=0;;i++){if(recv(sock,buffer,65535,0)>0)//(Socket描述符,接收缓冲区的地址,接收缓冲区的大小,特殊要求){ip_shoubu ip=*(ip_shoubu *)buffer;//把缓冲区中的内容转换为ip_shoubu 数据结构cout<<"<<******************解析第"<<i+1<<"个IP包******************>>"<<endl;cout<<"版本:"<<(ip.Version>>4)<<endl;cout<<"首部长度:"<<((ip.HeadLen &0x0f)*4)<<"字节"<<endl;cout<<"区分服务:优先级"<<(ip.ServiceType>>5)<<", 服务"<<((ip.ServiceType>>1)&0x0f)<<endl;cout<<"总长度:"<<ip.TotalLen<<"字节"<<endl;cout<<"标识:"<<ip.Identifier<<endl;cout<<"标志:"<<((ip.Flags>>15)&0x01)<<",DF="<<((ip.Flags>>14)&0x01)<<",MF="<<((ip.Flags>>13)&0x01)<<endl;cout<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl;cout<<"生存时间:"<<(int)ip.TimeToLive<<endl;cout<<"协议:"<<(int)ip.Protocol<<endl;cout<<"首部检验和:"<<ip.HeadChecksum<<endl;cout<<"源地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl;cout<<"目的地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl;cout<<endl;cout<<endl;file1<<"<<******************解析第"<<i+1<<"个******************>>"<<endl;file1<<"版本:"<<(ip.Version>>4)<<endl;file1<<"首部长度:"<<((ip.HeadLen &0x0f)*4)<<"字节"<<endl;file1<<"区分服务:优先级"<<(ip.ServiceType>>5)<<", 服务"<<((ip.ServiceType>>1)&0x0f)<<endl;file1<<"总长度:"<<ip.TotalLen<<"字节"<<endl;file1<<"标识:"<<ip.Identifier<<endl;file1<<"标志:"<<((ip.Flags>>15)&0x01)<<",DF="<<((ip.Flags>>14)&0x01)<<",MF="<<((ip.Flags>>13)&0x01)<<endl;file1<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl;file1<<"生存时间:"<<(int)ip.TimeToLive<<endl;file1<<"协议:"<<(int)ip.Protocol<<endl;file1<<"首部检验和:"<<ip.HeadChecksum<<endl;file1<<"源地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl;file1<<"目的地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl;file1<<endl;file1<<endl;}cout<<"输入任意字符继续"<<endl;getch();}file1.close();closesocket(sock);WSACleanup();}/*协议字段:0x01,ICMP(Internet Control Message Protocol,Internet控制报文协议);0x02,IGMP(Internet Group Management Protocol,Internet组管理协议);0x03,GGP(Gateway to Gateway Protocol。
解析IPv4和IPv6分组的校验和算法77 发表于 2005-10-26 10:02:00关于IP分组头的校验和(checksum)算法,简单的说就是16位累加的反码运算,但具体是如何实现的,许多资料不得其详。
TCP和UDP数据报头也使用相同法,的校验算但参与运算的数据与IP分组头不一样。
此外,IPv6对校验和的运算与IPv4又有些许不同。
因此有必要对IP分组的校验和算法作全面的解析。
IPv4分组头的结构如下所示:0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+其中的"Header Checksum"域即为头校验和部分。
ip头部结构的详解ip属于网络层协议,其意义在于确定设备的位置,即ip地址。
但又和arp与tcp不同,它是为传输层服务的,通常将tcp和udp架在ip协议之上。
所以他只不过是一个数据的载体,本身并没有自己的询问与回复功能。
他在程序中,只起到确定传输的功能。
以上是ip头的内容,版本一般为4,即ipv4,如果是ipv6,则可能为6,首部长度:首部长度应该为数量*4 通常为20字节,通过抓包工具抓包,基本都是20字节无一例外。
tos服务类型:应该是对应路由器的,当终端接收到数据后,应该就不关心这个的值了。
包括过程字段(3位,设置了数据包的重要性,取值越大数据越重要),延迟字段(1位),流量字段(1位),可靠性字段(1位),成本字段(1位),未使用(1位)16位总长度:即ip总长16位标识:占16位。
IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。
但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。
当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。
相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
ip头部标识与片偏移:ip数据头中的3位标识最低位为mf,为1时说明这个ip 数据包是分片的,并且后续还有数据包,为0时说明这个ip数据包是分片的,但已经是最后一个数据了。
中间位为df,df为1时,说明这个数据包是不分片的,为零时才允许数据包分片。
片偏移:占13位。
片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。
也就是说,相对于用户数据字段的起点,该片从何处开始。
片偏移以8个字节为偏移单位。
也就是说,每个分片的长度一定是8字节(64位)的整数倍。
8位ttl生存时间,表示的是数据从一个设备发向另一个设备,经过一个中转站,则减1,当ttl为0时,即使收端收到,则认定该数据超时,则丢弃该数据。
IP协议的工作原理及实现一、IP协议概述IP协议是网络通信中最重要的协议之一,它是互联网协议族的核心协议,它定义了数据报文的传输规则,是网络上数据通信的基础。
IP协议主要负责完成网络数据包的传输,是TCP/IP协议组中最基础的协议,因为TCP和UDP协议都需要依托于IP协议进行数据传输。
二、IP协议的工作原理IP是Internet Protocol(以太网协议)的简称,它借助于网络的路由机制,将分散在不同地方的数据报文分割成数据包在网络中传输。
IP协议有两个主要的功能:寻址和路由选择。
1. 寻址IP协议定义了一种全球唯一的寻址方式,即IP地址。
IP地址是由32位数字组成的二进制数,这32位数字被分成四段,每段之间由句点(.)隔开,例如192.168.0.1。
IP协议使用IP地址来唯一标识互联网上每一台计算机的网络位置。
2. 路由选择IP协议的另一大功能就是路由选择,即数据包从源节点传输到目标节点需要经过多条通信线路,而IP协议就负责选择最佳的通信线路进行数据包的传输。
IP协议通过路由表来实现路由的选择,路由表中保存了各个网络的地址,以及这些网络之间的传输路由信息,当一个数据包需要传输到目标节点时,IP协议可以根据路由表中的信息选择最佳的路由进行数据包的传输。
三、IP协议的实现IP协议的实现主要有以下几个步骤:1. 数据包的分组在IP协议中,数据被分成多个小数据包进行传输。
每个数据包包含了一个首部和数据。
IP数据包的首部主要包含了源IP地址、目标IP地址、IP版本号、IP协议号等信息。
2. 地址解析IP地址需要转换为对应的物理地址才能在局域网或广域网中进行通信。
为了实现地址解析,ARP(Address Resolution Protocol)协议被引入到协议族中。
当主机想要与其他主机通信时,它会首先将目标IP地址转换成对应的物理地址,并将该物理地址保存在本地的ARP列表中。
3. 路径选择当数据包被传输到下一跳时,IP协议需要选择下一个最佳的路径进行数据包的传输。
IP头部:
45 00 00 30
52 52 40 00
40 11 2c 23
c0 a8 01 01
d8 03 e2 15
“45”,其中“4”是IP协议的版本(Version),说明是IP4。
“5”表示IP头部的长度,说明是20字节,这是标准的IP头部长度,头部报文中没有发送可选部分数据
“00”是服务类型
“0030”是IP数据报文总长,包含首部以及数据,这里表示48字节
“5252”是两个字节的标识字段(Identification):转换为十进制就是21074。
这个是让目的主机来判断新来的分段属于哪个分组
“40”,转换为二进制就是“01000000”,标志字段(flag)占3 bit,其中第一位是IP协议目前没有用上的,为0。
接着的是两个标志DF和MF。
DF为1表示不要分段,MF为0表示后面没有分段。
然后的“00000”和“00000 00000000”是片偏移
“40”是TTL,转换为十进制就是64
“11”表示协议类型,转换为十进制就是17,表示传输层是UDP协议
“2c23”首部校验和
“c0 a8 01 01”,是源IP地址,转换为十进制的IP地址就是:192.168.1.1
“d8 03 e2 15”,是目的IP地址,转换为十进制的IP地址就是:216.3.226.21。
深入理解IP包分片原理IP包分片是指在IP协议中,当一个IP包的大小超过了网络链路所能承载的最大传输单元(MTU)时,需要将这个IP包拆分成多个较小的IP包进行传输。
本文将深入解释IP包分片的原理。
首先,IP包分片是IPv4协议中的一个重要特性,用于解决不同网络链路的MTU不一致的问题。
在IP协议中,每个IP包都有一个20字节的IP头部,其中包含了源IP地址、目的IP地址、协议类型以及其他控制标志等信息。
除了IP头部外,每个IP包还包含了封装的数据,即传输层协议(如TCP、UDP)的数据。
当一个IP包的大小超过了链路的MTU时,IP层需要进行分片处理。
MTU是链路层上能够传输的最大数据单元大小。
如果一个IP包的大小超过了MTU,则需要将其拆分成多个较小的IP包进行传输,这些被拆分的小IP包称为片段(fragment)。
IP包分片的过程如下:1.源主机将大的IP包分解成多个较小的IP片段。
每个片段都是一个完整的IP包,有自己的IP头部。
2. 在源主机的IP层,每个片段都被分配一个唯一的标识符(Identification),以便接收方能够将片段重新组装到原始IP包中。
3. 每个片段都有一个偏移量(Offset)字段,用于指示该片段在原始IP包中的相对位置。
偏移量以8个字节为单位。
4. 源主机还会设置“分片”标志(More Fragments),用于指示是否还有其他片段。
5.对于每个片段,源主机会重新计算IP头部的校验和字段。
6.在链路上传输时,每个片段被独立地处理。
片段可以采用不同的路由路径,因此可能会以不同的顺序到达目的主机。
7. 在目的主机上,IP层使用Identification来确定来自同一个原始IP包的片段。
偏移量字段被用来重新组装片段,将它们按照正确的顺序放置。
8.目的主机接收到所有片段后,会根据偏移量和片段大小重新组装原始IP包。
在重新组装时,目的主机会重新计算IP头部的校验和,并进行校验。
IP 首部校验和的计算zz1IP数据包的头信息格式:+-------------------------------------------------+| 版本 (4位) |+-------------------------------------------------+| 首部长度(4位) |+-------------------------------------------------+| 服务类型(TOS)8位 |+-------------------------------------------------+| 数据包总长度(16位) |+-------------------------------------------------+| 标识ID号(16位) |+-------------------------------------------------+| 标志位(3位) |+-------------------------------------------------+| 片偏移(13位) |+-------------------------------------------------+| 生存时间(TTL)(8位) |+-------------------------------------------------+| 协议类型 (8位) |+-------------------------------------------------+| 首部校验和(16位) |+-------------------------------------------------+| 源IP地址(32位) |+-------------------------------------------------+| 目的IP地址 (32位) |+-------------------------------------------------+* IP选项(若有) (32位) *+-------------------------------------------------+* 数据 *+-------------------------------------------------+这里要说的是首部校验和字段。
IP协议⾸部结构介绍当提交给数据链路层进⾏传送时,⼀个 I P分⽚或⼀个很⼩的⽆需分⽚的 I P数据报称为分组。
数据链路层在分组前⾯加上它⾃⼰的⾸部,并发送得到的帧。
I P只考虑它⾃⼰加上的 I P⾸部,对报⽂本⾝既不检查也不修改 (除⾮进⾏分⽚)。
下图显⽰了I P⾸部的结构。
下图包括i p结构中各成员的名字,N e t / 3通过该结构访问I P⾸部。
4 7 - 6 7 因为在存储器中,⽐特字段的物理顺序依机器和编译器的不同⽽不同,所以由 # i f s保证编译器按照I P标准排列结构成员。
从⽽,当 N e t / 3把⼀个i p结构覆盖到存储器中的⼀个 I P分组上时,结构成员能够访问到分组中正确的⽐特。
I P⾸部中包含I P分组格式、内容、寻址、路由选择以及分⽚的信息。
I P分组的格式由版本i p _ v指定,通常为4;⾸部长度i p _ h l,通常以4字节单元度量;分组长度i p _ l e n以字节为单位度量;传输协议 i p _ p⽣成分组内数据; i p _ s u m是检验和,检测在发送中⾸部的变化。
标准的I P⾸部长度是2 0个字节,所以i p _ h l必须⼤于或等于5。
⼤于5表⽰I P选项紧跟在标准⾸部后。
如i p _ h l的最⼤值为15 (2 4 -1 ),允许最多4 0个字节的选项( 2 0 + 4 0 = 6 0 )。
I P数据报的最⼤长度为65535 (2 1 6 -1 )字节,因为i p _ l e n是⼀个16 bit的字段。
下图是整个构成。
因为i p _ h l是以4字节为单元计算的,所以I P选项必须常常被填充成4字节的倍数。
认识IPv4分组强化⼀下记忆;以免忘记。
图就不放了。
⾸部20B (4B的整数倍) 的固定部分12个域,的确很⿇烦的;IPv6才8个域,⾸部长度8B的整数倍20B分5⾏吧,每⾏4B,即32位。
第⼀⾏,第⼆⾏,第三⾏,第四⾏,第五⾏ip地址就是32位4B 最⼤的数 255.255.255.255所以第四⾏,第五⾏,就放源地址和⽬的地址了。
⼀般吧,⽬标地址放在特殊位置,要么在⾸部的最开始(如MAC帧),要么在⾸部最末,这样才能体现⽬的⽤到的单位:⾸部长4位的单位为⾏即4B 即32位总长度16位,单位为字节即1B 8位⽚偏移13位,单位为 2⾏即8B 64位第⼀⾏:个⼈称其为总体基本信息第⼀个字节8位放两个信息,0100 0101前四位放IP协议的版本,0100 即4 IPv4后四位放⾸部长度 0101 即 5 可以理解5⾏(每⾏4B,也即单位是4B)吧,5*4B=20B最⼤的是1111即15⾏ 15*4B=60B 因此⾸部最⼤为60B⼀般情况看到 45H 时,就要条件反射的考虑有没有可能此处时IP分组的开始第⼆字节 8位放服务类型 0000 0000在OSFP路由协议中,对不同的链路可根据IP分组的不同服务类型(TOS)设置成不同的代价第三个和第四个字节总长度 0000 0000 0000 0000 单位是字节B第⼆⾏:个⼈称其为分⽚信息第⼀个字节和第⼆个字节:标识 0000 0000 0000 0000第三个字节:中的前三位 0000 DF MF 当DF=0 允许分⽚MF=1表⽰还有分⽚MF=0表⽰最后⼀个分⽚第三个字节后五位和第四个字节 0 0000 0000 0000 ⽚偏移8字节为单位因此分⽚的长度是8B的整数被,即两⾏两⾏的分,⾏数是偶数因此⼀般看到 xx xx 4x xx H 其中的4是 0100 DF=1不允许分⽚或者 xx xx 2x xx H 其中2是 0010 DF=0 MF=1 表⽰还有分⽚或者 xx xx 0x xx H 其中的0是 0000 DF=0 MF=0 最后⼀个分⽚看到上述数字要敏感第三⾏:个⼈称之为安全控制信息第⼀个字节⽣存时间:0000 0000 可通过路由器的最⼤值;每通过⼀个减1第⼆个字节:协议 TCP 为 06H 即 0000 0110 即 6UDP为11H 即0001 0001 即17 IGMP为02H 即0000 0010 即 2第三个字节和第四个字节:⾸部检验和综上:看到45 要提⾼敏感,考虑是不是IP分组06 11 02 等。
计算机学科专业基础综合计算机网络-18(总分:100.00,做题时间:90分钟)一、单项选择题(总题数:23,分数:28.00)1.网络层的主要功能是______。
(分数:1.00)A.路由选择√B.差错控制C.数据加密D.组帧解析:[解析] 网络层的主要功能是路由选择。
2.路由器转发分组是根据报文的______。
(分数:1.00)A.LLC地址B.端口号C.MAC地址D.IP地址√解析:[解析] 因为路由器工作在网络层,所以路由器转发分组是根据报文的IP地址。
3.当源IP地址和目的IP地址属于同一子网的分组到达时,路由器______。
(分数:1.00)A.将该分组向其他端口转发B.将该分组向其他子网转发C.将该分组向目的子网转发D.不向任何子网转发√解析:[解析] 当一个分组到达路由器时,路由器根据目的IP地址和子网掩码,获得目的子网号,再查找路由表,将该分组从相应的端口向相应的子网转发。
由于目的IP地址与源IP地址属于同一子网,所以路由器不会将该分组向任何子网或端口转发。
4.在因特网中,一个路由器的路由表通常包含______。
(分数:1.00)A.目的网络和到达该目的网络的完整路径B.所有的目的主机和到达该目的主机的完整路径C.目的网络和到达该目的网络路径上的下一个路由器的IP地址√D.目的网络和到达该目的网络路径上的下一个路由器的MAC地址解析:[解析] 路由器是网络互联的关键设备,其任务是转发分组。
每个路由器都维护一个路由表以决定分组的传输路径。
当目的主机与源主机不在同一个网络中时,应将数据报发送给源主机所在网络上的某个路由器,由该路由器按照转发表(由路由表构造的)指出的路由将数据报转发给下一个路由器。
这种交付方式称为间接交付。
为了提高路由器的查询效率和减少路由表的内容,路由表只保留到达目的主机的下一个路由器的地址,而不是保留通向目的主机的传输路径上的所有路由信息。
因此,因特网的路由表的表项通常包含目的网络和到达该目的网络的下一个路由器的IP地址。
网络基础IP地址的分类与分配IP地址是指互联网协议地址,它是计算机网络中用于唯一标识和定位主机或网络设备的一串数字。
在网络基础中,IP地址的分类与分配起着至关重要的作用。
本文将对IP地址的分类进行介绍,并探讨IP地址的分配方式。
一、IP地址的分类根据IP地址的规模和层次性,可以将其分为A类、B类、C类、D类和E类五类。
1. A类地址:从1.0.0.0到126.0.0.0的IP地址范围属于A类地址。
A类地址的特点是第一位固定为0,可以用来表示127个网络。
2. B类地址:从128.0.0.0到191.255.0.0的IP地址范围属于B类地址。
B类地址的特点是前两位固定为10,可以用来表示16384个网络。
3. C类地址:从192.0.0.0到223.255.255.0的IP地址范围属于C类地址。
C类地址的特点是前三位固定为110,可以用来表示2097152个网络。
4. D类地址:从224.0.0.0到239.255.255.255的IP地址范围属于D类地址。
D类地址用于多播,多个主机可以共享同一个D类地址。
5. E类地址:从240.0.0.0到255.255.255.255的IP地址范围属于E类地址。
E类地址保留用于特殊用途,目前尚未被广泛使用。
二、IP地址的分配IP地址的分配由互联网名称与数字分配机构(IANA)、互联网统一编号分配机构(ICANN)以及其他的区域互联网注册机构(RIR)共同管理。
下面将介绍IP地址的分配方式。
1. IANA管理的地址空间分配:IANA负责管理全球IP地址的分配,它将IP地址空间分配给各个RIR,RIR再将IP地址分配给本地的互联网服务提供商(ISP)。
2. RIR管理的地址空间分配:RIR根据地理区域对IP地址进行管理与分配。
目前全球有五个RIR,分别是亚太网络信息中心(APNIC)、非洲网络信息中心(AFRINIC)、欧洲网络信息中心(RIPE NCC)、拉丁美洲与加勒比海网络信息中心(LACNIC)以及北美互联网编号分配中心(ARIN)。
IP包头部各字段说明描述: IPv4首部一般是20字节长。
在以太网帧中,IPv4包首部紧跟着以太网帧首部,同时以太网帧首部中的协议类型值设置为080016。
IPv4提供不同,大部分是很少用的选项,使得IPv4包首部最长可扩展到60字节(总是4IPv4首部一般是20字节长。
在以太网帧中,IPv4包首部紧跟着以太网帧首部,同时以太网帧首部中的协议类型值设置为080016。
IPv4提供不同,大部分是很少用的选项,使得IPv4包首部最长可扩展到60字节(总是4个字节4个字节的扩展)0 4 8 12 16 19 24 31IP包头字段说明版本:4位,指定IP协议的版本号。
例如:Version=4,表示IP协议的版本号为4。
该部分占4个BIT 位。
包头长度(IHL):4位,IP协议包头的长度,指明IPv4协议包头长度的字节数包含多少个32位。
由于IPv4的包头可能包含可变数量的可选项,所以这个字段可以用来确定IPv4数据报中数据部分的偏移位置。
IPv4包头的最小长度是20个字节,因此IHL这个字段的最小值用十进制表示就是5 (5x4 = 20字节)。
就是说,它表示的是包头的总字节数是4字节的倍数。
例如:Header Length=20 Bytes,表示IP包头的总长度为20个字节。
该部分占4个BIT位,单位为4个字节,因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。
服务类型:定义IP协议包的处理方法,它包含如下子字段过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)延迟字段:1位,取值:0(正常)、1(期特低的延迟)流量字段:1位,取值:0(正常)、1(期特高的流量)可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)成本字段:1位,取值:0(正常)、1(期特最小成本)未使用:1位长度:IP包的总长认证:标志:是一个3位的控制字段,包含:保留位:1位不分段位:1位,取值:0(允许数据报分段)、1(数据报不能分段)更多段位:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)段偏移量:当数据分组时,它和更多段位(MF, More fragments)进行连接,帮助目的主机将分段的包组合。
计算机学科专业基础综合计算机网络-网络层(五)(总分:83.50,做题时间:90分钟)一、{{B}}单项选择题{{/B}}(总题数:26,分数:26.00)1.一个主机有两个IP地址,一个地址是192.168.11.25,另一个地址可能是______。
∙ A.192.168.11.0∙ B.192.168.11.26∙ C.192.168.13.25∙ D.192.168.11.24(分数:1.00)A.B.C. √D.解析:如果一个主机有两个或两个以上的IP地址,说明这个主机属于两个或两个以上的逻辑网络。
值得注意的是,在同一时刻一个合法的IP地址只能分配给一个主机,否则就会引起IP地址的冲突。
IP地址192.168.11.25属于C类IP地址,所以A、B、D同属于一个逻辑网络,只有C的网络号不同,表示在不同的逻辑网络。
2.CIDR技术的作用是______。
∙ A.把小的网络汇聚成大的超网∙ B.把大的网络划分成小的子网∙ C.解决地址资源不足的问题∙ D.由多个主机共享同一个网络地址(分数:1.00)A. √B.C.D.解析:CIDR是一种将网络归并的技术,CIDR技术的作用是把小的网络汇聚成大的超网。
3.CIDR地址块192.168.10.0/20所包含的IP地址范围是192.168.0.0~192.168.15.255。
与地址192.16.0.19/28同属于一个子网的主机地址是______。
∙ A.192.16.0.17∙ B.192.16.0.31∙ C.192.16.0.15∙ D.192.16.0.14(分数:1.00)A. √B.C.D.解析:CIDR地址由网络前缀和主机号两部分组成,CIDR将网络前缀都相同的连续的IP地址组成“CIDR地址块”。
网络前缀的长度为20位,主机号为12位,因此192.168.0.0/20地址块中的地址数为212个。
其中,当主机号为全0时,取最小地址,即为192.168.0.0。
在应用程序中,必须关心IP数据的长度。
如果它超过网络的MTU,那么就要对IP数据报进行分片。
如果需要,源目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做。
在此文中,将讨论IP分片的一些原理及其在分片中所需要的几个元素(此文只讨论MTU 最大传输单位和MSS最大数据分段),本文对以太网的例子作了初略的分解。
关键字:IP分片,MTU,MSS引言分片是分组交换的思想体现,也是IP 协议解决的两个主要问题之一。
在IP 协议中的分片算法主要解决异种网最大传输单元(MTU) 的不同.但是分组在传输过程中不断地分片和重组会带来很大的工作量还会增加一些不安全的因素。
正文:一、什么是IP分片IP分片是网络上传输IP报文的一种技术手段。
IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。
这一过程称为分片(fragmentation)。
二、为什么要进行IP分片通常要传输的IP报文的大小超过最大传输单位MTU(Maximum Transmissi on Unit)时就会产生IP分片情况。
IP分片通常发生在网络环境中。
比如说,在以太网(Ethernet)环境中可传输最大IP报文大小(MTU)为1500字节。
而传输的报文大小要比1500字节大,这个时候就需要利用到分片技术,经分片后才能传输此报文。
另外,使用UDP很容易导致IP分片,而很难强迫TCP发送一个需要进行分片的报文。
三、IP分片原理及分析分片和重新组装的过程对传输层是透明的,其原因是当IP数据报进行分片之后,只有当它到达下一站时,才可进行重新组装,且它(组装)是由目的端的IP层来完成的。
分片之后的数据报根据需要也可以再次进行分片。
IP分片和完整IP报文差不多拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。
在IP头里面,16位识别号唯一记录了一个IP包的ID,具有同一个ID的IP分片将会重新组装;而13位片偏移则记录了某IP片相对整个包的位置;而这两个表中间的3位标志则标志着该分片后面是否还有新的分片。
TCP/IP协议簇分层详解一、TCP/IP 和ISO/OSIISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。
TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和广域网中,目前已成为事实上的国际标准。
TCP/IP协议簇是一组不同层次上的多个协议的组合,通常被认为是一个四层协议系统,与OSI的七层模型相对应。
二、TCP/IP分层模型(1). 链路层也称作数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。
它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。
(2). 网络层也称作互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。
在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。
IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把分组从源结点送到目的结点,但是并不提供任何可靠性保证。
同时被TCP和UDP使用。
TCP和UDP 的每组数据都通过端系统和每个中间路由器中的IP层在互联网中进行传输。
ICMP是IP协议的附属协议。
IP层用它来与其他主机或路由器交换错误报文和其他重要信息。
IGMP是Internet组管理协议。
#include "winsock2.h"#include "ws2tcpip.h"#include "iostream.h"#include "stdio.h"#pragma comment(lib, "ws2_32.lib")#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535/* 定义IP首部数据结构*/typedef struct _IP_HEADER{union{BYTE Version; //版本(前4位)BYTE HdrLen; //报头标长(后四位),IP头长度};BYTE ServiceType; //服务类型WORD TotalLen; //总长度WORD ID; //标识union{WORD Flags;WORD FragOff;};BYTE TimeToLive; //生存时间BYTE Protocol; //协议WORD HdrChksum; //首部校验和DWORD SrcAddr; //源IP地址DWORD DstAddr; //目的IP地址BYTE Options; //选项字段}IP_HEADER;//逐位解析IP头中的信息,获取版本号void getVersion(BYTE b,BYTE &version){version = b>>4; //向右移四位}void getIHL(BYTE b,BYTE &result){result = (b & 0x0f) *4;}//解析服务类型char * parseServiceType_getProcedence(BYTE b){switch(b>>5){ //右移五位case 7:return "Network Control";case 6:return "Internet work Control";case 5:return "CRITIC/ECP";case 4:return "Flash Override";case 3:return "Falsh";case 2:return "Immediate";case 1:return "Priority";case 0:return "Routine";default:return "Unknown";}}char * parseServiceType_getTOS(BYTE b){b=(b>>1)&0x0f;switch(b){case 0:return "Normal service";case 1:return "Minimize monetary cost";case 2:return "Maximize reliability";case 4:return "Maximize throughput";case 8:return "Minimize delay";case 15:return "Maximize security";default:return "Unknown";}}/* 获取禁止分片标志和分片标志*/void getFlags(WORD w,BYTE &DF, BYTE &MF){DF=(w>>14)&0x01;MF=(w>>13)&0x01;}/* 获取分片偏移量*/void getFragoff(WORD w,WORD &fragoff){fragoff=w&0x1fff; //与1fff相与将0、DF、WF屏蔽掉}//获取协议char * getProtocol(BYTE Protocol){switch (Protocol){case 1:return "ICMP";case 2:return "IGMP";case 3:return "GGP";case 4:return "IP in IP ";case 6:return "TCP";case 8:return "EGP";case 17:return "UDP";case 41:return "IPv6";case 46:return "OSPF";default:return "UNKNOWN";}}/* 解析IP数据包*/void ipparse(FILE * file,char *buffer){IP_HEADER ip = *(IP_HEADER *)buffer;fseek(file,0,SEEK_END);BYTE version;getVersion(ip.Version,version);fprintf(file,"版本=IPV%d\r\n",version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"头长度=%d(BYTE)\r\n",headerLen);fprintf(file,"服务类型=%s,%s\r\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"数据报长度=%d(BYTE)\r\n",ip.TotalLen);fprintf(file,"数据报ID=%d\r\n",ip.ID);/* DF表示禁止分片标志,MF表示分片标记*/BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"分段标志DF=%d,MF=%d\r\n",DF,MF);WORD fragOff;getFragoff(ip.FragOff,fragOff);fprintf(file,"分段偏移值=%d\r\n",fragOff);fprintf(file,"生存期=%d(hops)\r\n",ip.TimeToLive);fprintf(file,"协议=%s\r\n",getProtocol(ip.Protocol));fprintf(file,"头校验和=0x%0x\r\n",ip.HdrChksum);fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));fprintf(file,"__________________________________\r\n");}/* 程序入口*/int main(int argc,char *argv[]){/* cmd参数*/if(argc!=2){ //程序名、文件名printf("usage error!\n");return -1;}FILE *file;/* 以读写的方式建立一个文本文件as.txt */if((file=fopen(argv[1],"w+"))==NULL){printf("fail to open file %s","as.txt");return -1;}WSAData wsData;/* 启动2.2版本的Socket,并将Socket版本信息保存到wsData中*/ if(WSAStartup(MAKEWORD(2,2),&wsData)!=0){printf("WSA startup failed!\n");return -1;}fprintf(file,"Socket初始化...\r\n");fprintf(file,"==================================\r\n");fprintf(file,"描述:%s\r\n",wsData.szDescription);fprintf(file,"状态:%s\r\n",wsData.szSystemStatus);fprintf(file,"==================================\r\n");SOCKET sock;/* 创建原始套接字*/if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET){printf("Can not create socket!\n");return -1;}BOOL flag=true;/* 设置IP头操作选项*/if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag))==SOCKET_ERROR){ printf("setsockopt failed!\n");return -1;}char hostName[128];/* 获取本地主机名*/if(gethostname(hostName,100)==SOCKET_ERROR){printf("gethostname failed!\n");return -1;}hostent *pHostIP;/* 根据主机名获取主机信息*/if((pHostIP=gethostbyname(hostName))==NULL){printf("gethostbyname failed!\n");return -1;}printf("Hostname: %s\r\n",pHostIP->h_name);printf("IPAddress: %s\r\n",inet_ntoa(*((struct in_addr *)pHostIP->h_addr)));/* 封装IP地址信息*/sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000); //监听的端口号/* 把Socket绑定到本地网卡*/if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR){printf("bind failed");return -1;}DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;/* 设置网卡为混杂模式*/if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR){ printf("icotlsocket failed\n");return -1;}char buffer[BUFFER_SIZE];printf("=============开始解析=============\r\n");while(true){/* 从套接字接收IP数据报*/int size=recv(sock,buffer,BUFFER_SIZE,0);if(size>0){ipparse(stdout,buffer);ipparse(file,buffer);}}/* 解除Socket绑定*/if(WSACleanup()==SOCKET_ERROR){printf("WSACleanup failed!\n");return -1;}/* 关闭文件*/fclose(file);return 0;}。