java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之计网_Part_2(在浏览器中输入www.baidu.com后执行的全部过程、DNS的域名<->IP地址、OS协议栈的样子、CDN)整起

可以说计算机网络,就是玩那几层中的那些协议们,本层玩,本层玩完了跨层玩,跨层玩,跨层玩完了本层玩…

PART1:在浏览器中输入网站网址后执行的全部过程?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0.服务器在 80 端口等待客户的请求。
  • 1.【浏览器发起到服务器的 TCP 连接(创建套接字 Socket),然后浏览器做的第一步工作是解析 URL】域名解析(域名 www.baidu.com 变为 ip 地址)找到ip地址后【因为委托操作系统发送HTTP请求消息时,必须提供通信对象的 IP 地址。】,并生成发送给web服务器的 HTTP 请求信息
    在这里插入图片描述
    • 微博和Twitter都有140字数的限制,如果分享一个长网址,很容易就超出限制,所以背后肯定有一个用来缩短网址的系统或者工具或者平台啥的,那他是怎么实现的呢?设计一个短网址服务(TinyURL),见路人老师的文章
    • 浏览器搜索自己的DNS缓存(DNS服务器是一种专门保存了 Web 服务器域名与 IP 的对应关系的服务器);下面PART2有详细的DNS相关
      在这里插入图片描述
      在这里插入图片描述
      • 为什么要这样一层一层查是因为域名是分层的,比如www.aaa.bbbbbb.com.,如果按照公司里面的组织结构来说就是com集团的bbbbbb部门里面的aaa科的www,域名是越靠右表示层级越高
        • 这种具有层次结构的域名信息会注册到DNS服务器中,每个域都是作为一个整体来处理的
    • 生产 HTTP 请求信息:对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了
      在这里插入图片描述
  • 2.得到了 IP 以后,向服务器发送 TCP 连接,发起 tcp 的三次握手,建立TCP连接【在 HTTP 传输数据之前,首先需要 TCP 建立连接,TCP 连接的建立,通常称为三次握手】(建立socket连接,通过socket先建立TCP连接【服务器接收来自浏览器的 TCP 连接】,然后再给服务器发送数据,其实将请求数据发给了服务器)。浏览器会以一个随机端口(1024-65535)向服务端的 web 程序 80 端口发起 tcp 的连接。
    在这里插入图片描述
    • 这个所谓的「连接」,只是双方计算机里维护一个状态机,在连接建立的过程中,双方的状态变化时序图就像这样。
    • 应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作【通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈】。
      • 协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议, TCP 和 UDP 协议这两个传输协议会接受应用层的委托执行收发数据的操作
      • 协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。IP 中还包括 ICMP 协议和 ARP 协议
        • ICMP:用于告知网络包传送过程中产生的错误以及各种控制信息
        • ARP:用于根据 IP 地址查询相应的以太网 MAC 地址
      • IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作
    • 其实就是OS通过源码中的tcp_connect建立TCP连接,那么我Java这些外部东东是如何调用这些例如tcp_connect(…)方法的呢。
      • 其实就是OS搞一个叫Socket接口(OS内部的一个.c文件,也可以说**socket是TCP协议的一个接口,也可以说socket是OS实现的。OS向外提供了一个socket接口,上层的应用程序只能使用socket这些接口**)(这个是个Class,业务层面的那种接口,并不是咱们Java中的Interface,对应于OS,),就是人家OS搞得.c文件(就类似于咱们Java中的.class呀,里面有很多方法或者叫函数…),这些.c文件中有很多的方法或者函数。这些方法就提供给上层的应用程序们来用,
        • 比如咱们Java中,怎样用TCP或者UDP(或者说怎样调用Socket接口):
          在这里插入图片描述
          然后Java中创建一个socket(记住哦,socket是OS实现的TCP的一个向外人提供服务的接口,所以才会有咱们main()函数的上面那一行)最终是调用了一个native方法:native void socketCreate(…)
          在这里插入图片描述
          也可以打个断点进去跟随一下源码,如下:
          在这里插入图片描述
          既然是实例化,那么首先肯定会进入到构造方法中:
          在这里插入图片描述
          在这里插入图片描述
          在这里插入图片描述
  • 3.建立 tcp 连接后(接受 TCP 报文后,对连接进行处理)发起 http 请求【需要委托操作系统将生成的HTTP请求消息发送给 Web 服务器】。因为HTTP 是基于 TCP 协议传输的
    • 其实是应用程序建立连接后通过OS实现的TCP协议的socket接口给服务器发了数据,然后服务器对从socket中取出来的这些数据进行解析,解析成一个又一个请求。
      • 服务器通过什么方式解析数据就得看你这些应用程序是通过什么协议发送过来的数据,HTTPorRPC。假如说咱们使用的是HTTP协议,那么咱们就按照HTTP协议的格式把数据解析出来呗。不就解析出来Request对象了嘛,然后要是感觉本对象直接暴露给别人会给别人造成很大麻烦或者不安全,就搞个门面或者代理,形成父子或者兄弟关系,让别人调用就行。
        在这里插入图片描述
        • 你找这张图总结一下:我是一个运行在OS上的服务器(软件)Tomcat,我生来就是来接收你浏览器(上的应用程序)发来的数据的(因为是网络请求嘛,所以肯定是通过socket连接请求到的得到的数据,也就是应用程序建立连接后通过OS实现的TCP协议的socket接口给OS上的服务器发了数据),然后服务器Tomcat通过Endpoint借助不同的IO模型从socket中获取连接并取出来数据,将取到的数据解析成一个又一个请求,也就是Request对象(这个对象中有啥呢,有咱们很熟悉的请求头,请求体这些呀,这些都成为了咱们Request对象的一些属性),然后Request作为XxxServelt的入参到Tomcat的容器中一层一层处理下来 ,然后将要返回的数据以Response对象的形式返回就行
      • 假设对于咱们Java程序员,现在服务器软件用的是Tomcat,那么现在Tomcat是怎样解析数据的呢?(是哪个类具体解析数据的呢)
        在这里插入图片描述
        在这里插入图片描述
        那咱么顺道也可以看看这个解析数据的类:org.apache.coyote.http11.Http11AprProtocol"
        在这里插入图片描述
        而这里面的这个endpoint是一个抽象类:protected AbstractEndpoint endpoint = null;(这个抽象类有三个子实现类) ,这个endpoint就是来通过不同的IO模型来从socket中取数据在这里插入图片描述
        这个JIOEndpoint其实就是一个BIO模型~IO多路复用及IO模型看这里哦,在这里可以看看JIOEndpoint的实现细节哦
  • 4.服务器响应 http 请求,也就是对 HTTP 协议解析,客户端得到 html 代码。服务器 web 应用程序收到 http 请求后,就开始处理请求,处理之后就返回给浏览器 html 文件。
    • 咱们说的**通过TCP可靠协议去帮咱们传输或者说收发数据(各种运行在OS上的应用程序去生成数据,然后在调用OS的接口去传输数据)**,其实说具体点是OS实现了TCP协议,然后咱们委托OS帮咱们传递数据
    • 一般收发数据的整体思路如下:(向OS内部的协议栈发出委托时需要按照指定的顺序来调用Socket库中的程序组件),收发数据的两台计算机之间连接了一条数据通道,数据会沿着这条数据通道流动到目的地(数据可以从通道两端中的任意一段进入,然后到达另一端被取出,说明数据的流动是双向的)
  • 5.浏览器解析 html 代码,并请求 html 中的资源,服务器返回响应。
  • 6.浏览器对页面进行渲染,并呈现给用户(浏览器接受响应,显示页面,渲染页面)。

PART2:我是一个用户,人们也叫我客户端,一般我给电脑浏览器的地址栏输入一串www.xxx.xx时,人们普遍认为我这是发起了一个请求。但是呢,电脑说,nen弄啥嘞,发的这是个啥。哦,原来电脑只认识IP地址。电脑说,就这么任性怎么滴吧,然后屏幕前的我们也会奇怪,这里面域名是怎样和IP地址联系起来的呢?

  • 先插播一条,能够完成向DNS服务器查询IP地址的操作就是调用了解析器,一般就是像下面一样在应用程序中编写一行代码后就能够调用解析器完成域名<->IP地址
    在这里插入图片描述
    • 调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息(响应消息中就包含查询到的IP地址,解析器会取出IP地址并将IP地址写入浏览器指定的内存地址中)
    • DNS服务器的基本功能就是**根据需要查询的域名和记录类型查找相关的记录,向客户端返回包含着查询结果的响应消息**

开唠~

  • 1.用户在浏览器中输入网址(网址=URL,就是以http://、ftp:、file:等等开头的那一串东西)开始
    在这里插入图片描述
    • 浏览器的工作会从对用户输入的网址进行解析开始。比如,https://blog.csdn.net/m0_52436398/article/details/123765517在这里插入图片描述
    • 之所有各种各样的URL,是因为尽管咱们通常用浏览器来访问Web服务器,但是实际上**浏览器并不仅仅一个功能(可以说浏览器是一个具备多种客户端功能的综合性客户端软件,因此浏览器需要一些东西来判断应该使用哪种功能来访问相应的数据,而各种不同的URL就是这个东西**)
      • 比如,访问Web服务器时用http:
      • 访问FTP服务器用ftp:
  • 2.服务器会根据网址的多段中每段的含义生成请求消息(HTTP消息),然后请求消息生成后浏览器会委托OS向Web服务器发送请求消息(那你浏览器肯定得告诉OS接收请求消息的接收方的IP才行呀,所以浏览器得先查出Web服务器这个接收方的IP地址
    • 浏览器能够解析网址并生成HTTP消息,但是浏览器本身不具备将HTTP消息发送到网络中的功能,所以要委托OS帮忙将HTTP请求消息发到Web服务器接收方(必须提供给OS接受方或者说通信对象的IP地址而不是域名,这样人家OS才肯帮忙)
      在这里插入图片描述
      更多内容见请求头响应头格式
    • 浏览器通过请求消息将用户需要哪些数据告知服务器
    • 当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者 /default.html 这些文件【如果做过Javaweb项目的伙这样也就懂了,咱们一般的默认访问页面不也是index.xml,当然了,咱们在项目的程序中是可以修改的】
  • 3.这一步就是全世界DNS服务器的查询大接力(浏览器得先查出Web服务器这个接收方的IP地址),先到离得最近的DNS服务器上查,没有,再去根服务器上查(每台DNS服务器上都记录着根服务器的位置,群居生活嘛,不管大家记不记得住所有的人但是大家总得记住领头羊,不然没人发工资呀),从根一步一步向下查直到查到想要域名对应的IP
    • DNS 服务器就专门保存了 Web 服务器域名与 IP 的对应关系
      • DNS 中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限。在域名中,越靠右的位置表示其层级越高。【实际上域名最后还有一个点,比如 www.server.com.,这个最后的一个点代表根域名。. 根域是在最顶层,它的下一层就是 .com 顶级域,再下面是 server.com。】
        • 根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中,也就是说 所有的DNS服务器中都有根域的 DNS 服务器信息,这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器
    • 具体过程是这样,互联网中有数万台DNS服务器肯定不能一台一台去查,所以具体查询过程是这样的。
      在这里插入图片描述
      • 首先,将负责管理下级域的DNS服务器的IP地址注册到他们的上级DNS服务器中,
      • 然后,上级DNS服务器的IP地址再注册到更上一级的DNS服务器中,以此类推

      • 在这里插入图片描述
        • (所以我们一般可以从根域开始一路顺藤摸瓜找到任意一个域的DNS服务器,从而借助DNS服务器完成域名和IP的转换)---->也不是每次解析域名都要经过那么多的步骤
        • 有时候有缓存功能可以记住之前的查询,所以也没必要每次从根域开始查找
          • 浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」
          • 缓存☞将使用过的数据存放在离使用该数据的地方较近的高速存储装置中,一边提高后续访问速度的技术
  • 4.查询到IP地址后,浏览器就可以将请求消息委托给OS发送给Web服务器了一般当我们访问Web服务器获取网页数据时使用的就是GET方法:访问过程大概过程在这里在这里插入图片描述
    • Web服务器不关心这几条请求获取的文件是1个网页上的还是不同网页上的,Web服务器的任务就是对每一条单独的请求返回一条响应而已

上面完了,就到前面的第二步,发起 tcp 的三次握手,建立 tcp 连接

PART3:上面你光知道用人家协议栈,那协议栈到底是个啥东西呀?

  • 网络协议栈:
    在这里插入图片描述
    • Linux 发送与接收网络包的流程:
      在这里插入图片描述

PART4:CDN(内容分发网络)

  • CDN 全称是 Content Delivery Network/Content Distribution Network。CDN 就是将静态资源分发到多个不同的地方以实现就近访问,进而加快静态资源的访问速度,减轻服务器以及带宽的负担。比如用户下单的第一时间,商品就从距离用户最近的仓库,直接发往对应的配送站,再由京东小哥送到你家。
    • 内容分发网络:
      • 内容 :指的是静态资源比如图片、视频、文档、JS、CSS、HTML。
      • 分发网络 :指的是将这 些静态资源分发到位于多个不同的地理位置机房中的服务器上,这样,就可以实现静态资源的就近访问比如陕西的用户直接访问陕西机房的数据【 CDN 是服务上一层的特殊缓存服务,分布在全国各地,主要用来处理静态资源的请求
        • 全站加速(不同云服务商叫法不同,腾讯云叫 ECDN、阿里云叫 DCDN)既可以加速静态资源又可以加速动态资源,内容分发网络(CDN)主要针对的是 静态资源 。两个不一样。
          在这里插入图片描述
        • 基于成本、稳定性和易用性考虑,建议直接选择专业的云厂商(比如阿里云、腾讯云、华为云、青云)或者 CDN 厂商(比如网宿、蓝汛)提供的开箱即用的 CDN 服务。
        • 同一个服务在在多个不同的地方部署多份(比如同城灾备、异地灾备、同城多活、异地多活)是为了实现系统的高可用而不是就近访问。直接将服务部署在多个不同的地方会使得成本太高,需要部署多份相同的服务。并且静态资源通常占用空间比较大且经常会被访问到,如果直接使用服务器或者缓存来处理静态资源请求的话,对系统资源消耗非常大,可能会影响到系统其他服务的正常运行。所以只是系统的高可用的实现时用
    • CDN 工作原理
      • 可以通过预热的方式将源站的资源同步到 CDN 的节点中。这样的话,用户首次请求资源可以直接从 CDN 节点中取,无需回源。这样可以降低源站压力,提升用户体验。如果不预热的话,你访问的资源可能不在 CDN 节点中,这个时候 CDN 节点将请求源站获取资源,这个过程是大家经常说的 回源。如果资源有更新的话,你也可以对其 刷新 ,删除 CDN 节点上缓存的资源,当用户访问对应的资源时直接回源获取最新的资源,并重新缓存
        • 命中率 和 回源率 是衡量 CDN 服务质量两个重要指标。命中率越高越好,回源率越低越好
      • CDN 会通过 GSLB 【GSLB (Global Server Load Balance,全局负载均衡)是 CDN 的大脑,负责多个CDN节点之间相互协作,最常用的是基于 DNS 的 GSLB。】找到最合适的 CDN 节点
        在这里插入图片描述
      • 如果我们的资源被其他用户或者网站非法盗刷的话,将会是一笔不小的开支。解决这个问题最常用最简单的办法设置 Referer 防盗链,具体来说就是根据 HTTP 请求的头信息里面的 Referer 字段对请求进行限制。我们可以通过 Referer 字段获取到当前请求页面的来源页面的网站地址,这样我们就能确定请求是否来自合法的网站。CDN 服务提供商几乎都提供了这种比较基础的防盗链机制
        • 不过,如果站点的防盗链配置允许 Referer 为空的话,通过隐藏 Referer,可以直接绕开防盗链。通常情况下,我们会配合其他机制来确保静态资源被盗用,一种常用的机制是 时间戳防盗链【时间戳防盗链的实现也比较简单,并且可靠性较高,推荐使用。并且,绝大部分 CDN 服务提供商都提供了开箱即用的时间戳防盗链机制。】 。相比之下,时间戳防盗链 的安全性更强一些。时间戳防盗链加密的 URL 具有时效性,过期之后就无法再被允许访问。时间戳防盗链的 URL 通常会有两个参数一个是签名字符串,一个是过期时间。签名字符串一般是通过对用户设定的加密字符串、请求路径、过期时间通过 MD5 哈希算法取哈希的方式获得。

巨人的肩膀:
https://www.javalearn.cn/
网络是怎样连接的
小林coding
深入理解计算机系统
javaGuide老师关于计算机网络的好文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值