79.计算机网络-面试题总结
Q1:三次握手?
A:客户端A主动请求服务器B,初始化时AB的TCP都处于CLOSED(关闭)状态。
A请求B时,B先打开自己的TCB(传输控制块),等待A连接请求,B进入到LISTEN(收听)状态,等待A的连接请求。
A请求时也会打开自己的TCB,然后在打算建立连接时向B发出连接请求报文段,同步位SYN=1,同时建立一个序列号seq,此时客户端进入到SYN-SEND(同步已发送)状态。
B收到连接请求后,如果同意建立连接,向A发送确认消息。同步位SYN=1,ACK=1,确认号为ack=x+1,同时建立服务端的序列号y,此时服务端进入SYN-RCVD(同步收到)状态。
客户端收到服务端的确认后,需要给服务端进行确认,ACK=1,确认号ack=y+1,客户端序列号seq=x+1。客户端进入连接已建立状态。服务端收到确认号后也进入连接已建立状态。
Q2:为什么必须是三次握手?
A:如果最后一次不进行客户端确认,那么如果客户端发出的报文由于网络原因导致很晚才送到了服务端。
由于这个报文已经超时了,但是服务端不知道这是一个超时的连接,于是就向客服端发出信号可以传送数据了。
但是客户端知道自己并没有重新发起请求,因此并不会去进行处理,但此时服务端却认为已经到了要传输数据的阶段了,会一直等待客户端发送数据,浪费服务端的资源。
Q3:四次挥手?
A:首先客户端和服务器都处于连接已建立的状态。当客户端想要关闭连接时:
客户端发出连接释放报文段,并把FIN=1,设置序列号seq=u,此时客户端进入FIN-WAIT-1(等待1)状态,等待服务端确认。
服务端收到后,发出确认消息,确认好ack=u+1,设置服务端序列号v,B进入到CLOSE-WAIT(关闭等待)状态。此时处于半关闭状态,半关闭状态下服务端如果有要发的东西,客户端仍要接收。
客户端收到确认后,进入到FIN-WAIT-2(终止等待2)状态,等待服务端发出连接释放报文段。
如果服务端没有要发的东西了,就通知TCP释放连接,FIN=1,ACK=1,seq=w,重复第一次发的确认号ack=u+1。服务端进入到LAST-ACK(最后确认)阶段。
客户端收到连接释放报文段后,发出确认,ACK=1确认号ack=w+1进入到time-wait(时间等待)状态。等待一段时间后关闭连接。
Q4:关闭连接后为什么要等一段时间再关闭?
A:防止服务端在传输过程中还有未传完的数据,客户端就已经关闭了。
保证客户端发出的最后一个确认报文能到达服务端。如果最后一个关闭报文没有成功达到服务端时,服务端没收到FIN+ACK报文段就不会正常关闭。
Q5:计算机网络分为那几层?
A:
Http1.0和Http1.1区别:
http1.0和tttp1.1的区别:
长连接:http1.1支持长连接和请求流水线处理,在一个TCP连接商可以传送多个http请求和响应,减少了建立和关闭连接的消耗和延迟,在http1.1中默认开启长连接。keep-alive
,一定程度上弥补了http1.0
每次请求都要创建连接的缺点。
http1.0
需要使用keep-alive
来告知服务端要建立一个长连接。
节约带宽:
http1.0
不支持断点续传
http1.1
支持只发送Header,客户端接收到100才开始把body信息发送到服务器,返回401客户端就可以不用发送请求Body了节约带宽。
host域
http1.0
每台服务器只能绑定一个ip地址
http1.1
的请求和响应消息都支持host域,且请求消息中如果没有Host域会报400的错
缓存处理
http1.0
使用if-modified-since
,expires
作为缓存判断的标准
http1.1
引入了更多的缓存控制策略Entity tag,If-Unmodified-Since, If-Match, If-None-Match
错误通知管理
http1.1
新增了24个错误状态码,409请求的资源与资源的当前状态发生冲突
410,服务器上的某个资源被永久删除。
6.Http1.1和Htp2.0的区别:
多路复用
同一个连接并发处理多个请求,http1.1
可以多创建几个TCP连接来支持处理更多并发请求 。
头部数据压缩
http1.1
不支持header数据的压缩,
http2.0
使用hpack算法对header数据进行压缩
服务端推送
在浏览器明确请求前,免得客户端再次创建连接发送请求到服务器端获取。
Q7:HTTPS?
A:在传输层和应用层加了TSL(运输层安全)和SSL(安全套接字层)。
属于传输层安全协议。
SSL建立安全会话过程:
-
协商加密算法
-
客户端发送请求,表明自己支持的加密算法
-
服务端选定加密算法
-
-
服务端鉴别
-
服务端向浏览器发送RSA公钥数字证书
-
浏览器使用该证书认证机构CA公开发布的RSA公钥对证书进行验证。
-
-
会话密钥计算
-
浏览器产生一个秘密数,用服务器的RSA公钥加密后发给服务器
-
协商算法完成产生共享的对称会话密钥
-
-
安全数据传输
- 双方用会话密钥加密和解密他们之间传送的数据并验证完整性
Q8:HTTP1.0和2.0有什么区别?
A:HTTP1.0和HTTP1.1和HTTP2.0的区别
Q9:TCP和UDP的特点?
A:TCP可靠的,面向连接的传输层协议,端对端的,面向字节流的(对数据进行处理,数据拆分和合并)
UDP时不可靠的,可以是一对一,一对多,多对多,多对一进行通信,面向报文的(不对数据进行处理只是加上首部之后就进行交付),没有拥塞控制,首部字节8个。
Q10:TCP是怎么实现可靠传输的?可靠传输的原理是什么?
A:网络层的传输本来是不可靠的,TCP使用了停止等待协议(每发送一个分组就停止发送,等待对方确认后才发送下一个分组)和连续ARQ协议
停止等待协议出现的几种状况:
-
无差错情况
-
出现出错情况
- 传输过程种出现差错,超时重传
-
确认丢失和迟到
-
确认过程种出现差错
-
客户端确认迟到->超时重传
-
服务端确认迟到->
-
-
Q11:常见的应用层协议有哪些?
A:http,ftp,telnet(远程终端协议),smtp(简单邮件传输协议),pop2和imap(邮件读取协议),DHCP(动态主机配置协议),DNS(域名解析协议)
Q12:常见的状态码?
A:不要再说404,500了
302资源临时被移动
304资源未修改
302和307状态码区别:
302如果不是head和get请求,浏览器会禁止重定向,除非得到用户的确认。但是浏览器的实现是得到302状态码时使用get方式进行重定向。
303用来规范浏览器的实现,即当得到302状态码时使用get方式进行重定向。
307实现和302一样,即不是head和get请求,浏览器会向用户确认然后进行重定向。
403未授权,常见于登录授权请求拒绝时
405不支持的请求方法
408发送超时
413请求实体超大
502代理服务器无法连接到父网关,常见于使用代理的服务器,配置的服务器地址不可用
503服务端暂时不可用,常见于后端发布过程中调用接口时遇到该状态
Q13:粘包和拆包?
A:TCP的流量控制产生的问题。
put和post请求方法的区别
Iput
方法是幂等的:连续调用一次或多次的效果相同。
client
对一个URI发送一个实体,将客户端的资源放在请求URI上们对于服务器到底时创建还是更新,由服务器返回的httpcode来区别。
post
连续调用会带来额外的影响,例如表单提交。
如果用PUT来达到更改资源,需要客户端提交资源全部信息
put应答:如果目标资源不存在,并且put方法成功创建了一份,那么源头服务器必须返回201来通知客户端资源已创建。
如果目标已存在,并且依照请求中封装的表现形式成功进行了更新,那么源头服务器必须返回200或204来表示请求的成功完成。
14.Http缓存
只能缓存Get请求。
缓存控制强缓存
cache-control
cahce-control-no-store:不缓存
cache-control:no-cache:有缓存,客户端想使用时需要域服务端进行验证
当发现有旧的资源时,会在请求时加一个if-none-match头部,判断资源副本是否过去,返回了304则表示资源副本时新鲜的。
Cache-control: max-age=N->Expires->Last-Modified
cache-control:max-age有效时间
协商缓存
if-none-match实体标签在验证,使用etag来进行标记。
服务器对比客户端发来的etag,相同if-none-match=false,返回304状态码,使用本地缓存。
不相同将if-none-match=true,返回200状态码,客户端重新解析服务器返回的数据。
last-modified和If-modified-since时一对:从某个日期之后文档被修改过
当发现有旧的资源时,会在请求时加一个if-none-match头部,判断资源副本是否过去,返回了304则表示资源副本时新鲜的。
Cache-control: max-age=N->Expires->Last-Modified
cache-control:max-age有效时间
协商缓存
if-none-match实体标签在验证,使用etag来进行标记。
服务器对比客户端发来的etag,相同if-none-match=false,返回304状态码,使用本地缓存。
不相同将if-none-match=true,返回200状态码,客户端重新解析服务器返回的数据。
last-modified和If-modified-since时一对:从某个日期之后文档被修改过
15.预检请求
第一个返回204状态码没有数据,第二次返回200.
为什么要发预检请求?
防止跨域请求,请求已经发送了后台数据也被修改了但是返回结果被拦截了。
为了防止这种请求,规范要求,对这种可能对服务器产生副作用的http请求方法,浏览器必须先使用options方法发起一个预检请求,从而获知服务器是否允许该跨域请求;如果允许,就发送带数据的真实请求;如果不允许,则组织发送带数据的真实请求。
什么时候发预检请求?
简单请求
请求方法:
get,head,post(不包含数据只有请求头)
请求头:
accept,accpt-language,content-language,last-event-id,
content-type为text/plain,multipart/form-data,application/x-www-form-urlencoded,
除了简单请求都是复杂请求需要预检
预检请求
必须使用options方法发起一个预检请求。