计算机网络面试题总结

1.http和https的区别

http是一个简单的请求-响应协议,运行在TCP之上,信息是明文传输。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,但客户端和服务器都无法验证对方的身份。

https是身披SSL(Secure Socket Layer安全套接层)外壳的http,添加了传输加密和身份认证机制,具有安全性。

二者存在以下不同:

  • 端口不同:http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • http的连接很简单,是无状态的。https协议是由SSL+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  • 开销:https需要到CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用
  • 资源消耗:和hTTP通信相比,https通信会由于加减密处理消耗更多的CPU和内存资源;

(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。

  1. 对称密钥加密:加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
  2. 非对称加密:密钥成对出现,分为公钥和私钥;公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
      
    由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

2.TCP 的三次握手

不讨论序号和确认号,因为序号和确认号的规则比较简单:序号(A:x,B:y),确认序号为收到序号+1(与SYN相同;并且不讨论 ACK,因为 ACK 在连接建立之后都为 1

(1) 三次握手(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功):
 在这里插入图片描述
 
 首先 Server 处于 LISTEN(监听)状态,等待客户的连接请求。

  • 第一次握手:Client 向 Server 发送连接请求报文:将标志位SYN置为1选择一个初始序号seq=x。Client进入SYN_SENT状态(同步已发送),等待Server确认。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

  • 第二次握手:Server收到连接请求报文后(由标志位SYN=1知道Client请求建立连接),如果同意建立连接,Server向 Client 发送连接确认报文:将标志位SYN和ACK都置为1(自己的)选择一个初始序号seq=y,确认号ack=x+1。Server进入SYN_RCVD状态(同步收到)。这个报文也不能携带数据,但是同样要消耗一个序号。

  • 第三次握手:

  1. Client收到连接确认后,检查ACK是否为1,ack是否为x+1,如果正确则向 Server 发出确认:将标志位ACK置为1自己的序列号seq=x+1,ack=y+1。Client进入ESTABLISHED状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。

  2. Server收到Client的确认后,检查ACK是否为1,ack是否为y+1,如果正确则连接建立成功,Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

(2)tcp的核心思想是保证数据可靠传输**,如果2次,显然不行(答案如下),但3次就一定行么?未必,可能第三次的时候网络中断了,然后A就认为B收到了,然后一通发消息,其实B没收到,但这是无法完全保证的。无论握手多少次都不能满足传输的绝对可靠,为了效率跟相对可靠而看,3次刚刚好,所以就3次了(正好AB相互确认了一次)

(3)三次握手的原因

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接(如果只有2次握手,客户端发送连接请求,只要Server发出确认数据包,新的链接就建立了)。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,而Server端没有收到来自客户端的确认,则就会知道Client并没有要求建立请求,就不会建立链接。

3.TCP 的四次挥手

(1) 四次挥手(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):
 在这里插入图片描述
 

  • 第一次挥手:Client发送连接释放报文:FIN=1,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

  • 第二次挥手:Server收到之后发出确认:ACK=1,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。(此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。)

  • 第三次挥手:当 Server 不再需要连接时,发送连接释放报文,FIN=1,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

  • 第四次挥手: 1. Client收到后发出确认:ACK=1,确认序号为收到序号+1,进入TIME_WAIT状态,等待 2 MSL(最大报文存活时间)后释放连接, 2. Server收到 Client 的确认后释放连接,进入CLOSED状态,完成四次挥手。

  • (2)四次挥手的原因
    客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

    (3)TIME_WAIT
    客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

    • 确保最后一个确认报文能够到达。如果 服务器 没收到 客户端 发送来的确认报文,那么就会重新发送连接释放请求报文,客户端 等待一段时间就是为了处理这种情况的发生。
    • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧
      的连接请求报文。

    4. 域名解析过程

    在浏览器中输入www.qq.com域名
    具体过程包括

    1. 找缓存:浏览器搜索自身的DNS缓存、操作系统的DNS缓存(读取本地的Host文件,hosts文件 保存域名和IP的对应关系 ),路由缓存。

    2. 向本地DNS服务器进行查询

      (1) 如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);
      (2) 如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。

    3. 如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;

    递归查询与迭代查询
    在这里插入图片描述

    一、主机向本地域名服务器的查询一般都是采用递归查询

    递归查询:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份, 向其它根域名服务器继续发出查询请求报文(替主机继续查询),而不是让主机自己进行下一步查询。

    因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

    二、本地域名服务器向根域名服务器的查询的迭代查询

    迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”,然后让本地服务器进行后续的查询。

    根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。
    顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。

    DNS(Domain Name System,域名系统)

    • 作为域名和IP(Internet Protocol Address)地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串
    • 通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析
    • DNS协议运行在UDP协议之上,使用端口号53
    • 在整个互联网体系中,约定俗成的用于标识网络上设备的地址是IP,然而我们输入的是DNS,因为域名更方便人们记忆

    5. 从输入网址到获得页面的过程

    (1). 根据域名,进行DNS域名解析:

    (2). 浏览器拿到解析的IP地址,建立TCP连接(向服务器请求建立连接,发起三次握手)

    (3). 浏览器向服务器发送HTTP请求;

    (4).服务器处理请求,返回响应结果: 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
      
      ----关闭TCP连接

    (5). 浏览器解析html,并渲染视图 ,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;

    (6). 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面



    HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议
    AJAX (异步的 JavaScript 和 XML),:在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页
    REST接口规范:用url定位资源,用HTTP描述操作

    6. get和post的区别

    1. 浏览器的GET和POST
      特指浏览器中非Ajax的HTTP请求,从HTML和浏览器诞生就一直使用的HTTP协议中的GET/POST(HTTP协议中的两种发送请求的方法)
    2. 接口中的GET和POST
      这里是指通过浏览器的Ajax api,或者是curl,postman之类的工具发出来的GET和POST请求

    二者之间的区别主要包括如下:

    • 从功能上讲:
      GET一般用来从服务器上获取资源,POST一般用来更新服务器上的资源;
      (浏览器用GET请求来获取一个html页面/图片/css/js等资源;用POST来提交一个表单,并得到一个结果的网页)

    • 从REST服务角度上说,
      GET是幂等的,即读取同一个资源,总是得到相同的数据,
      而POST不是幂等的,因为每次请求对资源的改变并不是相同的;
      进一步地,GET不会改变服务器上的资源,而POST会对服务器资源进行改变;

    • 从请求参数形式上看,
      GET请求的数据会附在URL之后,即将请求数据放置在HTTP报文的 请求头 中,以?分割URL和传输数据,参数之间以&相连。
      特别地,如果数据是英文字母/数字,原样发送;否则,会将其编码为 application/x-www-form-urlencoded MIME 字符串(如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII);

      而POST请求会把提交的数据则放置在是HTTP请求报文的 请求体 中。

    • 就安全性而言,
      POST的安全性要比GET的安全性高,因为GET请求提交的数据将明文出现在URL上,
      而且POST请求参数则被包装到请求体中,相对更安全。

    • 从请求的大小看,
      GET请求的长度受限于浏览器或服务器对URL长度的限制(主要是为了提高URL解析的效率),允许发送的数据量比较小,而POST请求则是没有大小限制的。

    • 数据包不同:
      GET请求的时候,产生一个TCP数据包。请求的header和data一起发送出去,服务端返响应具体的状态码。
      POST请求,产生两个TCP数据包。先发送header信息,服务端响应100 continue,浏览器再发送data信息,服务端响应具体的状态码。
      所以说,GET请求的性能要高于POST请求。但是这种差别几乎可以忽略不计。因为网络良好的情况下,两次包发送的时间几乎等于发送一次包的时间(tcp包)。而且,在某些浏览器下,POST请求也只发一次请求(Firefox)

    注:GET请求中URL编码的意义
    在GET请求中会对URL中非西文字符进行编码,这样做的目的就是为了 避免歧义。看下面的例子,

    针对“name1=value1&name2=value2”的例子,我们来谈一下数据从客户端到服务端的解析过程。上述字符串在计算机中用ASCII码表示为:

       6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532
       6E616D6531:name1 
       3D:= 
       76616C756531:value1 
       26:&
       6E616D6532:name2 
       3D:= 
       76616C756532:value2 
    

    服务端在接收到该数据后就可以遍历该字节流,一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再往后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

    现在考虑这样一个问题,如果我们的参数值中就包含=或&这种特殊字符的时候该怎么办?如,“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。这样,我们的本意是只有一个键值对,但是服务端却会解析成两个键值对,这样就产生了歧义。

    那么,如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码:例如,我们对上述会产生歧义的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符

    7. TCP与IP的区别

    • TCP:又叫传输控制协议(Transmission Control Protocal)是一种面向连接的、端对端的、可靠的、基于IP的传输层协议。主要特点是3次握手建立连接,4次挥手断开连接。
    • IP:又叫因特网协议(Internet Protocol),IP协议位于网络层,IP协议规定了数据传输时的基本单元(数据包)和格式,IP协议还定义了数据包的递交办法和路由选择。

    总结:整个网络中的传输流程是:
    IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层—TCP层;相反,IP层也把从TCP接收来的数据包传送到更低层。
    TCP和IP的关系是:IP提供基本的数据传送,而高层的TCP对这些数据包做进一步加工,如提供端口号等等。

    8. TCP与UDP的区别

    TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议,它们之间的区别包括:

    • TCP是面向连接的,UDP是无连接的;

    • TCP是可靠的,UDP是不可靠的;

    • TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

    • TCP是面向字节流的,UDP是面向报文的;

    • TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;

    • TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大

    问题

    网络良好的情况下,发现数据传输过程出现404的情况,你认为是什么问题。

    HTTP 404错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,当Web服务器接到类似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。其导致这个错误的原因一般来说有几种情况:
    1、无法在所请求的端口上访问Web站点。
    2、Web服务扩展锁定策略阻止本请求
    3、MIME映射策略阻止本请求。
    4、网站更新改版,但某些局部板块沿用原来的模块,而原有的模块调用的文件已经被删除或转移了路径。
    5、跟踪访问的各类脚码或CSS文件无效但调用代码依然存在。
    6、某个目录直接删除(导致一段时间该目录的文件在被爬行时全部报404 Not Found错误)
    7、网页URL生成规则改变、网页文件更名或移动位置、导入链接拼写错误等,导致原来的URL地址无法访问

    发布了52 篇原创文章 · 获赞 3 · 访问量 2万+

    猜你喜欢

    转载自blog.csdn.net/qq_26327971/article/details/104558561