TCP/IP详解卷1 读书笔记:第三章 IP网际协议

 引言

IP提供不可靠的、无连接的服务,其上层协议(TCP、UDP、ICMP、IGMP)都需要IP协议提供服务。

如果发生某种错误,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP差错报文给源端。任何要求传输的可靠性必须由上层协议来实现(如TCP)。

IP数据报及IP分片到达顺序都是未知的,因为每一个IP数据报和IP分片都可能通过不同的路由。

 

IP头部


4位版本号: 标识是IPV4还是IPV6.

4位首部长度: 标识是IP包头的长度,4字节为一个单位,这里首部长度占4位,最大值为15,因此IP首部的最15*4=60字节。

8位服务类型(TOS),一般不使用,并不能被所有设备所支持。

16位总长度:IP数据包的总长度,包括IP包头和数据,单位是字节,16位最多可表示65535字节。

16位标识,3位标识,13位片偏移 用于处理分片的。16位标识,上层协议投递给IP层同一个包的所有分片中,该值相同。

3位标志,其中一位未使用,一位表示该IP包是否允许分片,一位表示是否还有更多分片。

13位片偏移,表示如果允许分片,则当前分片是整个IP包中的哪个分片(即标识数据的位置)。单位是字节;在分片时,除最后一片外,其他每一片中的数据部分(除 I P首部外的其余部分)必须是 8字节的整数倍。

注意:在第一个数据报片出现时, I P层必须启动一个定时器。这里“第一个”表示给定数据报的第一个到达数据报片,而不是第一个数据报片(数据报片偏移为 0)。正常的定时器值为 3 0或6 0秒。如果定时器超时而该数据报的所有数据报片未能全部到达,那么将这些数据报片丢弃。如果不这么做,那些永远不会到达的数据报片(正如我们在本例中所看到的那样)迟早会引起接收端缓存满。即,路径中的任一节点(可能是路由器也可能是主机)在收到第一个IP分片后,IP层就启动一个定时器,如果在规定时间内未收到剩余分片,则会把之前的分片也给清除。

只有收到的IP分片包含IP数据报的第一个分片,才会产生ICMP差错报文。其它分片并不会向发送端发送ICMP差错报文。(这时只有依赖上层协议的超时重传机制来实现重传)

这里解释一下为什么只有收到了IP分片包含IP数据报的第一个分片,才会产生ICMP差错报文。在某一路由节点上,发生IP分片时,每一片都包含有IP的头部,也就是说,各个分片的IP头部信息都是完整的,但每个分片中包含的数据部分各不相同。其中上层协议(如TCP/UDP/ICMP等)是IP数据报的数据部分,在发生分片时,上层协议的协议头被划分到了第一个IP分片中,而上层协议(TCP/UDP)中的端口号决定了源主机对应的应用程序,除第一个IP分片外的其余分片都不具有该端口号信息,因此,即使路由器回复了ICMP差错报文,源主机在收到该报文后,依然不知道要投递给上层的哪个应用程序。所以,只有收到第一个IP分片的情况下(未收到全部分片),才会向源发送ICMP差错报文。

另需注意:虽然路由器是在所有的IP分片到达后才进行转发IP数据包,但在转发之前并不会对IP分片进行重组,其转发出去的依然是接收到的IP分片(有可能会对IP分片进行再次分片,具体要根据其与自身和下一跳的MTU来确定)。


8位生存时间TTL,time tolive, (当初设计的目的是每个设备的最大停留时间为1秒,实现起来困难)现在实现为最大的跳数,每经过一个设备,减1. 最大255,默认64.  设置该值的目的是为了防止网络环路。

8位协议号,标识ICMP、TCP、UDP等协议。 ICMP 1, TCP 6, UDP 17。

16位首部校验和,校验该IP包头的正确性。只管IP包头,它不管数据的正确性。IPV6不再有该校验和。


IP头部校验和的计算方法

发送方校验和的计算方法

a)将校验和字段置为0,然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;

b)对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段;

c)发送数据包。

接收方校验和的计算方法

a)将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;

b)对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0);

c)如果是全1则进行下步处理,否则意味着包已变化从而丢弃之。需要强调的是反码和是采用高位溢出加到低位的,如3比特的反码和运算:100b+101b=010b(因为100b+101b=1001b,高位溢出1,其应该加到低位,即001b+1b(高位溢出位)=010b)。

 

示例(发送计算校验和)


校验和所占去的字节(校验和置为0000),IP首部求和,去除进位,并将进位做为一个数字,加在剩余后4位上。然后求补,即得到。(FFFF减去计算得到的4位数值)。相加时,每两个字节一起。

4500+0028+4f51+4000+4006+0000+c0a8+0169+3ad8+16d3= 2283b

283b+2 = 283d (其中,2是2283b中最前面的2)

Ffff-283d = d7c2 , 即校验和。

 注意:TCP、UDP、ICMP、IGMP均采用该种算法计算校验和。IP数据包每转发一次,都要计算一次IP头部校验和。因为转发时修改了TTL值。

  

IP路由选择

IP数据包的路由

1.判断目的地址是否环回地址;

2.判断目的地址是否是多播或广播地址;

3.查路由表:

a. 查完全匹配(主机地址);

b. 查网络匹配(网络地址);(局域网间主机发包属于网络匹配,详见:局域网主机间发包细节

c. 查默认路由(网关地址,其实OS中所配置的网关地址即是默认路由);

d. 如以上都未查到,丢弃该包,给源端发送ICMP差错报文。

注意:

(1)IP数据报路由过程中,数据报中的目的IP地址始终不发生任何变化(只有使用源路由选项时,目的IP地址才有可能被修改,但这种情况很少出现)。所有的路由选择决策都是基于这个目的IP地址。源地址可能会改变,如家用路由器将局域网数据转发到公网时,会将内网IP映射为公网IP。

(2)每个链路层可能具有不同的数据帧商务部,而且帧中的目的地址(如果有的话)始终指向的是下一跳的链路层地址。

 

子网掩码

需要知道一个IP地址中,有多少位用于子网号和多少位用于主机号。子网掩码是一个32位的IP地址,其中值为1的部分对应网络号和子网号,值为0的部分对应主机号。

 

特殊情况的IP地址


由上面倒数第二条可知,当划分了子网后,广播地址可能就不是255了,如下:

 

其中,最后一条为以太网上的广播地址。这是一个B类地址,子网号占了8+3=11位,所以主机位共5位,当5位主机号为全1(31)时,为广播地址。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值