说到关于IP协议,就必须先说IP协议的两个特性:

(一)不可靠性(unreliable)

不可靠性的意思是它不能保证IP数据报能成功地到达目的地,IP所能做的只是提供最好的传输服务,IP有一个简单的错误处理算法:丢弃该数据,然后发送ICMP消息报给信源端,任何的可靠性就必须由上一层的协议来提供。

(二)无连接性(connectionless)

无连接性的意思是IP并不维护任何关于后续的数据报(datagram)的状态信息,数据报之间是平行的互不干涉,IP不维护后续的状态信息。

IP数据报的格式如下图所示:

IP数据报的传输使用的是大尾方式,大尾方式即人们写数据的正常方式,但是在计算机看来这是不正常的,如果你接触过一些机器语言或者一些二进制码的改写就会知道计算机中一般储存数据的方式都是小尾方式,小尾方式通俗地讲即从右向左按字节读/写,更多资料自行百度。

TOS字段分为两个部分3bit的优先权子字段和4bit的服务类型字段和一个1bit的未用位但必须得置0,4bit的TOS分别代表:1.最小时延  2.最大吞吐量  3.最高可靠性和最小费用。4bit中只能置其中的1bit。如果所有的4bit都为0那么就意味着是一般的服务。

总长度字段是指的整个IP数据报的长度,以字节为单位,利用首部长度字段和总长度字段,就可以知道整个IP数据报中包裹的内容的具体的位置和长度。由于该字段的总位数为16,所以IP数据报的长度可达65535字节,IP数据报在链路层因MTU的影响而分片时,该字段的值也就随之变化。标识符字段和分片有关,以后再作详细论述。

总长度字段的必要性:尽管以太网的最小帧的长度为46字节,但是IP数据可能会更短需要填充一些数据来达到最小的长度,如果没有总长度字段,IP层就不会知道46字节中有多少的字节是IP数据报的内容。

TTL是数据报可以经过的路由器的最多数目,他指定了数据报的生存时间,TTL的初始值一般由主机设置,一旦经过一个路由它的数目就将要减去1,当该字段等于0时,数据报就会被丢弃,并发送ICMP报文通知源主机,这也就是IP协议错误检查的简单算法。

首部检验和字段是根据IP首部计算的检验和码,并不对后面的数据进行计算。

IP路由的选择

如果目的主机和源主机直接相连或者都在一个共享网络上(以太网或者令牌环网)那么IP数据报就直接送到目的主机上,否则主机把数据报发往默认路由器上,由该路由器来进行转发,大多数的主机都是采用的这种简单的机制。当今大多数的用户系统包括几乎所有的unix系统,都以配置成一个路由器,我们可以为它指定主机或者简单的路由算法。本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。内含的路由器功能的主机应该从不转发数据报,除非它被设置成那样。

在一般的体制中,IP可以从TCP,UDP,ICMP和IGMP接受数据报(即在本地生成的数据报)并进行发送,或者从一个网络接口接受数据报并进行发送,IP层在内存中有一个路由表。当接受到一份数据报并继续发送的时候,它都要对该表搜索一次,当数据来自某一个网络接口的时候,IP首先检查目的地址是否为本机的IP地址之一或者IP广播地址。如果确实是这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据报的目的地址不是这些地址,则:(1)当IP层被设置为路由器的功能,那么就对数据报进行转发(2)否则数据包就直接被丢弃。

路由表中的每一项都包含下面的这些信息:

(1)目的IP地址,它既可以是一个网络地址,也可以是一个完整的主机地址。

(2)下一站路由器的IP地址

(3)标志,其中一个标志指明IP地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器。

IP路由的选择是逐跳地完成地,从这个路由表信息可以看出。IP并不知道到达任何目的的完整路径。所有的IP路由选择只为数据报传输提供下一站路由器的IP地址,它假定下一站的路由器比发送数据报的主机更接近目的,而且下一站路由器于该主机是直接相连的。

IP路由选择主要完成以下这些功能:

(1)搜索路由表,寻找能与目的IP地址完全匹配的表目,如找到,则把报文送给该表目指定的下一站或直接连接的网络接口。

(2)搜索路由表,寻找能与目的网络号完全匹配的表目,如果找到,就把报文发送给该表目指定的下一站路由器或直接相连的网络接口。目的网络上的所有的主机都可以通过这个表目来进行寻径。

(3)搜索路由,寻找标为“default”的表目,如果找到,则把报文发送给该表目指定的下一个路由器。

(4)如果以上的步骤都没有成功,那么该数据报就不能被传送,会向生成该数据报的应用程序返回一个主机不可达或者网络不可达的错误。

<再看TCP/IP第一卷>关于网络层及协议细节---IP协议的更多相关文章

  1. <再看TCP/IP第一卷>关于网络层及协议细节---IP协议(2)--移动IP及DHCP

    题外话:本来想按照互联网的层级自下向上回顾这些协议的,但是今天实在得破个例,DHCP不得不说! 主机从一个网络迁移到另一个网络,那么IP编址的结构就要发生改变,当今主流有如下几种修改方案: (一)改变 ...

  2. <再看TCP/IP第一卷>关于链路层的知识细节及相关协议

    在TCP/IP协议族中,链路层的主要有三个目的: (1)为IP模块发送和接受数据报 (2)为ARP模块发送ARP请求和接受ARP应答 (3)为RARP发送RARP请求和接受RARP应答 TCP/IP支 ...

  3. <再看TCP/IP第一卷>关于网络层及协议细节---ICMP协议几个要注意的地方

    在TCP/IP协议族中,ICMP协议是一个介于网络层和传输层中间的一个协议,许多材料都会认为ICMP是网络层的一个部分,但是ICMP协议的报头是被包裹在IP协议之中的,而UDP协议又可以被ICMP协议 ...

  4. <再看TCP/IP第一卷>TCP/IP协议族中的最压轴戏----TCP协议及细节

    题外话:刚刚过去的半个月实在是忙得我喘不过来气,虽然手里还压着几个项目得在期末考试之前做完,但是想想还是更新一下随笔,稍微换个心情.另外小吐槽一下那些在博客园里原封不动抄书当随笔的人,唉真是....算 ...

  5. TCP/IP入门(2) --网络层

    /** 本篇博客由 126(127不可用) 2^24 -2 B 2^14 -1 128.1 191.255 2^16 -2 C 2^21 -1 192.0.1 223.255.255 2^8 -2 D ...

  6. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  7. 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)

    一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端   24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器    想体验服务的时候 ...

  8. TCP/IP笔记 二.网络层(1)

    1. IP 1.1 配套协议 IP 是 TCP/IP 体系中两个最主要的协议之一 . 与 IP 协议配套使用的还有四个协议:   (1)ARP (Address Resolution Protocol ...

  9. TCP/IP协议之IP层

    TCP/IP协议的结构参见下图.有应用层,运输层,网络层,链路层. 但是如果更细化的话,其实还有几层没在这上面体现出来. 1 表示层:数据格式化,代码转换,加密. 没有协议 2 会话层:解除或者建立与 ...

随机推荐

  1. Python moni模拟鼠标事件

    7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 4 ...

  2. newlisp HTTP Basic Authentication

    HTTP Basic Authentication原来很easy,參考文档:http://zh.wikipedia.org/wiki/HTTP%E5%9F%BA%E6%9C%AC%E8%AE%A4%E ...

  3. MongoDB下载安装測试及使用

    1.下载安装 64位:mongodb-win32-x86_64-enterprise-windows-64-2.6.4-signed.msi 余数为1的 db.collection.find({ &q ...

  4. git 指令如何撤销一次merge

    在使用git指令时难免会发生错误的merge的情况,那么如何在这种情况下回退到错误发生之前的情况? git reflog 指令显示历史的操作 4457e43 HEAD@{0}: reset: movi ...

  5. 2017.2.7 开涛shiro教程-第六章-Realm及相关对象(二)

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第六章 Realm及相关对象(二) 1.Authenticatio ...

  6. Xcode中的变量模板(variable template)的使用方法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 你可能常常会写一些小的代码片段,里面自然少不了一些关键的变量. ...

  7. C++里面定时器的使用

    说白了就是三个函数的使用: SetTimer(20, 20, 0); //第一个20表示此定时器的标识符,第二个20表示你要定的时间,第三个不用管,设0即可. void CLMS511_interfa ...

  8. 百度Echart3

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

  9. windows下rsync部署安装

    windows下rsync部署安装 2012-06-05 12:06:13|  分类: 系统 |  标签:rsync  windows   |字号 订阅   rsync在windows与windows ...

  10. CXF webservice 一个简单的demo

    新建一个maven项目(or下载cxf所需jar包),pom.xml如下 1.pom.xml <project xmlns="http://maven.apache.org/POM/4 ...