zoukankan      html  css  js  c++  java
  • 一道面试题了解计算机网络

    本文是我在公司做的计算机网络知识的分享,特整理成文章供以后学习。本文内容大部分来自网上,并非完全原创,参考链接已经放到文章结尾处。


    今天分享的主题是计算机网络。

    我们先从一个经典的面试题开始讲起。 当我们输入URL,按下回车发生了什么?例如https://www.baidu.com

    这是一个网址,浏览器的第一步是就是把网址解析成URL。这里我们讲第一个概念。

    网址指因特网上网站的地址。将一些信息储存在网站上,所有开放资源都有一个相应的接口,以便其他用户访询而获取信息资料,这样的地址叫做网站地址。如果要从一台计算机访问网上另一台计算机,就必须知道对方的网址。这里所说的网址实际上指两个内涵,即IP和域名。 通用网址、域名、网站地址的三者是不同的概念,最基础的是域名。注册一个通用网址,你必须先要注册你的域名,提交给注册服务机构,这样通用网址就可以指向你提供的网站地址。

    解析URL

    网站地址是用将通向网站的地址用所属互联网类型(如最常见的www(万维网)等)访问协议+域名的形式表达出来。

    url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

    URL地址的格式为协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

    我们从URL的地址就可以知道要传输的数据的协议类型,端口号,目标文件等。但是目前浏览器的地址栏中的地址还不是URL,因为我们通过www.baidu.com 这样的字符串获取到目标的IP。这时候我们需要DNS解析了。

    DNS解析

    不知道大家有没有做过自己的网站。我第一次做网站的时候,在万网注册了一个域名www.gaoyakang.tk,并给了我一个DNS服务器的地址。 但是这时候我并不能发布我的网站代码,万网的帮助中心说了我需要一个服务器来发布网站。 于是我到阿里云上买了一个服务器,把我网站的源代码放在了上面。这时候阿里云提示我要做一个DNS解析,因为现在服务器指向的是阿里默认的域名。于是我按照提示,在我的服务器上填上了我域名和DNS服务器值,然后输入我的域名之后就可以访问到网站了。

    我们反过来看刚才那一个步骤,浏览器对于这个网址首先要去浏览器的缓存中查找对应的IP地址,如果没有再去本机系统的Hosts文件中查找对应的IP地址,如果没有就去路由器中查找,如果还是没有就去DNS服务器中去找到这个域名对应的IP地址。经过这一系列的步骤我们拿到了最终的IP地址。

    IP协议

    IP地址对应的是IP协议,我们讲第二个概念。

    IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。 IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。

    IP报文.jpg

    IP协议的报文如图所示。在TCP/IP报文中IP报文是包住TCP报文的

    IP数据报分配

    标识、标志、分偏移这三个字段帮助标识由IPv4主机发送的数据报,这三个字段对实现分片很重要。因为大多数数据链路层不支持过长的IP数据报,所以要把IP数据报分片,分片之后的数据报每一片都是一个独立的ipv4数据报。

    发送主机每次发送数据报都讲一个“内部计数器”加1,然后将数值复制“标识”字段中。

    ARP地址解析

    现在我们有了IP地址,我们知道我需要请求的资源在什么地方了,但是数据并不会直接根据IP就能直接到服务器。IP地址类似于收货地址,只有收货地址我们当然收不到快递了。我们需要知道去到这个地址应该走什么样的路线。那么这时候起作用的就是ARP协议了。

    地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址

    发送ARP请求,我们需要有一个目标IP地址,同时还需要知道用于发送ARP广播的接口的Mac地址。每个网络设备都有一个MAC地址,用来唯一标识一台设备。APR解析的工作过程大致如下:

    • 首先查询ARP缓存,如果缓存命中,我们返回结果:目标IP = MAC

      如果缓存没有命中,就进行如下操作:

    • 查看路由表,看看目标IP地址是不是在本地路由表中的某个子网内。是的话,使用跟那个子网相连的接口,否则使用与默认网关相连的接口。

    • 查询选择的网络接口的MAC地址

    • 我们发送一个二层ARP请求:

    在TCP/IP协议报文中,MAC地址是在Ethenet帧头里面的。

    现在我们有了DNS服务器或者默认网关的IP地址,我们可以继续DNS请求了:

    • 使用53端口向DNS服务器发送UDP请求包,如果响应包太大,会使用TCP协议

    • 如果本地/ISP DNS服务器没有找到结果,它会发送一个递归查询请求,一层一层向高层DNS服务器做查询,直到查询到起始授权机构,如果找到会把结果返回。

    使用套接字

    当浏览器得到了目标服务器的IP地址,以及URL中给出来端口号(http协议默认端口号是80, https默认端口号是443),它会调用系统库函数 socket ,请求一个TCP流套接字,对应的参数是 AF_INETSOCK_STREAM

    • 这个请求首先被交给传输层,在传输层请求被封装成TCP segment。目标端口会被加入头部,源端口会在系统内核的动态端口范围内选取(Linux下是ip_local_port_range)

    • TCP segment被送往网络层,网络层会在其中再加入一个IP头部,里面包含了目标服务器的IP地址以及本机的IP地址,把它封装成一个TCP packet。

    • 这个TCP packet接下来会进入链路层,链路层会在封包中加入frame头部,里面包含了本地内置网卡的MAC地址以及网关(本地路由器)的MAC地址。像前面说的一样,如果内核不知道网关的MAC地址,它必须进行ARP广播来查询其地址。

      到了现在,TCP封包已经准备好了,可以进行传输了。

    数据包传输

    通常情况下,封包会从本地计算机出发,经过本地网络,再通过调制解调器(modem)把数字信号转换成模拟信号,使其适于在电话线路,有线电视光缆和无线电话线路上传输。在传输线路的另一端,是另外一个调制解调器,它把模拟信号转换回数字信号,交由下一个 网络节点 处理。

    最终封包会到达管理本地子网的路由器。在那里出发,它会继续经过自治区域的边界路由器和其他自治区域,最终到达目标服务器。一路上经过的这些路由器会从IP数据报头部里提取出目标地址,并将封包正确地路由到下一个目的地。IP数据报头部TTL域的值每经过一个路由器就减1,如果封包的TTL变为0,或者路由器由于网络拥堵等原因封包队列满了,那么这个包会被路由器丢弃。

    上面的发送和接受过程在TCP连接期间会发生很多次。

    建立TCP连接

    在TCP连接之前我们先看一下TCP报文的格式:

    TCP报文.jpg

    TCP首部一些重要字段:
    序号(ISN):用于标识每个报文段,使目的主机可确认已收到指定报文段中的数据。当源主机用于多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。

    同步(SYN):仅在三次握手建立 TCP 连接时有效。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段,对方若同意建立连接,则应在相应的报文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置 1 就表示这是一个连接请求或连接接受报文。

    终止(FIN):用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

    数据包到达客户端后需要建立连接。TCP连接过程就是著名的三次握手。

    • 客户端选择一个初始序列号(ISN),将设置了SYN位的封包发送给服务器端,表明自己要建立连接并设置了初始序列号

    • 服务器端接受到SYN包

    • 服务器端选择它自己的初始序列号服务器端设置SYN位,表明自己选择了一个初始序列号服务器端把 (客户端ISN + 1) 复制到ACK域,并且设置ACK位,表明自己接收到了客户端的第一个封包

    • 客户端通过发送下面一个封包来确认这次连接:自己的序列号+1接收端ACK+1设置ACK位

    数据通过下面的方式传输:
    当一方发送了N个Bytes的数据之后,将自己的SEQ序列号也增加N另一方确认接收到这个数据包(或者一系列数据包)之后,它发送一个ACK包,ACK的值设置为接收到的数据包的最后一个序列号

    关闭连接的过程就是也很著名的四次握手:
    要关闭连接的一方发送一个FIN包另一方确认这个FIN包,并且发送自己的FIN包要关闭的一方使用ACK包来确认接收到了FIN。

    HTTP服务器请求处理

    HTTPD(HTTP Daemon)在服务器端处理请求/相应。最常见的 HTTPD 有 Linux 上常用的 Apache 和 nginx,与 Windows 上的 IIS。

    • HTTPD接收请求
      • 服务器把请求拆分为以下几个参数:
        HTTP请求方法(GET, POST, HEAD, PUT 和 DELETE )。在访问百度这种情况下,使用的是GET方法域名:baidu.com请求路径/页面:/ (我们没有请求baidu.com下的指定的页面,因此 / 是默认的路径)
    • 服务器验证其上已经配置了baidu.com的虚拟主机
    • 服务器验证baidu.com接受GET方法
    • 服务器验证该用户可以使用GET方法(根据IP地址,身份信息等)
    • 如果服务器安装了 URL 重写模块(例如 Apache 的 mod_rewrite 和 IIS 的 URL Rewrite),服务器会尝试匹配重写规则,如果匹配上的话,服务器会按照规则重写这个请求
    • 服务器根据请求信息获取相应的响应内容,这种情况下由于访问路径是 "/" ,会访问首页文件。(你可以重写这个规则,但是这个是最常用的)
    • 服务器会使用指定的处理程序分析处理这个文件,比如假设baidu使用Java,服务器会使用Java解析index文件,并捕获输出,把Java的输出结果给请求者。

    最终浏览器会把HTML文档的结果渲染到浏览器的界面上。


    相关链接:
    HTTP长连接、短连接究竟是什么?
    当我们输入URL,按下回车发生了什么?
    在浏览器中输入Google.com并且按下回车之后发生了什么?
    TCP和UDP报文分片的区别
    TCP/IP协议、HTTP协议、SOCKET通讯详解

  • 相关阅读:
    扁平化职能管理三部曲
    [转载]持续交付和DevOps的前世今生
    敏捷项目管理工具-百度效率云
    敏捷项目管理:基础知识与应用实务
    第8章 “敏捷+”创新创业模式
    第7章 "敏捷+"项目管理
    第6章 迭代循环与项目结束
    第5章 发布循环
    第4章 立项与项目启动
    Windows 2003 + IIS6.0 相关 401.1 或 401.2 等问题解决
  • 原文地址:https://www.cnblogs.com/rever/p/10223056.html
Copyright © 2011-2022 走看看