0


【Linux】网络基础(3)

前言

    hi~,大家好呀,欢迎来到我的网络基础学习笔记三~

我的网络1、2博客链接哦~

【Linux】网络基础(1)_柒海啦的博客-CSDN博客

【Linux】网络基础(2)_柒海啦的博客-CSDN博客

    本篇笔记将记录TCP/IP协议中网络层IP协议的理解与学习,其中重点对IP网段划分进行理解,知道公网和私网或者IPV4的缺陷以及网络层的定位作用;然后学习数据链路层,明白真正在一个路由上传输是如何进行的,以及如以太网数据链路层协议在局域网中的作用;最后将TCP/IP协议总结一下,建立起对网络整个体系的理解和认知。

一、网络层

    首先,我们复习一下TCP/IP协议栈之前的大致内容:

    在应用层,我们主要讨论如何去使用数据并且规范化的问题。

    而对于传输层、网络层、数据链路层来说,解决的就是具体数据传输的控制和流程,**将数据可靠的从源主机跨网络发送到目标主机**。

    其中网络层就是在复杂的网络环境中确定一个合适的路径。

    而就传输层和协议层之间的关系,就好比老板和员工一样,可靠性由传输层(TCP)决定,**传输能力**由IP协议决定。

    在网络中我们先确定如下的定义:

1.主机:配有IP地址,不进行路由控制的设备
2.路由器:配由ip地址,又进行路由控制;
3.节点:主机和路由器的统称。

    现在,我们针对IP协议封装的报头讨论**如何封装、解包,以及向上交付**的问题。

1.协议头格式

-4位版本:指定IP协议依据的版本。

    有IPV4和IPV6,对于IPV4来说就是4。

-4位首部长度:指定IP数据报报头的总大小。单位为4byte。

    因为是4位,所以就是4bit,首部长度的单位是4byte,因为4bit最大表示的值为1111 = 15,所以最大报头长度应该为:15*4=60byte。

-8位服务类型:表示指定的服务特性。3位优先级字段(已经弃用),4位TOS字段(最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个),和1位保留字段(必须置为0)

    对于服务类型了解即可。比如对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。

-16位总长度(字节数):IP数据报整体占多少byte,单位也是4byte。

    对于报头来说,分为定长报头(20byte)+选项。那么选项可以通过4位首部长度减去20byte就可以得到选项的长度。那么在**封装**的时候,在选项的后面copy数据即可。

    对于**分离**,由于知道数据报总大小(16位总长度),可以根据首部长度算出数据的大小,然后从后往前进行切分就可以得到数据从而做到报头和有效载荷进行分离了。**有效载荷长度(单位:byte) = (16位总长度 - 4位首部长度) * 4byte**。从而进行很好的一个分离。

-8位生存时间TTL:数据报到达目的地的最大报文跳数,一般是64,每次经过一个路由--,如果减到0还没到达就直接丢弃了

    这个防止一个报文进行环路转发,需要设置生存时间。(互联网很大,并且设备底层可能不同,不可排除网络中存在的一些数据黑洞)如果不设计约束,那么可能此报文成为垃圾了,并且不断在转发导致浪费资源。

-8位协议:上层传输层所对应的具体协议:TCP或者UDP

-16位首部检验和:使用CRC进行校验,鉴别头部是否损坏

-32位源地址和32位目标地址:表示发送端和接受端的IP地址

-选项字段:不定长,略过

    在向上交付的时候,我们可以通过8位协议判断传输层对应的协议,然后将报头去掉向上交付有效载荷即可。

MTU

    因为网络层需要向下给链路层进行交付。而链路层因为其物理特性的原因,一般无法转发太大的数据。**MTU表示此数据链路层接受的数据大小最大值,一般默认位1500byte**。

    但是如果我们此时的IP数据报超过了1500byte,我们该如何向下层链路层进行传递呢?此时就和我们接下来介绍的三个字段有关了。

-16位标识:唯一标识主机发送的报文

    如果是将同一个IP数据报分为多个进行发送的话,这每一块标识应该是一样的。

-3位标志:第一位保留,第二位为1表示禁止分片,第三位表示更多分片,此id最后一个分片置为0,其余分片置为1表示后面还有分片

    如果禁止分片,那么如果此时数据报的长度超过MTU,将会直接丢弃。

-13位片偏移:此分片相当于在原数据报开始的偏移量

    首先,我们需要明确一点,分片的行为是网络层做的,同样的组装行为也是对方主机的网络层做的,对上层是透明的。也就是说IP协议的分片和组装的行为,TCP是不知道并且不关心的。

    这里先来简单的说明一下分片分出并且组装时如何做到的,也就是即使IP数据报超过了1500byte,也能让对方主机拿到一个完整的IP数据报的。

针对接收方网络层来说,我们需要注意如下几点:

    1.首先网络层最好还是不要分片。(大部分情况下没有分片)

    2.具有识别报文与报文之间的不同。(16位标识区分)

    3.识别报文是否被分片了,并且将相同报文并且分片的集合到一起。(3位标志的第三位**更多分片如果为1**就表示存在分片,但是注意如果是一个报文的最后一个分片,那么此时是0,**就根据13位片偏移一定不为0进行判断分片**)(所以需要注意如果此报文没有被分片就说明更多分片标志为0,13位偏移为0即可)

    4.识别哪些分片是开始,中间结尾。(根据片位移进行判断即可)

    需要注意,偏移量 + 自身大小 = 下一个报文的偏移量。根据偏移量进行升序排序扫描整个报文如果不匹配,中间一定为丢失,如果计算到结尾的时候,就一定收取完整了。(组装过程,并且保证可靠性) 

    5.异常处理,我们识别如果组装过程中,任何一个分片丢失,都需要识别出来。

分片严重不推荐:

    1.在网络层分片和组装的过程中,上层(传输和应用)并不知晓。
     2.丢包是有概率的。分片就是增加了丢包的概率。
     3.**一旦丢包影响的是上层传输层,那么需要进行重发操作了**。       
    那么,IP地址究竟为何物?具体是如何进行划分的呢?

2.IP地址

    自互联网诞生以来,我们就需要在网络上去标识一台主机,让两台主机能够知道对应的位置。

    从IPV4开始,用32位去标识ip地址,也就是2^32次方。为了标识方便,我们每8位标识一段,并且用10进制标识出来,中间用.分开,这就是常用的点分十进制。比如:127.0.0.1 = 0111111 00000000 00000000 00000001。

    ip地址分为两个部分:**网络号 + 主机号**。

网络号:在同一网段网络号相同,保证相互连接的两个网段具有不同的标识;

主机号:同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

1不同的子网其实就是把网络号相同的主机放到一起.
2如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。

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

    在以前,首先抛开本身IP地址不足的情况,将所有IP地址分为5类,网络号从高位开始,8位、16位、24位......分为如下的a、b、c、d、e类。

     但是随着互联网的发展,此缺点会导致大量的IP地址浪费掉。并且IPV4本身的IP地址数量不足以支持庞大的互联网用户的上升量。

    针对这种情况提出了新的划分方案:称为CIDR。

1.子网掩码

    我们可以引入一个额外的子网掩码来区分网络号和主机号。
    子网掩码和IP地址一样,也是32位数。通常用一串"0"结尾。将IP地址和子网掩码进行按位与操作,得到的结果就是网络号。

    网络号和主机号的划分和A类、B类无关。
    此时,当一个IP报文被路由器提取后,提出其中的目的IP,与当前路由器的子网掩码按位与后,就可以得到该报文需要去的目的网络,如果当前路由器存在此网就直接送过去,不存在根据各种策略送往下一个路由器进行转发。

     另外,IP地址和子网掩码还有一种更简洁的表达方式,比如上面的例子1,我们整个可以不需要分开写,直接写成:140.252.20.68/24即可。其中24标识从高位开始存在多少个位是1,也就表示了整个子网掩码了。

2.特殊的IP地址

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

    至于如何进行区分特殊的IP地址和正常的如下图所示(loopback设备):

3.私有IP和公有IP

    但是,我们可以发现,CIDR虽然一定程度上缓解了IP的数量(提高了利用率),但是IP地址的上限还是没有增加。IPV4地址数大概43亿左右,我们还需要其他的方法进行解决IP地址不足的问题!

解决IP地址不足的方案:

    **动态分配IP地址**;

    主流:**NAT技术**;

   ** IPV6**;
    我们这里重点介绍NAT技术。在介绍NAT技术前,我们首先需要简单了解一下私有IP和公用IP,也就是经常所说的公网和私网。

    首先,可以先从我们的生活谈起。

1.你家里要上无线网,你家先会做什么?

    a、有运营商,在你家附近有网络覆盖
     b、家人联系运营商进行光纤入户
     c、工作人员上门,调制解调器(猫),无线路由器。
     d、开户、账号、密码,配置路由器(账号,密码 -- 运营商认证你们的密码);
     e、配置路由器 -- 设置路由器的wifi名称+密码(路由器认证人的)
     f、正常上网,按月或者按年缴费。

2.我们在手机上用流量,玩对应的app,但是最后却要充话费给运营商?为什么

    基础设施是运营商铺设的。
     访问任何网页资源,首先都是经过运营商的。

3.初步理解一下:我们访问不了国外网站的,为什么?
运营商。
无论是你的手机,还是家里的路由器都有账号。
-认证:余额是否够,够放行,不够,丢弃!
也可以将对应账号设置欠费等,欠费拦截。
合法性、账号等识别。
对于墙来说,检测到国外IP直接报文丢弃即可。

    首先,路由器天然的会构建出局域网出来(子网)。数据包没有发送到公网的时候,用的都是私有IP。(私有网络对于的IP时局部的。可以在**不同的子网中出现重复**的。这样IP不足问题就大大缓解了)而路由器、基站这些架设都是运营商帮我们做的,而他们就可以当作一个组织。

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

私有IP范围

10.,前8位是网络号,共16,777,216个地址
172.16.到172.31.,前12位是网络号,共1,048,576个地址
192.168.
,前16位是网络号,共65,536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网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,网络地址转换).
     如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.

4.NAT技术

    当我们的源IP地址在不同内网、不同层级的网络节点中转发,被替换的技术被称为NAT技术。

    NAT技术是当前解决IP地址不足的重要手段,也是路由器的一个重要功能。

    对于NAT来说,比如在上面的网络通信图中,如果主机A向一个公网IP进行发送通信,即使经过路由选择后进行层层转换,但是当目标主机返回给主机A的时候改怎么办呢?因为主机A是私网IP,这也正是我们学习NAT的目的。

NAT ip的转化过程:

    当我们发送出去的时候:将源IP替换位公网中存在的路由器,**并且进行子网IP与替换IP进行一个映射**。(实际上公网上应该是运营商的路由器,在传达这一过程中路由器也是转化为上一层子网IP即可)然后就是正常的路由转发。

    接收的时候:将目标地址根据之前的:目标地址映射的私网ip,替换即可,然后发送给指定的主机即可。
    比如在上图中,我们可以发现客户端A向全局IP中的服务器ip为163.221.120.9进行通信,首先在NAT路由器构建的子网中(此路由器一般WAN口对应的公网IP,一般是运营商那里),进行源IP地址替换,替换为NAT路由器的一个公网IP即可(中间是经过层层替换的), 即202.244.174.37然后发送给对方服务器,由于是在公网中,就进行正常的路由转发即可,服务器向客户端A发送信息的时候就直接向NAT路由器的公网IP发送即可。路由器接收到对应的信息后根据163.221.120.9查表转发到对应客户端上即可。

    那么此时问题来了,如果是在NAT路由器的私网里存在两台客户端向同一个服务器或者无论是向谁发,如何区分这两个客户端的呢?并且之间的映射关系又是存在哪里的。这就要涉及到**NAPT转换表**上了。

NAPT

     实际上,在转换表中,一个映射的关系就是一个**四元组{源LAN口IP:端口, 目标IP:端口, 源WAN口IP:端口, 目标IP:端口}**。

     可以发现,在NAT进行替换过程中,我们可以根据NAPT映射的表中,将**子网不同主机用公网上不同端口进行区分开**来。这也就意味着NAT技术需要动到上层的端口号才能进行映射转换表。
    1.其实在进行源地址转化的过程中,可能不一定只替换原IP,必要的时候,源端口也要替换!(当存在内网端口号相同的时候,转化外网端口的时候路由器会对于进行处理)

    2.路由器在NAT转化的过程中,除了单纯的替换,还会为我门根据报文请求的四元组,为我们构建一个映射关系。

    3.源IP表示唯一的一台主机,源端口表示该主机上唯一的进程,源IP+源端口 - 表示唯一的一个进程。(对于内外网来说)
     4.无论从内向外,都能表示各自网络中表示唯一性,所以,这个映射关系:互为key值的!
     5.如果从来没有访问过外网,外网能够直接访问内网吗?-理论上是不能的,因为无法进行NAT转化。
     6.但是存在很多基于NAT原理的软件,能够帮助我们从外网访问内网 -- 内网穿透。

NAT技术的缺陷

    1.外部无法直接向内部服务器建立连接。(可以想办法)

    2.转化表的生成和消耗存在额外的开销。

    3.NAT设备一旦异常,即使存在热备(存在一个的备份,外网发送到另外一个),所有TCP连接也都会断开;

    那么,除开NAT指定的私网和公网之间的转化,真正在公网中(都是公网IP),主机A是如何通过IP定位到主机B的呢?也就是我们接下来要学习的路由转发。

5.路由

    当两个主机在进行网络通信的时候,我们需要在复杂的网络结构中,找出一条通往终点的路线。

    路由的具体过程具体一下就是在每个局域网(每段不同的局域网)一跳一跳的过程。

    所谓的一跳就是就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

     我们需要知道的是,IP数据报在传输的过程中和问路是类似的。
    **路由器查看数据包目的IP,决定是否直接发送给目标主机,还是需要发送给下一个路由器(公网转发),如果不知道发送给默认路由器(内网转发)**。

    也就是说如果数据包在中途的过程中,那么是先转发给具有公网IP的路由器,查路由表找到应该去的下一个路由器,一直到目标子网中的时候,比较发现目标IP就是其中的一台主机就直接转发给对应主机了。

    重复上述步骤,直到找到目标IP地址。

    先找目标网络,然后在找目标主机。
    那么依据就是每个路由器或者主机里面的路由表。(或者节点内部里维护一个路由表)

    所以路由的过程可以如下图所示:

     在Linux我的云服务器下可以使用命令route进行查看路由表:

    那么具体如何根据路由表决定下一跳的过程呢?

    假设某主机上的网络接口配置和路由表如下:

     可以发现,此主机上存在两个网络接口:192.168.10.0/24,192.168.56.0/24。如果**目标IP的网络号命中了其中一个网络接口,就直接转发即可**。

    如果不命中,路由表中的最后一行,主要由**下一跳地址和发送接口**两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。

路由器中:

    Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接

口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

    根据上面的路由表,我们可以引入两个例子加以理解。

1、如果发送的数据包的目的地址是192.168.56.3。

    与第一行的子网掩码做运算,得到:192.168.56.0,与第一行目标网络地址不符,找下一个。

    与第二行子网掩码做运算,得到:192.168.56.0,与第二行目标网络地址相符,因此从eth1接口发送出去。因为标志是U,就表示是和本机接口直接相连的网络,直接转发即可。

2、如果要发送的数据包的目的地址是202.10.1.2。

    可以发现和两个网络即可的目标网络地址都不符合,按照缺省路由条目,从eth0发出,发往192.168.10.1路由器。此路由器在根据它的路由器决定下一跳的地址。
    现在我们可以简单总结一下传输层和网络层:TCP/IP协议层实现了可靠的将数据从A主机送到B主机。

    网络层主要解决了:根据**IP数据报的分组转发**,并且通过**子网划分、NAT技术**解决了IP地址不够的问题,通过**路由查找和路由算法**实现了发送在网络中的数据报找到该发送到哪里的策略。

    但是注意,IP层提供的是转发的策略,而真正在一跳一跳传输的是通过数据链路层进行完成的!

二、数据链路层

    数据链路层提供的是在**同一数据链路节点上的两个节点进行传递**。

    网络层在**逻辑**上解决了一个主机到另一个主机的路线问题,但是**实际**在这路线中解决一跳一跳的就是数据链路层。

    可以这么理解:当决定将数据交付給下一跳路由器的时候,下一跳路由器一定和我在同一个局域网。每一个节点本质就是子网转发。->宏观上,所有的网络由一个个子网构成的。

    在TCP/IP协议栈的总体学习中,我们直到数据链路层对应计算机的位置是处于驱动程序的,所以下面连接的就是物理层。局域网标准指定的很多都不一样,具有代表性的就是以太网、无线LAN/WAN等了。
    像“以太网”这些并不是一种具体的网络,而是一种**协议标准**;既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;

    例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
     以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

1.以太网帧格式

1.源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;

2.帧协议类型字段有三种值,分别对应IP、ARP、RARP;

3.帧末尾是CRC校验码,用于检查错误。

    理解一下所谓的硬件地址。MAC地址的目的是为了区分在同一数据链路层的节点。
    长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)

     在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
    我们可以重新理解一下局域网通信原理:

    现在在此局域网中,假设H1主机发送给H6。

    H1主机首先在数据链路层将上层的IP数据报封装为mac帧。此mac帧的格式是:m6-m1-0800-IP数据报-CRC。

    发送到局域网中去后实际上所有的主机都收到了mac帧,提取上来后提取mac帧报头比对第一个属性目标地址,其余主机查看不是自己的就直接丢弃,而H6发现是自己的,报头和有效载荷进行分离,向上进行转发即可。

    需要注意的是,在局域网发送信息的时候,难免别人也可能进行发送,别人主机我们是无法控制的,此时的话就会发生碰撞问题。

    对于**碰撞问题**,在局域网协议中是存在对应的协议进行解决的,比如预先检测是否碰撞,如果碰撞了就停止发送,隔上一段时间进行重复发送。此时可以将整个局域网当作一个共享资源,那么这里解决碰撞问题实际上就是解决对共享资源使用的安全问题。
    1.针对于碰撞问题,那么在一个局域网内主机多好呢还是越少越好?显然是越少。但是避免不了越多,所以增加了一种设备:交换机,它可以帮助我们划分碰撞域,在区域上减少碰撞的概率。

    2.局域网数据帧发送的时候,数据帧越长越好还是越短越好?数据帧有最小大小的规定,最大字节数的规定。(以太网:46~1500byte)MTU
    所以,这里可以简单提一下局域网攻击的原理:我们如果能够绕开数据链路层检查碰撞问题不久可以不断的向局域网里发送垃圾数据了吗吗,这样整个局域网就通信不了了,不久断网了嘛。(借助一些工具是可以实现的)。 

    对于MTU,我们在网络层IP协议分包的时候已经提到了,可以发现本身以太网协议定义:mac帧的最大数据限制就是**1500byte(最大传输单元MTU)**,最小就是46byte。对于类型是arp的数据包如果不够的话会往后进行填充的。并且对于不同的数据链路层其MTU的标准是不同的。

    针对于MTU对上层协议的影响,这里可以简单的总结一下:

MTU的影响

    **首先是MTU对IP协议的影响**。在上面网络层具体提出了,在IP报头中的16位标识,3位标志,13位偏移解决了此类问题,如果大于MTU就要采取分包,IP提供一种识别顺序的方式,并且让对方IP层能够组装。但是需要注意,**网络层并不提供可靠性,也就是说如果这个过程中组装失败,那么由上层协议进行控制重发**。(TCP)

    **对于传输层UDP协议的影响**。如果利用UDP协议进行传输数据,当数据大小超过1500byte(MTU) - 20byte(标准IP协议报头大小) - 8byte(UDP协议报头大小) = 1472byte,那么在IP层就要进行分片,此时数据被丢包的概率就大大的增大了。(数据更不能保证可靠性了)

    **对于传输层TCP协议的影响**:

    首先需要知道TCP的报文不能无限大,也是受限于MTU的,TCP单个数据报的最大消息长度,称为**MSS**。(指数据大小)
    TCP在建立连接的过程中, 通信双方会进行**MSS协商**.
     最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
     双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
     然后双方得知对方的MSS值之后, 选择**较小**的作为最终MSS.
     MSS的值就是在TCP首部的40字节变长选项中(kind = 2);
    对于MSS和MTU的关系可以根据下面的图进行记忆即可:

     在Linux下我们可以利用ifconfig命令查看MTU、ip地址和mac地址。

    但是在这里,细心的同学就发现了一个问题,那就是在mac帧我们封装报头的时候,我们自己的mac地址知道,那么**对方的mac地址是怎么知道**的呢?我们如何获取其地址的?

     此时就需要另一个协议ARP进行解决了,帮助我们获取被发送主机的mac地址。

2.ARP协议

    ARP协议不是一个单纯的数据链路层协议,而是一个介于数据链路层和网络层之间的协议。

    如上mac帧的格式,当类型是0806的时候就是构建arp请求和应答。

    arp协议目的是为了建立起主机和mac地址映射的一个关系。当上层IP数据报转发到此层的时候,首先确定此目标IP地址是否在arp缓存表中(找对应映射的mac地址),如果没有找到,那么就会构建arp数据报对此局域网进行广播:

    此arp数据报的格式如下:

    首先前面以太网的首部可以不用管。

    在arp请求应答中:硬件类型、协议类型、硬件地址长度、协议地址长度都是固定格式。

    对于2byte的op来说,是用于区分此arp数据报是一个**请求**还是一个**应答**。

    发送端的IP地址就是发送主机的源IP地址,目的以太网不知道的话设置位全1表示未知,目的IP地址就是发送端的目标IP地址。 
     当广播到局域网中后,此时所有的主机都收到了请求。并且都要在数据链路层,将其交付给ARP层。交付给后,首先看op字段:先区分时请求还是应答。1就是一个请求,然后找目的IP地址对比,对比不成功抛弃,成功就保留。

    保留的那一方就构建arp应答,在op字段标识应答,然后再发送端mac地址中填入自己的地址,目的以太网地址就是之前发送的arp数据报请求的发送端以太网地址。(并且会介入arp缓存表中构建相应的映射-ip<->mac)同理,请求的一方收到之后会提取其中的mac地址将目标ip和对应的mac地址建立映射,就可以正常的进行以太网帧发送了。

     可以简单的总结一下,**ARP前提需要知道目标的IP,只有根据此得到对方的MAC地址**。需要注意的是,ARP缓存表不会一直保存映射,存在一定的时间限制(在此段时间内不使用的话),因为可能存在一种情况:就是如果一直保持的话,那么原本的主机断电重新连接后会被重新分配IP,那么此时IP地址就对应不上了。

    可以通过Linux指令 arp -a查看arp缓存表:

     既然谈到了arp协议,这里可以简单讲解一下arp欺骗的原理。

ARP欺骗

    ARP欺骗可以很容易在**同一个局域网**内对双方主机**动态**的arp缓存表进行修改,使攻击方称为中间人。

    假设在一个局域网中主机A和主机B已经经过arp请求和应答,此时A中arp缓存表中存在这样的映射:IPb->MACb,B中arp缓存表中存在这样的映射:IPa->MACa。

    此时主机C疯狂的向B主机构建并且发送大量的ARP请求,其中发送端IP地址是IPa,但是其发送端以太网地址是MACc。

    需要注意对于动态的arp缓存表的话会取新不取旧,所以此时主机B更新缓存表IPa->MACc。同理,主机C在向主机A构建大量的arp响应,其中发送端IP地址位IPb,但是发送端以太网地址却是MACc,这时主机A也更新arp缓存表:IPb->MACc。所以此时主机a无论想向主机B发送信息都是发送给主机c,反过来同理。

    虽然经过https或者等安全层的保护无法构造信息,但是可以让指定主机断网。

三、其他重要协议技术

1.DNS

    在用浏览器日常上网中,我们发现我们直接使用的是**域名**,而并不是ip地址进行标识。

    通常IP地址不方便记忆,所以人们就发明了一种叫主机名的名字,是字符串。随着互联网的发展,最终产生了DNS系统对这些IP和主机名关系进行维护。

    域名由主机名.结构名.网络名.最高层域名构成,比如一个主机域名for.zj.edu.cn 中,for是主机名,zj是结构名,edu是网络名,cn为最高层域名。
    一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
     如果新计算机接入网络, 将这个信息注册到数据库中;
     用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
    DNS系统提供的是一种域名解析服务,比如当在浏览器进行输入一个url的时候,首先启动向DNS系统发送请求 - (注意DNS系统是基于UDP的),DNS系统接收到请求后返回对应的IP。(DNS解析服务器存在几层,最终要上传到根服务器)。

    比如有的时候,qq、游戏时正常登录的,但是网页打不开。在用DNS,浏览器内置的DNS ip地址服务挂掉了。

2.NAT和代理服务器

    首先,在前面的网络层,我们介绍了NAT基础区分了私网和外网,并且提供了私网和公网中主机通信的方法,有效的解决了当前IPV4地址不足的问题。

    实际上来说,代理服务器也是一个NAT设备,但是NAT设备主要解决IP地址不足的问题,但是代理服务器更加偏向应用层,能够为我们实现一些具体的需求。所以说,NAT设备一般工作在网络层,对IP地址进行替换,但是代理服务器来说就是工作在应用层的。

    代理服务器是一个软件设备,架设在服务器上,而NAT设备架设在路由器或者防火墙中等硬件设备中。

正向代理服务器

    比如在学校的局域网内,所有的主机网络通信在出去之前,首先需要连接到学校的代理服务器。

此时学校的代理服务器就可以提取信息进行检测:

1.身份认证。
 2.缓存数据,提高访问效率。
 3.内容审核。
 4.保证内网安全。
    这就是一种正向代理服务器,也就是说,我们做的事情需要让**正向代理服务器帮我们去做**。

反向代理服务器

    公司设立服务建立机房的时候会维护一个代理服务器。
     客户端访问公司资源的时候,请求首先转发到此代理服务器上,会将所有的请求通过一定的方式比如轮询、随机数等方式。比如建立一个IP与访问压力cnt的映射关系。不做任何业务的处理,只负责将请求推送到后端的指定主机。保证整个集群的**负载均衡**。

    也就是说反向代理服务器的话相当于代理正常的接收网络信息的流程,用此服务器进行发放,从而达到更好的控制的效果。

    代理服务器的应用广泛。针对于不同的网:局域网和广域网有着不同的应用场景。比如科学代理的话就是广域网中代理。

    这里可以简单提一下科学上网的原理:
    在国内,所有局域网的架设都是运营商实现的。那么此时在运营商那里就是一个大型的服务器,国内的所有的访问都必须经过运营商。而国内的运营商如果发现访问的ip是国外的,会直接丢弃不准访问的。

    但是在中国的某些地区(港澳台)不必经过国内的运营商,他们有自己的运营商,是可以直接访问外网的。

    所以,可以在这些地区搭建一个代理服务器,并且配对对应的公钥和私钥,发送给国内对应的客户端,国内想向外网访问的话,使用公钥进行加密,封装http,ip为这些地区,但是里面内容确实外网的内容。国内运营商接收到后,发现ip没问题,但是对应http内容来说无法解包,所以无法察觉就发送给这些地区的代理服务器了。

    此代理服务器就是正向代理服务器,解密后转发到外网,接收到内容后在加密返回即可。

3.ICMP协议

    ICMP协议是一个网络层协议,一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是I**P协议并不提供可靠传输**. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的。

ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;

四、总结

    针对TCP/IP协议栈的学习,我们重点针对下面的知识进行总结学习:

数据链路层

    数据链路层的作用: 两个设备(同一种数据链路节点)之间进行传递数据
     以太网是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
     以太网帧格式
     理解mac地址
     理解arp协议
     理解MTU

网络层

    网络层的作用: 在复杂的网络环境中确定一个合适的路径.
     理解IP地址, 理解IP地址和MAC地址的区别.
     理解IP协议格式.
     了解网段划分方法
     理解如何解决IP数目不足的问题, 掌握网段划分的两种方案. 理解私有IP和公网IP,理解网络层的IP地址路由过程. 理解一个数据包如何跨越网段到达最终目的地.理解IP数据包分包的原因. 
     了解ICMP协议.
     了解NAT设备的工作原理.

传输层

    传输层的作用: 负责数据能够从发送端传输接收端.理解端口号的概念. 
     认识UDP协议, 了解UDP协议的特点.

    认识TCP协议, 理解TCP协议的可靠性. 理解TCP协议的状态转化.
     掌握TCP的连接管理, 确认应答, 超时重传, 滑动窗口, 流量控制, 拥塞控制, 延迟应答, 捎带应答特性.理解TCP面向字节流, 理解粘包问题和解决方案.
     能够基于UDP实现可靠传输.
     理解MTU对UDP/TCP的影响.

应用层

    应用层的作用: 满足我们日常需求的网络程序, 都是在应用层能够根据自己的需求, 设计应用层协议.
     了解HTTP协议. 
     理解DNS的原理和工作流程.
标签: 网络 linux 运维

本文转载自: https://blog.csdn.net/weixin_61508423/article/details/129877642
版权归原作者 柒海啦 所有, 如有侵权,请联系我们删除。

“【Linux】网络基础(3)”的评论:

还没有评论