计算机网络面试知识点简要总结

两种协议栈

  • 网络体系结构模型一般有两种,ISO/OSI参考模型和TCP/IP模型
  • OSI参考模型是一个协议栈,有七层自下而上依次为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。低三层称为通信子网,高三层称为资源子网,传输层承上启下。为什么分七层?答案是支持异构网络的互联互通
  • OSI七层参考模型中,应用层是管理进程间的通信规则,协议:HTTP、HTTPS、FTP、TFTP、SMTP、DNS、TELnet、POP3等;表示层是从应用层获取到的报文数据进行格式处理,安全处理和压缩处理,格式:JPEG、ASCII、加密格式等;会话层用来管理进程,对当前主机进程和目标主机进程会话的建立、管理和终止;传输层提供数据的传输服务,定义了传输数据的进程端口号,负责数据包的排序、差错校验和流量控制等,协议:UDP、TCP;网络层进行逻辑地址的查询,协议:ICMP、IP(IPv4,IPv6)、ARP、RARP、OSPF;数据链路层建立节点的连接和信息校验,将网络层传输下来的IP数据包组装成帧,传输单位是帧,所实现的硬件是交换机和网桥,协议:PPP、HDLC、SDLC、STP、ARQ;物理层负责最底层的数据传输,传输的数据单位是比特,数据传输是通过01比特流来实现的,硬件:集线器、中继器
  • TCP/IP五层模型的话,协议栈自上而下分别为应用层、传输层、网络层、数据链路层、物理层,具体都干什么下面分别解释

物理层

  • 以比特流形式透明的传输数据,大概不会问这一层

数据链路层

  • 两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻节点之间传输数据是直接传送的(点对点),传输数据时,数据链路层将网络层交下来的IP数据包组装成帧,在两个相邻节点的链路上“透明”(好像不存在)的传输帧中的数据,每一帧包括数据和必要的控制信息(同步信息、地址信息、差错控制等)

停止等待协议

  • 就是每发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送到下一个分组

网络层

  • 主要包括以下两个内容,1.负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把传输层残生的报文段或用户数据报封装成包进行传送;2.选中合适的路由,使源主机传输层所传下来的分组,能够通过网络中的路由器找到对应的主机

ARP协议

  • 面试考点
  • 即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议
  • 工作原理:ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包最终由以太网广播给子网内的所有主机,每一台主机都会接受到这个数据包,并取出标头里的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一段时间,下次请求时直接查询ARP缓存以节约资源
    在这里插入图片描述
  • 补充:MAC地址和IP地址
  • MAC地址是Ethernet协议使用的地址,IP地址是指Internet协议使用的地址
  • IP地址的分配时基于网络拓扑,MAC地址的分配是基于制造商,写在硬件内部的,IP地址是可以自动分配的,而MAC地址在每一个网卡出厂的时候就有全球唯一的一个MAC地址,所以我们必须要拿到这个MAC地址
  • 那么问题来了,这个MAC地址这么NB我还要IP地址干嘛呢?其实一想就能明白了,全世界那么多电脑,要是没个查询范围会造成多大的流量?所以先用IP地址把每个地区分开,这样我查询的时候就从这一批里面去查询,这样流量就小得多了,且IP的公网也是唯一的

IP协议

  • T C P / I P ( T r a n s m i s s i o n C o n t r o l P r o t o c o l / I n t e r n e t P r o t o c o l TCP/IP(Transmission Control Protocol/Internet Protocol TCP/IP(TransmissionControlProtocol/InternetProtocol),传输控制协议/网际协议,字段如下
    在这里插入图片描述
  1. 版本号:占4位,指定IP协议的版本,通信双方的IP协议版本必须一致,目前使用最广泛的IP协议版本号为4,即IPv4
  2. 首部长度:占4位,用来记录ip协议首部的长度,这样在读取信息的时候,才知道哪里是ip数据的开始
  3. 服务类型:占8位,记录例如最小延时、最大吞吐量、最高可靠性、最小成本等信息
  4. 总长度:占16位,首部与数据之和
  5. 标识:用来标识数据报,占16位,分片的时候,相同数据包的标识字段是相同的,然后可以重组
  6. 标志:占3位,第一位未使用,值为0;第二位称为DF(不分片),为0时标识允许分片;第三位为MF(更多分片),表示是否还有分片正在传输,为0时表示没有更多分片需要发送
  7. 片偏移:占13位,当报文被分片时,用该字段标记该分片在原报文中的相对位置
  8. 生存时间TLL:占8位,表示数据报在网络中的寿命
  9. 上层协议标识:占8位,表示协议类型
  10. 首部校验和:占16位,用于校验数据报的首部
  11. 源IP地址:占32位,用于表示数据报的源IP地址
  12. 目的IP地址:占32位,用于表示数据报的目的IP地址

传输层

  • 服务基本原理:多路复用和解复用(分路)技术;可靠数据传输;流量控制和拥塞控制。复用的意思是发送方的不同进程都可以使用同一个传输协议传送数据,分路技术是指传输方的传输层剥去报文首部之后能把这些数据正确的传输到正确的应用进程上
  • 传输层提供的服务:传输层寻址和端口;无连接服务和面向连接服务。端口号是用来标识应用进程的数字标识,端口号的长度是16比特,也就是 2 16 2^{16} 216个不同的端口号,端口号根据端口范围分两类:服务端使用的端口号(范围是 [ 0 , 1023 ] [0,1023] [0,1023]),登记端口号数值范围:(范围是 [ 1024 , 49151 ] [1024,49151] [1024,49151])和客户端使用的端口号(数值范围为 [ 49152 , 65535 ] [49152,65535] [49152,65535]),常见端口号:FTP(21),TELNET(23),SMTP(25),DNS(53),TFTP(69),HTTP(80),SNMP(161)
  • 流量控制:如果发送方把数据发送的过快,接收方可能来不及接收,这样会造成数据的丢失
  • 拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载

TCP和UDP的区别

  • TCP有连接;UDP无连接
  • TCP是点对点通信;UDP可以一对一、一对多、多对一、多对多交互通信
  • TCP是可靠交付,无差错、不丢失、不重复、按序到达;UDP尽最大努力交付,不保证可靠交付
  • TCP有流量控制和拥塞控制;UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率
  • TCP动态报文长度,根据接收方窗口大小和当前网络拥塞情况决定;UDP面向报文,不合并、不拆分,保留上面传下来报文的边界
  • TCP首部开销大,首部20个字节;UDP首部开销小,8字节(源端口、目的端口、数据长度、校验和)
  • 文件传输、重要状态更新选择TCP(无差错的);视频传输、实时通信选择UDP(可以有点差错)

TCP如何保证可靠性

  • TCP协议保证数据传输可靠性的主要方式有:校验和、序列号、确认应答、超时重传、连接管理、流量控制、拥塞控制
  • 校验和:在数据传输的过程中,将发送的数据段都当作一个16位的整数,将这些整数加起来。而且前面的进位不能丢弃,补在后面,最后取反,得到校验和。发送方在发送之前要计算校验和,并进行校验和的填充;接收方收到数据之后,对数据以同样的方式进行计算,求出校验和,和发送方的进行比对。这只是一种保证方式,如果校验和比对一样也不能就说明数据传输成功,但是不一样一定没成功
  • 序列号和确认应答:TCP传输时将每个字节的数据都进行了编号,这就是序列号;TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答,也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉给发送方,接收到了哪些数据,下一次的数据要从哪里发。有了序列号,能够将接收到的数据按照序列号排序,然后去重,可以保证TCP传输的可靠性;我们会发现在后面的三次握手和四次挥手中反复出现的ACK实际上正是这个确认应答机制
  • 超时重传:如果迟迟没有收到ACK怎么办?首先,发送方没有收到相应的ACK报文的原因可能有两点:(1)数据在传输过程中由于网络原因等直接全体丢包,接收方没有收到;(2)接收方接收到了相应的数据,但是发送的ACK报文相应却由于网络原因丢包了。TCP引入超时重传机制正是为了解决此问题,就是重发呗。如果是原因(1),那么直接发送ACK报文就好了,如果是原因(2),根据序列号,接收方发现数据已存在,那么就直接丢弃,仍旧发送ACK应答
  • 连接管理:三次握手和四次挥手
  • 流量控制:TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制,在TCP协议的报头信息中,有一个16位字段的窗口大小,它实际上是接收数据缓冲区的剩余大小,这个数字越大,证明接收端接收缓冲区的剩余空间越大,网络的吞吐量越大。接收端会在确认应答发送ACK报文时,将自己的即时端口大小填入,并跟随ACK报文一起发送过去。而发送方根据ACK报文里的窗口大小的值改变进而改变自己的发送速度。如果接收到窗口大小的值为0,那么发送方将停止发送数据。并定期向接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。这是一个滑动窗口机制
  • 拥塞控制:慢启动,发送数据的时候先发送少量的数据探路,探清网络状态,然后再决定多大的速度进行传输,这时候引入一个拥塞窗口,刚开始为1,每次收到一个ACK应答,窗口加1,在发送数据之前,首先将拥塞窗口与接收端反馈
    的窗口大小比对,取较小的值作为实际发送的窗口。窗口大小一开始是指数增长,达到阈值之后线性增长。在慢启动刚开始的时候,阈值等于窗口最大值,一旦发生网络拥塞,超时重传,这个值减为原来(发生拥塞时候的窗口大小)的一半,同时拥塞窗口重置为1

TCP的粘包和拆包机制

  • TCP是一个”流“协议,所谓流,就是没有界限的一长串二进制数据。TCP作为传输层协议并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整的包,可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题
  • tcp是以流动的方式传输数据的,传输的最小单位是一个报文段。TCP为了提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了以后,再将缓冲区中的数据发送到接收方。同理,接收方也有缓冲区这样的机制来接收数据

产生粘包和拆包的原因:

  1. 应用程序写入数据大于套接字缓冲区大小,会发生拆包
  2. 应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发送粘包
  3. 进行MSS(最大报文长度)大小TCP分段,当TCP报文长度–TCP header长度>MSS的时候会发生拆包;
  4. 接收方法不及时读取套接字缓冲区数据,这将发生粘包

TCP的三次握手

  • 这个知识点不会没法面试

  • 首先明确这是客户端和服务器之间建立连接的过程,图示如下
    在这里插入图片描述

  • 第一次握手:客户端要求建立连接,它会发送SYN包(SYN=x)到服务器,并进入SYN_SENT状态(这叫半连接,此时双方还没有完全建立连接,服务器会把这种状态下的客户端放到一个半连接队列里面,完成三次握手之后就会放到全连接队列中),等待服务器确认,这里的SYN指的是同步序列编号 ( S y n c h r o n i z e S e q u e n c e N u m b e r s ) (Synchronize Sequence Numbers) (SynchronizeSequenceNumbers),这一次握手之后服务器能够确认客户端发送功能没问题

  • 第二次握手:服务器收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(SYN=y),即SYN+ACK包,此时服务器进入SYN_RECV状态,此时这一次是确认服务器的接收和发送功能没问题,但是不知道客户端的接收功能是否有问题,所以还要再握手一次

  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕客户端和服务器进入到ESTABLISHED(tcp连接成功)状态,完成三次握手,现在大家的发送和接收功能都没问题,可以开始发消息了

  • 补充:这里面的ACK为1表示确认序号有效,SYN表示发起一个新连接,FIN表示释放一个连接,它们都是标志位,用于确认/修改连接状态;ack表示发送接收到的对方的数据,seq表示发送自己的数据,用于确认数据是否准确,是否可以正常通信

问题1 三次握手过程中可以携带数据吗

  • 前两次握手不能携带,第三次可以。因为前两次是不知道服务器的接收和发送能力是不是正常的,如果对一个不正常的服务器发送了许多的请求会导致服务器的问题,可能会因此被攻击

问题2 能不能两次握手,或者四次握手

  • 如果客户端发出一个请求,但由于网络原因这个请求未被服务器收到,于是客户端重新传了一个请求,假设是两次握手,这时候服务器发回ACK确认,连接成功,等待数据传输完毕,断开连接,如果此时之前由于网络原因未传过来的请求传了过来,服务器认为客户端发出请求,于是他会发送给客户端ACK+SYN表示确认请求,但是客户端不会相应,于是服务器处于等待状态,等待连接超时,造成系统资源浪费;四次握手可以但没必要

问题3 为什么服务器端收到客户端的SYN之后,还要传回SYN

  • 为了告诉客户端,服务端收到的确实是客户端所发送的请求报文段

TCP的四次挥手

  • 这是客户端要求断开连接的的过程

在这里插入图片描述

  • 第一次挥手:客户端进程发出连接释放报文,而且停止发送数据,释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。我们可以发现,这一次是客户端要求断开连接,且现在客户端不会再往出发消息了
  • 第二次挥手:服务端收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE_WAIT(关闭等待状态)。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE_WAIT状态持续的时间,然后客户端收到服务器的确认请求后,此时,客户端就进入FIN_WAIT-2(终止等待2)状态,等待服务器发送连接释放的报文(在这之前还需要接受服务器发送的最后的数据)。这一次挥手实际上是服务器接受了客户端发送的断开连接的请求,使得服务端进入了一个半关闭状态,虽然客户端没有数据要发送了,但是服务端还可能有数据要发送,意思就是让客户端再等等,我还有数据你先别下线
  • 第三次挥手:服务器将最后的数据发送完毕之后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST_ACK(最后确认)状态,等待客户端的确认
  • 第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME_WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2*MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB(传输控制模块,存储每一个连接的重要信息)时,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSE状态。同样在撤销TCB后,结束此次TCP连接,也就是说,服务器结束TCP的时间比客户端要早

问题1 四次挥手原因

  • TCP协议时一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,当客户端发出FIN报文段时,只是说明客户端没有数据要发送了,但是它还是可以接受服务端发出的数据,当服务端返回ACK报文段时,表示它已经知道客户端没有数据要发送了;当服务端也发送了FIN报文段时,这个时候表示服务端也没有数据要发送了,就会告诉客户端,我也没有数据要发送了,然后连接断开。也就是说前两次挥手时断开一个方向的数据通道,后两次挥手是断开另一个方向的数据通道

问题2 每一次挥手丢失会发生什么

  • 第一次:如果客户端一直收不到ack应答报文,就会触发超时重传机制,最大重传次数由tcp_orphan_retries参数决定,当超过指定次数,就不再发送报文,直接进入close状态
  • 第二次:如果ack报文丢失,服务端是不会重传的,客户端这边会触发超时重传,直到收到ack报文或达到超时重传次数
  • 第三次:还是会触发超时重传机制
  • 第四次:还是一样

TIME_WAIT、CLOSE_WAIT状态发生在哪一步

  1. TIME_WAIT状态发生在客户端主动关闭连接时,发送最后一个ack之后,CLOSE_WAIT发生在客户端收到服务端的FIN信息之后
  2. 出现TIME_WAIT的状态原因:TIME_WAIT状态之所以存在,是为了保证网络的可靠性,由于TCP连接是双向的,所以关闭连接时,两个方向各自都需要关闭。先发FIN包的一方执行的是主动关闭,后发送FIN包的一方执行的是被动关闭,主动关闭的一方会进入TIME_WAIT状态,并且在此状态停留2MSL时长,如果服务端一直没有向客户端发送FIN信息(调用close()API),那么这个CLOSE_WAIT会一直存在下去
  3. 出现CLOSE_WAIT的状态原因:假设最终的ACK丢失,服务端将重发FIN,服务器必须维护TCP状态信息以便可以重发最终的ACK,否则会发送RST,结果服务器认为发生错误。TCP实现必须可靠的终止连接的两个方向(全双工关闭),服务端必须进入TIME_WAIT状态,因为服务器可能面临重发最终ACK的情形

为什么TIME_WAIT状态要保持2MSL这么长的时间?

  • 如果小于这个值,第一个连接就正常终止了,第二个拥有相同相关五元组的连接出现,而第一个连接的报文重复到达,干扰了第二个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT状态保持时间足够长,连接相应方向上的TCP报文要么完全响应完毕,要么被丢弃。建立第二个连接的时候不会混淆。换句话说就是让客户端和服务端发送的FIN全过期,保证不会干扰

应用层

HTTPS的工作原理

  • 见下图
    在这里插入图片描述

HTTP和HTTPS的区别

  • HTTPS协议需要到CA(Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用
  • HTTP是超文本传输协议,信息是明文传输,HTTPS是具有安全性的SSL解密传输协议
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • HTTP的连接很简单,是无状态的。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息)

介绍一下HTTPS的流程

  • HTTPS在传输的过程中会涉及三个密钥:服务器端的公钥和私钥,用来进行非对称加密;客户端生成的随机密钥,用来进行对称加密。一次HTTPS请求实际上包含了两次HTTP传输,如下
  1. 客户端向服务器发起HTTPS请求,连接到服务器的443端口
  2. 服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人
  3. 服务器将自己的公钥发送给客户端
  4. 客户端收到之后首先检查公钥的合法性(数字证书的合法性),如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥成为client key,即客户端密钥,我们用公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束
  5. 客户端发起第二次HTTP请求,将加密后的客户端密钥发送给服务器
  6. 服务器接收到密文,用私钥解密,然后用解密后的密钥加密,这样数据就变成了密文
  7. 然后服务器将加密后的密文发送给客户端
  8. 客户端进行对称解密,得到服务器发送的数据,这样HTTPS传输完成

HTTPS的证书认证过程

  1. 浏览器将自己支持的一套加密规则发送给网站
  2. 网站从中选出一组加密算法和HASH算法,并将自己的身份信息以证书的形式发送给浏览器,证书里面包含了网站地址,加密公钥以及证书的颁发机构等信息
  3. 浏览器获得网站证书之后,浏览器首先验证证书合法性,验证成功之后浏览器生成一串随机数的密码,并用证书中的公钥加密,然后使用约定好的HASH算法计算握手信息,并使用生成的随机数对消息进行加密,最后将之前生成的所有数据发送给网站
  4. 网站接收浏览器发来的数据之后要进行的操作:首先使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手信息,并验证HASH是否与浏览器发来的一致,使用密码加密一段握手信息,发送给浏览器
  5. 浏览器解密并计算握手信息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密

HTTPS为什么采用混合加密

  • 首先为什么需要加密?因为明文数据经过中间代理服务器、路由器等物理节点可能别窃取和篡改,如果采用对称加密问题是怎么把密钥通过服务器安全地传给浏览器?这无法保证绝对安全
  • 非对称加密是指我们有两把密钥,一把公钥,一把私钥,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容也必须要用公钥才能解开

插句题外话,可能有人会好奇怎么做的这么神奇,这里简单学习和介绍一下非对称加密算法中著名的RSA算法,完全不懂数论的可以直接略过。首先我们这边是服务器,我们要生成这两把密钥,任取两个不同的大素数 p , q p,q p,q计算 n = p q n=pq n=pq,根据欧拉函数的积性性质,有 ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n)=(p-1)\times(q-1) ϕ(n)=(p1)×(q1),然后任取一个大整数 e e e,满足 g c d ( e , ϕ ( n ) ) = 1 gcd(e,\phi(n))=1 gcd(e,ϕ(n))=1,现在我们的公钥是一个数对 ( e , n ) (e,n) (e,n),这个数对是公开的;接下来我们来生成私钥 ( d , n ) (d,n) (d,n),令 d d d满足 ( d e ) m o d    ϕ ( n ) = 1 (de)\mod\phi(n)=1 (de)modϕ(n)=1,有 d e = k ϕ ( n ) + 1 , k ∈ [ 1 , ∞ ) de=k\phi(n)+1,k\in[1,\infty) de=kϕ(n)+1,k[1,) k k k是任意的,为什么这个 d d d是对的呢?我们先看一下怎么加解密,将明文 m m m加密成密文 c c c,加密算法为 c = E ( m ) = m e m o d    n c=E(m)=m^e\mod n c=E(m)=memodn;将密文 c c c解密成明文 m m m,解密算法为 m = D ( c ) = c d m o d    n m=D(c)=c^d\mod n m=D(c)=cdmodn,这样就实现了公私钥的互相加密和解密。加密算法解释如下: c = E ( m ) = m e m o d    n = D e ( c ) m o d    n = c d e m o d    n = c k ϕ ( n ) + 1 m o d    n c=E(m)=m^e\mod n=D^e(c)\mod n=c^{de}\mod n=c^{k\phi(n)+1}\mod n c=E(m)=memodn=De(c)modn=cdemodn=ckϕ(n)+1modn根据欧拉公式,有 c k ϕ ( n ) + 1 m o d    n = c m o d    n = c c^{k\phi(n)+1}\mod n=c\mod n=c ckϕ(n)+1modn=cmodn=c故加密算法等式成立,同理也可证解密算法等式也成立

  • 但是这种办法的问题在于浏览器这边只能拿到公钥(明文传送),我们没办法把私钥传给它,也就是说现在我们只能用私钥加密,然后浏览器传消息,那么如果公钥被窃取,依然会产生可能消息泄露的问题,那到底该怎么办呢?我们引入混合加密
  • 这正是正难则反的思想,既然服务器这边没法弄了,考虑怎么对浏览器动手脚,我们先把公钥明文传给浏览器,然后浏览器随机生成一个密钥 X X X(对称加密),用这个明文加密之后传回给服务器,这样服务器用私钥一解密,两边都知道这个密钥 X X X了,HTTPS采用的是此方案

HTTPS的请求头中包含什么内容

  • User-Agent:产生请求的浏览器类型
  • Accept:客户端可识别的内容类型列表
  • Host:主机地址

请描述一次完整的HTTP请求过程

  1. 首先客户端位置是一台电脑或手机,在打开浏览器以后,输入一个域名http://www.xxx.cn,首先是浏览器发起一个DNS解析请求,如果本地缓存服务器中找不到结果,则首先会向根服务器查询,根服务器里面记录的都是各个顶级域所在的服务器的位置,当向根服务器请求http://www.xxx.cn的时候,根服务器就会返回.cn服务器的位置信息
  2. 递归服务器拿到.cn权威服务器地址以后,就会询问.cn的权威服务器,知不知道http://www.xxx.cn的位置,这个时候.cn权威服务器查找并返回http://www.xxx.cn的地址
  3. 继续向http://www.xxx.cn的权威服务器查询这个地址,由http://www.xxx.cn的服务器给出了地址:xxx.xxx.xx.xx
  4. 最终进入http的链接,进入网站

介绍一下DNS寻址的过程

  • 什么是DNS?DNS是域名系统,是因特网中的一项核心服务,是用于实现域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,得到该主机名的IP地址的过程叫做域名解析
  • 跟上面HTTP请求一样,注意最后递归服务器拿到解析记录以后,就会在本地进行缓存,如果下次客户端再请求本地的递归域名服务器相同域名的时候,就不会再这样一层一层查了,因为本地服务器里面已经由缓存了,这个时候直接把查询结果返回客户端就好

其他常见问题及参考答案

浏览器输入一个网址发生了什么

  • 非常重要,顺便把DNS解析、三次握手四次挥手全考完了,基本是上来就会问这个问题的样子
  1. 进行DNS解析,找到对应IP地址的服务器
  2. 通过TCP协议建立连接(三次握手)
  3. 建立连接后,浏览器发送HTTP请求
  4. 服务器根据HTTP请求返回相应的数据
  5. 浏览器根据协议解析数据,得到资源
  6. 根据得到的资源显示在页面上
  7. 根据Connection的Keep-Allive属性可以选择是否断开TCP连接(四次挥手)

Websocket的特点

  1. 建立在tcp协议上,服务器端的实现比较容易
  2. 与http协议有着良好的兼容性,默认端口也是80和443,而且握手阶段采用http协议,因此握手时不容易被屏蔽,能通过各种http代理服务器
  3. 数据格式比较轻量,性能开销小,通信高效
  4. 可以发送文本,也可以发送二进制数据
  5. 没有同源限制,客户端可以与任意服务器进行通信

DNS使用什么协议

  • DNS在区域传输的时候使用TCP协议,其余时候使用UDP协议,端口53

CSRF攻击

~哎,京东面试没答出来,死活想不起来叫啥

(Cross Site Request Forgery),中文是跨站点请求伪造。CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的

  • 简单说就是用户访问A,带着cookie,cookie是有状态的,然后他去访问钓鱼网站B,B获取了header中的cookie,然后B拿着这个cookie去访问A,这样B就是伪造了一段cookie
  • 那么解决办法就是token,因为token无状态

Cookie和Session的关系和区别

  • 存储位置:cookie存放在客户的浏览器上,session数据存放在服务器上
  • 安全性:cookie不是很安全,可能受到CSRF攻击
  • 性能:session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,为了减轻服务器压力应该使用cookie
  • 限制:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

其余待更

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clarence Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值