精华内容
下载资源
问答
  • 1微调原理在自己的数据集训练一个新的深度学习模型时,一般采取预训练ImageNet进行微调的方法。什么是微调?这里以VGG16为例进行讲解。图1.1VGG16结构示意图如图1.1所示,VGG16的结构为卷积层+全连接。卷...
    1微调原理

    在自己的数据集上训练一个新的深度学习模型时,一般采取在预训练ImageNet上进行微调的方法。什么是微调?这里以VGG16为例进行讲解。


    图1.1VGG16结构示意图

    如图1.1所示,VGG16的结构为卷积层+全连接层。卷积层分为五个部分,共13层,即图中的conv1~conv5。还有全连接层fc6、fc7、fc8。卷积层加上全连接层总共16层,因此被称为VGG16。如果要将VGG16的结构用于一个新的数据集,首先要去掉fc8这一层,因为fc8这一层输入的是fc7这一层的特征,输出是1000类的概率,这1000类正好对应的是ImageNet模型中的1000个类别,在自己的数据集中一般不是1000类,因此fc8是不适用的,必须将fc8去掉,重新采用适合数据集类别的全连接层,作为新的fc8全连接层,比如数据集为6类,那么新的fc8的输出应当是6类。

    此外,在训练的时候,网络参数的初始值并不是随机生成的,而是采用VGG16在ImageNet上已经训练好的参数作为训练的初始值。这样做的原因在于,在ImageNet数据集上训练过的VGG16中的参数已经包含了大量有用的卷积过滤器,与其从零开始初始化VGG16的所有参数,不如使用自己已经训练好的参数作为训练的起点。这样做不仅节约了大量的训练时间,而且还有助于分类器性能的提高。

    载入VGG16的参数后,就可以开始训练了,此时需要指定训练层数的范围,一般可以选择以下几种范围进行训练:

    a. 只训练fc8。训练范围一定要包含fc8这一层,前面讲过,fc8结构被调整过,因此它的参数不能直接从ImageNet预训练模型中取得,可以只训练fc8层,保持其它层的参数不变,这样就相当于将VGG16当做一个“特征提取器”:用fc7层提取的特征做一个softmax模型分类。这样做的好处是训练速度快,但往往性能不会太好。

    b. 训练所有参数。还可以对网络中所有的参数进行训练,这种方法的训练速度可能会比较慢,但是能提取较高的性能,可以充分发挥深度模型的威力。 

    c训练部分参数。通常是固定浅层参数不变,训练浅层参数。如训练conv1、conv2的部分参数不变,只训练conv3、conv4、conv5、fc6、fc7、fc8。

    这种训练方法就是所谓的对神经网络模型做微调,借助微调可以从预训练模型出发,将神经网络应用到自己的数据集上。

    2数据准备

    首先要做一些数据准备方面的工作:一是把数据集切分为训练集和验证集,二是转换为tfrecord格式。在data_prepare/文件夹中提供了会用到的数据集和代码。

    首先要将自己的数据集切分为训练集和验证集。验证集用于验证模型的准确率,本博客用了一个实验的卫星图片分类数据集,这个数据集一共有六个类。点击打开数据集链接

    在data_prepare文件夹下,使用预先编译好的脚本data_convert.py,将图片转换为tfrecord格式。

    python data_convert.py -t pic/ \
      --train-shards 2 \
      --validation-shards 2 \
      --num-threads 2 \
      --dataset-name satellite

    这样在pic文件夹下就会生成4个tfrecord文件和1个label.txt文件。


    3定义新的dataset文件

    首先,在dataset/目录下新建一个文件夹satellite.py,并将flowers.py文件夹中的内容复制到satellite.py中,接下来需要修改以下几处内容。

    第一处修改,

    对应修改如下图所示


    第二处修改修改为image/format部分

    'image/format': tf.FixedLenFeature((), tf.string, default_value='jpg'),

    修改完satellite.py后,还需要在同目录的dataset_factory.py文件夹中注册satellite数据库。红色框内为新增加的satellite数据


    4准备训练文件夹

    在slim文件夹下新建一个satellite目录,在这个目录下完成以下工作:

     新建一个data 目录,并将第2中准备好的5个转换好格式的训练数据复制进去。

    新建一个train_dir目录,用来保存训练过程中的日志和模型。

    新建一个pretrained目录,在http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz 下载并解压后,会得到一个inception_v3.ckpt 文件,将该文件复制到pretrained 目录下。

    5开始训练

    在slim文件夹下运行以下命令开始训练

    python train_image_classifier.py \
      --train_dir=satellite/train_dir \
      --dataset_name=satellite \
      --dataset_split_name=train \
      --dataset_dir=satellite/data \
      --model_name=inception_v3 \
      --checkpoint_path=satellite/pretrained/inception_v3.ckpt \
      --checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits \
      --trainable_scopes=InceptionV3/Logits,InceptionV3/AuxLogits \
      --max_number_of_steps=100000 \
      --batch_size=32 \
      --learning_rate=0.001 \
      --learning_rate_decay_type=fixed \
      --save_interval_secs=300 \
      --save_summaries_secs=2 \
      --log_every_n_steps=10 \
      --optimizer=rmsprop \
      --weight_decay=0.00004

    6验证模型准确率      

    可以用eval_image_classifier.py程序进行验证,在slim文件夹下运行以下程序

    python eval_image_classifier.py \
      --checkpoint_path=satellite/train_dir \
      --eval_dir=satellite/eval_dir \
      --dataset_name=satellite \
      --dataset_split_name=validation \
      --dataset_dir=satellite/data \
      --model_name=inception_v3

    执行后,应该会出现类似下面的结果


    7导出模型,并对单张图片进行识别

    在slim文件夹下运行以下程序

    python export_inference_graph.py \
      --alsologtostderr \
      --model_name=inception_v3 \
      --output_file=satellite/inception_v3_inf_graph.pb \
      --dataset_name satellite

    这个命令会在satellite文件夹下生成一个inception_v3_inf_graph.pb文件。(注:inception_v3_inf_graph.pb文件夹只保存了inception_v3的网络结构并不包含训练得到的模型,需要将checkpoint中的模型参数保存进来。需将12106改成train_dir中保存的实际的模型训练步数)在chapter_3文件夹下运行以下命令

    python freeze_graph.py \
      --input_graph slim/satellite/inception_v3_inf_graph.pb \
      --input_checkpoint slim/satellite/train_dir/model.ckpt-12106 \
      --input_binary true \
      --output_node_names InceptionV3/Predictions/Reshape_1 \
      --output_graph slim/satellite/frozen_graph.pb

    运行导出模型分类单张图片

    python classify_image_inception_v3.py \
      --model_path slim/satellite/frozen_graph.pb \
      --label_path data_prepare/pic/label.txt \
      --image_file test_image.jpg


    本博客是我在学习何之源的"21个项目玩转深度学习”这本书时,跟着教材第三章所做的一些实例,实验数据均为第三章的数据,读者朋友如发现错误,有疑问,请留言。谢谢~

    展开全文
  • OSI 模型中将网络划分为七层,但目前实际广泛使用的 TCP/IP 协议框架体系内,我们一般将网络划分为五层,从下到依次为物理层,链路层,网络层,传输层以及应用层。两者的区别在于 OSI 模型在应用层对数据包做了...

    1. 前言

    本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 Netfilter 数据包过滤框架的基本原理以及使用方式进行简单阐述。

    2. 基础网络知识

    2.1 网络分层模型

    OSI 模型中将网络划分为七层,但在目前实际广泛使用的 TCP/IP 协议框架体系内,我们一般将网络划分为五层,从下到上依次为物理层,链路层,网络层,传输层以及应用层。两者的区别在于 OSI 模型在应用层对数据包做了更细致的划分。两者的关系如下图所示:
    在这里插入图片描述
    在 TCP/IP 协议框架体系的五层网络模型中,每一层负责处理的数据包协议或类型均存在差异,物理层主要负责在物理载体上的数据包传输,如 WiFi,以太网,光纤,电话线等;数据链路层主要负责链路层协议解析(主要为以太网帧,其他类型此处暂不考虑),网络层主要负责 IP 协议(包括 IPv4 和 IPv6)解析,传输层负责传输层协议解析(主要为 TCP,UDP 等),而传输层以上我们均归类为应用层,主要包括各类应用层协议,如我们常用的 HTTP,FTP,SMTP,DNS,DHCP 等。

    2.2 数据包协议分层

    在 TCP/IP 协议框架体系内,上层协议报文被作为下层协议的数据载荷(Data Payload),存储在下层协议的数据段区域中进行传输。结合这一特性,我们常见的几类网络协议嵌套关系如下图所示:
    在这里插入图片描述
    从上图我们可以清晰地看到各类协议之间的嵌套关系,如使用 HTTP 协议的应用 App1 在传输层封装在 TCP 协议中,TCP 协议在网络层又封装到 IP 协议中,最后交到数据链路层中。其他应用层 App 也类似。

    网际报文控制协议(ICMP,使用该协议的 Ping 工具),以及网际组管理协议(IGMP,组播多播中的控制报文)是直接嵌套到 IP 数据包中,而不依赖于 TCP 或 UDP。

    地址解析协议(ARP)和反解析协议(RARP)则是直接嵌套在数据链路层数据包中进行传输。

    2.3 sk_buff 结构

    在 Linux 内核中,系统使用 sk_buff 数据结构对数据包进行存储和管理。在数据包接收过程中,该数据结构从网卡驱动收包开始,一直贯穿到内核网络协议栈的顶层,直到用户态程序从内核获取数据。使用图形表示 sk_buff 的结构如下:
    在这里插入图片描述
    在 sk_buff 数据结构中包含了诸多关于数据包存储,定位和管理的指针,数据包在网络协议栈各层次之间进行传输的过程中,内核通过操作指针的方式对数据包进行逐层解析,避免频繁的大数据段拷贝操作,从而提高数据包处理效率(但在某些特殊情况下依然会采用数据包拷贝操作)。

    2.4 收发包整体框架

    在这里插入图片描述

    • 用户态(User Space)程序 Client 向另一台主机上的 Server 发送数据,需要通过调用内核态(Kernel Space)提供给用户态的 Socket 抽象层接口发送数据;
    • Socket 抽象层接口收到用户态数据后,向下交给传输层接口(TCP 或 UDP);
    • 传输层负责创建 sk_buff,并将用户数据(应用层数据)填充到缓冲区,做合法性检查后,添加传输层头部,并通过网络层注册的接口将数据包交给网络层处理;
    • 网络层收到传输层数据包后,会查询路由表,决定数据包去向,如果是需要发出的数据包,会填充网络层头部,并交到内核虚拟网络接口设备的发送队列中;
    • 虚拟网络接口从发送队列获取数据,调用对应网卡驱动发送数据;
      Server 端接收数据时,按照相反的过程从网卡驱动中将数据包一层层上交,直到通过 Socket 抽象层接口将用户数据上交到用户态 Server 进程处理。

    3. 网络层(IPv4)收发包流程

    下图为基于 Linux 2.6.38 版本内核的网络层相关接口在数据包收发过程的调用逻辑图:
    在这里插入图片描述
    1)不同版本内核在函数名上可能存在一定差异,但整体调用逻辑基本不变;

    2)该图仅展示 IPv4 的处理流程,IPv6 不在该图的函数中处理,但整体流程基本相似;

    3)该图展示的流程仅为普通单播并且未进行 IP 分片的数据包处理流程,组播,多播,IP 分片的数据包在某些流程上存在差异;

    • 从图中可以看到,ip_rcv函数为网络层向下层开放的入口,数据包通过该函数进入网络层进行处理,该函数主要对上传到网络层的数据包进行前期合法性检查,通过后交由 Netfilter 的钩子节点;
    • 绿色方框内的IP_PRE_ROUTING为 Netfilter 框架的 Hook 点,该节点会根据预设的规则对数据包进行判决并根据判决结果做相关的处理,比如执行 NAT 转换;
    • IP_PRE_ROUTING节点处理完成后,数据包将交由ip_rcv_finish处理,该函数根据路由判决结果,决定数据包是交由本机上层应用处理,还是需要进行转发;如果是交由本机处理,则会交由ip_local_deliver走本地上交流程;如果需要转发,则交由ip_forward函数走转发流程;
      在数据包上交本地的流程中,IP_LOCAL_INPUT节点用于监控和检查上交到本地上层应用的数据包,该节点是 Linux 防火墙的重要生效节点之一;
    • 在数据包转发流程中,Netfilter 框架的-IP_FORWARD节点会对转发数据包进行检查过滤;
    • 对于本机上层发出的数据包,网络层通过注册到上层的ip_local_out函数接收数据处理,处理 OK 进一步交由IP_LOCAL_OUT节点检测;
    • 对于即将发往下层的数据包,需要经过IP_POST_ROUTING节点处理;网络层处理结束,通过dev_queue_xmit函数将数据包交由 Linux 内核中虚拟网络设备做进一步处理,从这里数据包即离开网络层进入到下一层;

    4. Netfilter 框架

    在这里插入图片描述
    从图中我们可以看到,Netfilter 框架采用模块化设计理念,并且贯穿了 Linux 系统的内核态和用户态。在用户态层面,根据不同的协议类型,为上层用户提供了不同的系统调用工具,比如我们常用的针对 IPv4 协议 iptables,IPv6 协议的 ip6tables,针对 ARP 协议的 arptables,针对网桥控制的 ebtables,针对网络连接追踪的 conntrack 等等。不同的用户态工具在内核中有对应的模块进行实现,而底层都需要调用 Netfilter hook API 接口进行实现。

    从图中我们可以看到,我们常用的 Linux 防火墙工具 iptables 其实也是 Netfilter 框架中的一个组件。接下来我们就以 IPv4 为例,描述 iptables 在 Netfilter 框架中生效的基本原理,同时,我们也看一下如果我们希望在内核中添加我们自己的处理函数,我们该怎么做。

    4.1 IPv4 网络层的 Netfilter Hook 点

    在第二章已经提及,Linux 内核中,Netfiler 在网络层设置了多个 Hook 点,这里我们不考虑实际的处理函数,仅看 Netfilter 的钩子节点,从而将网络层处理流程进行简化,如下图:
    在这里插入图片描述
    其中,矩形方框中的即为 Netfilter 的钩子节点。从图中可以看到,三个方向的数据包需要经过的钩子节点不完全相同:

    • 发往本地:NF_INET_PRE_ROUTING–>NF_INET_LOCAL_IN
    • 转发:NF_INET_PRE_ROUTING–>NF_INET_FORWARD–>NF_INET_POST_ROUTING
    • 本地发出:NF_INET_LOCAL_OUT–>NF_INET_POST_ROUTING

    4.2 iptables 工具

    iptables 在用户态提供了表格和链的概念。包含的表格有 filter,nat,mangle 以及 raw。而每个表格下包含不同的链,如下图所示:
    在这里插入图片描述
    iptables 中每个表格的作用不同,以我们比较常用的 filter 表为例,其主要起到数据包过滤和拦截作用,包含 INPUT,FORWARD 和 OUTPUT 三个链,根据链的名字我们可以知道,这三个链分别被放置到 Netfilter 三个不同的钩子节点中生效。INPUT 链是在NF_INET_LOCAL_IN节点,FORWARD 链是在NF_INET_FORWARD节点,OUTPUT 链则是在NF_INET_LOCAL_OUT节点。其他表格的链也类似。

    以如下 iptables 指令为例:

    iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
    

    该指令是在 filter 表的 INPUT 链中添加一条过滤规则,凡是收到源地址为 172.16.0.0/16,传输层协议为 UDP 并且目的端口为 53 的数据包(即 DNS 数据包),都将该数据包丢弃。在 Linux 内核中,这一个指令会在 Netfilter 网络层NF_INET_LOCAL_IN节点生成处理操作,凡是经过这个钩子节点的数据包,在前面规则都通过的情况下,都必须经过这一规则的检查,如果符合这条规则的匹配条件,则该数据包会被丢弃;如果不符合,则进行下一条规则的匹配。

    在 Linux 内核内部,使用 iptables 工具下发的指令规则,会存储在内核中的 Xtables 模块中,这部分内容这里不再深入分析。

    4.3 Netfilter 重要数据结构及相关函数

    钩子点枚举类型
    上面提到的网络层中 Netfilter 的几个钩子节点,在内核中是以枚举数据类型进行标记的。如下:

    // include/linux/netfilter.h
    enum nf_inet_hooks {
        NF_INET_PRE_ROUTING,
        NF_INET_LOCAL_IN,
        NF_INET_FORWARD,
        NF_INET_LOCAL_OUT,
        NF_INET_POST_ROUTING,
        NF_INET_NUMHOOKS
    };
    注册和解注册钩子函数
    // include/linux/netfilter.h
    /* Function to register/unregister hook points. */
    int nf_register_hook(struct nf_hook_ops *reg);
    void nf_unregister_hook(struct nf_hook_ops *reg);
    int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n);
    void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n);
    

    这些函数用于将自定义的钩子操作(struct nf_hook_ops)注册到指定的钩子节点中。

    钩子操作数据结构

    // include/linux/netfilter.h
    struct nf_hook_ops {
        struct list_head list;
    
        /* User fills in from here down. */
        nf_hookfn *hook;
        struct module *owner;
        u_int8_t pf;
        unsigned int hooknum;
        /* Hooks are ordered in ascending priority. */
        int priority;
    };
    

    这个结构体中存储了自定义的钩子函数(nf_hookfn),函数优先级(priority),处理协议类型(pf),钩子函数生效的钩子节点(hooknum)等信息。

    钩子函数声明

    // include/linux/netfilter.h
    typedef unsigned int nf_hookfn(unsigned int hooknum,
                       struct sk_buff *skb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *));
    

    如果我们自己实现一个内核模块,该模块需要在 Netfilter 框架的几个钩子节点中对经过的数据包进行处理,则该内核模块需要向 Netfilter 中的钩子节点注册钩子函数,我们需要按照 nf_hookfn 函数的声明类型,提供我们自己的实现,再按照之前提供的注册接口将相关数据类型注册到内核中使之生效。

    4.4 一个 Demo

    如下为在网络上找到的一个内核模块 Demo,该模块的基本功能是将经过 IPv4 网络层 NF_INET_LOCAL_IN 节点的数据包的源 Mac 地址,目的 Mac 地址以及源 IP,目的 IP 打印出来。代码如下所示:

    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/types.h>
    #include <linux/skbuff.h>
    #include <linux/ip.h>
    #include <linux/udp.h>
    #include <linux/tcp.h>
    #include <linux/netfilter.h>
    #include <linux/netfilter_ipv4.h>
    
    
    MODULE_LICENSE("GPLv3");
    MODULE_AUTHOR("SHI");
    MODULE_DESCRIPTION("Netfliter test");
    
    static unsigned int
    nf_test_in_hook(unsigned int hook, struct sk_buff *skb, const struct net_device *in,
                    const struct net_device *out, int (*okfn)(struct sk_buff*));
    
    static struct nf_hook_ops nf_test_ops[] __read_mostly = {
      {
        .hook = nf_test_in_hook,
        .owner = THIS_MODULE,
        .pf = NFPROTO_IPV4,
        .hooknum = NF_INET_LOCAL_IN,
        .priority = NF_IP_PRI_FIRST,
      },
    };
    
    void hdr_dump(struct ethhdr *ehdr) {
        printk("[MAC_DES:%x,%x,%x,%x,%x,%x"
               "MAC_SRC: %x,%x,%x,%x,%x,%x Prot:%x]\n",
               ehdr->h_dest[0],ehdr->h_dest[1],ehdr->h_dest[2],ehdr->h_dest[3],
               ehdr->h_dest[4],ehdr->h_dest[5],ehdr->h_source[0],ehdr->h_source[1],
               ehdr->h_source[2],ehdr->h_source[3],ehdr->h_source[4],
               ehdr->h_source[5],ehdr->h_proto);
    }
    
    #define NIPQUAD(addr) \
        ((unsigned char *)&addr)[0], \
        ((unsigned char *)&addr)[1], \
        ((unsigned char *)&addr)[2], \
        ((unsigned char *)&addr)[3]
    #define NIPQUAD_FMT "%u.%u.%u.%u"
    
    static unsigned int
    nf_test_in_hook(unsigned int hook, struct sk_buff *skb, const struct net_device *in,
                    const struct net_device *out, int (*okfn)(struct sk_buff*)) {
      struct ethhdr *eth_header;
      struct iphdr *ip_header;
      eth_header = (struct ethhdr *)(skb_mac_header(skb));
      ip_header = (struct iphdr *)(skb_network_header(skb));
      hdr_dump(eth_header);
      printk("src IP:'"NIPQUAD_FMT"', dst IP:'"NIPQUAD_FMT"' \n",
             NIPQUAD(ip_header->saddr), NIPQUAD(ip_header->daddr));
      return NF_ACCEPT;
    }
    
    static int __init init_nf_test(void) {
      int ret;
      ret = nf_register_hooks(nf_test_ops, ARRAY_SIZE(nf_test_ops));
      if (ret < 0) {
        printk("register nf hook fail\n");
        return ret;
      }
      printk(KERN_NOTICE "register nf test hook\n");
      return 0;
    }
    
    static void __exit exit_nf_test(void) {
      nf_unregister_hooks(nf_test_ops, ARRAY_SIZE(nf_test_ops));
    }
    
    module_init(init_nf_test);
    module_exit(exit_nf_test);
    

    该 Demo 为网络上找到的 Demo 程序,地址:http://wiki.dreamrunner.org/public_html/Linux/Networks/netfilter.html

    这个 Demo 程序是个内核模块,模块入口为module_init传入的init_nf_test函数。

    在init_nf_test函数中,其通过 Netfilter 提供的 nf_register_hooks 接口将自定义的nf_test_opt注册到钩子节点中。nf_test_opt为struct nf_hook_ops类型的结构体数组,其内部包含了所有关键元素,比如钩子函数的注册节点(此处为NF_INET_LOCAL_IN)以及钩子函数(nf_test_in_hook)。

    在nf_test_in_hook函数内部,其检查每一个传递过来的数据包,并将其源 Mac 地址,目的 Mac 地址,源 IP 地址以及目的 IP 地址打印出来。最后返回NF_ACCEPT,将数据包交给下一个钩子函数处理。

    4.5 NAT 和 conntrack

    NAT(Network Address Translation)技术现如今被广泛应用于路由器等网络设备中,其在解决 IPv4 地址紧缺的问题上起到了至关重要的作用,但与此同时也存在一定的安全隐患。

    而 conntrack(连接追踪)也是广泛应用于路由器网络设备中的模块,其根据数据包的五元组以及 NAT 的转换结果,记录每一条连接的状态,在提升设备转发效率上起到了很大的作用,但另一方面,记录连接信息需要消耗一部分资源,也会导致设备出现性能瓶颈。

    5. 总结

    Linux 网络协议栈是 Linux 内核中非常重要的子系统之一,虽然上层应用的开发维护工作极少涉及修改内核网络部分的工作,但了解其设计思想,基本工作原理,也可以为我们日常工作带来比较不少的帮助,特别是涉及到前后台网络交互,服务器网络性能相关的工作时。

    这篇文章所涉及的内容也仅仅是 Linux 网络协议栈中网络层的极小一部分,如下为 Linux 内核中数据包流向的整体脉络图以及 Netfilter 的整体生效节点:
    在这里插入图片描述

    展开全文
  • 网络分层:OSI七层模型(了解),TCP/IP 四层或五层模型,每一层的代表协议、硬件、技术 网络传输流程:网络互联(了解),局域网(了解),广域网 重点协议: ① TCP/UDP::掌握特性、原理和流程 ③ HTTP: 掌握...

    学习重点:

    1. 网络分层:OSI七层模型(了解),TCP/IP 四层或五层模型,每一层的代表协议、硬件、技术
      网络传输流程:网络互联(了解),局域网(了解),广域网
    2. 重点协议
      TCP/UDP::掌握特性、原理和流程
      HTTP: 掌握协议的格式,以及某些细节上的作用
      其他的重要协议(在网络传输流程中使用到):ARP/RARP、DNS、NAT、NATP、MTU、IMCP、IP、MAC
      网络传输流程中使用到的技术:以太网、路由、网管+子网掩码
    一. OSI七层模型(了解)
    1. OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
    2. OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
    3. 最大优点是将服务、接口和协议这三个概念明确地区分开来,缺点是既复杂又不实用。
    4. OSI七层模型须知物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
    5. 分层结构
      在这里插入图片描述
    二. TCP/IP五层(或四层)模型
    1. 网络设备:集线器、交换机(数据转发)、路由器、主机。依据于网络设备才有了网络传输
    2. TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
    3. 模型:
      物理层负责光/电信号的传递方式。 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。 集线器(Hub)工作在物理层。
      数据链路层负责设备之间的数据帧的传送和识别。 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准。 交换机(Switch)工作在数据链路层.
      网络层负责地址管理和路由选择。 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由).。路由器(Router)工作在网路层。
      传输层负责两台主机之间的数据传输。 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
      应用层负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等.。我们的网络编程主要就是针对应用层。
      在这里插入图片描述物理层我们考虑的比较少. 因此很多时候也可以称为 TCP/IP四层模型。
    4. 一般而言:
      ▶对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
      ▶对于一台路由器, 它实现了从网络层到物理层;
      ▶对于一台交换机, 它实现了从数据链路层到物理层;
      ▶对于集线器, 它只实现了物理层;
      但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);
    三. 网络传输基本流程

    两台计算机通过TCP/IP协议通讯过程如下:

    跨网段的主机的文件传输, 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器. 如下图所示:
    在这里插入图片描述
    而在数据传输的过程中会涉及到数据包的封装和分用

    五. 数据包的封装和分用
    1. 不同的协议层对数据包有不同的称谓,在传输层叫做(segment),在网络层叫做数据包 (datagram),在链路层叫做(frame).
    2. 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
    3. 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息.
    4. 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理.

    封装过程如下图如示:
    在这里插入图片描述
    分用过程如图所示:
    在这里插入图片描述
    简单来说封装和分用就是类似于封快递和拆快递的两个过程。

    展开全文
  • 网络分层: OSI七层模型(了解)、TCP/IP 四层或五层模型,每一层的代表协议,硬件,技术; 网络传输流程:网络互联(了解),局域网(了解),广域网; 重点协议: (1) TCP/UDP: 掌握特性、原理和流程; (2) HTTP:掌握协议的...

    【重点知识概括】

    1. 网络分层: OSI七层模型(了解)、TCP/IP 四层或五层模型,每一层的代表协议,硬件,技术;
    2. 网络传输流程:网络互联(了解),局域网(了解),广域网;
    3. 重点协议:
      (1) TCP/UDP: 掌握特性、原理和流程;
      (2) HTTP:掌握协议的格式,及某些细节上作用;
      (3) 其他的重要协议(在网络传输流程中使用到) : ARP/RARP. DNS. NAT、NATP、MTU、 ICMP、IP、 MAC
      (4)网络传输流程中使用到的技术:以太网、路由、网关+子网掩码

    一、OSI七层模型:

    ①物理层、②数据链路层、③网络层、④传输层、⑤会话层、⑥表示层、⑦应用层

    二、TCP/IP五层(或四层)模型(四层无物理层)

    在这里插入图片描述
    ①物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆
    (现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等.
    集线器(Hub)工作在物理层.

    ②数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准.
    交换机(Switch)工作在数据链路层.

    ③网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由).
    路由器(Router)工作在网路层.

    ④传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.

    ⑤应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.

    对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
    对于一台路由器, 它实现了从网络层到物理层;
    对于一台交换机,它实现了从数据链路层到物理层;

    三、数据包封装和分用

    封装类似发送快递包裹,需要从内往外打包;
    分用类似拆快递,需要从外往内拆包。

    • 使用程序时,只知道目的ip和目的端口号

    在这里插入图片描述
    下图为数据封装的过程:
    在这里插入图片描述
    四、网络中的地址管理

    1. ip地址:

    定位网络中某一台主机,在网络层包装IP地址。用来标识网络中不同主机的地址;

    本机IP默认为127.0.0.1 ,前三位为网络号,最后一位是主机号端口号:绑定主机中某一个应用程序,应用程序都是通过在传输层包装端口号发送/接收数据.

    1. 五元组:
      源IP+源端口号+目的IP+目的端口号+协议号
      ①IP+端口号:可以定位到网络上具体的某-个应用程序
      ②发送数据:五元组; 接收端响应数据:
      目的IP+ 目的端口号=发送数据包中的源IP +源端口

    2. MAC地址:
      用来识别数据链路层中相连的节点;
      网卡绑定的物理地址。

    IP和MAC的区别:
    IP地址描述的是路途总体的起点和终点:
    MAC地址描述的是路途上的每一个区间的起点和终点

    五、网络互联(了解)

    (1)、集线器:只是左数据的转发

    如图:主机A发送FTP"下载某个文件"数据包到主机C
    在这里插入图片描述
    查找目的主机MAC地址:

    1.查找本机ARP缓存表,通过目的IP查找目的MAC;

    2.如果找到,就直接发送数据包(广播)

    3.如果找不到,主机A广播一个ARP请求数据包到所有主机接收到ARP数据包;

    ARP请求数据包:源MAC+目的MAC(广 播形式的FF…);
    其他主机接收到ARP数据包的处理过程:
    if(目的ip==自己的ip)响应回自己的mac; else 丢弃数据包

    (2)、冲突域:
    连接在同一导线上的所有工作站的集合,或者说是同一物理网段上所有节点的集合或以太网上竞争同一带宽的节点集合。
    (就比如房间中所有人同时说话, 会让大家互相都听不清)

    集线器网络互联存在冲突域,交换机可以解决冲突域

    (3)、局域网

    ①交换机连接:交换机没有进行数据的加工(封装和分用)

    在这里插入图片描述

    ②交换机+路由器:

    场景:主机1发送FTP“某文件下载”数据包到主机4

    发送的数据报:源IP+源MAC+目的IP+目的MAC+协议号
    在这里插入图片描述
    【发送的过程】

    1.判断是否本机与目的主机在同一-个网段:
    目的IP + 子网掩码(位与操作得到网络号);

    2.在同一个网段,走交换机连接的逻辑;

    3.不同网段:通过ARP缓存表,查询网关IP对应的MAC

    • 主机发送数据报为:源IP (主机1) +源MAC (主机1) +目的IP (主机4) +目的MAC (路由器) + 协议号
    • 路由器接收数据报:

    1.路由表:目的IP对应设备的MAC地址 (查找过程和之前类似)

    2.数据报的加工(先分用,在重新封装) :
    数据包的以太网帧(数据链路层)里边包含的源MAC修改为自己(路由器)的MAC、目的MAC修改为目的主机(主机4)的MAC

    3.按目的MAC发数据报:发送到主机4

    4.目的主机解析(分用),响应数据报(封装发送) ,和之前发送端的逻辑一样

    (3)、广域网:

    场景: 主机1请求 https//www.baidu.com/

    在这里插入图片描述
    【传输流程】

    1. 封装数据报:
      在这里插入图片描述
    2. 路由器解析数据报:分用后封装

    (1)数据链路层:源MAC修改为自己(路由器A),通过目的IP在路由表查询到下一跳设备的MAC地址,将目的MAC修改为下个设备的MAC;
    (路由表可能不知道目的IP的地址,但是可以知道相连设备哪个方向更近)

    (2)网络层:源IP由局域网IP (主机1)改为路由器公网IP, NAT技术转换局域网IP和公网IP;

    (3)传输层:源端口号由局域网端口(主机1程序) 改为路由器映射端口,NAPT建立ip+ port的局域网;

    源端口:主机IP+主机程序端口 映射为 路由器公网IP +路由器公网端口

    展开全文
  • 6.4 如何程序中使用各资源 6.4.1 使用菜单与加速键 6.4.2 使用图标和光标 6.4.3 位图及对话框 6.4.4 子窗口控件字符串资源 6.5 图形设备接口( GDI) 6.5.1 什么是图形设备接口( GDI) 6.5.2 刷新客户区 6.5.3 设备...
  • 21天学通C++ (中文第版)

    热门讨论 2010-06-23 16:57:03
    4.10 嵌套if语句中使用大括号 4.11 使用逻辑运算符 4.11.1 逻辑AND运算符 4.11.2 逻辑OR运算符 4.11.3 逻辑NOT运算符 4.12 简化求值 4.13 关系运算符的优先级 4.14 再谈真和假 4.15 条件运算符(三日运算符...
  • 的范例Windows XP系统、Macintosh OS X系统和Linux系统进行 了测试。只有为数不多的几个程序会受编译器不兼容问题的影响。本书前一版面世后,编译器遵循C++标 准方面更严格。 对于本书完整的程序,...
  • 的范例Windows XP系统、Macintosh OS X系统和Linux系统进行 了测试。只有为数不多的几个程序会受编译器不兼容问题的影响。本书前一版面世后,编译器遵循C++标 准方面更严格。 对于本书完整的程序,...
  • 的范例Windows XP系统、Macintosh OS X系统和Linux系统进行 了测试。只有为数不多的几个程序会受编译器不兼容问题的影响。本书前一版面世后,编译器遵循C++标 准方面更严格。 对于本书完整的程序,...
  • 的范例Windows XP系统、Macintosh OS X系统和Linux系统进行 了测试。只有为数不多的几个程序会受编译器不兼容问题的影响。本书前一版面世后,编译器遵循C++标 准方面更严格。 对于本书完整的程序,...
  • 全书共分4个部分,第一部分介绍最基本的概念、术语及建模原则,第二部分描述了关系数据模型和关系型DBMS,第三部分讨论数据库设计,第四部分主要描述数据库系统中使用的物理文件结构和存取方法。书涉及的内容非常...
  • 6.5.1 从翻译模式去掉嵌入产生式中间的动作 6.5.2分析栈的继承属性 6.5.3模拟继承属性的计算 6.5.4 用综合属性代替继承属 练 习 第七章 语义分析和中间代码产生 7.1 中间语言 7.1.1 后缀式 7.1.2 图...
  • OSI 模型中将网络划分为七层,但目前实际广泛使用的 TCP/IP 协议框架体系内,我们一般将网络划分为五层,从下到依次为物理层,链路层,网络层,传输层以及应用层。两者的区别在于 OSI 模型在应用层对数据包做了...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 196
精华内容 78
关键字:

在五层原理模型中上层使用