zoukankan      html  css  js  c++  java
  • 网络入门相关【笔记】

    网络入门相关【笔记】

    网络基础

    首先我们要知道网络是干嘛的?

    就好比我和我朋友发消息,我希望发出去的信息是可靠和安全的,但是呢,我们俩手头上的物理的线路是不可靠不安全的

    那么网络解决的问题就是建立一个可靠安全的渠道在这个不可靠不安全的线路上

    我们都知道网络有七层结构,那么操作就是搭了一个数据链路层,在不可靠不安全的线路上划分出最小的传输单位(数据包),这个数据包可以通过校验的方式来确认这个包的正确性,这样就可以在完成了传递的同时也让接受的节点知道这个包是对还是错的,这种节点之间的传输适合在同一个区域内的传递,像是我把数据发给我们邻床

    但是要想向别的远的地方传递,比如我要传文件到我家里,这个时候单单是一个数据链路层就不够了,还需要网络层,网络层中有路由,我首先把包发到宿舍的路由器中,然后路由器再发给路由器,一路传递,最后到家里,为了标示网络中的各个节点,还使用IP协议,这样每个节点就都有一个IP地址

    虽然数据链路层可以保证可以判断这个包是正确还是错误,但是并不能保证这个路径是可靠得,就是说,希望有同一个方法可以确定我这个包到底有没有发到我想发的人的手上,这样就有了传输层,传输层中有TCP协议和UDP协议,TCP协议是基于连接的,在我和收件人之间建立一个可靠的连接,在这个连接上去传输数据

    这样一来我们就可以传输可靠的数据了,但是这样就有一个问题,传出去的数据是为了什么应用服务的呢?或者说,是为了哪一个应用呢?使用的是什么协议呢?送东西终归得有点目标方法用处,这样就引入了应用层

    这样就将不可靠不安全的变成了可靠安全的,不可靠不安全的叫做物理层,这样就将这五层的关系说明了出来,七层关系中的另外两层在其中的作用会被淡化,所以就不列举了

    虽然看起来很有道理没问题也可以通过这样的方法得到解决,但是这是解决这个问题的最优方案吗?凭感觉,五层协议太多复杂,所以这很可能,不是!但是为什么这一层一层协议堆叠形成的方法用到了现在?

    可以说,网路发展到现在并不是一次性解决所有问题的,所以很多情况都是一点一点解决的,这就形成了这种一层一层的情况,像是在看网络协议的时候我们也要用这种方法,不能从理论的角度直接看待,从现在的问题的本质去出发解决,而是要从历史的发展出发,对应的情况是负责解决当时的什么问题,整个计算机的发展也是相似的,不断地迭代进化才形成了今天,而不是一次就出现了完美

    不可靠的网络传输到底是怎么个不可靠不安全?

    像是不可靠就是指在传输的时候会出现,丢包,重复包,出错或者是乱序的情况,而在不安全的时候,就可能会出现中间人攻击,窃取个人信息或者是篡改个人的信息

    滑动窗口问题

    滑动窗口协议是在TCP协议中使用的,是用来维持发送方/接收方缓冲区,这个缓冲区的作用就是解决不可靠问题,在TCP协议中,通过双方的各自维护各自的缓冲区,互相商定包的重传机制来解决不可靠问题

    那么,在没有滑动窗口协议的时候我们是要如何保证发送方和接收方的包能够接受并且按照次序呢?我们可以在发送一个包以后让接收方发送一个确认包过来,发送一个包1,就返回一个确认包1,发送一个包2,就返回一个确认包2,这样就可以解决乱序丢包等出错情况

    使用这种方法的问题也很明显,就是吞吐量很低,只有在得到上一个发送包的确认包以后才能发下一个包,那么自然就会想到改进方法就是一次多发几个包,然后一起确认,那么问题就来了,一次发几个包?确认得到几个包的时候发下一批?

    这样就产生了滑动窗口

    这里一共有十六个包,我希望发出去的十六个包都可以得到确认,这就是Ack,灰色是已经发送的,黄色是发送出去没有去确认的,绿色是准备发送的,白色是没有发送的

    正常情况下,在四号收到了确认以后,变成灰色,然后将窗口向右边移动,在只保证有七个包处在已发送和待发送状态的时候,窗口移动一格,就会将十一号读进缓存中,将八和九发出去了,但是还没有确认

    丢包的情况也是可能的,在没有得到Ack时,就会使用超时重传机制,需要注意的是,这个Ack是按照顺序发送的,比如我拿到了五和六的Ack,但是没有四的,那么我就不会发五和六的,只有在四也到达以后,才会将这几个一起发回去,在使用超时重传机制的时候,就可能出现一下子好几个包都收到了Ack,然后窗口直接移动好几个位置

    需要注意的一些关于滑动窗口的知识

    滑动窗口的大小并不是一直不变的,是会进行调整的
    滑动窗口并不只是用于流量控制,还参与了拥塞控制
    滑动窗口大小为0是合法的

    感谢观看,文笔有限,博客不出彩,还请多多见谅
  • 相关阅读:
    mysql 导入CSV数据 [转]
    Linux用户态程序计时方式详解[转]
    [转] Bash脚本:怎样一行行地读文件(最好和最坏的方法)
    第二次作业
    软件工程原理与方法 第一次作业
    2017-02-19,周日整理
    2017-02-12,周日整理
    cnblogs,第一次博客纪念。
    堆和栈的区别(转过无数次的文章)
    Flash Player版本相关问题
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14464875.html
Copyright © 2011-2022 走看看