您的位置:首页 > 理论基础 > 计算机网络

TCP,IP详解,卷一:协议学习笔记之第三章IP:网际协议

2015-12-08 13:29 746 查看

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),也就知道网络号和子网号之间的分界。而根据子网掩码就知道了网络号和主机号之间的分界线。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: