说到关于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. iOS for循环创建button,button的宽度依据上面的文字来自适应.

    近期须要使用一个标签页,寻思自己写一个demo. 标签的大小依据上面的文字来自适应大小,须要依据后台返回的数据自己主动换行.没有加入 NSArray *arr = @[@"无知", ...

  2. zabbix学习系列之触发器

    触发器的简介 监控项仅负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正式 用于为监控项所收集的数据定义阈值 每一个触发器 ...

  3. swfit各种Function表现形式

    //: Playground - noun: a place where people can play import UIKit //多返回值函数 func countss(string: Stri ...

  4. POJ 3254 Corn Fields 状态压缩

    这题对我真的非常难.实在做不出来,就去百度了,搜到了一种状压DP的方法.这是第一种 详细见凝视 #include <cstdio> #include <cstring> #in ...

  5. apache默认路径

    读启动文件 /etc/inid.d/httpd 默认web路径 /var/www/html inux下Apache PHP MYSQL 默认安装路径 apache:如果采用RPM包安装,安装路径应在 ...

  6. js传递默认形参

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. Backup and Recovery Basics2

    1.6.Automatic Disk-Based Backup and Recovery: The Flash Recovery Area 创建不同备份和恢复文件的组件对每一个文件系统的大小没有不论什 ...

  8. 利用php调用so库文件中的代码

    某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数.下面做一个简单的例子,使 ...

  9. 高阶函数:sorted

    排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的 ...

  10. cocos2d-x-3.1 国际化strings.xml解决乱码问题 (coco2d-x 学习笔记四)

    今天写程序的时候发现输出文字乱码,尽管在实际开发中把字符串写在代码里是不好的做法.可是有时候也是为了方便,遇到此问题第一时间在脑子里面联想到android下的strings.xml来做国际化.本文就仅 ...