HTTP解决的问题:构建与解析请求和响应(对应的操作是read和write)
tcp解决的问题:数据的可靠性,效率,什么时候发送,每次发送多少(具体办事还是得看下两层)
IP解决的问题:端到端,将数据经过路由选择,发送到对方主机的过程由IP层负责(可能经过多个IP)
数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输
主机:配有IP地址,但是不进行路由控制的设备
路由器:即配有IP地址,又能进行路由控制
节点:主机和路由器的统称
4位版本号: 指定IP协议的版本,对于IPV4来说,就是4(通常是4,ipv4和ipv6不兼容)
4位首部长度: 表示IP协议的头部长度是多少个32bit(4字节),4位能表示的最大数为15,即首部长度最大为60字节(和TCP类似)
8位服务类型: 前面三个比特位表示优先权,已经弃用了。后面4位TOS字段, 和1位保留字段(必须置为0).
4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个为侧重点. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.
8位协议: 标识传输层使用什么协议,在数据分用的时候,通过该字段决定将有效载荷交给谁(将数据交给响应的协议)
16位总长度: 标识IP数据包的整体长度。
将首部长度读上来,总长度 - 首部长度就是有效载荷长度(分离报头与有效载荷)
16位标识: 表示当前UDP数据包分片是属于哪一个完整的UDP报文,同一个UDP数据包当中的所有分片具有相同的标识
3位标志:由3比特构成,表示包被分片的相关信息。每一位的具体含义请参考下表。
13位片偏移: 用来标识分片在原来数据之中的位置,用于接收方进行组装
由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0。由于FO域占13位,因此最多可以表示8192(=2 13 )个相对位置。单位为8字节,因此最大可表示原始数据8×8192=65536字节的位置 ->UDP最大长度就是2^16字节,因此可以表示UDP的每一个位置
8位生存时间(Time To Live TTL): 数据在传输过程中,允许经过的路由器的个数(TTL也叫跳数)
TCP只会存在于发送端和接收端,网络之中只能看到IP报文。
每经过一个路由器,TTL–; 硬件也有BUG,可能导致循环路由,这样网络中就会存在大量的废弃的游离报文,TTL解决了这些游离报文问题(TTL为0,数据包被丢弃)
16位首部校验和: 使用CRC进行检验,来鉴别头部是否损坏(数据的可靠性是由TCP保证的,所以IP只进行头部的鉴定,不会对数据进行鉴定)
32位源/目的IP地址: 表示发送端和接收端,一般在网络之中是不会改变的
路由查找的基本过程,是先找到目标网络,然后进行报文转发,再找到目标主机,应该根据目的IP进行路由(比如去故宫玩,首先先去北京)
注意事项:
1.每个切片都带有一个ip的头部 -> 比如大小为3000字节的UDP数据包,需要分成三个片进行运输,这是因为有两个20字节的IP头部
2.同一个分片的16位标识都相同
3.在进行重组的时候,通过标志位是否是0,来表示是否重组完成了
4.重组的时候判断数据是否丢失:将偏移量进行排序,然后通过ip报头读取当前的数据长度,当前的偏移量+数据长度 = 下一个数据包的起始位置,如果不是,则表示丢包发生了,一旦丢失一个分片,则整个数据包都被丢弃
5.通过偏移量和最后的标志位判断是否进行了分片,如果这个数据包分片了,那么除了第一个其余的偏移量都不相同,第一个的最后的标志位肯定不为0
IP地址由“网络标识(网络号、网段)” 和"主机标识(主机号、主机地址)"两部分组成
192.168.128.10/24中的“/24”表示从第1位开始到多少位属于网络标识。在这个例子中,192.168.128之前的都是该IP的网络地址
网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现
由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠
IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机
早期IP地址分为四个级别,分别为A类、B类、C类、D类(还有一个一直未使用的E类。) 。它根据IP地址中从第1位到第4位的比特位对其网络标识(标识一个子网络,代表了一堆的ip地址)和主机标识进行区分。
在分配IP地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为0或全部为1。
因为全部为0,只有表示对应的网络地址或IP地址不可获知的情况下才使用。而全部为1的主机地址通常作为广播地址。
因此,在分配过程中,应该去掉这两种情况。这也是为什么C类地址每个网段最多只能有254(2^8-2=254)个主机地址的原因。
CIDR是什么
网络标识相同的计算机必须同属于同一个链路。例如,架构B类IP网络时,理论上一个链路内允许6万5千多台计算机连接。然而,在实际网络架构当中,一般不会有在同一个链路上连接6万5千多台计算机的情况。因此,这种网络结构实际上是不存在的
上述这种直接使用A类或者B类地址的情况,会造成大量的IP被浪费,IP的总数量才2^32,因此,资源形式非常严峻(已经枯竭了),为此需要开发一种新的组合来减少这种浪费 -> 人们开始放弃IP地址的分类作为网络地址,采用用任意长度分割IP地址的网络标识和主机标识。这种方式叫做CIDR
子网掩码是什么:
上面说到,CIDR采用任意长度分割IP地址的网络标识和主机标识,因此引入子网掩码来进行分割
现在,一个IP地址的网络标识和主机标识已不再受限于该地址的类别,而是由一个叫做“子网掩码”的识别码通过子网网络地址细分出比A类、B类、C类更小粒度的网络。这种方式实际上就是将原来A类、B类、C类等分类中的主机地址,部分用作子网地址,可以将原网络分为多个物理网络的一种机制 -> 由固定的网络标识长度,变成了根据新规则进行划分子网(一批网络标识相同的IP地址,就叫做子网)
子网掩码也是一个32位的数字,它对应的IP地址网络标识部分全为1,对应的IP地址主机表示部分全为0
自从引入子网掩码后,一个IP地址有了两种识别码,一种是IP地址本身,另外一种是表示网络部分的子网掩码
因此有:主机号全0,表示的就是网络号,主机号全1,表示的就是广播号地址
最大主机号=子网掩码的反码
网络号=子网掩码 & ip地址
以172.20.100.52的前26位是网络地址的情况为例,以下是其中一种表示方法,它将IP地址与子网掩码的地址分别用两行来表示
另一种表示方式如下所示。它在每个IP地址后面追加网络地址的位数(这种方式也叫“后缀”表示法。) 用“/”隔开。
不难看出,在第二种方式下记述网络地址时可以省略后面的“0”。例如172.20.0.0/16跟172.20/16其实是一个意思(网络标识部分全1,主机号部分全0)
场景模拟:
一个网络之中,当前的网络号为 127.16.99.0,子网掩码为255.255.255.0,现在需要将网络平均划分为4个子网,求每一个子网当中ip地址的范围,以及子网掩码
VLSM:
CIDR被应用到互联网的初期,网络内部采用固定长度的子网掩码机制。也就是说,当子网掩码的长度被设置为/25以后,域内所有的子网掩码都得使用同样的长度。然而,有些部门可能有500台主机,另一些部门可能只有50台主机。如果全部采用统一标准,就难以架构一个高效的网络结构。为此人们提出组织内要使用可变长度的、高效的IP地址分配方式。
于是产生了一种可以随机修改组织内各个部门的子网掩码长度的机制——VLSM(可变长子网掩码)
即是有了上述的CIDR技术,也只是提高了IP地址的利用率,无法改变IP地址缺少的现实,于是需要使用其他的办法,缓解IP地址资源紧张的办法,其中一种就是私有IP地址
它不要求为每一台主机或路由器分配一个固定的IP地址,而是在必要的时候只为相应数量的设备分配唯一的IP地址。尤其对于那些没有连接互联网的独立网络中的主机,只要保证在这个网络内地址唯一,可以不用考虑互联网即可配置相应的IP地址
127.0.0.1 本地回环地址,用来测试网络协议栈
0.0.0.0 一般用于服务端程序,用来表示服务器程序当中所有网卡的IP地址
255.255.255.255:UDP的广播地址,全网广播,DHCP
主机号全为0,表示子网,网络标识
主机号全为1,表示子网,广播号
发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表(Routing Table)。实现IP通信的主机和路由器都必须持有一张这样的表。它们也正是在这个表格的基础上才得以进行数据包发送的。
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP)
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换,属于网络层的协议)
子网掩码
网关
子网