前几天面试遇到类似的问题
题目汇总
- 三次握手和四次挥手(done!)
- tcp和udp的区别?(done!)
- tcp如何保证可靠传输?(done!)
- http1.0和http1.1有什么区别?(done!)
- HTTP2.0和HTTP1.X相比?(done!)
- 简单讲解一下http2的多路复用?(done!)
- https,http2,http3,区别以及作用。比如四次握手,多路复用原理,二进制分帧。
- http和websocket
- https握手过程(done!)
- 介绍一下https中间人攻击(done!)
- 说一下http缓存策略,比如缓存的关键header是什么?(doing)
- 详细讲下304状态码(doing)
- 介绍一下http协议
- http协议规范了些什么?
文章目录
讲实在的这么多问题,这么多需要记住的,内心是有点抗拒的。来吧,一个一个攻破。
三次握手,四次挥手,两次握手可不可以?
三次握手
- 第一次握手:客户端向服务端发送带SYN标志的数据包请求连接,产生随机起始序列seq=x;
- 第二次握手:服务端收到请求,如果确认连接,发送确认包SYN=1,ACK=1,确认号字段ack=x+1,随机起始序列seq=y;
- 第三次握手:客户端收到确认报后,发送ACK=1,序号字段为seq=x+1,确认号字段为ack=y+1,服务端验证没问题,则建立连接。
补充:服务器端的资源是在完成第二次握手分配;客户端资源是在完成第三次握手时分配
四次挥手
第一次挥手:客户端发送连接释放报文段,FIN=1,seq=u;
第二次挥手:服务端收到释放连接请求,发出确认,ACK=1,确认号ack=u+1,seq=v;
第三次挥手:如果服务器传输数据完毕,向客户端发送FIN=1的连接释放报文段,ACK=1,ack=u+1,seq=w;
第四次挥手:客户端收到连接释放报文段,必须发出确认报文段,ACK=1,ack=w+1,seq=u+1,等待计时器时间2MSL后,A进入关闭连接状态。
补充:关于连接和释放的题目,ACK,SYN,FIN一定等于1
两次握手可不可以?
不可以。是为了防止已失效的连接请求报文段突然又传送到服务端而产生错误。比如客户端A发送请求连接报文段滞留,A超时后认为报文丢失,重新发送请求连接报文段。如果前一个滞留在网络中的报文段突然到达服务端B,而B认为A又发送连接请求,若使用“三次握手”则B向A发送确认报文段,由于是一个失效的请求,A不理睬,建立连接失败;如果采用“两次握手”,则B认为连接建立,一直等待A传输数据,造成资源浪费。
搞定第一个问题,接下来第二个。常见的tcp和udp的区别?
tcp和udp的区别
- UDP:用户数据报协议,是面向非连接的协议;不可靠传输;支持一对一,一对多,多对一和多对多交互通信;传输方式面向报文;首部开销小仅八个字节;适用于实时应用,比如IP电话、视频会议、直播。
- TCP:传输控制协议,是面向连接的协议;可靠传输(数据顺序和正确性),使用流量控制和拥塞控制;只能一对一通信;传输方式面向字节流;首部最小20字节,最大60字节;适用于要求可靠传输的应用,例如文件传输。
参考链接:面试题:TCP和UDP 相关
上个问题很快,两分钟就够了。接着下一个tcp如何保证可靠传输?,诶挑着简单的先来
tcp如何保证可靠传输?
五个关键点
- 应用数据被TCP分割成合适发送的数据块
- 确认机制,即发送报文后,等待确认
- 重发机制,没有收到确认,将重发数据报
- 保持它的首部和数据校验,确认数据的准确性
- 排序,将重复数据丢弃,进行流量控制
前几天笔试题还遇到,TCP拥塞控制机制包含什么?
- 慢启动
- 拥塞避免
- 快速重传
- 快速回复
http1.0和http1.1有什么区别?
这部分内容有点点多
- 请求方式的区别,http1.0只有get、post、head;http1.1多六种options、put、patch、delete、trace、connect;
- 缓存处理的区别,http1.0主要使用header里面的If-Modified-Since,Expires作为缓存判断的标准;http1.1引入更多的缓存控制策略Entity tag,If-Unmodified-Since,If-Match,If-None-Match等更多可供选择的缓存头来控制缓存策略;
- 带宽优化及网络连接的使用区别,http1.1在请求头引入range头域,允许之请求资源的某个部分,则返回码为206(Partial Content);
- 错误通知管理区别,http1.1中新增了24个错误状态响应码,409请求的资源和资源的当前状态发生冲突;
- host头处理,http1.1的请求消息和响应消息都应支持host头域,且请求消息中如果没有host会报错400 bad request
- 长连接的区别,http1.1支持长连接persistentConnection和请求的流水线处理,在一个tcp连接上可以传送多个http请求和响应,减少建立和关闭连接的消耗和延迟,http1.1默认开启Connection: keep-alive。通过设置HTTP的请求头部和应答头部,保证本次数据请求结束之后,下次请求仍可以宠用这一通道,避免重新握手。
参考链接: 面试题(2020)前端HTTP浏览器相关面试题
HTTP2.0和HTTP1.X相比?
- 新的二进制格式,http1.x基于文本解析。http2.0基于二进制格式解析,应用场景更广泛
- 多路复用,即连接共享,一个request对应一个id,一个连接拥有多个request,每个连接的request可以随机混在一起,接收方可以根据request的id将request再归属到各自不同的服务端请求里面;(换种说法:多路复用把多个请求当作多个流,请求响应数据分成多个帧,不同流中的帧交错发送解决了tcp连接数量多,tcp连接慢,所以对于同一个域名下只用创建一个连接就可以了)
- header压缩,http1.x的header带有大量信息,且需要重复发送,http2.0使用了专门首部压缩算法HPACK,使用encoder来减少header的大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减少了传输的大小
- 服务端推送,服务端推送能把客户端所需要的资源伴随index.html一起发送给客户端,省去客户端重复请求的步骤。因为没有发起请求、建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。
- 设置请求优先级,HTTP2.0可以设置请求优先级,可以按照优先级来解决阻塞问题
HTTP1.1
- 缓存处理新增E-tag、If-None-Match之类缓存来控制缓存
- 长连接,可以在一个tcp连接上发送多个请求和响应
HTTPS与HTTP相比
- https需要ca申请证书,免费少,需要付费
- https运行在tcp之上,传输内容都是明文,https运行再ssl/tls之上,ssl/tls运行在tcp上,所有传输内容都加密
- http和https端口不同,前者为80,后者为443
- https可以有效防止运营商劫持,解决防劫持的一个大问题
简单讲解一下http2的多路复用?
背景:在http1.x中,每次请求都会建立一次http连接,会占用相当长一段时间,即使开启keep-active,解决了多连接问题,依然有两个效率上的问题:一是串行的文件传输,二是连接数过多导致的性能问题,http2多路复用就是为了解决上述两个性能问题
- http2中帧(frame)代表着最小的数据单位,每个帧会标识出该帧属于哪个流(stream),流也就是多个帧组成的数据流
- 多路复用就是一个tcp连接中可以存在多条流。换句话说,也就是一个tcp可以发送多个请求,对端可以通过帧中的标识来确定来自哪个请求。
- 避免http就版本中的对头阻塞问题,极大提高传输效率。
总结:
- HTTP1.x中,相同域名下并发多个请求需要多个TCP连接,一般浏览器为了控制资源会限制TCP连接,造成延时和内存消耗;
- HTTP2多路复用下,同域名所有通信可以在单个TCP连接上完成,并行交错请求和响应,互不影响,消除多个 TCP 连接而带来的延时和内存消耗。
此问题参考链接
https握手过程
- 客户端使用https的url访问web服务器,要求与服务器建立ssl连接;
- web服务器收到请求后,将网站的证书(含服务器地址、公钥以及证书的颁发机构等信息)传送一个给客户端;
- 客户端收到网站证书后会检查证书的合法;,如果没有问题就随机产生一份密钥
- 客户端利用公钥将会话密钥加密,并传送给服务端,服务端用自己的私钥解密出会话密钥,验证信息是否正确;
- 使用密码加密一段握手消息,发送给客户端,客户端解密并验证握手消息是否与服务端发送一致,如果一致握手过程结束,之后所有通信数据将由之前客户端生成的随机密码并利用对称加密算法进行加密。
参考链接:
http的缺点
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
介绍一下https中间人攻击
- 服务端向客户端发送公钥
- 攻击者截获公钥,保留在自己手上
- 攻击者生成一个“伪造的”公钥,发送给客户端
- 客户端收到伪造的公钥,生成加密hash(密钥)值发送给服务器
- 攻击者获得加密hash值,用自己的私钥解密获得真密钥
- 同时生成假的加密hash值,发送给服务器;
- 服务器用私钥解密获得假密钥;
- 服务器用假密钥加密传输信息。
说一下http缓存策略,比如缓存的关键header是什么?
参考连接: