网络基础面试题(1)网络协议

网络基础面试题(1)网络协议

1 说说HTTP协议的交互流程?

一次完整的 HTTP 通信过程中客户端与服务器之间将完成下列7个步骤:
(1)建立 TCP 连接:在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,该协议与 IP 协议共同构建 Internet,即著名的 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;
(2)客户端向服务器发送请求命令:一旦建立了TCP连接,客户端就会向服务器发送请求命令;例如:GET/sample/hello.jsp HTTP/1.1;
(3)客户端发送请求头信息:客户端发送其请求命令之后,还要以头信息的形式向服务器发送一些别的信息,之后客户端发送了一空白行来通知服务器,它已经结束了该头信息的发送;
(4)服务器应答:客户端向服务器发出请求后,服务器会客户端返回响应;例如: HTTP/1.1 200 OK响应的第一部分是协议的版本号和响应状态码;
(5)服务器返回响应头信息:正如客户端会随同请求发送关于自身的信息一样,服务器也会随同响应向用户发送关于它自己的数据及被请求的文档;
(6)服务器向客户端发送数据:服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据;
(7)服务器关闭 TCP 连接:一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

2 HTTP和HTTPS有什么差异,说说SSL交互流程?

http:超文本传输协议(Hypertext Transfer Protocol,http)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

https:https (Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 http 通道,在http的基础上通过传输加密和身份认证保证了传输过程的安全性。https 在http 的基础下加入SSL,https 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 https 存在不同于 http 的默认端口及一个加密/身份验证层(在 http与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面。

http协议传输的数据都是明文数据,安全性较低,数据泄露风险较大,而https则是在http基础上做了加密,简单来说就是http的安全版,即在http下加入SSL安全层,https的基础就是SSL,因此传输加密的加密内容就要用到SSL。https主要作用包括两方面,一是数据加密,保证数据传输的安全性,二是确认访问网站的真实性,起到身份验证的作用。

http和https区别包括以下几点:
(1) 使用https协议一般需要用到CA机构颁发的证书,免费证书较少,购买证书需要一定的费用。
(2)http是超文本传输协议,信息时明文传输,安全性较低,而https则是使用了SSL加密传输,安全性高。
(3)http和https使用的是完全不同的连接方式,使用的端口也有所区别,http使用的是80端口,https使用的是443端口。

客户端在使用https方式与Web服务器通信流程如下:
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。

HTTPS通信流程
HTTPS通信流程

3 HTTP协议都有哪些方法?

HTTP/1.1协议中共定义了八种方法,来表明Request-URL指定的资源不同的操作方式。
(1)OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送的请求来测试服务器的功能性
(2)HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
(3)GET:向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
(4)POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
(5)PUT:向指定资源位置上传其最新内容
(6)DELETE:请求服务器删除Request-URL所标识的资源
(7)TRACE:回显服务器收到的请求,主要用于测试或诊断
(8)CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

4 REST和HTTP什么关系?

REST全称 Representational State Transfer 表述性状态转移。REST不是一种标准或者规范,而只是一种设计风格,REST的实现一般基于HTTP,URI,XML,HTML等协议和标准。HTTP是用于通信的协议,具有明确定义的、约束的标准,通常用于与Internet资源或Web浏览器客户端的任何应用程序进行通信。

RESTful系统的核心构建块是资源,资源可以是网页、视频流、图像等。资源甚至可以是抽象的概念,如数据中用户的列表或特定位置的天气预报。唯一真正的限制是系统中的每个资源都是唯一且可标识的。另外,资源可能有很多种表示形式,在C/S(客户端/服务器)架构中,服务负责管理资源的状态,但是客户端可以选择他们自己希望与之交互的表示方式。

统一接口是RESTful系统独特的属性之一,它要求客户端使用同一套标准操作来访问所有的资源。统一接口的好处在于易于创建与其提供的服务脱钩的实现。RESTful系统中,所有的操作都应该是无状态的,从客户端到服务器的每个调用都不得依赖任何的共享状态。采用 REST 设计应用程序时使用的主要概念是资源。对于要执行的每个动作,首先定义一个资源,使用HTTP协议中的4个动词来针对4个CRUD操作非常方便,Get用于READ,POST用于CREATE,PUT用于UPDATE,DELETE用于DELETE。

5 浏览器发生302跳转背后的逻辑?

302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取,用户看到的效果就是他输入的地址A瞬间变成了另一个地址B。301是永久重定向,而302是临时重定向。301适合做永久重定向; 302适合做临时的跳转。

(1)301 Moved Permanently:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
(2)302 Found:请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

服务器端跳转就是指地址栏内容不变(客户端浏览器的地址栏不会显示目标地址的URL),客户端请求到达以后,服务器发现当前资源给不出回应,在服务器内部请求另一个资源的跳转。所以跳转与否客户端不知道,属于一次请求。客户端跳转是指地址栏内容发生改变,客户端再根据服务器端给的响应中的URL再向服务器发送请求,所以是两次请求。客户端请求到达服务端,服务端返回一个 “去访问其他链接” 的回应。

6 如何理解HTTP协议是无状态的?

HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

7 HTTP协议的长链接与短链接是什么?

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码: Connection:keep-alive。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

8 网络七层模型是什么,HTT协议工作在哪一层?

HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。


 网络七层协议

9 Session和Cookies有什么区别?

cookies和session都是用来跟踪浏览器用户身份的会话方式,cookie数据保存在客户端,session数据保存在服务端。

  • cookie

如果浏览器使用的是cookie,那么所有数据都保存在浏览器端。当服务器设置使用了cookie用户名,当再次请求服务器的时候,浏览器会将用户名一块发送给服务器,服务器会解释为cookie变量。只要不关闭浏览器,cookie变量一直是有效的,所以能够保证长时间不掉线。如果cookie设置了有效值,那么cookie会保存到客户端的硬盘上,下次在访问网站的时候,浏览器先检查有没有cookie,如果有的话,读取cookie,然后发送给服务器。工作流程如下:
(1)浏览器第一次发送请求到浏览器端;
(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该cookie发送到浏览器端。
(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie。
(4)服务器端通过Cookie中携带的数据区分不同的用户。

cookie工作流程
cookie工作流程
  • session

如果web服务器端使用的是session,那么所有的数据都保存在服务器上,客户端每次请求服务器的时候会发送当前会话sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登陆或具有某种权限。由于数据是存储在服务器上面,所以不能伪造。工作流程如下:
(1)浏览器端第一次发送请求到服务器端,服务器端创建一个session,同时会创建一个特殊的cookie,然后将cookie发送至浏览器端
(2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端的时候会携带cookie对象
(3)服务器端会根据cookie的value值去查询Session对象,从而区分不同用户。

session工作流程
session工作流程

10 建立TCP连接的过程什么?

TCP是因特网中的传输层协议,先看一下 TCP头部结构:

 TCP头部结构
 TCP头部结构

在TCP连接中最需要关注的几个地方是序列号、确认号、标记位(SYN、FIN、ACK、RST…)。
(1)序列号相当于是随机出来的一个ID,为本次TCP连接建立建议一个标志,序列号可以用来解决网络包乱序的问题。
(2)确认号主要用来表示「接收端」告诉「发送端」对上一个数据包已经成功接收(确认号可以⽤来解决网络包丢失的问题)。
(3)标记位主要就是用来表达各种意义,如 SYN = 1 时,表示希望创建连接。ACK = 1时,确认号字段有效。FIN = 1时,表示希望断开连接。RST = 1 时,表示TCP连接出现异常,需要断开。

TCP使用三次握手协议建立连接,下面是建立连接的全过程:

 TCP建立连接
 TCP建立连接

(1)一开始服务端与客户端都处于 CLOSE 状态
(2)服务端主动监听一个端口,进入 listen 状态
(3)客户端发送 SYN 包(表示希望建立 TCP 连接),其中 SYN 的值是随机生成的序列号,随机将 请求报文 发送给客户端,并且自己也进入了 SYN_SEND 状态
(4)此时服务端接收到了来自客户端发送的SYN包 会返回一个 ACK 包和一个 SYN 包,其中ACK包是确认包,表示服务端已经接收到了来自客户端的请求,其值为 Client_Num + 1,SYN包 的值则是客户端这边随机出来的序列号,同时将 ACK 和 SYN 的标记位置为1,将报文发送到客户端,随机自己进入 SYN_RCVD 状态
(5)此时客户端接收到了来自服务端的确认包,可以保证客户端已经接收到了他的请求,此时就需要再次发送一个ACK 确认包,告诉服务端自己已经接收到了请求,其值为 server_num + 1 , 并且将 ACK标记位置为1 发送报文后自己进入 ESTABLISHED状态
(6)服务端接收到了来自客户端发送的报文之后,随机也进入了 ESTABLISHED状态,此时双方建立起了连接

11 为什么建立TCP连接一定要三次,而不是两次?

(1)第一次握手:客户端向服务端发送了网络包,服务端接收到了。服务端知道了客户端的发送能力和服务端的接受能力没有问题。
(2)第二次握手:服务端的发包,客户端接收到了。服务端知道了客户端的发送能力和服务端的接受能力没有问题。客户端知道了服务端的接受能力和发送能力没问题,自己的接受能力和发送能力没问题。但是服务端不知道的是,自己发送的包客户端能不能接收到,也就是服务端无法确认自己的发送能力和客户端的接受能力是否正常,这个时候就需要 TCP 的第三次握手。
(3)第三次握手:客户端向服务端发包,服务端接收到了。此时服务端知道双方的发包能力和接受包的能力都是没问题的,也就建立起了TCP连接。

12 断开TCP连接的过程是什么?

 TCP断开连接
 TCP断开连接

(1)开始的时候,服务端和客户端仍处于 ESTABLISHED 状态
(2)客户端首先想要断开连接,这时就会向服务端发送一个FIN报文,报文中有一个指定的序列号,表示想要断开链接,并且进入 FIN_SAIT_1 状态
(3)此时服务端收到了由客户端发送来的FIN包之后,会先给客户端发送一个 ACK 报文,报文的序列号为客户端的序列号值 + 1,表示自己已经收到了,但是需要检查一下自己还有没有什么需要发送的资源,并且进入 CLOSE_WAIT状态
(4)等到服务端检查完毕没有需要发送的资源之后,就会给客户端发送一个 FIN 包表示即将断开链接,并且进入 LAST_ACK 状态
(5)客户端收到了 FIN 包之后,再次发送一个 ACK 报文,报文的序列号为服务端的序列号值 + 1,表示自己已经收到,随机进入 TIME_WAIT 状态,等待2msl 之后,就进入了 CLOSE 状态
(6)服务端接收到了来自客户端发送的 ACK 包之后,也进入了 CLOSE 状态

以上就是TCP四次挥手的全过程。

13 TCP的滑动窗口协议有什么用?

IP 层协议属于不可靠的协议,IP 层并不关系数据是否发送到了对端。在复杂的网络中,由于各种各样的原因,接收到数据包的顺序不一定和发送的顺序相同,这就是乱序问题。这种情况下,有必要为每个包定义一个序号seq,每个包用一个校验和确保数据完整性。然后发送方不能不管接收方的承受能力,只顾着发。一个高速公路如果没有收费站,那么车辆就会一拥而入。此时如果发生了追尾事故,导致公路拥塞,如果不控制公路的进入车辆,那么整个高速公路都会严重堵塞。TCP需要这样的“收费站”,而这个收费站就是“滑动窗口”。TCP通过滑动窗口实现了传输流的控制,首先明确滑动窗口的定义:
(1)TCP是双工的协议,会话的双方都可以同时接收和发送数据。
(2)会话的双方都各自维护一个发送窗口和一个接收窗口。各自的接收窗口大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的发送窗口则要求取决于对端通告的接收窗口,要求相同。
(3)滑动窗口解决的是流量控制的的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。接收端的缓存传输数据给应用层,但这个过程不一定是即时的,如果发送速度太快,会出现接收端数据overflow。

 发送端窗口
发送端窗口1

上图是发送端滑动窗口的简图,我们可以将数据分为4个部分:
(1)发送和已确认的字节(蓝色部分)
(2)已发送但尚未确认的字节(黄色部分)
(3)未发送的字节和接收方准备接收的字节,即在缓冲区buffer中(绿色部分)
(4)未发送且接收方未准备接收的字节,即已经在缓冲区,但是该部分数据还未被处理(灰色部分)
其中第三部分,也就是绿色部分,也称为可用窗口,因为这是发送方可以使用的窗口。发送窗口由黄色和绿色部分组成。这些字节要么已经发送,要么可以发送。

当发送方发送21-25字节并使用可用窗口中的所有字节时,可用窗口可能为空,发送窗口保持不变,如下图:

 发送端窗口
发送端窗口2

当发送方收到第16-19字节的 ACK 时,发送窗口向右滑动 4 个字节。更新的可用窗口可用于队列中的以下字节,如下图:

 发送端窗口
发送端窗口3

为了便于理解,我们后续将窗口名使用简称,即:
SND.WND,代表发送窗口
SND.UNA, 代表Send Unacknowledged指针,指向发送窗口的第一个字节
SND.NXT, 代表Send Next指针,指向可用窗口的第一个字节

使用简写后,如下图所示:

 发送端窗口
发送端窗口4

基于这些定义,我们可以用公式表示可用的窗口大小:

可用窗口(可用窗口)大小 = SND.UNA + SND.WND - SND.NXT

14 交换机和路由器的区别?

交换机的功能分三部分:
(1)接入层交换机功能,支持将终端节点设备连接到网络。
(2)分布层交换机功能,收集所有接入层交换机发来的数据并转发到核心层交换机。
(3)核心层交换机功能,负责处理分布层传输过来的数据。路由器的基本功能,一是连通不同网络,二是选择信息传输线路。

路由器跟交换机区别:
(1)在OSI模型中所处位置不同。交换机是从网桥发展而来,在OSI模型中的第二层,也就是数据链路层的设备。路由器在OSI模型中的第三层,属于网络层设备。
(2)寻址方式不同。交换机根据MAC地址寻址,通过站表选择路由,站表的建立与维护由交换机自动进行。路由器根据IP地址寻址,通过路由协议产生路由表。
(3)回路问题。它根据交换机的地址学习和站表建立算法,因此交换机之间不能存在回路。有回路,就会阻塞掉产生回路的端口。路由器因为有路由协议,所以对回路没什么要求。于是路由器之间可以有多条通路来平衡负载,提高可靠性。
(4)负载集中方面。由于交换机之间只有一条通路,信息会集中在一条通信链路上,而路由器有路由协议,可以很好的避免开。
(5)广播域控制方面。交换机只能缩小冲突域,不能缩小广播域。而路由器可以隔离广播域,使广播报文不能通过路由器进行广播。
(6)子网划分方面。交换机只能识别MAC地址,而MAC地址又是物理地址,而且采用平坦地址结构。因此,交换机不能根据MAC地址来划分子网。而路由器是识别IP地址的,IP地址可以是网管分配也可以自己分配,属于逻辑地址且IP地址具有层次结构。可以划分网络号和主机号,也可以划分子网络。

15 说说Socket交互的基本流程?

  • 服务器端

第一步:创建一个用于监听连接的Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Bind()方法绑定EndPoint;
第四步:用socket对像的Listen()方法开始监听;
第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;
第六步:通信结束后一定记得关闭socket;

  • 客户端

第一步:建立一个Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;
第五步:用socket对像的Receive()方法接受服务器发来的信息 ;
第六步:通信结束关闭socket;

Socket工作流程
Socket工作流程

16 HTTP断点续传的原理什么?

将上传/下载的文件划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经断开的部分继续传输完成剩下的部分,而没有必要从头开始上,从而节省时间、提高速度。这个过程通过HTTP协议 Header 里面的参数实现的,客户端发请求时对应的是 Range ,服务器端响应时对应的是 Content-Range。

在客户端的请求头中,采用 Range 参数指定文件的第一个和最后一个字节的位置,一般格式如下:

Range:(unit=first byte pos)-[last byte pos]

Range 头部的格式有以下几种情况:

Range: bytes=0-499 表示第 0-499 字节范围的内容 
Range: bytes=500-999 表示第 500-999 字节范围的内容 
Range: bytes=-500 表示最后 500 字节的内容 
Range: bytes=500- 表示从第 500 字节开始到文件结束部分的内容 
Range: bytes=0-0,-1 表示第一个和最后一个字节 
Range: bytes=500-600,601-999 同时指定几个范围

客户端发出带 Range 参数的请求后,服务器会在 Content-Range 头部返回当前接受的范围和文件总大小。一般格式:

Content-Range: bytes 0-499/22400

0-499 是指当前发送的数据的范围,而 22400 则是文件的总大小。响应客户端后,服务端返回的响应头内容如下:

HTTP/1.1 200 Ok(不使用断点续传方式)   
HTTP/1.1 206 Partial Content(使用断点续传方式)

使用断点续传的流程如下:
(1)客户端下载一个1024K的文件,已经下载了其中512K。
(2)网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段: Range:bytes=512000-,这个头通知服务端从文件的512K位置开始传输文件。
(3)服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加: Content-Range:bytes 512000-/1024000,并且此时服务端返回的HTTP状态码应该是206,而不是200。

参考
https://blog.csdn.net/m0_65421722/article/details/127813102
https://baijiahao.baidu.com/s?id=1722203080780588499&wfr=spider&for=pc
https://www.cnblogs.com/linyu51/p/14849955.html
https://blog.csdn.net/weixin_38051797/article/details/120467188

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注