本篇总结的是计算机网络知识相关的面试题,后续也会更新其他相关内容
答:主要有四个方向的不同,分别是:
SSL/TLS
安全协议,使得报文能够加密传输。SSL/TLS 的握手过程
,才可进入加密报文传输。80
,HTTPS 默认端口号是 443
。CA(证书权威机构)
申请数字证书,来保证服务器的身份是可信的。答:在之前我们介绍了对称加密和非对称加密的优缺点,HTTPS是将两者结合起来,使用的对称加密和非对称
加密的混合加密算法。具体做法就是
简易的加密流程
这其中存在一个很大地问题,就是客户端最开始如何判断收到的这个公钥就是来自服务端而不是其他人冒充的?
- 这就需要证书上场了,服务端会向一个权威机构申请一个证书来证明自己的身份.
- 到时候将证书(证书中包含了公钥)发给客户端就可以了
- 客户端收到证书后既证明了服务端的身份又拿到了公钥就可以进行下一步操作了。
HTTPS的加密过程
客户端哪里来的数字认证机构的公钥,其实,在很多浏览器开发时,会内置常用数字证书认证机构的公钥。
如下图:
答:它们都是都是HTTP的一种协议,但是
GET
是用于向服务器获取资源
,参数直接拼接在url上面。方法是安全、幂等、可被缓存的。POST
用于向服务器推送资源
,参数使用requestData传输,传输内容更多。方法是不安全,不幂等,不可缓存。在 HTTP 协议里,所谓的「安全」是指请求方法不会「破坏」服务器上的资源。 所谓的「幂等」,意思是多次执行相同的操作,结果都是「相同」的。
- GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签。
- POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签。
答:
HTTP 0.9
:仅支持GET请求,不支持请求头。HTTP 1.0
:默认短连接,一次请求对应一次TCP连接,请求完就断开、支持GET、POST、 HEAD请求。HTTP 1.1
:默认长连接,一次TCP连接可以多次请求、加入了请求头、加入了缓存处理、支持断点续传功能、支持PUT,DELETE,PATCH等六种请求。HTTP 2.0
:多路复用,降低开销(一次TCP连接可以处理多个请求)、报头压缩,降低开销、允许服务器主动推送数据、基于二进制解析,解析错误少,更高效(HTTP 1.X解析基于文本),提高了传输性能;HTTP 3.0
:把HTTP下层的TCP协议改成了UDP,数据的可靠传输依靠 QUIC 协议来实现。无队头阻塞、建立连接速度快、连接迁移;(没有被正式推出);它们都是运行在TCP之上的应用层协议,区别是:
控制信息
是带外(out-of-band)传送的,HTTP控制信息是带内(in-band)传送的;答:HTTP协议是无状态的,即服务器无法判断用户身份。但是Session和Cookie可以用来进行用户身份辨认。
Cookie
Session
sessionid
,将sessionid
放到Cookie中,保存在客户端浏览器。更加详细的请看这一篇:cookie、session与token的真正区别
答:可以,Session的作用是在服务端来保持状态,通过sessionid来进行确认身份,但sessionid一般是通过
Cookie来进行传递的。如果Cooike被禁用了,可以通过在URL中传递sessionid。
答:例如查询www.baidu.com的IP地址分为以下几个步骤:
浏览器的DNS缓存
:浏览器会缓存DNS记录一段时间;系统缓存中的DNS
信息,首先检查域名是否在本地hosts
里,再查系统本地缓存的其它DNS记录
;发送一个请求到路由器
上,然后路由器在自己的路由缓存上查找记录,路由器一般也存有DNS信息;ISP(网络服务提供商)
,ISP也会有相应的ISP DNS服务器;DNS递归查询
:本地域名服务器-----根域名服务器-----顶级域名服务器-----二级域名服务器-----三级域名服务器 Socket通信
,调用系统库函数socket,建立TCP连接
;DNS 服务器:一种专门保存了 Web 服务器域名与 IP 的对应关系的服务器
答:TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。
TCP采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的。
UDP是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。
造成TCP粘包的原因有哪些?
出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
Nagle算法
,将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包;减少网络中报文段的数量接收数据包到缓存
的速度大于
应用程序从缓存中读取
数据包的速度,多个包
就会被缓存
,应用程序就有可能读取到多个首尾相接粘到一起的包。出现TCP粘包了需要处理吗?
如果是一个文件被分成多个部分发送,这时当然不需要处理粘包现象;但是如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了。
如何处理粘包?
关闭Nagle算法
来解决,使用TCP_NODELAY选项来关闭算法。格式化数据
:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。发送长度
:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。我们在网络通信的过程中,常常使用 ping 某一个 IP 地址或者某个域名看下基本连接是否正常;是否有丢包;是否有网络延迟。
Ping 的原理是 ICMP(无连接、网络层协议) 协议,具体是:
ICMP Echo请求报文
,目的主机收到之后会发送Echo 回答报文
。