linux【网络编程】IP协议

IP协议概念

TCP+IP:将数据从A主机可靠的 跨网络 传输到B主机
在这里插入图片描述

主机: 配有IP地址, 但是不进行路由控制的设备;
路由器: 即配有IP地址, 又能进行路由控制;
节点: 主机和路由器的统称

IP协议格式

在这里插入图片描述

4位版本

4位版本填的是ipv4,代表ipv4【ipv6和ipv4是不兼容的】
ipv4—32位;ipv6–128位

四位首部长度–报头和有效载荷分离

和TCP协议一样,IP协议的四位首部长度代表报头总长度=4位首部长度*4字节(报头总长度的范围是20-60字节)

16位总长度(解包)

四位首部长度解决了报头大小,如何获取有效载荷的大小呢?

16位总长度表示IP数据报整体占多少个字节;IP协议的16位总长度包含报头和有效载荷,所以可以通过16位总长度大小减去报头大小,即可得到有效载荷的长度(对于网络层来说,它的有效载荷是传输层给的报文)

ip面向数据包,向上交付的时候需要明确交付多少数据

8位协议–向上交付(分用)

8位协议中写了传输层的协议编号,这样向上交付时IP协议就知道自己要将有效载荷交给上层的哪一个协议了

8位服务类型

3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)
4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要

8位生存时间

报文在网络传递的过程中,一旦报文从主机发出,便不再受主机控制了。报文会在一个个路由器之间进行传递,可能会出现环路转发等问题,如果不给路由器丢弃报文的权利,那么这条报文将会在环路中被循环转发,白白占用网络资源。

IP协议的8位生存时间规定了这条数据报到达目的地的最大跳数,一般是64。(每次经过一个路由, TTL减减 ,减到0直接将报文丢弃)

16位首部校验和

使用CRC进行校验, 分片组装之后来鉴别头部是否损坏,如果损坏,丢弃,TCP重新补发,否则交付上层,让TCP16位校验和校验整个TCP报文是否损坏

32位源地址和32位目标地址

表示发送端和接收端

16位标识

16位标识(id): 唯一的标识主机发送的报文. 如果IP报文大于数据链路层的最大传输单元MTU(1500),导致IP层进行分片, 那么每一个片里面的这个id都是相同的。

3位标志

3位标志字段:
第一位保留(保留的意思是暂未使用,备用)
第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文.
第三位表示"更多分片":为1表示“后面还有分片”,为0表示自己是最后一个分片,类似于一个结束的标记

最大MTU较小的路由器更适合小容量的有效载荷通过,速度较快。

13位片偏移

是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片
在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)

报文分片+组装

16位标识,3位标志,13位片偏移来负责报文分片。

数据链路层的MAC帧协议规定自己的有效载荷不能超过1500字节(MTU:最大传送单元,可以修改),这1500个字节限制ip数据包有时需要分片传输。

数据包的大小由传输层能控制,但有时超过1500字节,只能让IP协议进行分片与组装来解决,发送端IP层进行分片,每一个分片都会有IP报头,对端IP层进行组装(分片会增加丢包概率)。TCP和MAC帧并不关心IP对数据包进行了分片和组装,这仅仅是IP层自己的行为


携带源IP的报文具有了区分不同主机的能力
如何知道分片?
开始报文:更多分片为1,片偏移为0
中间报文:更多分片为1,片偏移>0
结束报文:更多分片为0,片偏移>0
独立完整的报文:更多分片为0,片偏移为0


分片收全:根据已上报文类型,头尾丢失可以知道,对于中间报文,按偏移量排序就行

组装正确:IP首部校验和(保证不会因分片而导致首部出问题)+TCP校验和(校验交付给上层的TCP报文)共同决定

报文丢失补发:如果因为分片导致某一片报文丢失,就会造成组装失败。TCP会重新为IP层补发一个完整的报文


不考虑选项的情况下,为了避免分片过多导致丢包率增加,应该让TCP数据不能发过大数据,最好是MSS(最大段尺寸)
这也解释了TCP滑动窗口为什么不能当成一片报文直接发送,要分成多片也就是滑动发送,因为MSS约束着
在这里插入图片描述
udp才可能需要分片传输
tcp一定不需要分片传输的
TCP分段后,在传输层,根据TCP报文中的序列号和mss值将分段后的数据包排好顺序完成重组。当数据包发生TCP分片后,数据包的大小必然小于MTU,因此TCP报文是不会产生IP分片的,而UDP报文没有MSS,因此产生IP分片的报文必然是UDP报文

网段划分

IP地址共32位,分为两个部分【网络号和主机号】
网络号: 保证相互连接的两个网段具有不同的标识(例如:学校里不同的学院有不同的编号)

主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号(学院里不同的学生)

子网划分的意义

互联网中的每一台主机,都必须隶属于某一个子网,这是为了方便定位这台主机。主机A向主机B发送数据,数据报在经过路由器时,会选择正确的网络号,瞬间排除了大量的IP地址,大大提升了查找效率

规则

在这里插入图片描述

  • 路由器也是一台小型计算机,负责构建一个子网
  • 不同的子网其实就是把网络号相同的主机放到一起.
  • 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复

有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器

像我们连接WiFi,就是向路由器申请一个IP地址

网络号主机号划分方案一

在这里插入图片描述
A类 0.0.0.0到127.255.255.255

B类 128.0.0.0到191.255.255.255

C类 192.0.0.0到223.255.255.255

D类 224.0.0.0到239.255.255.255

E类 240.0.0.0到247.255.255.255

这种划分方式是不合理的,例如A类IP地址,网络号就只有7位,但是主机号有24位,一个子网下面有这么多主机的场景不多,造成了A类地址被大量浪费;而B类地址是比较合理的,这就造成了大多数的组织申请的是B类地址,使得B类地址早早地被分配完毕。

针对这种不合理的划分方案,人们又提出了一种新的划分方案CIDR(Classless Interdomain Routing)

无类域间路由选择CIDR

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号:
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

在这里插入图片描述

  1. IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;
  2. IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0

特殊的IP地址

将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

IP地址数量限制

IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址.这意味着, 一共只有43亿台主机能接入网络么?
实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个IP地址.
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

  1. 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
  2. NAT技术(后面会重点介绍);
  3. IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

私有IP和公网IP

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65,536个地址
    包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP)

在这里插入图片描述

1)一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP)
2)路由器LAN口连接的主机, 都从属于当前这个路由器的子网中
3)不同的路由器, 子网IP其实都是一样的(家用通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了(如上图中三台家用路由器子网ip一样,WAN口IP不一样)
4)每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了
5)子网内的主机需要和外网进行通信时, 路由器将IP首部中的源IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的源IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换

路由

路由器要级联多个子网,那么,路由器内部一定有一张路由表,用来记录每一个子网号和子网掩码

路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程。

所谓 “一跳” 就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间
在这里插入图片描述
IP数据包的传输过程也和问路一样:

1)当IP数据包, 到达路由器时, 路由器会先查看目的IP

2)路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器。一直到达目标IP地址
一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关

3)通过路由表来判定这个数据包应该发送到哪里

路由表的查看

[wmh@VM-24-5-centos ~]$ route
Kernel IP routing table
目标网络			下一跳(网关)	子网掩码		     使用状态			哪个接口
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0#默认网关
10.0.24.0       0.0.0.0         255.255.252.0   U     0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eth0

如果一个IP数据包目的IP为10.0.24.0

  1. 遍历路由表
  2. 目的IP按位与路由表配置的子网掩码,确定该数据包要去的目标网络
  3. 将&出来的结果和对应子网掩码的目标网络进行比较,是否一样
  4. 如果一样,这个目标网络就是下一跳的目的地。
  5. 如果遍历找不到目标网络,下一跳的目的地就是该路由器配置的默认网关
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值