博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP,IP详解,卷一:协议学习笔记之第三章IP:网际协议
阅读量:4184 次
发布时间:2019-05-26

本文共 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),也就知道网络号和子网号之间的分界。而根据子网掩码就知道了网络号和主机号之间的分界线。

      

你可能感兴趣的文章
Greenplum技术浅析
查看>>
SQL如何查询一张表的所有字段并按其中一个字段进行分组
查看>>
GROUP BY...HAVING 组合查询大总结
查看>>
MATLAB
查看>>
金融术语科普 , 什么是GP、LP、PE、VC和FOF
查看>>
SAS 系统全称为Statistics Analysis System
查看>>
算法使用1
查看>>
java中的集合和数组
查看>>
Java运算符优先级
查看>>
IndexWriterConfig这个配置管理类
查看>>
lucene以.gen ,.si为后缀名的文件。
查看>>
段文件格式的组成以及结构
查看>>
fnm的索引文件格式的具体结构及数据类型
查看>>
在Lucene中,如何完成一个搜索的过程
查看>>
lucene的Term dictionary
查看>>
向量的索引文件格式
查看>>
DocValues 对于一些存储的值
查看>>
Lucene的几种评分方式
查看>>
static为什么可以修饰类
查看>>
Sql Server 锁机制
查看>>