截至今天,计网方面看完了《图解tcp—ip》《计算机网络自顶向下方法》和湖科大的教学视频。为了避免忘记,对一些面试问题做一下整理,既是复习重点也为之后面试的八股文做准备。
自己综合整理的
为什么网络要分层?
网络分层的原则:每一层独立于其它层完成自己的工作,而不需要相互依赖,上下层之间通 过标准结构来互相通信,简单易用又具有拓展性。复杂的系统需要分层,因为每一层都需要专注于一类事情。我们的网络分层的原因也是一 样,每一层只专注于做一类事情。
为什么计算机网络要分层呢?我们再来较为系统的说一说:
各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只 需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)这个和我们对开发时系统进行分层是一个道理。
提高了整体灵活性 :每一层都可以使用最适合的技术来实现,你只需要保证你提供的功能以及暴露的接口的规则没有改变就行了。这个和我们平时开发系统的时候要求的高内聚、低耦合的原则也是可以对应上的。
大问题化小 :分层可以将复杂的网络间题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。这样使得复杂的计算机网络系统变得易于设计,实现和标准化。这 个和我们平时开发的时候,一般会将系统功能分解,然后将复杂的问题分解为容易理解 的更小的问题是相对应的,这些较小的问题具有更好的边界(目标和接口)定义。
TCP-IP 网络模型
4层模型
应用层、运输层、网络层、网络接口层
5层模型 (一般回答)
应用层、运输层、网络层(数据平面、控制平面)、链路层、物理层
7层模型 (古老的理论)
应用层、表示层、会话层、运输层、网络层、链路层、物理层
HTTP 是哪一层的协议?http常见的状态码
HTTP 协议 属于应用层的协议。
HTTP 协议是基于 TCP 协议的,发送 HTTP 请求之前首先要建立 TCP 连接也就是要经历 3 次握手。目前使用的 HTTP 协议大部分都是 1.1。在 1.1 的协议里面,默认是开启了 Keep-Alive 的,也就是持续连接,这样的话建立的连接就可以在多次请求中被复用了。
另外, HTTP协议是无状态的协议,它无法记录客户端用户的状态一般我们都是通过Session 来记录客户端用户的状态。
此处应参考知乎回答
https://www.zhihu.com/question/23202402/answer/515842304
https://www.zhihu.com/question/23202402/answer/527748675
常见的状态码: 200、301、302、403、404、500、503
200:请求被成功处理
301 永久性重定向:比如建设一个网站后,将网站的url变换了,重新申请一个域名,但是希望之前的用户访问之前url仍然可以访问到,就可以做一个重定向新的url下面。比如京东最早域名www.360buy.com名重定向到现在www.jd.com (DNS解析 )
302 临时性重定向:比如用户在未登录时访问个人中心页面,这时可以临时重定向到登录的url。
304 Not Modified:当客户端拥有可能过期的缓存时,会携带缓存的标识 etag、时间等信息询问服务器缓存是否仍可复用,而304是告诉客户端可以复用缓存。
400 请求出错:由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。
401 未授权:(未授权) 请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。
403 没有访问权限:系统中某些页面只有在某些权限下才能访问,当用户去访问了一个本身没有访问权限的url,回报403错误。
404 没有对应资源:一般是自己输入了一个url,这个url并不合法。找不到,Web 服务器找不到您所请求的文件或脚本。请检查URL 以确保路径正确。
405 不允许此方法:不允许此方法,对于请求所标识的资源,不允许使用请求行中所指定的方法。(get/post/put/delete/请求用混淆了,更正即可)请确保为所请求的资源设置了正确的 MIME 类型
406 不可接受:根据此请求中所发送的“接受”标题,此请求所标识的资源只能生成内容特征为“不可接受”的响应实体
407 需要代理身份验证:需要代理身份验证,在可为此请求提供服务之前,您必须验证此代理服务器。请登录到代理服务器,然后重试
412 前提条件失败:在服务器上测试前提条件时,部分请求标题字段中所给定的前提条件估计为FALSE。客户机将前提条件放置在当前资源 metainformation(标题字段数据)中,以防止所请求的方法被误用到其他资源
414 Request-URI 太长:Request-URL太长,服务器拒绝服务此请求。
仅在下列条件下才有可能发生此条件:
- 客户机错误地将 POST 请求转换为具有较长的查询信息的 GET 请求
- 客户机遇到了重定向问题(例如,指向自身的后缀的重定向前缀)
- 服务器正遭受试图利用某些服务器
(将固定长度的缓冲区用于读取或执行 Request-URI)
中的安全性漏洞的客户干扰
500 服务器错误:比如服务器某一个函数代码出错了,有没有捕获异常,这时候会报500错误。
500 服务器的内部错误,Web 服务器不能执行此请求。请稍后重试此请求。
501 未实现:Web 服务器不支持实现此请求所需的功能。请检查URL 中的错误
502 网关出错 :Bad Gateway,当用作网关或代理时,服务器将从试图实现此请求时所访问的upstream 服务器中接收无效的响应
503 服务器停机:系统正在维护或者服务器暂停的时候,回报500错误。
504 Gateway Timeout :代理服务器无法及时的从上游获得响应
HTTP 和 HTTPS 什么区别?
端口 :HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443。
安全性和资源消耗:HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL之上的HTTP协议,SSL运行在TCP之上。所有传输的内 容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。
对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称 加密算法有DES、AES等;
非对称密钥加密,加密和解密使用不同的密钥。通信发送方获得接收方的公开密钥之后,就 可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。可以更安全地将公 开密钥传输给通信发送方;运算速度慢。典型的非对称加密算法有RSA、DSA等
HTTPS 采用的加密方式: HTTPS 采用混合的加密机制。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。
HTTP 2.0
HTTP1.0和HTTP1.1区别
HTTP1.0和HTTP1.1最主要的区别就是:
HTTP1.1默认是持久化连接!
在HTTP1.0默认是短连接
相对于持久化连接还有另外比较重要的改动:HTTP 1.1增加host字段
HTTP 1.1中引入了Chunked transfer-coding,范围请求,实现断点续传(实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输)
HTTP 1.1管线化(pipelining)理论,客户端可以同时发出多个HTTP请求,而不用一个个等待响应之后再请求注意:这个pipelining仅仅是限于理论场景下,大部分桌面浏览器仍然会选择默认关闭HTTP pipelining!所以现在使用HTTP1.1协议的应用,都是有可能会开多个TCP连接的!
HTTP2新改动:
二进制分帧
多路复用
头部压缩
服务器推送
参考知乎回答 https://www.zhihu.com/question/306768582/answer/576026225
http和smtp 区别
- http 拉 smtp 推
- smtp数据按照七比特ascii格式编码,http数据不受限制
- http把每个对象分别封装到自己的http响应报文(图片 文本),smtp则放在一个报文中
具体参考计网自顶向下 78面内容
HTTP报文详解?详细说一下请求报文,以及HTTP和TCP的区别
HTTP有两种报文:请求报文和响应报文
HTTP请求报文主要包括请求行、请求头部以及请求的数据(实体)三部分请求行(HTTP请求报文的第一行)由方法字段、URL字段和HTTP协议版本字段组成。其中,方法字段严格区分大小写,当前HTTP协议中的方法都是大写,方法字段如下介绍如下:POST GET HEAD
请求头部:位于请求行的下面, 是一个个的key-value值
空行(CR+LF):请求报文用空行表示header和请求数据的分隔 请求数据:GET方法没有携带数据, POST方法会携带一个body
HTTP的响应报文包括:状态行,响应头部,相应的数据(响应体)
状态行包括:HTTP版本号,状态码和状态值组成。响应头类似请求头,是一系列key-value值
空白行:同上,响应报文也用空白行来分隔header和数据 响应体:响应的数据
tcp三次握手 四次挥手 及其原因
知乎回答
https://www.zhihu.com/question/24853633/answer/254224088
https://www.zhihu.com/question/24853633/answer/115173386
https://www.zhihu.com/question/24853633/answer/573627478
补充如下
CLOSE-WAIT 状态问题:
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送FIN 连接释放报文。
TIME-WAIT 状态问题:
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一 个新的连接不会出现旧的连接请求报文。
通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。
TCP滑动窗口是干什么的?TCP的可靠性体现在哪里?拥塞控制如何实现的?
复习时应看自顶向下 152页 FSM应详细学习 且前面原理也应复习到,简略答案如下。
滑动窗口:窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接 收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。接收窗口只会对窗口内 最后一个按序到达的字节进行确认。如果发送窗口内的字节已经发送并且收到了确认,那么 就将发送窗口向右滑动一定距离,直到第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就滑动接收窗口。
流量控制如何实现:流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。(实际上会继续发送只有一个字节数据的报文段)
拥塞控制:如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞 程度更高。因此当出现拥塞时,应当控制发送方的速率。TCP主要通过四个算法来进行拥塞控制:慢启动、拥塞避免、快重传、快恢复。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量。
慢启动与拥塞避免:
发送的最初执行慢开始,令拥塞窗口大小为1MSS,发送方只能发送1个报文段;当收到确认后,将拥塞窗口大小加倍(每个轮次的ACK增加 1MSS)。设置一个慢启动门限,当 拥塞窗口的大小大于慢开始门限 时,进入拥塞避免,每个轮次只将拥塞窗口加1(相当于每个轮次的的ACK只能增加 1/cwnd MSS)。如果出现了超时,则令慢启动门限 = 拥塞窗口大小 / 2,然后重新执行慢开始。
快重传与快恢复:
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传, 立即重传下一个报文段。在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此 执行快恢复,令慢开始门限 = 拥塞窗口大小 / 2 ,拥塞窗口大小 = 慢开始门限+3(+3是三个重复确认ack 仔细看自顶向下) ,注意到此时直接进入拥塞避免。
TCP 通过按字节序号,累计确认,超时重传及快速重传确保传输的可靠性
(主要)TCP使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
应用数据被分割成 TCP 认为最适合发送的数据块。
TCP 给发送的每一个包进行编号,接收方对数据包进行排序(无序到达数据也被缓存),只把有序数据传送给应用层。
校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
TCP 的接收端会丢弃重复的数据。
流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。(TCP 利用滑动窗口实现流量控制)
拥塞控制: 当网络拥塞时,减少数据的发送。
ARQ协议:也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
选择重传:TCP 采用选择重传,滑动窗口,捎带确认,MSS (最大报文段大小),以及对接收窗口和发送窗口大小进行约束来确保传输效率。TCP 使用选择重传的方式来处理丢失的报文段,当 ACK 报文到达发送方,如果 ACK 序号在滑动窗口左边界以左则直接丢弃这个报文,如果该序号对应的报文在已发送待确认的序号之间,则确认该序号以前的数据被接收,并已该序号为开始选择报文段进行重传
tcp 服务器如果向客户端发送 1MB 数据,是如何得知 1MB 发送完毕
每个 socket 建立时均会分配输入缓冲区和输出缓冲区,write/send 方法会向输出缓冲区写入数据,写入方式分为阻塞和非阻塞两种,write/send 调用成功返回结果表示的是向输出缓冲区写入成功的字节数,并不代表接收端已接收到的数据。
而阻塞和非阻塞的区别是,如果写入的数据大于输出缓冲区可用大小,阻塞写入方式会阻塞直到全部数据写入成功然后返回总的数据字节数,非阻塞方式则直接按照缓冲区可用大小写入,然后返回写入的字节数
因此,可以通过 write/send 方法调用的返回值确定这 1MB 是否写入成功
read/recv 的阻塞模式则指的是如果输入缓冲区无数据则一直阻塞,有数据则读取返回,如果要读的数据大小大于缓冲区可读数据大小,则只会返回可读的字节数
叫你设计一个聊天应用层协议,需要考虑哪些重要问题
要设计一个应用层协议需要考虑:1)首先是基于哪些网络层,传输层和应用层协议来分工完成整个聊天应用的通信和传输;2)应用程序还需要传输一些信息来控制程序运行过程,因此还需要自行来定义应用层协议
大致设计如下:
1 TCP/Websocket 协议维护长连接
2 UDP 进行消息/文件的传输和接收
3 HTTP/HTTPS 完成用户登录,用户注销等应用功能
4 设计类似于 ICMP(一种错误侦测与回报机制) 的辅助控制协议,在客户端和服务端之间传输协议控制命令,如控制 UDP 传输的可靠性,发送心跳包等等
对于辅助控制协议的设计则需要考虑:1)协议头的设计;2)基于哪种协议来完成,UDP or TCP?
由于控制协议的消息很短,且无需维护长连接,那么排除 TCP,而且我们要设计的是应用层协议,使用 UDP 协议
协议头如下:
Flag:协议标识
Version:协议版本
Command:协议消息类型,即协议控制命令
Sequence:协议消息序号
ID:用户ID
Data:协议数据
CheckData:校验和数据,可以放到 Data 中,感觉没啥必要
TCP和UDP
1
TCP 是面向连接的可靠传输协议,面向字节流,能够确保每一个字节都按序到达接收端,会发生粘包和拆包现象,有拥塞控制,适合对数据传输可靠性较高的场景。
UDP 是无连接,不可靠的,尽最大努力交付,面向报文,不拆分不合并,不会有粘包和拆包现象发生,无拥塞控制,适合可容忍部分数据丢失的实时应用,能够实现 1 对 1,1 对多和多对多的实时交互通信。
UDP 的首部长度只有 8B,相比 TCP 开销很小
2
用户数据报协议 UDP是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
传输控制协议 TCP是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数 据块),每一条 TCP 连接只能是点对点的(一对一)。
TCP应用场景:
效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、 排序等操作,相比之下效率没有UDP高。举几个例子:文件传输、接受邮件、远程登录。
UDP应用场景:
效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ聊天、在线视频、网 络语音电话、广播通信(广播、多播)。
UDP为何快?
- 不需要建立连接
- 对于收到的数据,不用给出确认
- 没有超时重发机制
- 没有流量控制和拥塞控制
mac地址和ip地址 已经有了mac地址为什么还要ip地址 相反呢
MAC地址是烧录在网卡或者接口上的物理地址,具有全球唯一性,一般不能被改变。IP地址是网络中的主机或接口在网络中的逻辑地址,在同一个网络内具有唯一性。(ip地址因为 DHCP NAT协议改变)
知乎万能 https://www.zhihu.com/question/21546408/answer/149670503
先有mac地址后有ip地址
- 高效:mac地址过多,转发表太大,主机不可能一直不变,难以找到对应节点。
- 上下兼容:满足不同网络(以太网 WiFi ppp )之间的通信(互联网不止只有以太网),屏蔽掉各个厂家数据链路层不同的标准,达到异构网络的通信。
ip地址聚合可以快速高效找到对应节点,大大减少路由器计算量和所需储存空间,且屏蔽链路层不同实现异构网络通信。
有了ip为什么还要mac地址?
- DHCP 分配ip时通过mac地址标识主机
- mac地址在匹配转发时更快
三层交换机 & 路由器在收到一个包的时候,需要拆下 IP 头进行解析,根据路由表找到目标地址所对应的出端口(如果入端口上配置了 NAT,还需要进行地址转换)。这一步完成后,数据包会被包上新的 IP 头(更新地址及 TTL 等信息)然后才能发出去。而二层交换机完全不拆 IP 头,基本是收一个包就转发一个包,快的要死。更一般地说,三层交换机和路由器可以看做是子网与子网之间的枢纽,相当于邮局;而二层交换机只能作为单个子网内的中转站(因为它完全不知道 IP 是什么东西)。当子网很大的时候(很大指设备多,此时端口不够用;或者距离长,衰弱太严重),不可避免的需要使用中转站,此时如果用三层的未免小题大做,而且效率不佳。
ip相当于学校的学号 mac相当于身份证号。
当你打开一个电商网站,都需要经历哪些过程?分别用到了什么协议
具体应看 自顶向下326面
浏览器查找域名的IP地址 (DNS:获取域名对应的IP)
浏览器向web服务器发送HTTP请求(cookies会随着请求发送给服务器)
服务器处理请求 (请求 处理请求 参数、cookies、生成一个HTML响应)
服务器返回HTTP报文,发回一个HTML响应。
浏览器解析渲染页面,浏览器开始显示HTML。
连接结束
使用的协议:
DNS: 获取域名对应的IP TCP: 与服务器建立TCP连接
IP: 建立TCP协议时,需要发送数据,发送数据在网络层上使用IP协议
OSPF:IP数据包在路由器之间,路由选择使用OSPF协议
ARP:路由器在与服务器进行通信的过程中,将IP地址装换成MAC地址
HTTP:客户端浏览器与Web服务器之间的应用层通信协议,在TCP建立完成后,使用HTTP协议访问网页
电子邮件的发送过程
自顶向下 75面
一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。
邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP(更复杂 更精细)。
用户A的邮箱是QQ邮箱,他要发往的邮箱是163邮箱,用户A写好一封邮件点击发送, 即提交到了QQ邮箱服务器,使用的是SMTP协议。
QQ邮箱会对A发送邮件的收件地址进行解析,判断是否为内部邮箱的账号,如果也是QQ邮箱,会直接存储到自己的存储空间,如果不是则会发送到指定邮箱服务器,使用 的也是SMTP协议。
163的邮箱服务器收到邮件后会再次判断该邮件是否为自己的邮件,如果是则存到自己的存储空间,等待POP3服务去读取邮件。
用户B收到消息后,打开客户端访问163服务器,调用POP3服务。
Pop3服务接到指令后,读取存储空间中发送给B的未读邮件服务。
将读取到的邮件返回给客户端软件。
DNS解析过程,DNS劫持
自顶向下 83面
DNS完成的工作是:域名到IP地址的解析。将域名和IP地址相互映射的一个分布式数据库。第一步:客户机提出域名解析请求,并将该请求发送给本地域名服务器。
第二步:当本地域名服务器收到请求后,就先查询本地缓存,如果有该纪录项,则本地域名
服务器就直接把查询结果返回。
第三步:如果本地缓存中没该纪录,则本地域名服务器就直接把请求发给根域名服务器,然 后根域名服务器再返回给本地域名服务器一个所查询域(根子域)主域名服务器地址。
第四步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自 己的缓存,如果没该纪录,则返回相关下级域名服务器地址。
第五步:重复第四步,直到找到正确纪录。
第六步:本地域名服务器把返回结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
DNS劫持:在DNS服务器中,将www..com的域名对应的IP地址进行了变化。你解析出来的域名对应的IP,在劫持前后不一样。
HTTP劫持:你DNS解析的域名的IP地址不变。在和网站交互过程中的劫持了你的请求。在网站发给你信息前就给你返回了请求。
DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。
GET和POST有什么不一样
详细看知乎https://www.zhihu.com/question/28586791/answer/767316172
GET和POST是HTTP请求的两种基本方法
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,而POST么有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
SESSION和COOKIE
Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式
Cookie 一般用来保存用户信息,Session 的主要作用就是通过服务端记录用户的状态(此时客户端有一个 session cookie 记录 session ID)
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果要在 Cookie 中存储一些敏感信息,不要直接写入 Cookie 中,最好能将Cookie 信息加密然后使用到的时候再去服务器端解密。
HTTP是不保存状态的协议,如何保存用户状态
HTTP 是一种无状态协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。主要通过session机制来进行解决,Session 的主要作用就是通过服务端记录用户的状态。
在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis 保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下, 通过在 Cookie中附加一个 Session ID 来方式来跟踪。
Cookie 被禁用怎么办 最常用的就是利用 URL 把 Session ID 直接附加在URL路径的后面
Arp协议
Arp协议能通过接收端的ip地址解析到mac地址。
如果发送端和目标端的主机都在同一个网段,发送端发送数据帧前检查是否拥有接收端的 mac地址,如果没有,则启动arp,先检查缓存ip-mac表中是否有接收端的mac地址,如果有 则直接拿来即用,如果没有则在本网段(局域网)广播arp包,本网段各计算机都收到arp请 求,从发送来的数据中检查请求过来的ip地址与自己是否一致,如果不一致,则丢弃,如果 ip一致,则单播返回mac地址给请求的计算机,发送端便获取到了接收端的mac地址,接收 到接收端的mac地址它还会缓存一份,用于下次拿来即用。
如果请求端和目标端的主机不在同一个网段呢?arp广播的数据是被路由阻断的,不能跨到不同的网段进行广播的,因为这样广播会导致广播数据泛滥。如果不在同一个网段,则请求端 拿到的目标端的mac地址其实是它网关的mac地址,将数据帧给到网关(网关路由对数据帧进行重新封装 根据自己的换缓存重写mac地址)再进行下一跳转发, 下一跳同样在自己的网段寻找到目标主机mac地址或再找到下一跳mac地址。
补充个知乎回答 https://www.zhihu.com/answer/223124156
DDos攻击
分布式拒绝服务,一般来说是指攻击者利用一些被控制的设备对目标网站在较短的时间内发 起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。
DNS 反射/放大
DNS 反射攻击是一种常见的攻击媒介,网络犯罪分子通过伪装其目标的 IP 地址,向开放的 DNS 服务器发送大量请求。作为回应,这些 DNS 服务器通过伪造的 IP 地址响应恶意请求,大量的 DNS 答复形成洪流,从而构成预定目标的攻击。很快,通过 DNS 答复产生的大量流量就会造成受害企业的服务不堪重负、无法使用,并造成合法流量无法到达其预定目的地。
SYN 泛洪攻击
人们连接到互联网应用的主要方式之一是通过传输控制协议 (TCP)。这种连接需要从 TCP 服务(如 Web 服务器)进行三方握手,涉及到从用户连接到服务器的位置发送所谓的 SYN(同步)数据包,然后服务器返回一个 SYN-ACK(同步确认)数据包,最终通过最后的 ACK(确认)通信作为应答,以此完成 TCP 握手。
在 SYN 泛洪攻击中,恶意客户端发送大量 SYN 数据包(通常在握手的第一部分),但永远不会发送确认以完成握手。这使得服务器一直等待对于这些半开放的 TCP 连接的响应,而这些连接最终会耗尽容量,造成服务器无法接受跟踪连接状态的新连接。
直接COPY的
简述OSI七层协议
OSI七层协议包括:物理层,数据链路层,网络层,运输层,会话层,表示层, 应用层
简述TCP/IP五层协议
TCP/IP五层协议包括:物理层,数据链路层,网络层,运输层,应用层
物理层有什么作用
主要解决两台物理机之间的通信,通过二进制比特流的传输来实现,二进制数据表现为电流电压上的强弱,到达目的地再转化为二进制机器码。网卡、集线器工作在这一层。
数据链路层有什么作用
在不可靠的物理介质上提供可靠的传输,接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路。提供物理地址寻址功能。交换机工作在这一层。
网络层有什么作用
将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方,通过路由选择算法为分组通过通信子网选择最佳路径。路由器工作在这一层。
传输层有什么作用
传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
会话层有什么作用
建立会话:身份验证,权限鉴定等;
保持会话:对该会话进行维护,在会话维持期间两者可以随时使用这条会话传输局;
断开会话:当应用程序或应用层规定的超时时间到期后,OSI会话层才会释放这条会话。
表示层有什么作用
对数据格式进行编译,对收到或发出的数据根据应用层的特征进行处理,如处理为文字、图片、音频、视频、文档等,还可以对压缩文件进行解压缩、对加密文件进行解密等。
应用层有什么作用
提供应用层协议,如HTTP协议,FTP协议等等,方便应用程序之间进行通信。
TCP与UDP区别
TCP作为面向流的协议,提供可靠的、面向连接的运输服务,并且提供点对点通信
UDP作为面向报文的协议,不提供可靠交付,并且不需要连接,不仅仅对点对点,也支持多播和广播
为何TCP可靠
TCP有三次握手建立连接,四次挥手关闭连接的机制。
除此之外还有滑动窗口和拥塞控制算法。最最关键的是还保留超时重传的机制。
对于每份报文也存在校验,保证每份报文可靠性。
为何UDP不可靠
UDP面向数据报无连接的,数据报发出去,就不保留数据备份了。
仅仅在IP数据报头部加入校验和复用。
UDP没有服务器和客户端的概念。
UDP报文过长的话是交给IP切成小段,如果某段报废报文就废了。
简述TCP粘包现象
TCP是面向流协议,发送的单位是字节流,因此会将多个小尺寸数据被封装在一个tcp报文中发出去的可能性。
可以简单的理解成客户端调用了两次send,服务器端一个recv就把信息都读出来了。
TCP粘包现象处理方法
固定发送信息长度,或在两个信息之间加入分隔符。
简述TCP协议的滑动窗口
滑动窗口是传输层进行流量控制的一种措施,接收方通过通告发
送方自己的窗口大小,从而控制发送方的发送速度,防止发送方发送速度过快而导致自己被淹没。
简述TCP协议的拥塞控制
拥塞是指一个或者多个交换点的数据报超载,TCP又会有重传机制,导致过载。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量.
当cwnd < ssthresh 时,使用慢开始算法。
当cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当cwnd = ssthresh 时,即可使用慢开始算法,也可使用拥塞避免算法。
慢开始:由小到大逐渐增加拥塞窗口的大小,每接一次报文,cwnd指数增加。
拥塞避免:cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1。
快恢复之前的策略:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,继续执行慢开始,之后进行拥塞避免。
快恢复:发送方判断网络出现拥塞,就把ssthresh设置为出现拥塞时发送方窗口值的一半,并把cwnd设置为ssthresh的一半,之后进行拥塞避免。
简述快重传
如果在超时重传定时器溢出之前,接收到连续的三个重复冗余ACK,发送端便知晓哪个报文段在传输过程中丢失了,于是重发该报文段,不需要等待超时重传定时器溢出再发送该报文。
TCP三次握手过程
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值序列号seq=x,并将该数据包发送给服务端,客户端
进入syn_sent状态,等待服务端确认。 - 第二次握手:服务端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和
ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入syn_rcvd状态。 - 第三次握手:客户端收到确认后检查,如果正确则将标志位ACK为1,ack=y+1,并将该数据包发送给服务端,服务端进行检查如果正确则连接建立成功,客户端和服务端进入established状态,完成三次握手,随后客户端和服务端之间可以开始传输
数据了
为什么TCP握手需要三次,两次行不行?
不行。TCP进行可靠传输的关键就在于维护一个序列号,三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值。
如果只是两次握手, 至多只有客户端的起始序列号能被确认, 服务器端的序列号则得不到确认。
简述半连接队列
TCP握手中,当服务器处于SYN_RCVD 状态,服务器会把此种状态下请求连接放在一个队列里,该队列称为半连接队列。
简述SYN攻击
SYN攻击即利用TCP协议缺陷,通过发送大量的半连接请求,占用半连接队列,耗费CPU和内存资源。
优化方式:
- 缩短SYN Timeout时间
- 记录IP,若连续受到某个IP的重复SYN报文,从这个IP地址来的包会被一概丢弃。
TCP四次挥手过程
- 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入fin_wait_1状态。
- 第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
- 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。
- 第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。
为什么TCP挥手需要4次
主要原因是当服务端收到客户端的 FIN 数据包后,服务端可能还有数据没发完,不会立即close。
所以服务端会先将 ACK 发过去告诉客户端我收到你的断开请求了,但请再给我一点时间,这段时间用来发送剩下的数据报文,发完之后再将 FIN 包发给客户端表示现在可以断了。之后客户端需要收到 FIN 包后发送 ACK 确认断开信息给服务端。
为什么四次挥手释放连接时需要等待2MSL
MSL即报文最大生存时间。设置2MSL可以保证上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。
简述DNS协议
DNS协议是基于UDP的应用层协议,它的功能是根据用户输入的域名,解析出该域名对应的IP地址,从而给客户端进行访问。
简述DNS解析过程
1、客户机发出查询请求,在本地计算机缓存查找,若没有找到,就会将请求发送给dns服务器
2、本地dns服务器会在自己的区域里面查找,找到即根据此记录进行解析,若没有找到,就会在本地的缓存里面查找
3、本地服务器没有找到客户机查询的信息,就会将此请求发送到根域名dns服务器
4、根域名服务器解析客户机请求的根域部分,它把包含的下一级的dns服务器的地址返回到客户机的dns服务器地址
5、客户机的dns服务器根据返回的信息接着访问下一级的dns服务器
6、这样递归的方法一级一级接近查询的目标,最后在有目标域名的服务器上面得到相应的IP信息
7、客户机的本地的dns服务器会将查询结果返回给我们的客户机
8、客户机根据得到的ip信息访问目标主机,完成解析过程
简述HTTP协议
http协议是超文本传输协议。它是基于TCP协议的应用层传输协议,即客户端和服务端进行数据传输的一种规则。该协议本身HTTP 是一种无状态的协议。
简述cookie
HTTP 协议本身是无状态的,为了使其能处理更加复杂的逻辑,HTTP/1.1 引入 Cookie 来保存状态信息。
Cookie是由服务端产生的,再发送给客户端保存,当客户端再次访问的时候,服务器可根据cookie辨识客户端是哪个,以此可以做个性化推送,免账号密码登录等等。
简述session
session用于标记特定客户端信息,存在在服务器的一个文件里。
一般客户端带Cookie对服务器进行访问,可通过cookie中的session id从整个session中查询到服务器记录的关于客户端的信息。
简述http状态码和对应的信息
1XX:接收的信息正在处理
2XX:请求正常处理完毕
3XX:重定向
4XX:客户端错误
5XX:服务端错误
常见错误码:
301:永久重定向
302:临时重定向
304:资源没修改,用之前缓存就行
400:客户端请求的报文有错误
403:表示服务器禁止访问资源
404:表示请求的资源在服务器上不存在或未找到
转发和重定向的区别
转发是服务器行为。服务器直接向目标地址访问URL,将相应内容读取之后发给浏览器,用户浏览器地址栏URL不变,转发页面和转发到的页面可以共享request里面的数据。
重定向是利用服务器返回的状态码来实现的,如果服务器返回301或者302,浏览器收到新的消息后自动跳转到新的网址重新请求资源。用户的地址栏url会发生改变,而且不能共享数据。
简述http1.0
规定了请求头和请求尾,响应头和响应尾(get post)
每一个请求都是一个单独的连接,做不到连接的复用
简述http1.1的改进
HTTP1.1默认开启长连接,在一个TCP连接上可以传送多个HTTP请求和响应。使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
服务端无法主动push
简述HTTP短连接与长连接区别
HTTP中的长连接短连接指HTTP底层TCP的连接。
短连接: 客户端与服务器进行一次HTTP连接操作,就进行一次TCP连接,连接结束TCP关闭连接。
长连接:如果HTTP头部带有参数keep-alive,即开启长连接网页完成打开后,底层用于传输数据的TCP连接不会直接关闭,会根据服务器设置的保持时间保持连接,保持时间过后连接关闭。
简述http2.0的改进
提出多路复用。多路复用前,文件时串行传输的,请求a文件,b文件只能等待,并且连接数过多。引入多路复用,a文件b文件可以同时传输。
引入了二进制数据帧。其中帧对数据进行顺序标识,有了序列id,服务器就可以进行并行传输数据。
http与https的区别
http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份。
https具有安全性的ssl加密传输协议,加密采用对称加密,
https协议需要到ca申请证书,一般免费证书很少,需要交费。
简述TLS/SSL, HTTP, HTTPS的关系
SSL全称为Secure Sockets Layer即安全套接层,其继任为TLSTransport Layer Security传输层安全协议,均用于在传输层为数据通讯提供安全支持。
可以将HTTPS协议简单理解为HTTP协议+TLS/SSL
https的连接过程
- 浏览器将支持的加密算法信息发给服务器
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发给浏览器
- 客户端(SSL/TLS)解析证书验证证书合法性,生成对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,用服务器的公钥对客户端密钥进行非对称加密。
- 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端对称密钥发送给服务器
- 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
- 服务器将加密后的密文发送给客户端
- 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成
Get与Post区别
Get:指定资源请求数据,刷新无害,Get请求的数据会附加到URL中,传输数据的大小受到url的限制。
Post:向指定资源提交要被处理的数据。刷新会使数据会被重复提交。post在发送数据前会先将请求头发送给服务器进行确认,然后才真正发送数据。
Get方法参数有大小限制吗
一般HTTP协议里并不限制参数大小限制。但一般由于get请求是直接附加到地址栏里面的,由于浏览器地址栏有长度限制,因此使GET请求在浏览器实现层面上看会有长度限制。
了解REST API吗
REST API全称为表述性状态转移(Representational State Transfer,REST)即利用HTTP中get、post、put、delete以及其他的HTTP方法构成REST中数据资源的增删改查操作:
- Create : POST
- Read : GET
- Update : PUT/PATCH
- Delete: DELETE
浏览器中输入一个网址后,具体发生了什么
- 进行DNS解析操作,根据DNS解析的结果查到服务器IP地址
- 通过ip寻址和arp,找到服务器,并利用三次握手建立TCP连接
- 浏览器生成HTTP报文,发送HTTP请求,等待服务器响应
- 服务器处理请求,并返回给浏览器
- 根据HTTP是否开启长连接,进行TCP的挥手过程
- 浏览器根据收到的静态资源进行页面渲染