大家好,又见面了,我是全栈君。
本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出。
下图显示了IP层常见的组织形式。
在之前的文章中。我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调用一个软件中断,例如以下图所看到的:
由于硬件中断的优先级比软件中断的要高,所以在发生一次软件中断之前。有的分组可能会被放到队列中。在软件中断中,ipintr
函数不断从ipintrq中移走和处理分组,直到对垒为空。在终于的目的地,IP把分组重装为数据包,并通过函数调用把该数据包直接
传给适当的运输层协议。假设分组没有到达最后的目的地,而且假设主机被配置成一个路由器,则IP把分组传给ip_forward。传输
协议和ip_forward把要输出的分组传给ip_output。由ip_output完毕ip首部,选择输出接口以及在必要时对分组分片。终于的分组
被传给合适的网络接口输出函数。
当产生差错时,IP丢弃该分组,并在某些条件下向分组的源站发出一个差错报文。这些报文是ICMP的一部分。
1.IP分组
我们把传输层协议交给IP的数据称为报文。典型的报文包括一个传输层首部和应用程序数据。下图所看到的的传输协议时UDP。IP在报
文的首部前加上它自己的首部形成一个数据包。假设在选定的网络中。数据报长度太大。IP就把数据包分裂成几个分片,每一个分片
包括它自己的IP首部和一段原来的数据报的数据。
下图显示了IP首部的结构。
下图包括了IP结构中的各成员的名字
标准的IP首部长度是20个字节,所以ip_hl必须大于等于5.大于5表示IP选项紧跟在标准首部后。如ip_hl的最大值为15,同意最多
40各字节的选项。ip_hl是以4字节为单位计算的。
2.输入处理:ipintr函数
当接口把分组放到ipintrq上排队后。通过schednetisr调用一个软中断。当该软中断发生时,假设IP处理过程已经由schednetisr
调度。则内核调用ipintr。在调用ipintr之前。cpu的优先级被改成splnet。
ipintr是一个大函数,主要分4部分讨论:
1.对到达分组验证
2.选项处理及转发
3.分组重装
4.分用
当中选项处理和分用重装比較复杂,会在以后作为单独的章节进行说明。
2.1.验证
一个未被破坏的首部应该具有0检验和。假设为非0,则该
以下的章节详细介绍in_cksum。
2.2.选项处理和转发
接下来调用ip_dooptions来处理IP选项,然后决定分组是否到达它最后的目的地。
假设分组没有到达最后目的地,则Net/3会
尝试转发该分组;假设分组到达最后目的地,就被交付给合适的传输层协议。
1.选项处理
ip_dooptions处理选项,假设ip_dooptions返回0,ipintr将继续处理该分组;否则ip_dooptions通过转发或丢弃分组完毕对该
分组的处理。ipintr能够处理输入队列中的下一个分组。
处理完选项后,ipintr通过把ip首部内的ip_dst与配置的全部本地接口的ip地址比較。以决定分组是否已经到达终于目的地。
ipintr
必须考虑与接口相关的几个广播地址、一个或多个单播地址以及随意多个多播地址。
2.转发
假设ip_dst与全部地址都不匹配,分组还没有达到终于目的地。
假设不准备转发,则丢弃分组,否则。ip_forward尝试把分组路由
到它的终于目的地。
2.3.分组重装和分用
ipintr函数最后进行分组的重组和分组。在后面的章节会具体进行介绍。
最后ipintr调用选定protosw结构中的pr_input函数来处理数据报包括的运输报文,当pr_input返回时,ipintr继续处理ipintrq中的
下一个分组。
3.IP头部检验:in_cksum函数
SHORT checksum(USHORT* buffer, int size){ unsigned long cksum = 0; while(size>1) { cksum += *buffer++; size -= sizeof(USHORT); } if(size) { cksum += *(UCHAR*)buffer; } cksum = (cksum>>16) + (cksum&0xffff); cksum += (cksum>>16); return (USHORT)(~cksum);}
接收方计算校验和时的首部与发送方计算校验和时的首部相比。多了一
因此,假设首部在传输过程中没有发生差错。那么接收方计算的结果应该为全一。由于接收方计算除
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115327.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...