zoukankan      html  css  js  c++  java
  • 计算机网络

    一、从点击URL到显示页面,浏览器做了什么?

          URL,Uniform Resource Locator,统一资源定位符,常说的网址,它包含的信息指出文件位置以及浏览器怎样处理它。

          点击了URL后,浏览器首先分析URL。

          URL由三部分组成:访问类型、域名、URI。

          URI,Uniform Resource Dentifier,统一资源标识符,用来定位服务器上的一切资源,包括html、css、js、图像、视频、程序等。

          访问类型:通过HTTP协议访问Web服务器则是http,通过FTP协议访问FTP服务器则是ftp,还有邮件服务器的mailto等。

          点击网址后,浏览器分析URL,然后生成请求报文并发送给服务器,服务器接收到请求后,生成相应报文返回给浏览器。

    二、HTTP协议

          就如同写信需要写问候语、署名、日期等固定格式一样,浏览器与Web服务器间的通讯消息也有严格的格式规定,而这个规定就是HTTP协议。HTTP,hypertext transfer protocol,超文本链接协议。

          浏览器分析URL后发送请求报文。请求报文由请求行、请求头、请求实体组成。请求行又由协议版本、方法、URI组成。一般请求获取页面的方法是GET。而需要提交数据给服务器并保存到服务器的数据库,方法为POST,这时请求的实体就是提交的数据。当然GET也能提交数据,不过提交的数据小并且以获取相关页面为目的的,一般不保存到数据库,如获取分页、排序、搜索等。

          服务器接收到请求报文后,找出相关资源并且放在响应报文实体中,返回给浏览器。响应报文由状态行、响应头、响应实体组成。状态行显示了本次响应的状态。常见如:200 OK,404 Not Found,503 Service Unavailable。而请求的资源放在实体中。

          网页是有许多文件组成的,如html、css、js、图像、视频等。一次请求响应的过程只能请求一个文件并返回得到一个文件,想要完整显示整个网页,通常都是先请求得到一个html文件,然后浏览器又根据html中的URI对其他文件资源进行一个个的请求,最终得到整个页面。

    三、DNS协议

          DNS,domain name system,域名系统。在浏览器的请求报文中,我们得到的是服务器的域名。但在计算机网络中,我们需要IP地址才能传输数据。

          IP地址,相当于每台主机的门牌号,如198.132.2.1。IP地址由网络号和主机号组成,同一个子网网络号相同。一个家庭、一个企业、一个校园都可以是一个子网,用的是同一个网络号,就好像一个同一个小区的地址栏上都用同一个小区的名称一样。子网掩码能够帮助我们区分IP地址中的网络号与主机号。子网掩码由32位bit组成,每8位一组,其构结构与IP地址结构一样,但子网掩码的每一组都只能用相同的bit,转换成十进制就是只能有255和0,一个子网掩码会像这样:255.255.255.0。子网掩码为255的部分对应的IP地址是网络号,0部分对应的地址是主机号,如上面的198.132.2.1/255.255.255.0的网络号为198.132.2,而主机号为1。

          浏览器无法从请求报文中获取域名对应的网址,只能委托操作系统中的网络控制软件,Socket库中的相关组件进行。

          网络控制软件会像浏览器一样,向DNS服务器,储存域名-IP地址映射表的服务器,发送请求报文然后得到响应报文,其中用到的协议就是DNS协议。

          DNS服务器是分层次的分布式服务器,每一层次都是一个域,该域的DNS服务器都会保存所有下一个域的DNS服务器的IP地址,网络控制软件查询IP地址的方式是从上而下接力式的查询。具体如下图:

          DNS的这种分布式服务器的最大优点是向下扩展非常容易。比如说一开始全球只设置了1台DNS服务器,里面的映射表是空的,然后每个国家允许向这1个DNS服务器注册自己国家的服务器,比如说中国自己买了1个DNS服务器,然后把这台服务器的IP域名和IP地址注册到全球服务器上,然后这台中国服务器的域名是cn。然后中国又分门别类为各个不同领域购买了1台DNS服务器,并且又把它们的域名和IP地址注册到cn这个DNS服务器上,比如说代表了公司的com(company)。然后各个不同的公司又可以独自购买自己公司的DNS服务器用来保存自己公司的域名-IP地址映射表,比如说百度的baidu.com.cn。这时百度的1台DNS服务器就满足了整个公司的需要,所以它就会把百度所有的域名-IP地址映射表都保存在这个DNS服务器上了。

          DNS服务器有缓存功能,能够把一段时间内查询过的域名-DNS映射记录保存在服务器内存中,这样客户机向DNS服务器查询某个域名的IP地址时,DNS服务器先到内存去查找有没有相关记录,如果有直接返回,如果没有就向根域(最顶层,全球服务器)一层一层向下查询。

    四、协议栈

          当有了请求报文和IP地址,接下来就是把请求报文通过协议栈发送出去了。与获取服务器IP地址是向DNS服务器查询一样,浏览器也需要通过Socket库中的组件来完成请求报文的发送。而协议栈做的事情是对请求报文进行打包,附上相关信息,就像快递的东西需要打包贴上快递单一样。

          第一步:调用socket组件创建套接字。

          套接字实际上就是用来保存控制信息的一个对象。一开始套接字的控制信息不多,在后来会随着连接进行慢慢增多。套接字的初始化最重要的是:①这个套接字创建的是TCP还是UDP连接;②主机端口。

          第二步:向服务器发起连接。

          具体就是把第一步的套接字和目标服务器的IP地址与端口传到connect组件里面,然后协议栈会进行“三次握手”建立TCP连接。

          “三次握手”:(1)如果客户端到服务器端的连接是TCP连接的话,客户端会先发送一个没有内容只有TCP报头的TCP包给服务器端。这个TCP包的TCP包头包含了:①客户端与服务器端的端口号;②请求连接的字段SYN=1;③客户端发送数据是的初始序号;④客户端的窗口(接收缓存区)的大小,此乃第一次“握手”。(2)然后服务器端也会返回一个只有报头的TCP包给客户端,报头包含字段有:①用于确认上一个数据的ACK号;②请求连接的SYN=1;③服务器端发送数据的初始序号;④服务器端的窗口大小,此乃第二次“握手”;(3)最后,客户端会发送一个确认第二次“握手”的ACK包给服务器端,“三次握手”结束,TCP连接建立完成。

          第三步:客户端调用write组件向服务器端发送数据。

          建立连接时,操作系统还会为这个TCP连接分配一个发送缓存区,需要发送的数据先会放到缓存区,当缓存区中数据的大小超过一个数据包内容的最大长度,协议栈就会把数据打包成一个TCP包发送给服务器端。

          滑动窗口方式:客户端发送一个TCP包给服务器端,服务器端又要返回一个用于确认的ACK包(TCP报头有ACK字段的TCP包)给客户端,这样一来一回会存在时间间隔,而这段时间间隔是被浪费的。为了解决这个问题,接收端会创建一个接收缓存区,并允许发送方一次性发送多个数据包,直到缓存区空间被填满。而发送方也会在一段时间内等待接收方的ACK包,过了一段时间才会判断为丢包重发。这个就是滑动窗口方式。

          每当接收到一个数据包,接收方就要返回一个ACK包确认,如果发送数据量很大的话,连接中流通的数据包就会成两倍增长,这样会造成网络堵塞。所以接收方会等一段时间,当接收的数据包较多时才发送ACK包,如果接收的数据是连续的,这样可以只发送一个ACK包(因为ACK号就是接收数据最后一个数据块序号+1),这样客户端就会知道该ACK号前面的数据都已经接收了。

          前面提到的接收方允许发送方一次发送多个数据,而接收方也要更新窗口大小才能让发送方知道应该一次发送多少数据,而接收方发送更新窗口的包的时机是应用程序从接收缓存区取出数据时。更新窗口大小的包与ACK包合并的话可以进一步减少包的数量。

          第四步:断开连接并删除套接字。(“四次挥手”)

          当A的数据发送完毕,就会发送一个含有FIN=1的请求断开连接字段的TCP包给B端,这时可能B端还在处理A发过来的数据而不能断开连接,但B端依然要发送一个ACK包告诉A已经收到请求断开连接的消息,否则A会判断FIN包没有发送到而重发。当B处理完请求并且发送完数据后,B就会发送请求断开连接的FIN包给A,A收到后发送确认的ACK包。这就是断开连接时的“四次挥手”。

          在双发“四次挥手”结束甚至是断开连接后的一段时间内,双方的套接字都不会删除而暂时保存在内存中,这时为了防止重用相同套接字的情况:①“四次挥手”结束前不能删除,因为双方的连接未正式断开;②连接断开一段时间内,如果还需要建立相同的连接,重用内存中的套接字会比重新创建一个套接字快得多。

    五、协议栈中的IP模块

          在协议栈建立连接时,IP模块也会给数据包(这时是TCP包)附上IP报头,然后发挥IP协议的作用把IP包发送出去。

          IP报头的字段主要有两个:目标服务器IP地址和源IP地址。目标服务器的IP地址已经通过DNS协议获得,剩下的源IP地址可能有人会说不就是计算机的IP地址吗?一个计算机可能会有很多个IP地址,比如大型的服务器。一个网卡接口对应一个不同的IP地址。

          IP协议:计算机内部有一个路由表,它的列项有:目标服务器/网络的IP,目标服务器/网络的IP的子网掩码,网关(下一个路由器)的IP,网卡接口IP。协议栈会根据目标服务器的IP,用来与路由表第一第二项比较,尽量把数据包发送到最接近目标服务器的网络,找到后该行记录的第三项就是应该把数据包发向的下一个路由器的IP的地址,方向确定后,发送的网卡也确定了(第四项网卡接口的IP)。路由表会根据路由算法顶起更新。

          知道了目标服务器IP和源服务器IP后,TCP包就会套上包含这两个字段的IP报头,成为一个IP包。

          IP协议也是路由器的工作原理,其实计算机一般都有路由功能,而路由器就是一个专注于路由功能的计算机。

          注意:IP报头的两个字段一旦在源主机封装好后,无论经过多少个路由器都不会再改变,所以IP协议是不能完成数据包在复杂的网络上传输的。帮助数据包在网络上传输的实际上是以太网协议(MAC协议)。

    六、MAC协议/ARP协议

          IP协议发挥的是寻路功能,就像导航一样,会告诉你怎么走。但是IP协议不能传输数据,就像我们导航后还需要用车子才能抵达目的地。而在计算机网络中发挥了车子作用运输数据的是MAC协议。

          在IP包封装完毕后,还需要在IP包上再封装一层,并附上MAC报头,成为一个MAC包。MAC报头主要的两个字段是源MAC地址和目标MAC地址。MAC地址就是网卡的物理地址,网卡在生产时都会附有一个独一无二的网卡地址,并且是写入了网卡的内存里面。MAC报头的两个地址跟IP报头的两个地址不同,MAC报头的两个地址是会随着数据包的转发而发生变化。

          在IP协议确定了源IP地址后,源MAC地址就可以确定了。而且IP协议还根据路由表帮我们找到了下一个路由的IP地址,只要我们找出这个路由的MAC地址就可以了。

          ARP,address resolution protoco,地址解析协议,能够根据IP地址找出对应的MAC地址。ARP协议是作用在以太网上的,它的原理是:向同一个子网的其他主机发送消息问:“请IP地址为xxx的网卡告诉我它的MAC地址。”,这就是以太网的广播。然后同一个以太网上的所有主机都收到这个消息,但不是广播中提到的IP地址的主机不会做出应答,而对得上IP地址得主机会回复这条消息自己得MAC地址,当然也是以广播得形式。

          计算机中会有ARP缓存,储存了IP地址-MAC地址的映射表,当然这个表在一段时间后就会更新。

          得到下一个路由器的MAC地址后填入MAC报头,MAC包的封装就完成了,接下来数据包就可以通过以太网一直传送到目标服务器了。

    七、集线器(hub)

          当一个子网的主机数量众多时,就需要一个集线器把主机和路由器连接起来。集线器英文叫hub,hub是车轮的意思,这时因为集线器与跟它连接的主机就像一个车轮。主机和路由器组成轮子,集线器就是轴心。

          集线器的接口没有MAC地址,集线器是以太网的一个典型的体现,集线器的作用就是把传过来的数据包以广播的形式发送到同一个子网的所有其它主机。

    八、交换机(switch)

          交换机就是一个升级版的集线器。交换机也是一个用来连接以太网的设备,不同的是:交换机的内部有一张MAC地址-端口映射表,它会把哪一个端口连接的是哪一个网卡(MAC地址)记录下来。所以数据包发送过来是,交换机会根据记录表把数据包定点发送出去,而不是广播的形式。

    九、路由器

          路由器就是一个专注于路由功能的计算机,它能够把数据包发送到合适的下一个路由器。其工作原理:根据路由表中的目标IP地址,找出发往的下一个路由器的IP地址,并完成的IP报头的填写。根据源IP地址,找到对应的源MAC地址和目标MAC地址,完成数据包传输。所以路由器也具有交换机的功能。

    十、UDP协议

          为了可靠的传输,我们需要建立TCP连接。但某些情况下我们还能选择UDP连接。UDP连接的特点是:①没有确认机制,不可靠;②传输速度快。有两种情况我们可以采用UDP协议传输数据。

    (1)数据量小的,一个包就可以发送完的数据。比如浏览器向DNS服务器查询IP地址就是用了UDP连接。这时因为域名的数据比较小,没有其他附加传输的数据。而且不需要传输确认,当主机发出查询请求时,如果没有收到回复就重新发送数据就可以了。

    (2)音频和视频数据。这是因为音频和视频数据必须在规定的时间内送达,一旦晚了就会造成音频和视频的卡顿。如果是TCP连接,一旦数据送达时间晚了,服务器还要在等不到确认消息后再去重传,这时候都已经于是无补了。所以我们有时看直播,在卡顿一会儿回复正常之后,两个画面不是连续的,因为服务器并没有重传刚才的数据包。

    具体参考:《网络是怎样连接的》

  • 相关阅读:
    网易云信流媒体服务端架构设计与实现
    从零开始搭建创业公司后台技术栈
    协程(coroutine)简介
    微服务的简介和技术栈
    分布式系统中最容易被忽视的六大“暗流”
    分布式架构的演进
    全网最详尽的负载均衡原理图解
    图解 | 搞定分布式,程序员进阶之路
    Enterprise Library 3.0体验(4):Validation Application Block与ASP.NET的集成
    Enterprise Library 3.0 发布
  • 原文地址:https://www.cnblogs.com/lqxing1994/p/9243465.html
Copyright © 2011-2022 走看看