关于网络的常见面试问题

TCP与UDP的区别

OSI和TCP/IP模型在传输层定义了两种传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。它们的主要区别如下:

面向连接与无连接(面向报文)
TCP保证数据可靠性,错误重发;UDP不可靠,可能丢包
TCP保证数据顺序,UDP不保证
TCP主要提供完整性服务,UDP主要提供及时性服务

访问一个网页的全过程

  1. 客户端用户从浏览器输入www.google.com网站网址后回车,系统会查询本地hosts文件及DNS缓存信息,查找是否存在网址对应的IP解析记录。如果有就直接获取到IP地址,然后访问网站,一般第一次请求时,DNS缓存是没有解析记录的。

  2. 如果hosts与DNS缓存都没有解析记录时,系统会把浏览器的解析请求交给客户端本地设置的DNS服务器地址解析,如果本地DNS服务器的本地缓存有对应的解析记录,就会直接返回IP地址。

  3. 如果本地DNS服务器没有对应的解析记录,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(google.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找google.com域服务器,重复上面的动作,进行查询,直至找到www.google.com主机。

  4. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS服务器或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根DNS,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

如果配置了CDN,则DNS系统最终会将域名的解析权交给CNAME指向的CDN专用DNS服务器,CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回给本地DNS,本地DNS再向CDN的全局负载均衡设备发起内容URL访问请求,CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址,全局负载均衡设备再把缓存服务器的IP地址返回给本地DNS,此时就可以通过IP向缓存服务器发起请求了,当缓存服务器中不存在请求结果时才会从源站中获取。

  1. 通过DNS解析拿到了IP之后,就可以通过IP向服务器发送http请求了,因为http工作在应用层,tcp工作在传输层,所以发生http请求之前,还会进行tcp的三次握手建立连接。
    在连接成功建立后,开始向web服务器发送请求,当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求报文,请求报文由请求方法 URI 协议/版本、请求头、请求正文三部分组成。

  2. 请求报文由应用层向下,依次经过传输层、网络层、数据链路层与物理层。应用层的任务是通过应用进程间的交互来完成特定网络应用,有HTTP、DNS等众多协议,传输层的主要任务则是负责向两台主机进程之间的通信提供通用的数据传输服务,包括TCP与UDP两种协议,TCP是面向连接的、可靠的的数据传输服务,而UDP提供无连接的、不可靠的数据传输服务,TCP主要提供完整性服务,UDP主要提供及时性服务;传输层是为主机中的进程提供数据传输服务,而网络层则是为不同主机提供数据传输服务,这一层有IP协议,由于主机之间可以有很多链路,数据链路层则是为同一链路的主机提供数据传输服务。最终物理层考虑怎样在传输媒体上传输数据比特流。数据通过以太网电缆传送到服务器,服务器拿到数据包后同样再由数据链路层、网络层、传输层依次向上解析,应用层最终收到请求内容。

  3. 服务器收到请求报文之后,就会将响应报文返回给客户端,响应报文由协议/版本 状态码 描述、响应头、响应正文三部分组成。这里的状态码分为1XX(信息类)、2XX(成功类)、3XX(重定向类)、4XX(客户端错误)、5XX(服务器错误)。

  4. 当浏览器加载一个完整的页面时,还需要与服务器断开连接,这个过程就是tcp的四次挥手。

  5. 在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。因此,每次的请求都会造成无谓的TCP连接建立与断开,增加通信量的开销。为了解决这个问题,HTTP/1.1使用长连接减少开销,只要任意一端没有明确提出断开连接,就保持TCP连接状态,当客户端再次访问这个服务器上的网页时,会继续使用这一条已经建立的连接。

为什么 TCP 创建连接时只需要 3 次握手,而释放连接时需要 4 次挥手

  1. 为什么最后还要发送一次确认呢?主要是为了防止已失效的连接请求报文段突然又传送到了接收方产生错误。
    例如:A发送连接请求,但因连接请求报文丢失而未收到确认,于是A重传一次连接请求,后来收到确认连接建立。但是如果发生异常情况,A发出的第一个连接请求报文段没有丢失,而是在网络节点长时间滞留了。以至于延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段,但是B收到此是小的请求报文段后,就误以为是A又发出的一次新的连接请求。于是就向A发出确认报文段,同意建立连接,如果此时没有第三次握手,连接就建立了。但是A并没有发出连接请求,对B的确认报文段不会理睬,也不会向B发送数据,但是连接已经建立了,此时B就一直等待着A发来数据,资源就这样白白浪费了。
  2. 通信双方都可以独立关闭自己的通信通道,也就是半关闭。
    client先发送FIN告知对方我已经完成数据发送了,server回复ack来确定我知道了。这样一个流程,就关闭了client的发送信息通道。但是还可以接收来自server方的数据。
    server此时已经知道接收不到client的数据了,但是还可以给它发送数据。如果server也没有啥数据要发送给对方了,server也会以FIN标志位发送一个信息给client,client接到后,也会传递一个ack表示知道了。这样子,双方都完成了关闭。

cookie和session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。

  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。

  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE。

  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

GET与POST的区别

  1. GET用于资源获取,是安全且幂等的,安全的意思是仅仅会获取资源而不会影响资源状态,幂等则是对同一URL的多次请求应该返回同样的结果;POST主要用来传输数据,多次调用会产生多个新的资源,因此是不安全且非幂等的。
  2. GET请求的数据会包含在URL中,而POST请求则把数据放置在HTTP请求体中。
  3. 正因为GET请求是通过URL提交数据,所以GET请求可提交的数据量跟URL的长度有关系,而POST请求从理论上讲是没有大小限制,可传较大量的数据。

HTTP 请求方法

根据 HTTP 标准,HTTP 请求可以使用多种请求方法。

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

http 和 https 的区别

  • https协议需要到ca申请证书,一般免费证书很少,需要交费。

  • http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

  • http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。

  • http的连接很简单,是无状态的。

  • HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

TCP协议有几大计时器?

  1. 超时重传计时器

    目的:避免无限等待确认报文

    创建时间:在发送TCP报文段时,会为该报文段设置一个超时重传计时器

    可能发生的情况:在超时时间到达之前,收到了该报文段的确认则撤销计时器,否则重传该报文段,并将超时重传计时器复位

    重传时间:2*RTT(RTT为往返时间)

  2. 坚持计时器

    目的:解决零大小窗口导致的死锁问题

    死锁产生原因:当接收端窗口大小为0时,发送端停止发送,此后如果接收端有空余空间来接收数据,则发送一个新窗口大小的报文,如果该报文丢失了则导致双方都处于等待状态,产生死锁

    工作原理:当发送端接收到接收端发送的零大小窗口的报文时,就启动坚持计时器,当计时器到达计时时间,发送端就主动发送一个报文段告诉接收端你发送的新窗口大小的报文丢失了,需要重新发送

    坚持时间:开始先设置为超时重传时间,如果超时了还是没有收到接收端发送的新窗口大小报文,则将计时器的值加倍并且复位,直到大于门限值60s,在此之后每隔60s向接收端发送一个询问报文

  3. 保活计时器

    目的:避免空闲连接长时间的占用服务器资源

    工作原理:当服务器收到数据时都将保活计时器重新设置(一般2h),过了2h后,服务器如果没有收到数据,每隔75s发送一个探测报文给客户端,当连续发送10次后,仍然没有收到客户端的回复,则服务器断开连接

  4. 时间等待计时器(为服务器Time_Wait状态设置)

    服务器主动断开连接时,服务器会保持一个Time_wait状态,而时间等待计时器就是Time_wait状态的持续时间

参考资料