当前位置: 首页 > 编程日记 > 正文

第二章、IP协议详解

一、IP服务的的特点

IP协议是TCP/IP协议族的动力,他为上层协议提供的无状态无连接,不可靠的服务。

无状态是指IP通信双方不同步传输数据的状态信息,因此所有的ip数据报的发送,传出和接受都是相互独立的,没有上下文的联系。这种服务最大的缺点就是无法处理乱序和重复的IP数据报。比如,发送端发送出的第N个数据包可能逼第N+1个报文段后到达接收端,而同一个IP数据报也可能经过不同的路径多次到达接收端。IP数据报头部提供了一个标识字段用以唯一的标识一个 IP数据报,但它是被用来处理IP分片和重组的,而不是用来指示接受顺序的。

无状态的优点也有,简单高效,我们无须为保持通信的状态而分配一些内核资源,也无需每次传输数据是都携带上状态信息。网络协议中,无状态是很常见的,比如UDP协议和HTTP协议就是无状态连接。以HTTP协议为例,一个浏览器连续俩次网页请求之间没有任何关系,他将被web服务器独立的处理。

无连接是指IP通信双方都不长久的维持对方的任何信息,这样,上层协议每次发送数据报的时候,都必须明确指定对方的ip地址。

不可靠是指IP协议不能保证数据报准确的到达接收端,他只是承诺尽最大努力。导致IP数据报发送失败。

二、IPV4头部结构。

iPV4头部结构如下图,其长度通常为20字节,除非含有可变长的选项部分。

4位版本号4位头部长度8位服务类型16位总长度(字节数)
8位生存时间TTL8位协议16位头部校验和
32位源端IP地址
32位目的端IP地址
选项,最多40个字节

4位版本号:制定IP协议的版本。

4位头部长度:标识该IP头部有多少个32bit字,因为4位是最大能表示15,所以IP头部最长是60字节。

8位服务类型:

16位总长度是指整个UP数据包的长度。

16位标识唯一标识主机发送的每一个报文段。

三、IP分片。

前面提到,当IP数据报长度超过帧MTU时候,他将被分片传输。分片可能发送在发送端,也可能发生在中转的路由器上,而且可能在传输过程中被多次分片,但是只有在最终的目标机器上,这些分片才会被内核中的IP这些分片才会被内核中的IP模块重新组装。

IP数据包头部:数据报标识,标志和片偏移。一个IP数据报的每个IP数据分片都有自己的IP头部,他们具有相同的标识值,但是具有不同的片偏移。并且除了最后一个分片外,其它分片都将设置MF标志。此外,每个分片的IP头部的总长度将被设置为该分片的长度。

以太网,帧的长度为MTU1500字节,因此他携带的IP数据报的数据部分最多是1480字节,(IP头部需要占20字节)。考虑,用IP数据报文封装一个长度为1481字节的ICMP报文(包括ICMP头部8字节,所以长度是1473字节),则该数据报在使用以太网帧传输的时候必须被分片。

四、IP路由。

IP协议的一个核心任务就是数据包的路由,即确定发送数据报到目标机器的路径。为了理解IP路由过程,我们先简要分析IP模块的基本工作流程。

1、IP模块工作流程:当IP模块接受来自数据链路层的IP数据报的时候,他首先对该数据报进行CRC校验,确认无误之后就分析其头部的具体信息。如果该数据包头部设置了源站选路选项,则,IP模块调用数据包转发子模块来处理该数据报。如果该IP数据报的头部中目标IP地址是本机的某个IP地址,或者广播地址,就是该数据报是发送给本机的,则IP模块就根据数据包头部中的协议字段来决定发给那个上层应用。如果IP模块发现这个数据包不是发送给本机的,则也调用数据包转发子模块来处理该数据报。

数据包转发子模块将首先检测系统是够允许转发,如果不允许,IP模块就将数据包丢弃。如果允许,数据包转发子模块将对该数据包执行一些操作,然后将它交给IP数据报输出子模块。

IP数据报应该发送给哪个下一跳路由(或者目标机器),以及经过那个网卡来发送,就是IP数据报路由过程。IP模块实现数据包路由的核心数据结构是路由表。这个表按照数据报的目标IP地址分类,同一类型的IP数据报将被发送往相同的下一跳路由(或是目标机器)。

IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报之外,还包括封装了本机上层数据(ICMP报文,TCP报文段和UDP数据报)的IP数据报。

2、路由机制:;路由表是如何按照IP地址分类的?

(1)查找路由表中和数据包的目标IP地址,完全匹配的主机ip地址。如果找到,就使用该路由项,没找到则转步骤2。

(2)查找路由表中和数据包的目标IP地址具有相同的网路ID的网络IP地址。如果找到,就使用该路由项;没找到则跳转步骤3.

(3)选择默认路由项,这通常意味着数据包的下一跳路由是网关。

3、路由表更新。

路由表必须能够更新,以反映网络连接的变化,这样的IP模块才能更准确,高效的穿法数据报。route命令可以修改路由表。

五、IP转发。

不是发送给本机的IP数据报转发子模块来处理。路由器都能执行数据包的转发操作,而主机一般只发送和接受数据报,这是因为主机上的讷河参数默认被设置为0,。我们可以通过修改他来使能主机的数据报转发功能。

六、重定向。

1、ICMP重定向报文。

8位类型8位代码16位校验和
应该使用的路由器的IP地址
原始IP数据报的头部信息(包括可选字段)+数据部分的前8个字节

ICMP报文头部的三个固定字段,8位类型,8位代码,16位校验和。ICMP重定向报文的类型是5,代码段由4个可选值,用来区分不同的重定向类型。

转载于:https://www.cnblogs.com/yjds/p/8848862.html

相关文章:

为绑定的NSArrayController设置默认的排序

当NSArrayController与一个class或者entity进行绑定(Binding)之后,可以为这个NSArrayController设置默认的排序。通过在Bindings Insepector中选择Controller Content Parameters -> Sort Descriptor进行默认排序的设定。 1、在.h文件中创…

快速求斯特林数总结(洛谷模板题解)

题目链接 第一类斯特林数行第一类斯特林数列第二类斯特林数行第二类斯特林数列 求一行第一类斯特林数 由第一类斯特林数的推论,\(x^{\overline{n}}\sum_i\begin{bmatrix}n\\i\end{bmatrix}x^i\),分治FFT计算上升幂即可 \(O(nlog^2n)\)。 求一列第一类斯特…

【Linux】Linux简单操作之系统管理

1、date : 显示系统时间 注 :系统操作与所在的文件夹无关,在哪都能操作。 2、su : 切换账号 注: (1)如果高级用户切换低级用户可以直接切换,不用密码 (2)…

嵌入式开发博客收藏

http://hbhuanggang.cublog.cn 嵌入式linux之我行 http://blog.csdn.net/fudan_abc fudan_abc的Linux内核专栏 http://blog.chinaunix.net/space.php?uid20543672

【Python3.6+Django2.0+Xadmin2.0系列教程之一(入门篇-上)】环境搭建及项目创建

由于工作需要,接触了大半年时间的Djangoxadmin框架,一直没空对这块对进行相关的梳理。最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧。 好了,话不多说,下面开始进入正题: 转载请注明出处&#xf…

JavaScript深拷贝Json

今天因为项目需要写了个Json格式的深拷贝(深度复制)。很简单,没有做其他的判断,代码如下: function deepCopy(json){if(typeof json number || typeof json string || typeof json boolean){return json;}else if(t…

【Linux】Linux简单操作之压缩解压

一、tar : 归档 格式:tar 参数(必须有) 要被压缩的文件或目录 1、创建归档文件 格式: tar -zvcf 归档文件名 要归档文件列表 注意: (1)z是压缩 v是显示详细信息 c是创建压缩文件…

Firefox 的User Agent 将移除 CPU 架构信息

Mozilla 计划从 Firefox 的 User Agent(用户代理)和几个支持的 API 中移除 CPU 架构信息,以减少 Firefox 用户的“数字指纹”。Web 浏览器会自动向用户在应用程序中打开的网站显示信息,而用户代理会显示有关浏览器和浏览器版本、操…

工程师必读 微软如何部署Exchange2010

一年一度的IT技术盛典——微软TechEd2010大会将于2010年12月1日正式开幕。为了更好地为网友和读者报道今年的大会,我们IT168前方的记者在TechEd会场,为读者带来第一时间的报道。 在今天的大会现场,来自微软的高级顾问陈刘项为我们全面介绍了关…

线程范围内的数据共享

1、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做。 2、如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有如下两种方…

Setting the Reply-To Header in an Email using CDONTS.NewMail Object and CDO Message

代码 1 <%2 OptionExplicit3 4 DimobjMail5 DimstrSubject6 DimstrBody7 8 strSubject "This is a test email"9 strBody "This test email is using testdevasp.com "&_10 "as the sender email address but we are "&_11 "…

Codeforces Beta Round #95 (Div. 2) 部分解题报告 (dp,组合数,)

做这样的比赛既考快速编码的能力&#xff0c;还有快速思维的能力。本人很弱&#xff0c;跌了rating。。加油&#xff01;&#xff01;&#xff01;。。 第一题上来就把题意理解错了。。粗心啊。。直接模拟着做就行:1&#xff1a;如果字符串全是大写字母就进行大小写转换:2&…

【Linux】 Linux简单操作之网络通信和网络访问

一、网络通信 1、ifconfig &#xff1a; 查看ip信息 2、ping &#xff1a; 测试网络连通 格式 &#xff1a; ping ip或域名 注&#xff1a; 通过该测试你能知道你的计算机是不是能联网的。 二、网络访问 1、curl &#xff1a; 测试网络访问和模拟用户访问 2、wget &#x…

将类别加入到别人的名称空间内

怎样把自己的类别加入到别人的名称空间内&#xff0c;在引用时&#xff0c;能在别人的名称空间下使用到自己写的类别。 这是一位台湾朋友问及此问题&#xff0c;因此录制一个视频做演示&#xff1a; 视频文件格式&#xff1a;.wmv&#xff1b;大小&#xff1a;9,706KB&#xff…

Linux内核初期内存管理---memblock(转)

http://www.maxwellxxx.com/linuxmemblock转载于:https://www.cnblogs.com/erhu-67786482/p/8873112.html

看懂SqlServer查询计划(转)

转自&#xff1a;http://www.cnblogs.com/fish-li/archive/2011/06/06/2073626.html 对于SqlServer的优化来说&#xff0c;可能优化查询是很常见的事情。关于数据库的优化&#xff0c;本身也是一个涉及面比较的广的话题&#xff0c;本文只谈优化查询时如何看懂SqlServer查询计划…

openoj的一个小比赛(F题解题报告)poj3978(dp+素数筛选)

http://openoj.awaysoft.com:8080/judge/contest/view.action?cid47#problem/F 一个素数帅选法的题目&#xff0c;才开始直接就套模板结构tle应为被题目中的As many as 1000 lines, 给坑了总的时间消耗是1000*10^5.。这样暴力枚举的话肯定会超时&#xff0c;当时就急了&#x…

【Linux】Linux简单操作之管道与重定向

一、重定向 1、重定向 使用符号 > 例如&#xff1a; echo "hello world" > a.txt注&#xff1a;如果文件不存在则会自动创建文件 2、重定向覆盖&#xff1a; 代码实现&#xff1a; echo "hello world" > a.txt3、重定向追加&#xff1a; 使…

linux tc打造ip流量限制

tc是个配置Linux内核流量控制的工具 名字 tc - 显示&#xff0f;维护流量控制配置 摘要 tc qdisc dev DEV qdisc tc class dev DEV parent qdisc-id qdisc tc filter dev DEV protocol protocol prio priority filtertype flowid flow-id tc qdisc show tc class show dev DEV …

vue Element-ui 表格自带筛选框自定义高度

el-table中可以在一行的某列进行筛选&#xff0c;代码如下&#xff1a; <el-table-column prop"classOfTest" class"test" label"测试类名" :filters"classList" filter-placement"bottom-start" width"300" c…

【Linux】Linux简单操作之vi与vim编辑器

一、vi与vim的区别 vi类似于普通的记事本&#xff0c;没有字体颜色的变化&#xff0c;vim对一些关键字会进行变色处理 二、vi 1、启动vi编辑器 格式&#xff1a; vi 文件名 注&#xff1a; &#xff08;1&#xff09;如果文件存在&#xff0c;则打开该文件 &#xff08;2…

vectorbool不是容器

vector<bool>不是容器&#xff0c;为了节省空间&#xff0c;其内部是用一个bit来表示一个bool值的&#xff0c;operator[]不会返回一个指向bool值的引用&#xff0c;而是返回一个代理&#xff08;proxy&#xff09; 试图以数组的形式来使用vector<bool>会引发错误。…

.Net MVC3中取得当前区域的名字(Area name)

在代码中&#xff1a; ControllerContext.RouteData.DataTokens["area"] 在View中&#xff1a; ViewContext.RouteData.DataTokens["area"] 转载于:https://www.cnblogs.com/idlewater/archive/2011/11/29/2267892.html

草根创业都选择的是什么人?

前言&#xff1a;选合伙人和投资就像在选女朋友一样&#xff0c;要谨慎&#xff0c;甚至有时候宁缺毋滥。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />曾经以为有了钱&#xff0c;就会找到需要的人&#xff0c;后来发现不是这…

MSF渗透测试-CVE-2017-11882(MSOffice漏洞)

1.测试环境 2.测试前准备 3.测试过程 —3.1虚拟机环境测试 —3.2局域网靶机测试 4.测试感想 1.测试环境 攻击机&#xff1a; OS&#xff1a;kail IP&#xff1a;192.168.15.132/192.168.137.231 靶机&#xff1a; OS&#xff1a;Windows7 Office版本&#xff1a;Office2013_CN …

002本周总结报告

在这次的一周中&#xff0c;我从网站上观看了有关Java基础的教学视频&#xff0c;学习了一些Java语言的历史及发展&#xff0c;更重要的是学习了Java的部分基本语法&#xff1a;如编写Java程序的的外部框架&#xff0c;输入输出函数的格式等。平均每天花在学习上一小时&#xf…

Java Execution Process

Here attached an article about heap (堆) and stack (栈).HeapAndStack Java will store all things into system memory (system memory is physical mem virtual mem), then it’s the OS to decide they go to physical memory or hard disk (virtual memory) later. 堆是…

【Linux】Linux简单操作之安装jdk

1、去官网下载jdk &#xff0c;使用 Xftp将jdk压缩包导入自己创建的文件夹 /home/soft当中 注意&#xff1a; 使用后缀名为 .tar.gz的jdk 2、将文件解压到 文件夹 /usr/local当中 代码实现&#xff1a; tar -zxvf jdk-12.0.2_linux-x64_bin.tar.gz -C /usr/local3、切换到 …

oracle 分区表的建立方法

Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断&#xff0c;把分区列不同的记录&#xff0c;放到不同的分区中。分区完全对应用透明。 Oracle的分区表可以包括多个分区&#xff0c;每个分区都是一个独立的段&#xff08;SEGMENT&#xff09;…

QSignalMapper的使用

官方文档&#xff1a;http://doc.qt.io/qt-5/qsignalmapper.html 参考&#xff1a; https://blog.csdn.net/nirendao/article/details/51607115 QSignalMapper 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject*参数或者QWidget*参数的信号,在具体的项目中…