面试准备——计网中的高频面试题
-
- 输入一个url到显示页面的过程
- 在这个过程中使用了那些协议
- TCP的三次握手和四次挥手
- TCP和UDP协议的区别
- UDP的不可靠和效率高的原因
- TCP如何保证传输可靠
- 滑动窗口和流量控制
- 拥塞控制
- TCP采用的拥塞控制算法
- TCP的time_wait
- TCP超时重传,会一直传吗。详细说说
- HTTP的构成
- HTTP请求头
- HTTP响应头
- HTTP状态码
- HTTP的长连接和短连接
- HTTP不保存状态的协议,如何保存用户状态
- Cookie的作用以及和Session的区别
- HTTP1.0,HTTP1.1和HTTP2.0的区别
- HTTP和HTTPS的区别
- 如何判断一个长连接已经结束了?
- HTTPS的过程
- HTTP常用方法
- get和post的区别
- 如何保证网站的可用性
- 每层有哪些协议,路由器,交换机分别在那一层?
- DNS解析过程
输入一个url到显示页面的过程
- 1、输入网址
- 2、DNS解析
- 3、三次握手建立可靠的TCP连接
- 4、客户端发送HTTP请求
- 5、服务器处理请求
- 6、服务器响应请求返回HTTP报文
- 7、浏览器解析渲染页面
DNS的查询是一个递归的过程,首先在本地域名服务器中查找,如果没找到,就到根域名服务器进行请求,根域名系统不存在。本地域名系统就向com顶级域名系统发送请求。
但是在进行这个查找过程前,DNS会先在浏览器缓存,系统缓存,路由器缓存等去查找。
在这个过程中使用了那些协议
- 应用层:
DNS协议,查找对应的域名IP
HTTP,超文本传输协议,在TCP建立连接以后就使用HTTP协议访问网页 - 传输控制层
TCP协议通过三次握手,建立可靠的传输协议. - 网络层:
IP协议:建立TCP协议时,需要发送数据,发送数据在网络层使用IP协议 - 数据链路层:
ARP:地址解析协议
RARP:逆向地址解析协议
在路由器上IP数据报的发送使用的是OPSF协议
TCP的三次握手和四次挥手
- 三次握手过程
- 首先,客户端发送一个SYN标志数据包给服务端进行第一次握手。
- 服务端返回一个SYN+ACK标志的数据包给客户端进行第二次握手。
- 最后客户端返回一个ACK标志数据报给服务端。建立可靠连接
- 为什么进行三次握手,进行两次可以吗?.
答:进行两次是不可以的。进行三次的目的是为了建立可靠的连接,三次连接的建立可以使服务端,客户端都确认自己的发送和接收是正常的。而如果只进行两次,缺少最后的客户端返回ACK标志的数据包给服务端,服务端就不知道自己的接收是否正常。
- 四次挥手的过程
客户端
发送一个FIN,用于关闭客户端到服务端的数据传送服务端
收到FIN,回复一个ACK,告诉客户端我知道了(确认序号为收到序号+1。)服务端关闭了了客户端的连接后
,发给一个FIN给客户端客户端
发送ACK报文确认
- 为什么要四次挥手
首先各端发出第一个通知的时候,都进入的是半关闭状态,防止还有数据漏发。然后收到对方的确认以后在进行断开连接。
TCP和UDP协议的区别
TCP是面向连接的可靠连接。而UDP是不面向连接的不可靠连接。
TCP采用的是字节流进行传输,而UDP是采用数据报文进行传输。
由于TCP的需要保证可靠,因此传输效率慢,需要资源多。而UDP则更快,需要资源更少。
TCP的首部是20-60个字节而UDP是8个字节
UDP的不可靠和效率高的原因
UDP传输之前不需要建立连接,远程主机收到UDP报文以后,不需要进行任何确认。但是UDP即时通讯中作用很大特别是不在意丢包率的场景中。
TCP如何保证传输可靠
- TCP会将其分成适合发送的大小的数据块。并且每次发包都要进行编号,因此在上传给应用程时也是传输的有序的数据。
- TCP会在端到端的过程中检验首部和数据。如果发生缺失,就会丢弃和不确认收到了这个报文段。发送端没收到接收端的接收确认信息就会重新发。
- 流量控制:TCP传输的每一个端都有固定大小的缓冲空间,保证及时接收数据。当接收方不能及时处理的时候就会提示发送端降低发送速率,防止丢包。TCP是使用可变大小的滑动窗口实现的流量控制。
- 拥塞控制:发送方发完一个就等待接收方的确认消息,收到了才会继续,否则进行重传。
- 超时重传,发送到不仅没有收到确认消息会重传,在定时器超过时间也会自行传输。
滑动窗口和流量控制
TCP利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方的报文字段可以用来控制发送方窗口的大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。
拥塞控制
拥塞控制是为了防止数据过多的注入网络当中,这样就可以使得网络中的路由器或者链路不至于过载。
TCP对于拥塞控制是使用的一个拥塞窗口(cwnd)的状态变量。**拥塞窗口的大小取决于网络的拥塞程度,并且动态变化。**发送方让自己的发送窗口取为拥塞窗口和接收方的接收窗口中较小的哪一个。
TCP采用的拥塞控制算法
慢开始:主机发送数据的时候,先探测一下,然后逐渐增大发送窗口,也就是从小到大逐渐增加拥塞窗口数值。cwnd初始值为1,每次经过一个传播轮次,cwnd加倍。
拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT,cwnd加1。
快重传和快恢复:TCP/IP中,快速重传和恢复是一种拥塞控制算法,他能快速恢复丢失的数据包。在FRR(快重传和快恢复中)如果收到一个不按顺序的数据段,它立即给发送端发送重复确认。如果发送机接收到三个重复确认,就会立即重传这些数据。
使用FRR避免了数据丢失,TCP使用定时器,暂停传送,要求重传的浪费。
TCP的time_wait
- 产生time_wait的原因
TCP的挥手导致的
主动关闭的一方(client)最后发送的ACK在网络中丢失
,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN
,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源不能诶释放。直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。
如果主动关闭一方不维护这样一个TIME_WAIT状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生,然而这事实上只是正常的关闭连接过程,并非异常。
为使旧的数据包在网络因过期而消失:
由于TCP协议栈不能区分连接的差别,为了避免新旧连接交替而产生的旧数据的问题因此有了time_wait。
- time_wait如何避免
假设是client,我们一般不用操心,由于client一般选用暂时port。再次创建连接会新分配一个port。
除非指定client使用某port,只是一般不须要这么做。
假设是server主动关闭连接后异常终止。则由于它总是使用用一个知名serverport号,所以连接的time_wait状态将导致它不能重新启动。只是我们能够通过socket的选项SO_REUSEADDR来强制进程马上使用处于time_wait状态的连接占用的port。 通过socksetopt设置后,即使sock处于time_wait状态,与之绑定的socket地址也能够马上被重用。
- time_wait过多的危害
延迟的FIN或者重传会影响新的连接。
占用内存
TCP超时重传,会一直传吗。详细说说
不会一直传。由于TCP的顺序发包收包机制,因此如果中间失去了一个包,那么后面的包由于滑动窗口的机制也会让服务端以为没有收到,需要重传。
- 因此TCP采用了
快重传的机制
,服务器如果收到乱序的包,也给客户端回复 ACK,只不过是重复的 ACK
。就拿刚刚的例子来说,收到乱序的包 6,7,8,9 时,服务器全都发 ACK = 5。这样,客户端就知道 5 发生了空缺。- 在快重传中会出现重复包的情况,因此改进出来了
SACK
,在快速重传的基础上,返回最近收到的报文段的序列号范围在这里插入代码片
,这样客户端就知道,哪些数据包已经到达服务器了。但由于服务端可能会自作主张将乱序包删除因此还是可能需要重传多个。DSACK
:即重复 SACK,这个机制是在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了
。DSACK 的目的是帮助发送方判断,是否发生了包失序、ACK 丢失、包重复或伪重传。让 TCP 可以更好的做网络流控。
HTTP的构成
- 请求行:
- 请求头
- 请问正文
HTTP请求头
Accept:浏览器能够处理的内容类型
Accept-Charset:浏览器能够显示的字符集
Accept-Encoding:浏览器能够处理的压缩编码
Accept-Language:浏览器当前设置的语言
Connection:浏览器与服务器之间连接的类型
Cookie:当前页面设置的任何Cookie
Host:发出请求的页面所在的域
Referer:发出请求的页面的URL
User-Agent:浏览器的用户代理字符串
HTTP响应头
Date:表示消息发送的时间
server:服务器名字。
Connection:浏览器与服务器之间连接的类型
content-type:表示后面的文档属于什么MIME类型
Cache-Control:控制HTTP缓存
HTTP状态码
HTTP的长连接和短连接
HTTP的长短连接实质是TCP协议的长短连接。
短连接::HTTP/1.0中默认使用。当客户端和服务器每进行一次HTTP操作就建立一次连接,任务结束就中断。
长连接:在HTTP/1.1中开始默认使用。响应头中加入了Connection:keep-alive
使用长连接,当一个网页打开后,客户端和服务器之间用于传输的HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用一条已经建立的连接。
这个keep-alive的时间不会持续很久。由服务器确定存活时间。客户端和服务端需要都支持长连接才能使用长连接。
HTTP不保存状态的协议,如何保存用户状态
HTTP是一种无状态协议。而使用的是Session来进行一个通信状态的保存。Session通过内存或者是数据库(Redis)来实现在服务端记录用户状态。服务端会在一段时间内保存这个Session,过了这个时间限制,就会销毁。
Session的跟踪通过在Cookie中附加一个Session ID的方式来跟踪。
Cookie的作用以及和Session的区别
两者都是用来跟踪浏览器用户身份的会话方式的。
Cookie一般用来保存用户信息。
Session主要作用是通过服务端记录用户状态。
Cookie保存在浏览器中,Session保存在服务端
Session安全性更高。
HTTP1.0,HTTP1.1和HTTP2.0的区别
- HTTP1.0和HTTP1.1的区别
缓存处理
:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。连接
:在HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP 是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。
因此最好能维持一个长连接,可以用个长连接来发多个请求。HTTP 1.1起,默认使用长连接 ,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。错误状态响应码
:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。带宽优化及网络连接的使用
:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- HTTP1.1和HTTP2.0的区别
更加方便和健壮:HTTP1.X的解析基于文本,健壮性低,而HTTP2.0则基于二进制,提升了健壮性。
多路复用:连接共享,每一个request对应一个id,这样一个连接可以有多个request。
header的压缩:HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
HTTP和HTTPS的区别
端口
:HTTP默认端口80,HTTPS默认端口号443
CA申请证书:HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
安全性和资源消耗
: HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。
防止劫持
:HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
如何判断一个长连接已经结束了?
这个我也没想到方案.
判断Content-Length?
HTTPS的过程
HTTP常用方法
- GET: 用于请求访问已经被URI识别的资源,可以通过URL传参给服务器;简单来说就是将服务端获取的用户所需的资源,作为响应信息返回给客户端(不会影响资源信息的状态,如:增删改查等操作)。
- POST:用于传输数据给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。请求服务器接受所指定的文档作为对所表示的URL的新的从属实体。
- PUT: 传输数据,报文主体中包含文件内容,保存到对应URI位置。从客户端向服务器所传送的数据取代指定的文档信息。
- HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。只请求页面的头部信息。
- DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。请求服务器删除指定的页面信息。
- OPTIONS:查询相应URI支持的HTTP方法。允许客户端查看服务器性能。
get和post的区别
- 1.GET请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,POST把提交的数据则放置在是HTTP包的包体中.
- 2.GET的长度受限于url的长度,而url的长度限制是特定的浏览器和服务器设置的,理论上GET的长度可以无限长。POST是没有大小限制的,HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力
- 3.在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。
- 4.POST的安全性要比GET的安全性高
- 5.编码不同:GET的参数只能支持ASCII而POST能支持任意的binary。
如何保证网站的可用性
冗余备份,失效转移
每层有哪些协议,路由器,交换机分别在那一层?
路由器在网络层,交换机在数据链路层
DNS解析过程
(1)主机先向本地服务器DNS进行递归查询。
如果本地服务器DNS中不存在所要查找的域名IP-》
(2)本地服务器以DNS采用迭代查询,本地服务器以DNS客户身份向根域名进行查找。
如果根域名中差找不到-》
(3)根域名服务器告诉DNS向顶级域名服务器查找。
(4)顶级域名服务器告诉DNS所要查找的那个服务器ip地址
(5)DNS去查找这个ip地址的服务器,该服务器告诉DNS他就是要找的。然后DNS将结果返回给本地主机。
整个查询用到了8个UDP包