TCP/IP协议族中最核心的协议,提供不可靠、无连接的数据报传输服务。

·        不可靠:不能保证IP数据报能成功送达。

·        无连接:并不维护后续数据报的状态信息,每个数据报的处理都是相互独立。数据报可能不会按照发送顺序接收。同一站点向另一站点发送的多个数据报可能经过不同的路由到达。

帧格式

IP数据报格式如下。

IP包头字段说明

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

包 头长度(IHL):4位,IP协议包头的长度,指明IPv4协议包头长度的字节数包含多少个32位。由于IPv4的包头可能包含可变数量的可选 项,所以这个字段可以用来确定IPv4数据报中数据部分的偏移位置。IPv4包头的最小长度是20个字节,因此IHL这个字段的最小值用十进制表示就是5 (5x4 = 20字节)。就是说,它表示的是包头的总字节数是4字节的倍数。

IP协议包头最长:20+40 = 60字节  正好等于:15*4 = 60

服务类型:定义IP协议包的处理方法,它包含如下子字段

过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)

延迟字段:1位,取值:0(正常)、1(期特低的延迟)

流量字段:1位,取值:0(正常)、1(期特高的流量)

可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)

成本字段:1位,取值:0(正常)、1(期特最小成本)

未使用:1位

长度:IP包的总长

认证:

标志:是一个3位的控制字段,包含:

保留位:1位

不分段位:1位,取值:0(允许数据报分段)、1(数据报不能分段)

更多段位:1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)

段偏移量:当数据分组时,它和更多段位(MF, More fragments)进行连接,帮助目的主机将分段的包组合。

TTL:表示数据包在网络上生存多久,每通过一个路由器该值减一,为0时将被路由器丢弃。

协议:8位,这个字段定义了IP数据报的数据部分使用的协议类型。常用的协议及其十进制数值包括ICMP(1)、TCP(6)、UDP(17)。

校验和:16位,是IPv4数据报包头的校验和。

源IP地址:

目的IP地址:

选项(IP Options):本书不讨论。

填充(Padding):当IP报文头长度不是32比特的整数倍时,填充0来凑齐32比特整数倍,没有实际意义。

数据(Data):来自第4层的数据段。


IPv4的头部结构如图2-1所示。其长度通常为20字节,除非含有可变长的选项部分。

4位版本号(version)指定IP协议的版本。对IPv4来说,其值是4。其他IPv4协议的扩展版本(如SIP协议和PIP协议),则具有不同的版本号(它们的头部结构也和图2-1不同)。

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

8位服务类型(Type Of Service,TOS)包括一个3位的优先权字段(现在已经被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延 时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登录程序需要的是 最小延时的服务,而文件传输程序ftp则需要最大吞吐量的服务。

16位总长度(total length)是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535(216-1)字节。但由于MTU的限制,长度超过MTU 的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。接下来的3个字段则描述了如何实现分片。

16位标识(identification)唯一地标识主机发送的每一个数据报。其初始值由系统随机生成;每发送一个数据报,其值就加1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。

3位标志字段的第一位保留。第二位(Don’t Fragment,DF)表示“禁止分片”。如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模 块将丢弃该数据报并返回一个ICMP差错报文。第三位(More Fragment,MF)表示“更多分片”。除了数据报的最后一个分片外,其他分片都要把它置1。

13位分片偏移(fragmentation offset)是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分 片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值)。

8位生存时间(Time To Live,TTL)是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。

8位协议(protocol)用来区分上层协议,我们在第1章讨论过。/etc/protocols文件定义了所有上层协议对应的protocol 字段的数值。其中,ICMP是1,TCP是6,UDP是17。/etc/protocols文件是RFC 1700的一个子集。

16位头部校验和(header checksum)由发送端填充,接收端对其使用CRC算法以检验IP数据报头部(注意,仅检验头部)在传输过程中是否损坏。

32位的源端IP地址和目的端IP地址用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。关于这一点,我们将在第4章进一步讨论。

IPv4最后一个选项字段(option)是可变长的可选信息。这部分最多包含40字节,因为IP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。可用的IP选项包括:

记录路由(record route),告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样我们就可以跟踪数据报的传递路径。

时间戳(timestamp),告诉每个路由器都将数据报被转发的时间(或时间与IP地址对)填入IP头部的选项部分,这样就可以测量途经路由之间数据报传输的时间。

松散源路由选择(loose source routing),指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器。

严格源路由选择(strict source routing),和松散源路由选择类似,不过数据报只能经过被指定的路由器。

关于IP头部选项字段更详细的信息,请参考IP协议的标准文档RFC 791。不过这些选项字段很少被使用,使用松散源路由选择和严格源路由选择选项的例子大概仅有traceroute程序。此外,作为记录路由IP选项的替 代品,traceroute程序使用UDP报文和ICMP报文实现了更可靠的记录路由功能,详情请参考文档RFC 1393。


IP路由选择

对于主机,如果目的主机和源主机直接相连,或者处于同一个网络中,IP数据报就直接发送到目的主机。否则,主机将数据报发送给默认的路由器,由路由器来转发包。

IP层可以配置成路由器的功能,也可以配置成主机功能。区别是,主机不转发数据报,而路由器需要转发包。

IP层在内存中都有一个路由表,当收到数据报进行发送时,都要搜索该表。

路由表每项包含的信息:

·        目的IP地址。可以是主机地址,也可以是网络地址,由下述的标志来标示。

·        下一跳路由器的IP地址,或者是直接连接的接口。

·        标志。一个标志标示目的IP是网路地址还是主机地址,另一个标志指示下一站路由器是否为真正的下一站路由器,还是一个直连的接口。

·        为数据报的传输指定一个网络接口。

IP路由选择主要完成下面的功能:

1) 搜索路由表,寻找与目的IP完全匹配的条目。如果找到,则把报文发给下一站路由或者直连接口(取决于标志字段的值)

2) 搜索路由表,寻找与目的网络号匹配的条目。找到的处理同上。这种搜索网络的匹配方法必须考虑可能的子网掩码。

3) 搜索路由表,寻找标为“默认(default).类似192.168.0.1”的条目。如果找到,处理同上。

如果上述都没成功,则丢弃该包,并返回主机不可达或者网络不可达的错误。

数据包在传输过程中,经过不同的链路层或不同的网络会构造不同的链路层首部,但是IP部分不会更改(忽略路由器的NAT功能)。链路层的目的地址(如果有的话),始终是下一站的链路层地址。

子网寻址

最早:IP地址 = 网络号 + 主机号

子网编址:IP地址 = 网络号 + 子网号 + 主机号

子网对于子网以外的路由器都是透明的,对于子网内部的路由器不透明。

RFC 1009允许含有子网的一个网络使用多个子网掩码。

IP地址编址方案:将IP地址划分为A,B,C,D,E五类,其中A,B,C为基本类,D,E类作为多播和保留使用。

网络类别

最大网络数

IP地址范围

最大主机数

私有IP地址范围

A

126(2^7-2)

1.0.0.0--126.255.255.255

16777214

10.0.0.0--10.255.255.255

B

16384(2^14)

128.0.0.0--191.255.255.255

65534

172.16.0.0--172.31.255.255

C

2097152(2^21)

192.0.0.0--223.255.255.255

254

192.168.0.0--192.168.255.255

内部私有地址:

A类 10.0.0.0--10.255.255.255

B类 172.16.0.0--172.31.255.255

C类 192.168.0.0--192.168.255.255

特殊的IP地址:

0表示所有的比特为0,-1表示所有的比特位全为1,netid、subnetid和hostid分别表示不为全0或全1的对应字段。子网号栏为空表示该地址没有进行子网划分。

一、概念 
  将IP地址中的主机号再分成一个子网号和主机号。而不是把IP地址看成单纯的网络号+主机号。举例来说:一个B类网络地址,网络位为16位,主机位为16位。若划分子网则需要对这16主机位继续进行划分,比如在这16bit中将8bit用于子网号,8bit用于主机号,那么就允许有254个子网,每个子网可以有254台主机(由于全0或全1的主机号都是无效的,因此为256-2=254)。

二、特点 
  子网对外部路由器来说隐藏了内部网络组织的细节。比如在一个所有IP地址都有一个B类网络号140.252的网络例子中,划分30个子网(140.252.1.X~140.252.30.X),每个子网上拥有一定数量的主机。与直接使用30个C类地址相比,使用子网寻址功能的好处就是可以缩小Internet路由表的规模。B类地址140.252被划分成子网对除了140.252子网之外的Internet路由器来说都是透明的。如果这里最终访问外部Internet的地址是通过 gateway IP地址140.252.104.1进行的,那么为了到达任何以140.252开头的主机,外部路由器仅需要知道到达IP地址140.252.104.1的路径,这意味着对于整个140.252网络仅需要一条路由表项。而不是像30个C类地址需要30个路由表项那样。

PS: 子网划分对于子网内的路由器是不透明的。至于如何到达路径,则是根据IP路由选择进行的。

IP地址

每个计算机必须有一个 IP 地址才能够连入因特网。

每个IP 包必须有一个地址才能够发送到另一台计算机。

IP标识网络中的节点主机,端口号标识节点主机的进程。


IP 地址包含 4 组数字:

TCP/IP 使用 4 组数字来为计算机编址。每个计算机必须有一个唯一的 4 组数字的地址。

每组数字必须在 0 到 255 之间,并由点号隔开,比如:192.168.1.60。


32 比特 = 4 字节

TCP/IP 使用 32 个比特来编址。一个计算机字节是 8 比特。所以 TCP/IP 使用了 4 个字节。

一个计算机字节可以包含 256 个不同的值:

00000000、00000001、00000010、00000011、00000100、00000101、00000110、00000111、00001000....... 直到 11111111。

现在,您应该知道了为什么 TCP/IP 地址是介于 0 到255 之间的 4 组数字。


IP V6

IPv6 是 "Internet Protocol Version 6" 的缩写,也被称作下一代互联网协议,它是由 IETF 小组(Internet 工程任务组Internet Engineering Task Force)设计的用来替代现行的IPv4(现行的)协议的一种新的 IP 协议。

我们知道,Internet 的主机都有一个唯一的 IP 地址,IP 地址用一个 32 位二进制的数表示一个主机号码,但 32 位地址资源有限,已经不能满足用户的需求了,因此 Internet 研究组织发布新的主机标识方法,即 IPv6。

在RFC1884 中(RFC 是 Request forComments document 的缩写。RFC 实际上就是Internet 有关服务的一些标准),规定的标准语法建议把 IPv6 地址的 128 位(16 个字节)写成 8 个 16 位的无符号整数,每个整数用 4 个十六进制位表示,这些数之间用冒号(:)分开,例如:3ffe:3201:1401:1280:c8ff:fe4d::db39。


域名

12 个阿拉伯数字很难记忆。使用一个名称更容易。

用于 TCP/IP 地址的名字被称为域名。w3cschool.cc 就是一个域名。

当你键入一个像 http://www.w3cschool.cc 这样的域名,域名会被一种 DNS 程序翻译为数字。

在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。

当一个新的域名连同其 TCP/IP 地址一起注册后,全世界的 DNS 服务器都会对此信息进行更新。

网络:IP协议与寻址相关推荐

  1. Linux网络-IP协议

    文章目录 零.前言 一.网络层 理解路由选择 二.IP协议 三.网段划分 四.IP地址数量限制 五.私有和公网IP地址 NAT技术 六.路由 零.前言 本章主要讲解学习网络层的作用, 深入理解IP协议 ...

  2. 网络-IP协议详解(报文格式、分类、NAT、子网、CIDR、抓包分析)

    目录 简介 报文格式 IPv4地址 分类 网络地址转换NAT 子网划分与子网掩码 CIDR 实战 参考 简介 IP(网际互连协议,Internet Protocol)是TCP/IP协议族中最为核心的协 ...

  3. TCP/IP协议簇简介

    参考: https://blog.csdn.net/wuzhiwei549/article/details/105965493 https://blog.csdn.net/weixin_4419896 ...

  4. 网络层IP协议—ipv4

    什么是IP协议? IP 协议(Internet Protocol)是一个处于垄断地位的网络层协议. IPv4 就是 IP 协议的第 4 个版本,是目前互联网的主要网络层协议.IPv4 为传输层提供 H ...

  5. 计算机网络-网络层篇-IP协议

    目录 虚拟互连网络 IP地址 回顾一下 IP协议的转发流程 虚拟互连网络 实际的计算机网络是错综复杂的 物理设备通过使用IP协议,屏蔽了物理网络之间的差异 当网络中的主机使用IP协议连接时,则无需关注 ...

  6. 网络协议——TCP/IP协议

    简介: TCP(传输控制协议)和 IP(网际协议)是两个独立且紧密结合的协议,负责管理和引导数据报文在 Internet上的传输.二者使用专门的报文头定义每个报文的内容.TCP 负责和远程主机的连接, ...

  7. 网络编程基础之C/S架构和TCP/IP协议

    一.何谓C/S架构 C指的是client(客户端软件),S指的是Server(服务端软件),既然我们的的标题是网络编程基础, 那我们就一起来学习怎样写一个C/S架构的软件,实现服务端与客户端软件基于网 ...

  8. 网络基础知识-TCP/IP协议各层详解

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

  9. 网络编程-TCP/IP协议栈-IP协议

    协议 协议就是约定的一种规则,例如扑克游戏中约定好的各种规则,2<3<4<5<-等,以此作为游戏规则.当所有人都遵循这个规则,那么久可以不需要任何多余的交流就可以进行游戏,这个 ...

最新文章

  1. android仿ios城市选择,Android 省市区三级联动选择器(仿iOS滚轮实现)
  2. 2016/07/11 常用正则表达式大全 (转)
  3. baseline发布!OPPO安全AI挑战赛,人脸识别对抗攻击赛题详解
  4. XVII Open Cup named after E.V. Pankratiev. GP of Tatarstan
  5. php定时某个时间循环做,PHP定时循环执行脚本
  6. 阿尔法贝塔阀原理_图总结 - 阿尔法个贝塔 - 博客园
  7. 百度地图SDK使用注意其代理的处理
  8. java数据类型double保留两位小数
  9. 如何删除github上的文件
  10. 手把手教你进行R语言的安装及安装过程中相关问题解决方案...
  11. DragSortListView可拖拽ListView的注意事项
  12. 软考:软件设计师(历年真题汇总)|希赛网
  13. postman接口测试
  14. 使用JFlash往Nordic nRF系列芯片烧写程序
  15. JavaScript:实现PigeonHoleSort鸽巢排序算法(附完整源码)
  16. 计算机硬盘电源接口,硬盘电源接口图解
  17. 程序员土豆原创诗四首回顾
  18. miui11升级鸿蒙,MIUI11稳定版首批推送来了 12款小米机型可升级
  19. vue导出excel文件损坏
  20. Booth(布斯)算法——补码乘法运算过程

热门文章

  1. 在VMware上装苹果系统后全屏
  2. SQL Server 监控统计阻塞脚本信息
  3. Android官方网站
  4. 高考题(可作为试讲资料)
  5. 深入浅出UML类图(四)
  6. 使用元数据设计测试用例
  7. 配置SQL Server 2005 远程连接(转)
  8. OSPF邻接形成过程
  9. 管道命令和xargs的区别(经典解释)
  10. 关于整型数据符号位扩展的问题