1、OSI的七层模型?
应用层:通过进程间的网络交互,完成特定的网络应用。信息分组为报文;在上面的协议:HTTP\HTTPS\DNS等
表示层:对数据格式化、编码、解码等;
会话层:管理会话;
传输层:提供统一的数据传输服务,应用层通过传输层的服务进行数据的传输。将报文分组为报文段;TCP/UDP
网络层:选择合适的网间路由或交换节点,确保数据及时送达。将报文段分组成为数据报。IP
链路层:从一个节点传输到下一个节点;将数据报分组为帧;
物理层:进行字节流传输;
2、TCP/IP协议有了解吗?
四层:
应用层
传输层
网络层
链路层
我们通常的应用程序都工作在应用层,当各个应用之间通信时,传输层的TCP模块负责给HTTP数据添加TCP头部等信息;网络层的IP模块负责给HTTP数据添加IP头部等信息;链路层添加以太网首部等信息,并且通过电信号来传输数据包;然后数据包会依次经过对方的链路层,网络层,传输层以及应用层,实现数据的通信。
知识点:
IP协议:
IP协议制定了一套网络地址,也就是IP地址,根据IP协议能够区分两台主机是否同属一个网络(子网)。
ARP协议(地址解析协议):
根据IP地址获取MAC地址,将目标的IP地址在链路层进行包装,生成以太网数据包,在同一个子网内进行广播出去,各个主机拿到IP地址和自己的IP地址对比,若一样,则返回自己的MAC地址。注意,MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间。
路由协议:
ARP的寻址必须是在同一个子网内,我们可以通过IP协议来确定是否是同一个子网。如果不是同一个子网,则通过网关将数据包多次转发到对应的子网中,完成这个路由协议的物理设备就是路由器。
3、可以详细说一下三次握手以及四次挥手吗?(重点掌握)
简单理解由于TCP是双工通信,因此会建立从发送端到接收端 与 接收端到发送端的连接,通过SYN申请建立连接,被申请方如果同意建立连接,则会返回一个ACK,接收端会将SYN和ACK一起返回,如此一来就构成了三次握手建连。
ACK:
滑动窗口:目的TCP能够流量控制,通过滑动窗口控制传输速率。滑动窗口的本质是动态缓冲区,接收端根据自己的能力,通过ACK发送给发送端,发送端根据窗口大小来控制发送速率;
传输基于字节流:TCP的传输是基于字节流的,按照字节进行编号,然后通过ACK来确认收到的数据编号,这样能够保证数据的有序性和完整性;
ACK延迟机制:Serve端收到SYN并不会立即返回ACK,会延迟一段时间(最小值40ms),希望和应答数据一起返回。设置TCP_QUICKACK可以取消
4、 TCP和UDP协议的区别?(重点掌握)
答:TCP和UDP协议都是传输层常见的协议,TCP面向连接,可靠的网络传输,UDP无连接的最大可能的进行网络传输。它们的主要区别如下所示:
- TCP协议进行数据通信之前需要三次握手建立连接,UDP协议不需要建立连接即可发送数据。
- TCP有ACK,丢包可以重发,保证数据的正确性;UDP不保证正确性,只是单纯的负责发送数据包。
- TCP协议可能会对大数据包进行拆分,并且在接收方进行重组数据包操作;UDP协议是面向报文的,不会进行分片和重组,所以需要注意传输的报文大小。
- 网络包中的TCP头部为20个字节;UDP头部只有8个字节。
UDP协议的应用:
UDP协议由于传输不需要建立连接,资源消耗较小。常用在视频或者语音传输中,域名解析服务DNS都使用了UDP协议。
前面我们提到了TCP头部以及UDP头部所占大小,那么接下来让我们看看一个完整的网络数据包都包括哪些模块吧~
5、TCP粘包
TCP粘包是指一种发送方发送的数据包在接收方的缓冲区中粘成了一包,也就是出现了数据包首尾相接的现象。产生原因主要是发送方使用了Nagle算法,或者接收方的处理速度小于数据包的接收速度,导致接收缓冲区中消息堆积。可以通过关闭Nagle算法或者规定每个数据包的具体格式和长度,在接收方的应用层来进行判断;还有UDP是不会产生粘包现象的,因为数据包之间具有明确的消息保护边界。
6、一个网络数据包包括哪些有了解吗?
网络数据包一般包括头部和数据部分,在TCP协议中,要发送的数据经过TCP模块添加TCP头部;然后IP模块添加IP头部和MAC头部;然后在最前面加上报头/起始帧分界符以及末尾假如FCS(帧校验序列),这样就构成了一个完成的数据包。
在UDP协议中就是UDP头部,各个头部都有其固定的格式,TCP头部最小20个字节,UDP头部最小8个字节。
6、TCP协议中的数据包分片与重组功能有了解吗?
当TCP传输的数据包比较大时,在发送方会进行分片,在接收方进行数据包的重组。
发送方:
将数据包分为多个TCP头部+数据包的组合,TCP头部中存着不同的数据序号;之后将多个组合交由IP模块,统一添加IP头部和MAC头部,IP头部的ID号设为统一的。
接收方:
IP模块具有分片重组的功能,如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。
分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂时存在内部的内存空间中,然后等待IP头部中具有相同ID的包全部到达,因为同一个包的所有分片都具有相同的ID。此外,IP头部还有一个分片偏移量的字段,它表示当前分片在整个包中所处的位置。根据这些信息,在所有的分片全部收到之后,就可以将它们还原成原始的包。
解析:
数据包的分片和重组里边还涉及到了MTU和MSS的概念,介绍如下:
- MTU: Maxitum Transmission Unit 最大传输单元
- MSS: Maxitum Segment Size 最大分段大小,MSS就是TCP数据包每次能够传输的最大数据分段。
7、TCP协议的拥塞避免算法有哪些?
当网络中的资源供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而下降。也就是说对资源的需求超过了可用的资源,因为传输数据是需要资源的。
拥塞控制:防止过多的数据注入到网络中,使得网络中的路由器或链路不致过载。
拥塞避免算法主要有如下两种:
- 慢启动+拥塞避免
- 快重传+快恢复
1、HTTP和HTTPS的区别有哪些?(掌握)
HTTP和HTTPS的主要区别可以总结如下:
- HTTP是超文本传输协议,数据明文传输;HTTPS在HTTP的基础上加入了SSL协议,实现数据的加密传输;
- HTTPS需要区申请证书,一般是收费的;
- HTTP默认使用80端口,HTTPS默认使用443端口
解析:
这是一网络协议的基础题目,请大家务必掌握。在这里我们一起更加详细的进行学习吧。既然HTTPS = HTTP + SSL,那么我们先来看何为HTTP协议吧。
HTTP协议:
HTTP是超文本传输协议,是一种无状态的协议,是常见的一种应用层协议。HTTP是一个通信规则,规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。
HTTP请求信息:HTTP请求头中可以看到当前请求支持的语言,压缩格式,编码格式以及何种类型的返回文件,Connection以及Cookie,Content-Type等信息。
HTTP返回信息:HTTP返回信息中包括响应协议,HTTP Code以及Content-Type,时间和Cookie等信息。
(HTTP请求和返回的具体信息,大家可以任意打开一个网址,F12查看每一个具体的HTTP请求的请求和返回信息)
面试官:“HTTP请求中的Get和Post方法有哪些区别?”
- Get一般用来从服务器上查询获取资源;Post一般用来更新服务器上的资源;
- Get方法将参数直接拼接在了URL后边,明文显示,可以通过浏览器地址栏直接访问;
- Post请求用于提交表单,数据不是明文的,安全性更高;
- Get请求有长度限制,Post请求没有
面试官:“常见的HTTP Code有哪些?”
- 1xx(临时响应)
- 2xx(成功)
- 3xx(重定向):表示要完成请求需要进一步操作
- 4xx(错误):表示请求可能出错,妨碍了服务器的处理
- 5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误
接着,我们可以给出具体的状态码。
常见HTTP协议的状态码:
- 200(成功)
- 302 (重定向):请求重定向到指定网页
- 304(未修改):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
- 401(未授权):请求要求身份验证
- 403(禁止):服务器拒绝请求(比如死循环了,一直访问)
- 404(未找到):服务器找不到请求的网页
- 405 (方法禁用):Post请求当成了Get请求直接访问
- 500 (服务器内部错误):有bug导致程序嗝屁了
- 502 (错误网关):服务器从上游接到了无效响应
- 504 ( 网关超时):nginx请求超时,请求一直没有返回
这里简单阐述304的含义,304表示上次请求结束到现在,目标网页内容未改变,客户端可以直接显示上次的内容。通过客户端和服务端之间的一个Last-Modified来判断。如下所示:
面试官:“cookie和session有了解吗?“
HTTP协议是一种无状态的协议,我们可以使用cookie和session来保持会话状态。用户发起请求,服务端收到请求处理后可以生成一个sessionId,并且将sessionId存入cookie中返回给客户端,将session的内容存储在服务器上。在下一次的请求中,客户端带着cookie来请求服务器,服务端从cookie中取出sessionId,实现了用户会话状态的保持。
这样做有一个缺点就是将一些东西存在了服务器上,在用户量较大的情况下,服务器容量会不足。实际情况中,经常是将所需要的会话状态,比如说登录态直接存入cookie并且返回给客户端,下次请求时,服务端直接取出cookie中的信息和参数信息进行比较,保持HTTP会话状态。
总结:session保存在服务端。cookie保存在客户端,并且cookie有大小限制。
基本了解了HTTP协议之后,我们再来简单看下何为SSL协议吧~
SSL协议:
HTTPS协议在HTTP的基础上加入了SSL(安全套接字层)协议,SSL逐渐演变为了TLS协议,但是业界习惯仍然称其为SSL协议。
SSL协议在传输控制层的基础上建立了安全的连接,它作为一种通用可靠的安全解决方案,可与多种应用层协议结合使用,实现应用数据的安全传输。SSL协议分为记录协议,握手协议,警告协议和密码规范改变协议:
记录协议:接收上层协议或下层协议的消息并进行一系列的处理,然后再将处理后的消息继续向下或向上传递。主要包括对消息进行加解密,压缩解压缩,分段或者重组等操作。
握手协议:建立在三次握手之后,为通信双方确立安全连接所需要的安全参数,通常也会在此阶段对通信双方身份的真实性进行验证。
警告协议:无论是在握手阶段还是在对应用层数据的传输阶段,都有可能出现差错。警告协议规定了在SSL协议工作过程中可能出现的差错、错误的严重等级以及相应的处理方式。
密码规范改变协议:在SSL握手刚开始的时候,加密参数还没确定,消息都是明文传送的。双方协商好加密参数之后,在发送握手结束消息之前,需要发送一个密码规范改变消息(Change Cipher Message)来通知对方随后的消息都使用刚刚协商好的加密算法和加密密钥进行加密。
2、HTTP1.0,HTTP1.1以及HTTP2.0协议的区别:
答:主要区别和特点可以概括如下:
- HTTP1.0:
HTTP1.0是一种无状态,无连接的协议。浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。也就是默认使用Connection: close
- HTTP1.1:
HTTP/1.1中默认使用Connection: keep-alive,避免了连接建立和释放的开销。但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。
- HTTP2.0:
HTTP2.0协议新增了二进制分帧,多路复用,头部压缩和服务器推送等功能,进一步提高了传输效率。
接下来,我们再来介绍路由汇聚和子网掩码相关的知识点吧,这块知识点常见于笔试题目中,要求我们计算出正确的答案。
3、路由汇聚:
答:路由汇聚是指把一组路由汇聚为一个单个的路由广播。路由汇聚优点是可以缩小网络上的路由表的尺寸。
算法实现:
- 将各子网地址的网段以二进制写出。
- 比较,从第1位比特开始进行比较,将从开始不相同的比特到末尾位填充为0。由此得到的地址为汇总后的网段的网络地址,其网络位为连续的相同的比特的位数。
举例:
假设下面有4个网络:
1 2 3 4 |
|
这四个进行路由汇聚,那么能覆盖这四个网络的汇总地址是:172.18.128.0/21
具体计算方式如下:
- 129的二进制代码是10000001
- 130的二进制代码是10000010
- 132的二进制代码是10000100
- 133的二进制代码是10000101
这四个数的前五位相同都是10000,所以加上前面的172.18这两部分相同的位数,网络号就是8+8+5=21。而10000000的十进制数是128,所以,路由汇聚的IP地址就是172.18.128.0。所以最终答案就是172.18.128.0/21
4、子网掩码的求法:
答:笔试中关于子网掩码的求法一般考察下边的两种。
根据划分的子网数:
算法实现:在求子网掩码之前必须先搞清楚要划分的子网数目,以及每个子网内的所需主机数目。
- 将子网数目转化为二进制来表示
- 取得该二进制的位数,为 N
- 取得该IP地址的类子网掩码,将其主机地址部分的前N位置1 即得出该IP地址划分子网的子网掩码。
举例:
如欲将B类IP地址168.195.0.0划分成27个子网,则其子网掩码为255.255.248.0
- 27=11011
- 该二进制为五位数,N = 5
- 将B类地址的子网掩码255.255.0.0的主机地址前5位置1(B类地址的主机位包括后两个字节,所以这里要把第三个字节的前5位置1),得到 255.255.248.0
根据每个子网中的主机数:
算法实现:利用主机数来计算。
- 将主机数目转化为二进制来表示
- 如果主机数小于或等于254(注意去掉保留的两个IP地址),则取得该主机的二进制位数,为 N,这里肯定N<8。如果大于254,则 N>8,这就是说主机地址将占据不止8位。
- 使用255.255.255.255来将该类IP地址的主机地址位数全部置1,然后从后向前的将N位全部置为 0,即为子网掩码值。
举例:
如欲将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台,则其子网掩码为:255.255.252.0
- 700=1010111100
- 该二进制为十位数,N = 10
- 将该B类地址的子网掩码255.255.0.0的主机地址全部置1,得到255.255.255.255
- 然后再从后向前将后10位置0,即为: 11111111.11111111.11111100.00000000
- 即255.255.252.0。