java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之计网

java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之计网,第1张

PART1:计算机网络体系可以大致分为一下三种,

  • 每一层有自己对应的协议,每一层都是向上一层提供服务,每个分层中所有的协议都称为协议栈

    • 协议:网络中传输信息时的规范和规则
  • OSI七层模型:大而全,但是比较复杂、而且是先有了理论模型,没有实际应用

    • 七层网络体系结构各层的主要功能::
      • 应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等。(应用层协议基本上不是基于TCP就是基于UDP的,因为要靠这俩哥们向上层提供服务呀)

        应用层中的各个应用程序(浏览器)委托收发数据的过程的关键点就是像对DNS服务器发送查询一样,调用Socket库中的特定程序组件(也就是OS那些方法们,API)。访问DNS服务器时我们调用的是一个叫作gethostbyname的程序组件(也就是解析器),而这一次则需要按照一定的顺序调用若干个程序组件,其过程如下图所示。下面咱们以HTTP工作过程包含下面五个方面为例:
        • HTTP工作过程包含下面四个方面:咱们心里得明白,你应用层的HTTP或者其他协议再牛,你最后还得通过传输层去进行下一步工作,像下面这样。但是不管是在下面哪一个阶段,Socket库中的程序组件(也就是一堆API或者说OS的方法们)都会被调用来执行相关的收据收发 *** 作。浏览器等应用程序不会自己去创建套接字、连接管道、放入数据等这些工作,而是委托OS的协议栈来代劳。

          下面这四步就是HTTP的工作过程。HTTP协议将HTML文档和图片都作为单独的对象来处理,每获取次数据,就要执行一次连接、发送请求消息、接收响应消息、断开的过程

          因此,如果一个网页中包含很多张图片,就必须重复进行很多次连接、收发数据、断开的 *** 作。对于同一台服务器来说,重复连接和断开显然是效率很低的,因此后来人们又设计出了能够在一 次连接中收发多个请求和响应的方法。在HTTP版本1.1中就可以使用这种方法,在这种情况下,当所有数据都请求完成后,浏览器会主动触发断开连接的 *** 作。浏览器与Web服务器之间收发消息的过程中实际负贵收发消息的是协议栈、网卡驱动和网卡,只有这3者相互配合,数据才能够在网络中流动起来
          • (1):创建套接字阶段(调用socket后socket套接字就创建好了):这条管道不是一开始就有,而是在进行收发数据 *** 作之前先建立起这条管道才行(最重要的是建立管道两端的数据出入口,这些出入口就是套接字。相当于我们需要先创建套接字然后将套接字连接起来形成管道),然后等待客户端向该套接字连接管道。当服务器进入等待状态时客户端就可以连接管道了。
            • 创建套接字时,首先由OS的内存模块分配一个套接字所需的内存空间,然后向其中写入初始状态。

              在这个过程中,协议栈首先会分配用于存放一个套接字所需的内存空间。用于记录套接字控制信息的内存空间并不是一开始就存在的,因此我们先要开辟出这样一块空间来,这相当于为控制信息准备一个容器。
            • 首先服务器一方启动后先创建出套接字。客户端创建套接字的 *** 作非常简单,只要调用Socket库中的socket程序组件就可以了。和调用解析器一样,调用socket之后,控制流程会转移到socket内部并执行创建套接字的 *** 作,完成之后控制流程又会被移交回应用程序。只不过,socket的内部 *** 作并不像解析器那样简单。
            • 客户端也会先创建一个套接字,然后从该套接字延伸出管道,最后管道连接到服务器端的套接字上
              • Socket、 socket.、套接字(英文也是socket)等看起来非常容易混淆的词,其中小写的socket表示程序组件的名称,大写字母开头的Socket表示库,而汉字的“套接字”则表示管道两端的接口。后面将提到的connect、write、read、close 等就是程序组件的内部 *** 作。,也就是说明**程序组件其实内部就放了一堆方法呗**。当调用Socket库中的程序组件时,应用程序所指定的参数会通过Sacket库的程序组件传递给协议栈,并由协议栈来实际执行相应的 *** 作。
            • 套接字创建完成后,协议栈会返回一个描述符,应用程序会将收到的描述符存放在内存中
              • 描述符是用来识别不同的套接字的。我们现在只关注了浏览器访问Web服务器的过程,但实际上计算机中会同时进行多个数据的通信 *** 作,比如可以打开两个浏览器窗口,同时访问两台Web服务器。这时有两个数据收发 *** 作在同时进行,也就需要创建两个不同的套接字。这个例子说明,同一台计算机上可能同时存在多个套接字,在这样的情况下,我们就需要一种方法来识别出某个特定的套接字,这种方法就是描述符。我们可以将描述符理解成**给某个套接字分配的编号。也许光说编号还不够形象,大家可以想象一下在酒店寄存行李的场景,酒店服务人员会给你一个号码牌,向服务人员出示号码牌,就可以取回自己寄存的行李,描述符的原理和这个差不多。当创建套接字后,我们就可以使用这个套接字来执行收发数据的 *** 作了。这时,只要我们出示描述符,协议栈就能够判断出我们希望用哪一个套接字来连接或者收发数据了。应用程序是通过“描述符”这一类似号码牌的东西来识别套接字的**。
            • 协议栈首先会分配用于存放一个套接字所需的内存空间。用于记录套接字控制信息的内存空间并不是一开始就存在的,因此我们先要开辟出这样一块空间来,这相当于为控制信息准备一个容器。但光一个容器并没有什么用,还需要往里面存入控制信息。套接字刚刚创建时,数据收发 *** 作还没有开始,因此需要在套接字的内存空间中写入表示这一初始状态的控制信息。到这里,创建套接字的 *** 作就完成了。
            • 计算机内部公同时运行多个程序,如果每个程序都擅自使用内存空间的话,就有可能发生多个程序重复使用同一个内存区域导致数据损坏的问题。为了避免出现这样的问题。 *** 作系统中有一个内存管理模块。它相当于内存的管理员,负责根据程序的申请分配相应的内存空间。确保这些内存空间不会被其他程序使用。因此。分配内存的 *** 作就是向内存管理模块提出申请,请它划分一块内存空间出来。
            • 接下来,需要将表示这个套接字的描述符告知应用程序。描述符相当于用来区分协议栈中的多个套接字的号码牌收到描述符之后,应用程序在向协议栈进行收发数据委托时就需要提供这个描述符。由于套接字中记录了通信双方的信息以及通信处于怎样的状态,所以只要通过描述符确定了相应的套接字,协议栈就能够获取所有的相关信息,这样一来,应用程序就不需要每次都告诉协议栈应该和谁进行通信了.
          • (2)连接阶段(总而言之,就是当调用connect进行连接时,协议栈就会执行连接 *** 作。当连接成功后,协议栈会将对方的IP地址和端口号等信息保存在套接字中,这样我们就可以开始收发数据了。描述符:应用程序用来识别套接字的机制。IP地址和端口号:客户端和服务器之间用来识别对方套接字的机制):将管道连接到服务器端的套接字上。我们需要委托协议栈将客户端创建的套接字与服务器那边的套接字连接起来。应用程序通过调用Socket库中的名为connect的程序组件来完成这一 *** 作。这里的要点是当调用connect时,需要指定描述符、服务器IP地址和端口号这3个参数。
            • 第1个参数,即描述符,就是在创建套接字的时候由协议栈返回的那个描述符。connect会将应用程序指定的描述符告知协议栈,然后协议栈根据这个描述符来判断到底使用哪一个套接字去和服务器端的套接字进行连接,并执行连接的 *** 作。当调用Socket库中的程序组件时,应用程序所指定的参数会通过Sacket库的程序组件传递给协议栈,并由协议栈来实际执行相应的 *** 作。
            • 第2个参数,即服务器IP地址,就是通过DNS服务器查询得到的我们要访问的服务器的IP地址。在DNS服务器那里进行数据收发 *** 作时,双方必须知道对方的IP地址并告知协议栈。这个参数就是那个IP地址了。
            • 第3个参数,即端口号。IP地址是为了区分网络中的各个计算机而分配的数值。因此,只要知道了IP地址,我们就可以识别出网络.上的某台计算机。但是,连接 *** 作的对象是某个具体的套接字,因此必须要识别到具体的套接字才行,而仅凭IP地址是无法做到这一点的。我们打电话的时候,也需要通过“请帮我找一下 某某某”这样的方式来找到具体的某个联系人,而端口号就是这样一种方式。当同时指定IP地址和端口号时,就可以明确识别出某台具体的计算机上的某个具体的套接字。准确地说,IP地址不是分配给每一台设备的,而是分配给设各中安装的网络硬件的。因此,如果一台设备中安装了多个网络硬件,那么就会有多个IP地址。
              • 能不能只用前面创建套接字时提到的那个描述符而不用IP和端口来识别套接字呢? "这种方法其实是行不通的,因为描述符是和委托创建套接字的应用程序进行交互时使用的,并不是用来告诉网络连接的另-方的,因此另一方并不知道这个描述符。同样地,客户端也无法知道服务器上的描述符。因此,客户端也无法通过服务器端的描述符去确定位于服务器上的某一个套接字。所以,我们需要另外一个对客户端也同样适用的机制,而这个机制就是端口号。如果说描述符是用来在一台计算机内部识别套接字的机制,那么端口号就是用来让通信的另一方能够识别出套接字的机制。当同时指定IP地址和端口号时,就可以明确识别出某台具体的计算机上的某个具体的套接字。既然需要通过端口号来确定连接对象的套接字,那么到底应该使用几号端口呢?网址中好像并没有端口号也不能像IP地址一样去问DNS服务器。其实服务器上所使用的端口号足根据应用的种类事先规定好的,仅此而已。比如Web是80号端口,电子邮件是25号端口65。只要指定了事先规定好的端口号,就可以连接到相应的服务器程序的套接字。也就是说,浏览器访问Web服务器时使用80号端口,这是已经规定好的。实际上根据网址的规则, 是有用来写端口号的地方的, 但实际的网址中很少出现端口号,大部分情况下都省略了。实际上存在通过DNS服务器查询端口号的机制,只能说并没有广泛普及。客户端在创建套接字时,协议栈会为这个套接字随便分配一个端口号66。接下来,当协议栈执行连接 *** 作时,会将这个随便分配的端口号通知给服务器。
          • (3)收发数据(通信阶段): 传递消息:当双方的套接字连接起来后通信准备就完成了。接下来就是将数据送入套接字就可以收发数据了
            • 当套接字连接起来之后,剩下的事情就是只要将数据送入套接字,数据就会被发送到对方的套接字中。当然,应用程序无法直接控制套接字,因此还是要通过Socket库委托协议栈来完成这个 *** 作。这个 *** 作需要使用write这个程序组件,具体过程如下。
              • 首先,应用程序需要在内存中准备好要发送的数据。根据用户输入的网址中的域名和域名前的协议种类,由对应的协议(假设用的是HTTP)生成的HTTP请求消息就是我们要发送的数据。
              • 接下来,当调用write时,需要指定描述符和发送数据,然后协议栈就会将数据发送到服务器。由于套接字中已经保存了已连接的通信对象的相关信息,也就是IP和端口号,所以只要通过描述符指定套接字,就可以识别出通信对象,并向其发送数据。
              • 接着,发送数据会通过网络到达我们要访问的服务器。
              • 接下来,服务器执行接收 *** 作,解析收到的数据内容并执行相应的 *** 作,向客户端返回响应消息。当消息返回后,需要执行的是接收消息的 *** 作。接收消息的 *** 作是通过Socket库中的read程序组件委托协议栈来完成的。调用read时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区。于是,当服务器返回响应消息时,read就会负责将接收到的响应消息存放到接收方的内存空间也就是接收缓冲区中。由于接收缓冲区是一块位于应用程序内部的内存空间,因此当消息被存放到接收缓冲区中时,就相当于已经转交给了应用程序。
          • (4):断开阶段: 收发数据结束。当浏览器收到数据之后,收发数据的过程就结束了。接下来,我们需要调用Socket库的close程序组件进入断开阶段。最终,连接在套接字之间的管道会被断开,套接字本身也会被删除。断开的过程如下。当数据全部发送完毕后连接的管道将会被断开(断开客户端或者服务器都可以发起断开,管道断开后套接字也会被删除,通信 *** 作就标志结束)。
            • Web使用的HTTP协议规定,当Web服务器发送完响应消息之后,应该主动执行断开 *** 作,因此Web服务器会首先调用dlose来断开连接。断开 *** 作传达到客户端之后,客户端的套接字也会进入断开阶段。接下来,当浏览器调用read执行接收数据 *** 作时,read会告知浏览器收发数据 *** 作已结束,连接已经断开。浏览器得知后,也会调用close进入断开阶段。根据应用种类不同,客户端和服务器哪一方先执行lose都有可能。有些应用中是客户端先执行close, 而另外一些应用中则是服务器先执行close.
      • 表示层:主要负责数据格式的转换,如加密解密、转换翻译、压缩解压缩等。
      • 会话层:负责在网络中的两节点之间建立、维持和终止通信,如服务器验证用户登录便是由会话层完成的。
      • 运输层:有时也译为传输层,向主机进程提供通用的数据传输服务。

        运输层主要有以下两种协议:
        • TCP:提供面向连接的、可靠的数据传输服务;TCP 用于在传输层有必要实现可靠传输的情况
          • TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
            • FTP文件传输
            • HTTP / HTTPS
          • TCP协议如何保证可靠性?----TCP主要提供了检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制和 流量控制等方法实现了可靠性传输。
            • 检验和:通过检验和的方式,接**收端可以检测出来数据是否有差错和异常**,假如有差错就会直接丢弃TCP段,重新发送。
            • 序列号/确认应答:序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据
              • TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文,这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发
            • 滑动窗口:动窗口既提高了报文传输的效率,也避免了发送方发送过多的数据而导致接收方无法正常处理的异常。
              • 详细讲一下TCP的滑动窗口?:
                • 在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。(为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值
                  • 分组:当发送端与接收端相互传输数据时,不可以一次性(有个最大传输长度MTU存在,当传输的数据大于这个限制时,表示必须分组了,太大了)就将数据传输完毕,会将数据分段,然后再给每段加上首部字段后再去传输,此时**分段后加上首部字段形成的信息包称为分组**,每层都有自己(自己按照自己目的加工出来的)的分组
                • 滑动窗口起到了一个限流的作用,也就是说当前滑动窗口的大小决定了当前 TCP 发送包的速率,而滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的最小值
            • 超时重传:超时重传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是丢包了,需要重传。最大超时时间是动态计算的
            • 拥塞控制:在数据传输过程中,可能由于网络状态的问题,造成网络拥堵,此时引入拥塞控制机制,在保证TCP可靠性的同时,提高性能
              • 详细讲一下拥塞控制?—TCP 一共使用了四种算法来实现拥塞控制:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。当cwndssthresh时,改用拥塞避免算法
                • 慢开始 (slow-start);
                  • 不要一开始就发送大量的数据,由小到大逐渐增加拥塞窗口的大小
                • 拥塞避免 (congestion avoidance);
                  • 拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1而不是加倍。这样拥塞窗口按线性规律缓慢增长。
                • 快速重传 (fast retransmit);
                  • 我们可以剔除一些不必要的拥塞报文,提高网络吞吐量。比如接收方在收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时捎带确认。快重传规定:发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期
                • 快速恢复 (fast recovery)。
                  • 主要是配合快重传。当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半(为了预防网络发生拥塞),但接下来并不执行慢开始算法,因为如果网络出现拥塞的话就不会收到好几个重复的确认,收到三个重复确认说明网络状况还可以
            • 流量控制:如果主机A 一直向主机B发送数据,不考虑主机B的接受能力,则可能导致主机B的接受缓冲区满了而无法再接受数据,从而会导致大量的数据丢包,引发重传机制。而**在重传的过程中,若主机B的接收缓冲区情况仍未好转,则会将大量的时间浪费在重传数据上,降低传送数据的效率。所以引入流量控制机制,主机B通过告诉主机A自己接收缓冲区的大小,来使主机A控制发送的数据量流量控制与TCP协议报头中的窗口大小**有关
        • UDP:提供无连接的、尽最大努力的数据传输服务,但不保证数据传输的可靠性。UDP 用于对高速传输和实时性有较高要求的通信。TCP 和 UDP 应该根据应用目的按需使用。
          • UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
            • 包总量较少的通信,如 DNS 、SNMP等
            • 视频、音频等多媒体通信
            • 广播通信
          • TCP和UDP的区别?
      • 网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP协议。
        • 此外,IP中还包括ICMP协议和ARP协议。
          • ICMP用于告知网络包传送过程中产生的错误以及各种控制消息,
          • ARP用于根据IP地址查询相应的以太网MAC地址。
        • 网络包:网络中的数据会被切分成几十字节到几千字节的小块,每一个小数据块被称为一个包。
      • 数据链路层:数据链路层通常简称为链路层。将网络层传下来的IP数据包组装成帧,并再相邻节点的链路上传送帧。
      • 物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和通信手段的差异。
  • TCP/IP四层模型:TCP/IP其实就是由一些小的子网(子网相当于用集线器连接起来的几台计算机)通过路由器连接起来组成一个大的网络

    • 是由实际应用发展总结出来的,从实质上讲,TCP/IP只有最上面三层,最下面一层没有什么具体内容,TCP/IP参考模型没有真正描述这一层的实现。
  • 五层模型

    • 五层模型只出现在计算机网络教学过程中,这是对七层模型和四层模型的一个折中,既简洁又能将概念阐述清楚。

巨人的肩膀:
网络是怎样连接的

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/877168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存