浅谈
TCP/IP 协议栈
- TCP/IP协议栈概述
互联网早期时,尽管知道计算机连接的原理,但是没有协议的时候,就没有办法进行大规模的通信使用。当时就衍生出了很多为了解决当时问题的协议,像TCP协议就是为了约定大家使用TCP连接时传输的一种协议,HTTP协议则是为了约定文本传输的一种协议。
而TCP/IP协议并不是指某一个具体的协议,它是指代一系列的协议栈,因此也叫TCP/IP协议栈或者TCP/IP协议簇。
所以广义上,我们说的TCP/IP指的是4层的总和。 而狭义上来说,指的是4层中的传输层和网络层。
在TCP/IP协议栈中每一层都有对应的协议,最终组成协议栈。
网络协议的特征
运行于 OSI 网络层,是面向无连接的协议,可以独立处理数据包,具有分层编址,尽力而为传输,无数据恢复的功能。
TCP/IP协议栈 被分作这么多的层级,目的是为了整理硬件间通信时的一个通用的模型,因此它们每一层都和其上下层有关联性的,如下图:
IP协议
IP协议处于TCP/IP协议簇的网络互联层。它提供不可靠、无连接的服务,也即依赖其他层的协议进行差错控制。在局域网环境,IP协议往往被封装在以太网帧中传送。而所有的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送。
在IP协议中,有两个重要的内容需要了解下。一是IP地址的概念,二是IP协议的报头。
- IP协议的包头
版本:占4位,指 IP 协议的版本目前的IP协议版本号为4
首部长度:占4位,可表示的最大数值是15个单位,一个单位为4字节,因此IP 的首部长度的最大值是60字节
总长度:占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535 字节.总长度必须不超过最大传送单元 MTU
标识:占16位,它是一个计数器,通常,每发送一个报文,该值会加1, 也用于数据包分片,在同一个包的若干分片中,该值是相同的
标志(flag):占3位,目前只有后两位有意义
DF: Don’t Fragment 中间的一位,只有当 DF=0 时才允许分片
MF: More Fragment 最后一位,MF=1表示后面还有分片,MF=0 表示最后一个分片
片偏移:占13位,指较长的分组在分片后,该分片在原分组中的相对位置.片偏移以8个字节为偏移单位
生存时间:占8位,记为TTL (Time To Live) 数据报在网络中可通过的路由器数的最大值,TTL 字段是由发送端初始设置一个 8 bit字段.推荐的初始值由分配数字RFC 指定,当前值为 64.发送 ICMP 回显应答时经常把 TTL 设为最大值 255
协议:占8位,指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据
部分上交给哪个处理过程, 1表示为 ICMP 协议, 2表示为 IGMP 协议, 6表示为
TCP 协议, 17表示为 UDP 协议
首部检验和:占16位,只检验数据报的首部不检验数据部分.这里不采用 CRC 检验
码而采用简单的计算方法
源地址和目的地址:都各占4字节,分别记录源地址和目的地址
-
IP地址的特性
- 它们可唯一标识 IP 网络中的每台设备
- 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址
- IP地址由两部分组成
• 网络ID:
1.标识网络
2.每个网段分配一个网络ID
• 主机 ID:
• 标识单个主机
• 由组织分配给各设备
-
IPv4地址格式:点分十进制记法
-
IP地址分类
-
计算公式如下:
- 一个网络的最多的主机数=2^主机ID位数-2
- 网络(段)数=2^网络ID中可变的位数
- 网络ID=IP与netmask
- CIDR无类域间路由表示法:IP/网络ID位数
- 判断对方主机是否在同一个网段:用自已的子网掩码分别和自已的IP及对方的IP相与,比较结果,相同则同一网络,不同则不同网段
A类:
0 000 0000 - 0 111 1111: 1-127
网络数:126, 127
每个网络中的主机数:2^24-2
默认子网掩码:255.0.0.0
私网地址:10.0.0.0
B类:
10 00 0000 - 10 11 1111:128-191
网络数:2^14
每个网络中的主机数:2^16-2
默认子网掩码:255.255.0.0
私网地址:172.16.0.0-172.31.0.0
C类:
110 0 0000 - 110 1 1111: 192-223
网络数:2^21
每个网络中的主机数:2^8-2
默认子网掩码:255.255.255.0
私网地址:192.168.0.0-192.168.255.0
D类:组播
1110 0000 - 1110 1111: 224-239
-
公有IP地址
-
私有IP地址
-
特殊地址
- 0.0.0.0
0.0.0.0不是一个真正意义上的IP地址。它表示所有不清楚的主机和目的网络 - 255.255.255.255
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机 - 127.0.0.1~127.255.255.254
本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包 - 224.0.0.0到239.255.255.255
组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器。224.0.0.5指OSPF路由器,地址多用于一些特定的程序以及多媒体程序 - 169.254.x.x
如果Windows主机使用了DHCP自动分配IP地址,而又无法从DHCP服务器获取地
址,系统会为主机分配这样地址
- 0.0.0.0
-
保留地址
子网掩码
子网掩码有自己的特性,可以多种自由变化,是用来确认网络ID的具体位数,它是一个32位进制的数字,它规则是:对应的网络ID为1,而对应的IP中主机的地址为0。
子网掩码的作用有以下几种:
-
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据
子网掩码之所以要求“1”和“0”必须都是连续的,是为了让子网掩码与IP地址做按位与运算时用“0”遮住原主机数,而不改变原网络号数字,此时若得出两个IP地址的网络号相同,那么就表明属于同一子网;而且这种方式很容易通过“0”的位数确定子网的主机数(2的主机位数次方-2,因为主机号全为“1”时表示该网络广播地址,全为0时表示该网络的网络地址,这是两个特殊地址)。只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作 -
子网掩码用于将一个大的IP网络划分为若干小的子网络,减少IP地址的浪费。
互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。随着互联网的发展,越来越多的网络产生,网络中的计算机有的多则几百台,有的只有区区几台,这样就浪费了很多IP地址,因此要划分子网,提高网络应用的效率。 -
子网掩码一共分为两类:
-
标准子网掩码,也叫做缺省(自动生成)子网掩码,即未划分子网,对应的网络号的位都置1,主机号都置0。
转换为十进制为:
A类网络缺省子网掩码: 255.0.0.0,用CIDR表示为/8
B类网络缺省子网掩码: 255.255.0.0,用CIDR表示为/16
C类网络缺省子网掩码: 255.255.255.0,用CIDR表示为/24
-
非标准子网掩码,也叫做自定义子网掩码
是将一个网络划分为几个子网,需要每一段使用不同的网络号或子网号,将一个网络划分子网后,把原本的主机号位置的一部分给了子网号,余下的才是给了子网的主机号实际上可以认为是将主机号分为两个部分:子网号、子网主机号。
做子网划分后的IP地址:网络号+子网号+子网主机号
如:192.168.1.100/25,其子网掩码表示:255.255.255.128意思就是将192.168.1.0这个网段的主机位的最高1位划分为了子网。
-
-
可变的子网掩码
如何根据IP地址和子网掩码,计算网关地址:
-
①、将IP地址与子网掩码转换成二进制数。
-
②、将二进制形式的 IP 地址与子网掩码做“与”运算。
-
③、将得出的结果转化为十进制,便得到网络地址。
网络地址计算小技巧: IP地址和子网掩码做与运算,把IP地址的主机位直接归0,就快速得到网络地址。所以只要一看到IP地址和子网掩码,就能马上确认网络地址。
- 子网掩码的8位图
ICMP协议
-
IP协议有两个非常明显的缺点
- 缺少差错控制或者叫差错纠正机制。
如果IP协议在通讯过程中出现了各种各样的错误,那应该怎么办呢? 出现了差错而IP协议没有内建的机制可以通知发出改数据报文的主机。 - 缺少一种主机和管理查询的机制
主机有时候需要确定是否一个路由器或另一个主机是活跃的。
有时候网络管理员需要从另一个主机或路由器得到信息。
- 缺少差错控制或者叫差错纠正机制。
-
ICMP协议又叫网际控制报文协议,它是为了补偿IP协议上述的两个缺点而设计的,它是配合IP协议使用的。
ICMP可以发送以下常见的差错报告报文和查询报文,用来支持不可靠的和无连接的网际协议(IP).
-
终点不可达(Type=3)
IP路由器无法将IP数据报发送给目的地址时,会给发送端主机返回一个终点不可达ICMP消息。例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。 -
时间超过
超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。
IP 数据包中有一个字段TTL(Time to live,生存周期),它的值随着每经过一个路由器就会减1,当路由器收到生存时间TTL为零的数据报时,除丢弃该数据报外,还要向源站发送时间超过报文。当目的站在预先规定的时间内不能收到一个数据报的全部数据报片时,就将已收到的数据报片都丢弃,并向源站发送时间超过报文。 -
参数问题
当路由器或目的主机收到的数据报的首部中的字段的值不正确时,就丢弃该数据报,并向源站发送参数问题报文。 -
改变路由(重定向)
如果路由器发现发送端主机使用次优的路径发送数据时,那么它会返回一个ICMP 重定向消息给这个主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个ICMP 重定向消息给发送端主机一个更合适的发送路由。
-
-
以下几种情况都不会导致产生ICMP差错报文:
- ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文);
- 目的地址是广播地址或多播地址的IP数据报;
- 作为链路层广播的数据报;
- 不是IP分片的第一片;
- 源地址不是单个主机的数据报。即源地址不能为零地址、环回地址、广播地址或多播地址
这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。所有的ICMP差错报告报文中的数据字段都具有同样的格式。将收到的需要进行差错报告IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上响应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。
- 询问报文
- 回送消息
用于进行通信的主机或路由之间,判断发送数据包是否成功到达对端的消息。可以向对端主机发送回送请求消息,也可以接收对端主机回来的回送应答消息。
我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在。
- 时间戳消息
时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。
- 回送消息
ICMP的应用
-
Ping
ping是一个用来查询网络通不通的一个工具,是系统自带的,运行于内核,调用ICMP协议。ping的工作原理:ping通过调用echo来发送请求,通过是否收到echo-reply来查询网络层的连通性。ping的结果会给出传送的时间和TTL的数据,还可以查看主机到目的主机的路由。这是因为ICMP的ping请求数据报在每经过一个路由器的时候,路由器就会把自己的IP地址放到该数据包中,而目的主机则会把这个IP列表复制到ICMP数据包中发回给主机。但是,IP头能记录的路由列表非常有限,如果要观看完整的路由信息,就要用到traceroute工具了。
-
traceroute
traceroute是用来侦测主机到目的主机所经路由情况的工具,可以获取到所经路由器的IP地址。traceroute的工作原理:它收到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动将TTL减1。而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个主机不可达的ICMP数据包给主机。主机收到这个数据包以后就发送一个TTL=2的数据包给主机,然后刺激第二个路由器给主机发送ICMP数据包,如此反复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP,从而避免了IP头只能记录有限的路由IP的问题。