《TCP/IP具体解释卷2:实现》笔记--IP:网际协议
本章介绍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结构中的各成员的名字
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
标准的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);
}
接收方计算校验和时的首部与发送方计算校验和时的首部相比。多了一
因此,假设首部在传输过程中没有发生差错。那么接收方计算的结果应该为全一。由于接收方计算除
《TCP/IP具体解释卷2:实现》笔记--IP:网际协议的更多相关文章
- 《TCP/IP具体解释卷2:实现》笔记--IP多播
D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议. ...
- 《TCP/IP具体解释卷2:实现》笔记--UDP:用户数据报协议
用户数据报协议.即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作仅仅产生一个UDP数据报,从而发送 一个IP数据报. 进程通过创建一个Internet域内的SOCK_DGRAM类型的插口 ...
- 《TCP/IP具体解释卷2:实现》笔记--协议控制块
协议层使用协议控制块(PCB)存放各UDP和TCP插口所要求的多个信息片.Internet协议维护Internet协议控制块 (internet protocol control block)和TCP ...
- 《TCP/IP具体解释卷2:实现》笔记--ICMP:Internet控制报文协议
ICMP在IP系统间传递差错和管理报文,是不论什么IP实现必须和要求的组成部分.能够把ICMP分成两类:差错和查询.查询报文 是用一对请求和回答定义的.差错报文通常包括了引起错误的IP包的第一个分片的 ...
- TCP/IP具体解释--UDP数据报中的IP分片
1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...
- 《TCP/IP具体解释卷2:实现》笔记--接口层
接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一 ...
- 《TCP/IP具体解释卷2:实现》笔记--选路请求和选路消息
内核的各种协议并不直接使用前面提供的函数来訪问选路树,而是调用几个函数:rtalloc和rtallocl是完毕路由表查询的两个 函数:rtrequest函数用于加入和删除路由表项:另外大多数接口在接口 ...
- 《TCP/IP具体解释卷2:实现》笔记--IP的分片和重装
IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0, ...
- 《TCP/IP具体解释卷2:实现》笔记--域和协议
Net/3组把协议关联到一个域,而且用一个协议族常量来标识每一个域.Net/3还通过全部的编址方法将协议分组. 在一个域中 的每一个协议使用同类地址.而且每种地址仅仅被一个域使用.作为结果,一个域能通 ...
随机推荐
- (四)Jsoup 获取 DOM 元素属性值
第一节: Jsoup 获取 DOM 元素属性值 Jsoup获取DOM元素属性值 比如我们要获取博客的href属性值: 我们这时候就要用到Jsoup来获取属性的值 : 我们给下示例代码: package ...
- cross apply 和 outer apply
使用APPLY运算符可以实现查询操作的外部表表达式返回的每个调用表值函数.表值函数作为右输入,外部表表达式作为左输入. 通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出.A ...
- python类、类继承
yield: 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab( ...
- 20165333 学习基础和C语言学习基础
说实话,我并没有什么技能比90%以上的人更好,非要拿一个出来的话,篮球勉强好一点吧.最初接触篮球是小学的时候跟着哥哥看他打球,哥哥的球技在同龄人中算是好的,每次看他各种突破过人,我都觉得特别潇洒帅气, ...
- Web前端开发最佳实践(10):JavaScript代码不好读,不好维护?你需要改变写代码的习惯
前言 这篇文章本应该在上一篇文章:使用更严格的JavaScript编码方式,提高代码质量之前发布,但当时觉得这篇文章太过基础,也就作罢.后来咨询了一些初级的开发者,他们觉得有必要把这篇文章也放上来.尽 ...
- LoadRunner脚本篇
LoadRunner脚本篇 1概述 2脚本录制 3脚本编写 4脚本调试 关 键 词:LoadRunner 性能测试脚本 摘 要:编写一个准确无误的脚本对性能测试有至关重要的意 ...
- Dubbo的容错与负载均衡
虽然前面在介绍dubbo中写过这块内容,但是不够充分,这里详细写一下,在以后研究中,还会继续补充程序原理. 一:容错 1.机制 在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failove ...
- 2018年全国多校算法寒假训练营练习比赛(第二场)B - TaoTao要吃鸡
链接:https://www.nowcoder.com/acm/contest/74/B来源:牛客网 题目描述 Taotao的电脑带不动绝地求生,所以taotao只能去玩pc版的荒野行动了, 和绝地求 ...
- 最详细的vue-cli安装教程 &^没有之一 ^& 大神亲测。。╮( ̄▽  ̄)╭
这里介绍使用git安装,电脑自带命令行依然可以使用进行安装 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装 1.2 如果本机已经安装node的运行换 ...
- 使用IDEA运行Eclipse编辑jetty运行的J2EE项目的惨痛教训
公司的项目原本是使用Eclipse,使用自带的jetty运行, 用IDEA通过git clone后,使用Tomcat运行,可以运行,却无法访问页面,总是报错404 后来使用IDEA Jetty运行,经 ...