(Linux)网络基础- - - 网络层(IP协议)、链路层

文章目录

  • 网络层(IP协议)
      • 地址管理
        • 特殊的IP地址:
        • 公网 / 外网 与 私网 / 内网:
        • 路由选择
  • 链路层
      • 其它的典型协议与技术:DNS / ICMP /NAT /NAPT /代理
        • DNS
        • ICMP协议:网络层协议,用于进行网络探测。
        • NAT/NATP服务:网络地址转换服务
        • 代理服务

网络层(IP协议)

负责地址管理与路由选择(为每一条网络中的数据根据想去的地方选择合适的路径)

IP协议格式
(Linux)网络基础- - - 网络层(IP协议)、链路层_第1张图片

  • 4位版本号:IPV4 / IPV6;
  • 4位首部长度:标识IP报头有多长,以4字节为单位(最小20字节/最大60字节);
  • 8位服务类型:3位弃用 / 1位置0,4位TOS字段- - -最大吞吐量 / 最小成本 /最高可靠性 / 最小延时;
  • 16位数据报长度:限制了一个完整的IP报文最大长度不超过64k;udp报文数据最大长度不能超过64-20-8;
  • 分片标识:数据在实际传输时的最大长度不仅受限于数据报长度字段,并且受限于链路层的一个信息- - -MTU(最大传输单元,链路层中一条数据帧中的最大数长度(网络层的报文最大长度),通常在以太网组网方式中是1500字节,可配置),一条udp数据在网络层限制不大于64k-28即可发送,但是在链路层会受限于MTU大小;
    若IP报文大小小于MTU,但是又符合数据报长度字段,则这条数据会在网络层进行数据分片
    16位分片标识:标识当前分片属于哪一个完整的上层报文;
    3位标志:1位保留,1位禁止分片位,1位标志位(除了最后一个分片外其他分片都置为1);
    13位分片偏移:当分片在对端进行重组的时候,就需要确定这个分片在原始报文中的什么位置,13位能够表示的最大大小是 8192。
    假设一个分片在报文中的位置是:64000个字节的偏移量,这个时候13位分片偏移就没法识别,因此分片偏移的单位是8个字节,以8字节为单位,13位偏移量8192*8刚好可以描述的大小就是0~65535,所以每个分片(除了最后一个)长度都是8的整数倍。(例:offset=1000,则表示这个分片的偏移量是8000字节);
  • 8位TTL:报文的最大生存周期,每经过一次路由器就会-1,为0时表示找不到对端,则会被丢弃(默认一般为64,现在大多都是128),主要是为了防止路由环路的问题(多个路由器互相连接,形成转发环路,数据在环路中不断转发出不去);
  • 8位上层协议:记录传输层所使用的协议,用于数据分用时,选择上层解析协议;
  • 16位校验和:校验数据一致性(不同设备工作的不同层,比如路由器,不会到达传输层,不会进行传输层的校验);
  • 32位源端IP / 32位对端IP:描述了通信中的两台主机;
    0~40字节选项数据:例如保存路由过程中每台经过的路由器信息…
    (Linux)网络基础- - - 网络层(IP协议)、链路层_第2张图片

地址管理

IP地址的组成:网络号 + 主机号
网络号:是一个网络的标识,俗称网段; (这个网络中所分配的IP地址都会带有这个网络的标识,这样的话每个网络的网络号保证不同,就可以保证他们分配的IP地址不同);
主机号:一个主机在一个网络中的标识;(一个网络中,有很多主机,主机号就是用于在一个网络中标识不同的主机)
网段的划分
早期:将所有IP地址划分了五类(五类网络)
A:用于组件大型网络,高1位固定位0,7位网络号,24位主机号; 网络号范围:0~127;IP地址范围:.0.0.0.0 ~ 127.255.255.255; 1.0.0.0 ~ 1.255.255.255 - - -这就是1号网络所能分配的IP地址范围,这种网络可以容纳16581375 个主机;
B:用于组建中型网络,高2位固定为10,14位网络号,16位主机号;网络号范围:128.0~ 191.255;IP地址范围:128.0.0.0 ~ 191.255.255.255; 128.1.0.0~128.1.255.255- - -这就是128.1这个网段所分配的IP地址范围,这种网络可以容纳65536个主机;
C:用于组建小型网络,高3位固定为110,21位网络号,8位主机号;网络号范围:192.0 ~ 223.255;IP地址范围:192.0.0.0 ~ 223.255.255.255; 192.168.1.0 ~ 192.168.1.255- - -这就是192.168.1这个网段所能分配的IP地址方位,这种网络可以容纳256个主机;
D:特殊IP地址;
E:特殊IP地址;
(早期的这种划分方式造成了大量的IP地址浪费,大部分公司申请的是B类网络) - - - - - 划分不够精细

当前:CIDR方案- - -如何将网络划分的更加精细- - - 使用子网掩码划分网络
子网掩码:unit32_t 类型的数字,这个数字由连续的二进制1组成;
子网掩码与IP地址相与:得到当前网络的网络号;
子网掩码取反:得到这个网络中的主机号范围,子网掩码 = 255.255.255.0,则这个网络中的主机号范围是:0 ~255;
(Linux)网络基础- - - 网络层(IP协议)、链路层_第3张图片

特殊的IP地址:

  • 0.0.0.0:可以识别当前主机上的任意网卡地址,常用于服务端的监听地址(表示绑定监听本机上的所有地址);
  • 255.255.255.255:全网广播地址(任意一个主机收到这个地址的数据,都会认为是发送给自己的- - -适配所有IP地址,常用于DHCP请求地址);
  • 127.0.0.1:本地虚拟回环网卡的IP地址(常用于本地的网络通信测试- - - 自己给自己发送数据);
  • 主机号全为0:实际就是网络号,是网络的表示,因此全为0的主机号是不能分配给网络中主机的;
  • 主机号全为1:实际上是UDP局域网广播地址(适配于当前网络中的所有主机),因此全为1的主机号是不能分配给网络中主机的;

公网 / 外网 与 私网 / 内网:

  • 公网 / 外网:我们通常所说的互联网;
  • 私网 / 内网:一个私有网络,仅限于内部通信;

IP地址不够用怎么办?
1、DHCP动态地址分配
2、NAT网络地址转换(主要就是用于组建私网,私网中的主机要么只能内部通信,要么就使用统一 一个对外的IP地址上网)
(Linux)网络基础- - - 网络层(IP协议)、链路层_第4张图片
私网之间,只要网络不相邻,网络号就可以相同,分配的IP地址就可以冲突(因为它们对外上网的时候会通过NAT服务转换为对外的地址进行上网,对外来说是没有冲突的);但是私网的网络号,也不能随便使用,万一与公网的某个网络的网络号冲突了就不合适了(则分配的地址都会与公网地址相冲突)。

RFC文档1918规定:能够用于组建私网的网络号有以下几种:

  • 10.* . *. * - - -用于组建大型网络
  • 172.16.* . * ~ 172.31. * .* - - -用于组建中型网络;
  • 192.168. * .* - - -用于组建小型网络;

路由选择

路由为每一个流经的数据根据目的的IP地址进行路径选择

路由表
在这里插入图片描述
(Linux)网络基础- - - 网络层(IP协议)、链路层_第5张图片
上图中蓝色圈为一个小的局域网,红色圈为一个小的局域网,但是两者不能直接进行通信,需要通过运营商路由器发到互联网后才可以;蓝色圈之间是可以直接通过局域网进行通信的,红色圈也是。
(Linux)网络基础- - - 网络层(IP协议)、链路层_第6张图片
互联网中路由器上记录的路由表(包含的不仅仅是与自己相连的网络的路由信息,与自己不相连的也会记录- - -路由器会广播自己的路由表多少层网络),路由表生成算法 有很多种。

链路层

负责相邻设备之间的数据帧传输(以太网eth),链路层负责每一个相邻节点之间的数据传输;
相邻设备之间也需要描述识别(因为一个设备可能又很多相邻设备),链路层相邻设备之间的识别是通过MAC地址实现的。
MAC地址:网卡的硬件地址。
在这里插入图片描述
48位对端MAC地址 / 48位源端MAC地址:描述识别相邻的设备,描述了相邻设备之间的数据传输;
16位上层协议类型:网络层的协议类型,进行数据分用时选择上层的解析协议;
32位CRC校验和:数据帧尾,包含校验和在内;

如何获取对端的MAC地址?
一个主机,第一次通过网线连接到路由器上,然后发送dhcp请求,路由器收到之后就会进行响应,给主机分配IP地址;
arp协议:是一个介于网络层和链路层之间的协议,通过IP地址获取MAC地址;封装 arp 请求,然后arp请求广播到整个局域网中,(以太网头中设置的对端MAC地址FFFFFFFFFFFF,arp请求中描述自己的MAC地址和IP地址,以及对端的IP地址,对端的MAC地址空白),相邻设备收到这个arp请求后,检测目的的IP地址是否与自己相符,若相符则组织arp响应,填充自己的MAC地址回复出去,若不相符则直接丢弃。
arp局域网欺骗攻击:恶意主机收到arp广播请求,伪造自己,告诉主机自己就是目标主机,将自己的MAC地址发送过去。 解决方法:防火墙白名单(主机获取到相邻设备MAC地址之后,会缓存一段时间(默认为20~30分钟))
MTU:最大传输单元,链路层限制的数据帧大小(根据组网方式不同,默认数值也不同,以太网默认1500字节)
(Linux)网络基础- - - 网络层(IP协议)、链路层_第7张图片
MTU对上层协议应用的影响

tcp协议:tcp在传输层,三次握手的时候,进行MSS - - - 最大数据段大小协商,告诉对方自己的mss是多少,然后通信双方取最小的一方作为最大传输数据段大小,每次从发送缓存区中取出不大于mss大小数据进行传输- - -因此通常也说tcp在传输层会自动进行数据分段。
MSS = MTU - 最小IP报头长度 - 最小TCP报头长度;
如:mtu默认为1500,则mss = 1500 - 20 - 20 =1460
.
udp协议:因为udp不考虑mss(对于udp不存在mss的概念),只要数据段大小小于64k-28,就可以进行传输,但是这个数据大小若是大于mtu则会在网络层进行数据分片。
udp不保证数据可靠传输,一个Udp报文若在网络层进行了分片,则传输过程中,一个分片出问题,整个udp报文都会被丢弃;意味着Udp传输过程中,分片越多在传输出问题的几率就越大。
解决方案:程序员在应用层使用udp协议的时候最好就能考虑mss的问题,将udp数据按照计算的mss进行分包处理。
交换机通过记录mac地址映射实现固定主机间的数据转发。

其它的典型协议与技术:DNS / ICMP /NAT /NAPT /代理

DNS

DNS为域名系统 ,用于存储IP地址与域名的映射关系,提供域名解析,通过域名获取服务器IP地址的服务。
域名:服务器地址的别名 - - -便于记忆,但是最终通过域名访问服务器的时候还是进行解析最终通过IP地址访问服务器的。域名服务器用于记录所有服务地址与域名的映射关系。
域名服务器的划分:根域名服务器(13组)- -> 顶级域名服务器- - > 二级域名服务器 - - ->三级域名服务器;
域名的划分:顶级域名(.com / org /.cn / .jp)- ->二级域名(.baidu.com)- ->三级域名(.zhidao.baidu.com)
域名解析流程:www.zhidao.baidu.com
(Linux)网络基础- - - 网络层(IP协议)、链路层_第8张图片
浏览器中输入url回车之后,都发生了什么?
1、域名解析 - ->2、根据http协议格式组织http请求数据- -> 3、搭建tcp客户端与服务器建立连接,发送请求数据 - -> 4、等待响应,得到后进行解析渲染。

ICMP协议:网络层协议,用于进行网络探测。

ping:ssh协议使用22号端口 / telnet协议使用23号端口,ping 使用多少端口呢?
ping工具通过icmp协议实现,进行网络探测,而网络层的协议不涉及到端口(但口试传输层的信息);

NAT/NATP服务:网络地址转换服务

(Linux)网络基础- - - 网络层(IP协议)、链路层_第9张图片
主要用于组建私网,对外使用统一地址,防止与外部地址冲突;
NAT服务,通常部署在网管设备上,工作在网络层(进行IP报头中的源端地址替换),通过网关设备进行数据转发。

代理服务

个人网络与互联网服务商之间的中间代理机构(类似于我们买东西时与生产厂家之间代销商);
与NAT是完全不同的

  • 代理服务:是一个应用层服务,部署在任意设备上,工作在应用层,我们个人请求的是代理服务器;
  • NAT服务:是一个网络层服务,部署在网管设备上,工作在网络层,我们个人依然请求的是目标服务器;

举个聊QQ发消息的例子,进一步掌握 TCP / IP 五层

  • 1、编写QQ程序;
  • 2、程序运行起来称为进程,开始处理,采集键盘数据,得到数据之后,从线程池中取出一个线程;
  • 3、在线程中,组织QQ协议格式数据,描述这个数据是发送给哪个QQ号的(应用层协议封装);
  • 4、应用层封装完毕后创建套接字,搭建TCP客户端,连接QQ的服务器,连接建立之后,send发送数据;
  • 5、send发送数据只是将数据放到了socket发送缓冲区中,tcp三次握手会协商mms,根据mss从发送缓冲区中取出合适大小的数据;
  • 6、封装tcp头部,通过端口描述哪两个进程在进行通信;
    通过协议中序号、确认序号进行包序管理,并且实现确认应答机制,以及发送端通过超时重传机制实现可靠传输;
    通过协议中校验和校验发送端的数据与接收端数据是否一致;
    通过协议中窗口大小字段,实现滑动窗口机制,进行流量控制,以及接收端的数据排序;
    发送端口通过拥塞控制,进行网络探测,防止网络不好丢包较多;
    通过捎带应答,延迟应答,快速重传提高传输效率;
  • 7、传输层封装完毕之后,将数据交给网络层进行IP封装,通过IP地址描述是网络中哪两台主机在进行数据通信,tcp会自动进行数据分段(mss就是通过mtu计算的),因此不会进行数据分片;
    描述TTL生存周期防止路由环路,描述传输层协议用于数据分用;
  • 8、网络层封装完毕之后,将数据交给链路层;通过arp请求获取到指定IP地址的相邻设备的mac地址;通过mac地址描述是哪两台相邻设备之间先进行传输,通过协议中的上层协议类型,用于数据分用时网络层的协议选择;
  • 9、通过物理层将电信号发送出去;

1、我现在是将数据从我的主机发送给我们家的路由器(我的主机的网关设备),我的主机第一次连接到网关设备的时候会广播DHCP请求,获取到网关的IP地址,生成自己的路由表。
2、数据发送到路由器这个家里的网关设备上之后,路由器会根据自己的路由表以及目标地址,逐个匹配最终生成一条路径,应该将数据发送给哪个与自己相连的网络,发送之前会进行NAPT地址替换映射(指定端口收到回复的时候应该将回复相应给哪个家里的主机),然后由路由连接指定相邻网络的这个网卡将数据发送到这个网络。
3、数据经过这些路由器逐层转发之后就会到达对端。

你可能感兴趣的:(Linux,网络协议)