本文共 3632 字,大约阅读时间需要 12 分钟。
1,IP是TCP/IP协议中最为核心的协议,其提供不可靠,无连接的数据报传送。
1》不可靠:它不能保证IP数据报能成功地到达目的地。 2》无连接:IP不维护任何关于后续数据报的状态信息。 2,IP首部:1》版本号:目前协议版本号为4,因此IP有时也称作IPv4.
2》首部长度:首部站32位字节的数目,包括任何选项,最小为5*4=20字节,最大为(2^4-1)*4=60字节。 3》服务类型(TOS)字段包括3bit的优先权字段(现在已被忽略)。4bit的TOS子字段(最小延时,最大吞吐量,最高可靠性和最小费用)和1bit未用位但必须设置为0。 4》总长度字段是指整个IP数据包的长度,以字节为单位。由于该字段长为16bit,所以数据报最长可达65535字节(MUT)。尽管以太网最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报内容。 5》TTL生存时间字段设置了数据报可以经过的最多路由器数。即数据报的生存时间。 6》8位协议1表示ICMP,2表示IGMP,6表示TCP协议,17表示UDP协议。 7》首部检验和字段是根据IP首部计算的校验和码。《ICP/IP详解在,卷1:协议》中是这样描述的: 这一段说明的算法如下: IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和。应该按如下步骤: (1)把IP数据报的首部校验和字段都置为0。 (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。 (3)把得到的结果存入校验和字段中。 在接收数据时,计算数据报的校验和相对简单,按如下步骤:(1)当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。
1、发送方 i)将校验和字段置为0,然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;ii)对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段;
iii)发送数据包。
2、接收方
i)将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;ii)对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0);
iii)如果是全1则进行下步处理,否则意味着包已变化从而丢弃之。需要强调的是反码和是采用高位溢出加到低位的,如3比特的反码和运算:100b+101b=010b(因为100b+101b=1001b,高位溢出1,其应该加到低位,即001b+1b(高位溢出位)=010b)。
1.实例 请看我用ominipeek的抓包I.将校验和字段置为0,然后将IP包头按16比特分成多个
校验和Header Checksum:0x618D将其重置为0X0000
将IP包头分段: 1. 0x4500 2. 0x0029 3. 0x44F1 4. 0x4000 5. 0x8006 6. 0x0000 ------->这个为Header Checksum的值,我们前面将其重置为0了 7. 0xC0A8 8. 0x01AE 9. 0x4A7D + 10. 0x477D ------------------------------------------------------- 将1至10相加求出来的和为:0x29E70 II.对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段 0x0002+0x9E70=0x9E72 0x9E72二进制为:1001 1110 0111 0010 反码为:0110 0001 1000 1101 0110 0001 1000 1101的16进制为:0x618D 看看这个 是否与IP包头中的Checksum相同 ========================================================== 当接收到IP对其进行检测 III.对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0) 当收到IP数据局包的时候,要验证IP头是否正确,则可以这样进行 1. 0x4500 2. 0x0029 3. 0x44F1 4. 0x4000 5. 0x8006 6. 0x618D ------->这个为Header Checksum的值 7. 0xC0A8 8. 0x01AE 9. 0x4A7D + 10. 0x477D ------------------------------------------------------- 将1至10相加求出来的和为:0x2FFD 对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段: 0x0002+0x0FFD=0xFFFF 0xFFFF二进制为:1111 1111 1111 1111 1111 1111 1111 1111反码为:0 ==================================================== 关于这一部的补充说明, 将IP包头分段:1. 0x4500
2. 0x0029
3. 0x44F1
4. 0x4000
5. 0x8006
6. 0x0000 ------->这个为Header Checksum的值,我们前面将其重置为0了
7. 0xC0A8
8. 0x01AE
9. 0x4A7D
+ 10. 0x477D
---------------------------------------------------------------------------------------------------------- 3,IP路由选择 当一个IP数据包准备好了的时候,IP数据包(或者说是路由器)是如何将数据包送到目的地的呢?它是怎么选择一个合适的路径来"送货"的呢? 最特殊的情况是目的主机和主机直连,那么主机根本不用寻找路由,直接把数据传递过去就可以了。至于是怎么直接传递的,这就要靠ARP协议了。 稍微一般一点的情况是,主机通过若干个路由器(router)和目的主机连接。那么路由器就要通过ip包的信息来为ip包寻找到一个合适的目标来进行传递,比如合适的主机,或者合适的路由。路由器或者主机将会用如下的方式来处理某一个IP数据包 1》. 如果IP数据包的TTL(生命周期)以到,则该IP数据包就被抛弃。 2.》 搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机 3》. 搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码(1.3.)”的协助。如果找到路由器,则将该包发向路由器。 4》. 搜索路由表,如果匹配同子网路由器失败,则匹配同网号(第一章有讲解)路由器,如果找到路由器,则将该包发向路由器。 5》. 搜索陆游表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包 6》. 如果都失败了,就丢掉这个包。 4,子网寻址 现在所有的主机都要求支持子网编址。不是把IP地址看成有单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。 与30个C类地址相比,用一个包含30个子网的B类地址的好处是,它可以缩小Internet路由表的规模。 5,子网掩码 子网掩码是一个32bit值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。 如果知道了本机IP地址,那么就知道了它是否属于A类,B类或C类(从IP地址的最高位可以知道,128,192,224,240),也就知道网络号和子网号之间的分界。而根据子网掩码就知道了网络号和主机号之间的分界线。