HTTP
请求报文
<method> <request-URL> <version>
<headers>
<entity-body>
响应报文
<状态码> <状态码解释> <version>
<headers>
<entity-body>
1. http 0.9,http 1.0,http 1.1,http 2.0有什么区别?
- http 0.9 只包含请求行,且方法只有 GET
- http 1.0 加入了POST, HEAD,加入了请求头,状态码,这个版本我们现在还在使用,但是每次进行http操作结束后,都会释放http连接,因此又需要再一次三次握手,而不能维持一个连接,因此在http1.0中加入了一个非标准的关键字 “connection”。
- http1.1
a. 将关键字connection标准化了,默认持久连接。
b. 因为持久连接的存在,因此如果不做应对,容易造成TCP粘包问题,因此在请求头中加了一个content-length字段。
c.使用Content-Length字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度,对于一些很耗时的动态操作来说,这意味着,服务器要等到所有操作完成,才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。因此,1.1版规定可以不使用Content-Length字段,而使用"分块传输编码"(chunked transfer encoding)。只要请求或回应的头信息有Transfer-Encoding字段,就表明回应将由数量未定的数据块组成。
d.支持管道机制,客户端不需要等待上一次请求完成才能发送以一个请求了,如需要资源a与b,可以把a请求发送出去后马上发送b请求。不过这种情况下,服务器端任然是先同步的先处理完a请求然后再处理b请求。因此这里也可以看出connection的弊端,那就是如果a请求服务端处理得很慢,那么会导致b请求一直得不到响应,一直处于阻塞的状态,这被称为队头阻塞。
e.http1.1还增加了很多其他的方法如 PUT,DELETE,OPTIONS - http2.0
a.http2.0是纯二进制的协议。(以往需要我们制定content-Type)
b.多工,http2.0解决了上述的队头阻塞问题,服务端可以不一一回复,可以以任意的先后顺序回复
c.头信息压缩
2. 状态码
- 200 OK 客户端请求成功
- 301 Moved Permanently 请求永久重定向
- 302 Moved Temporarily 请求临时重定向
- 304 Not Modified 文件未修改,可以直接使用缓存的文件。
- 400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
- 404 Not Found 请求的资源不存在,例如,输入了错误的URL
- 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
- 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
3.HTTPS基本过程
- 客户端发送一个 ClientHello 消息到 服务端,这个消息包含以下内容
1: 客户端支持的加密方法 压缩算法
2:客户端生成的随机数(Client random)
3:Transport Layer Security (TLS) 版本 - 服务器端发送一个 ServerHello 消息给客户端,这个消息包含以下内容
1:Transport Layer Security (TLS) 版本
2: 客户端支持的加密方法 压缩算法
3: 数字证书认证机构(Certificate Authority,缩写 CA)签发的服务器公开证书,证书中包含了 公钥 - 客户端验证CA证书是否可信,如果可信则依照之前的2个随机数 再一次 生成一个 随机数,然后使用公钥加密发送给服务端
服务器使用自己的私钥解密随机数,
客户端与服务端分别使用约定的加密方法,使用前面的3个随机数,生成 “对称密钥” ,这个对称密钥负责接下来的数据的对称加密
4.Http和Https的区别
Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:
- 端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
- 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
- 开销:Https通信需要证书,而证书一般需要向认证机构购买;
Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
5.session cookie的联系与区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个
- cookie分为2类,
1类是未设置max-age的内存型cookie,保存在内存中随着浏览器的关闭而关闭
2类是设置了max-age的,保存在硬盘中,当到达时间限定后被清除
6.Get与POST的区别
- 功能角度,Get是获取信息,Post用于提交信息。
- 报文角度,Get数据部分在请求行的URL中,而Post数据部分在body中。因此Get是对用户可见的,很不安全。而且对于Get的请求parameter,采用的是?分割,=赋值,如果参数是数字或者英文,那么原样发送,如果是中文则会被编码。
- Restful角度,Get是幂等的,Post不是。
- 内容大小角度,Get的大小却决于浏览器对URL长度的限制,而Post对数据大小无限制。
OSI七层模型
1. 应用层
为应用程序提供网络服务接口
协议 http,ftp,telnet,https,dns(基于udp)
2. 表示层
决定数据的压缩,编码等表示形式
3. 会话层
开启,管理,关闭一次会话
4. 传输层
定义数据传输协议的端口号,提供稳定的连接。
协议 tcp, udp
5. 网络层
提供了端对端的传输,根据ip地址提供路由交换的功能,定义了路由选择与学习的方式
6. 数据链路层
定义了在单个链路上进行数据传输的方式,提供根据mac地址寻址,差错校验的方式
7. 物理层
建立,维护,断开物理连接
三次握手
- 客户端发送握手请求(syn + seq)
- 服务端回复请求,并也发出握手请求(syn + seq + ack + ACK)
- 客户端回复请求 (ACK, ack),开始建立连接
问题
1. 为什么不是2次或者4次?
为了防止 已失效的链接请求报文突然又传送到了服务端,因而产生错误。
假设是2次,我们以上述的3次请求为例,如果此时网络存在延时的现象,那么请求1将在网络中被阻塞一段时间,由于迟迟得不到ack,因此客户端会重新发送syn请求握手,然后建立连接。这时,之前在网络中逗留的请求1又到达了服务端,那么服务端就会打开2个连接!如果这种情况频繁发生,那么服务端资源将会被耗尽!
既然3次能解决,那当然就没必要四次了,多此一举尔
四次挥手
- 客户端发送f断开连接请求(fin seq)。
- 服务端回复客户端(ack ACK seq )
- 服务端发送断开连接请求(fin seq)
- 客户端发送回复(ack ACK)
- 进入TIME_WIAT
问题
1. 为什么是四次?
第二次为服务器返回给客户端一个ACK,此时客户端已经处于半关闭状态,也就是只能收数据,不能发数据。这时服务器还不能直接关闭Fin,因为可能还有的请求没有发送完,因此必须把剩余的数据发送完给客户端。
2.TIME_WAIT
在收到服务器端发来的挥手请求之后,还是不能直接关闭客户端的tcp。而是需要等待2msl(2倍报文最大生存时间,超过这个时间的报文将会被抛弃)。原因:
- 最后客户端发送给服务器端的ack可能会丢失,那么服务器端会再次请求发送FIN,此时客户端需要再发ack,为了应对这种情况,客户端的请求不能马上关闭。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文 。如果关闭这个tcp连接之后,马上有产生了一个和这个一样的tcp连接,那么将会发生不可预见的错误
3.TCP如何保证可靠性
不可靠主要有四个方面 1 报文丢失 2 报文失序 3 报文错误 4 报文重复
- 超时重发:tcp在发送端维护了一个计时器,发送数据出去之后开始计时,接收端应该在这个时间段之内回复ack,如果发送端未收到ack则超时重发
- 校验和:在头部维护一个字段用于数据校验,接收端如果数据错误则直接丢弃,等待数据超时重传
- 序列号:seq字段,避免乱序
- 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。
- 拥塞控制
a.慢启动(指数增加窗口大小)
b.拥塞避免(线性增加窗口大小,到达门限值开始进入此模式)
c.快重传(对于之前我们采用的是超时重传机制,这种机制的弊端在于,如果缺失了一个报文,那么无法立即对其后续的报文发送确认,那么会导致后续的报文也会被超时重传(因此滑动窗口如果后续的ack到达,则表示之前的报文全部正常接收),因此如果缺失了某个报文,接收端会一直发送这个缺失报文前一个报文的ack,当连续收到三次相同的ack,表示这之后的报文丢失,快速重传此报文
d.快恢复(很多时候,发生报文丢失并不是因为网络发生了拥塞,比如快重传,因此从ssh/2门限值开始,直接进入拥塞避免)
4.TCP与UDP的区别
- tcp是面向字节的,udp是面向报文的
- tcp面向连接,udp面向无连接
- tcp提供稳定的传输,udp只尽力交付
- tcp保卫首部消耗大,而udp首部内容很少。
- tcp只支持点对点的通信,udp提供点到点,点到多,多到点,多到多的通信。
5.滑动窗口相关
作用:
- 提供可靠的,高效的数据传输
- 实现了流量控制
原理:
在发送端与接收端都维护了一个缓冲区,这个缓冲区内的数据将全部发送给接收方,当收到ack之后,滑动这个缓冲区。因此高效在于可以异步的发送多个报文了,流量控制也是使用这个缓冲区来实现的,ack中携带了还能接收端缓冲区的大小,用于协调发送端-接收端的数据发送
从输入网址到获得页面的过程
(1). 浏览器查询 DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
(2). 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
(3). TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
(4). 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
(5). 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
(6). 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
常见的几种web安全攻击
- XSS(跨站脚本攻击)
将A网站的cookie发送给B网站,在向网站提交的内容中写入script脚本,严重的可以获取到document.cookie,之后重定向到另一个网站,从而达到窃取其他用户的cookie的目的。
解决措施:
1 对关键词如<script>进行转义,这样可以避免浏览器将其解析为html格式
2 将cookie设置为http-only,那么将不允许从js中获取到cookie - CSRF(跨域请求伪造)
利用A网站的cookie,从B网站攻击A网站。举例如果我们登录了银行的网站(那么此网站cookie将会保存一段时间),之后我们进入B网站,B网站中有这样一个链接诱导人们点击如 www.bank/do/addMoney,
那么如果点击了这个链接钱就会被转走!
解决措施:
1 判断cookie的来源,只允许在相同域名下进行调用
2 浏览器在发送请求时会自动加上cookie,因此我们在关键的请求时不使用cookie就可以了,可以使用jwt(json web token)存在localstroge - SQL注入
向数据库提交具有隐患的sql语句
解决措施
1 使用编译后的sql语句如 preparestatement,mybatis则使用#{} - DDOS(分布式拒绝服务)
分布式拒绝服务,也就是发送大量请求导致服务器瘫痪。
措施:加大硬件投入,加带宽
网络层
1. 试述ospf协议的思想及其功能的实现过程
OSPF是链路状态的内部网关协议,ospf的思想及功能主要通过各种报文之间的相互协作来实现。ospf协议实现过程:同区域中两个相邻的路由器使用Hello报文,以发现,建立并维护邻居关系;然后双方交换数据库描述,最终达成链路状态数据库数据的一致性。当链路状态发生变化时,以洪泛的方式传输链路状态更新报文,收到链路状态更新报文的路由器将会回传一个链路状态报文进行确认
2. ABCD类地址
A类地址是指 前8位为网络地址,后24为为主机地址且第一位固定为0的IP地址
B类地址是指 前16位为网络地址,后16为为主机地址且前2为固定为10的IP地址
C类地址是指 前24位为网络地址,后8为为主机地址且前3位固定为110的IP地址
D类地址是指24位全部为网络地址,且前4位为1110的IP地址,D类地址一般只在广播时使用
3. 试述BGP协议的基本原理以及实现过程
BGP是一种外部网关协议,用于在不同AS之间选择转发路径。他是居于tcp的,当一个AS的BGP发言人希望与另一个AS的发言人建立联系的时候,他们需要先三次握手建立tcp连接,然后发送OPEN报文,对方则回一个KEEPALIVE用于确认,这个过程称为BGP发言人的邻居关系协商,协商成功后,BGP通过UPDATE报文交换路由信息(也可以是路由关系变化时就交换)。如果上述发生错误则发生NOTICATION报文向对方报告
4. 什么是路由体系结构?
路由体系结构涉及如何对Internet中的路由器进行划分,管理控制,以便有效的交换路由信息,完成数据报投递。路由体系结构决定了互联网的运行效率。
(1) Internet的拓扑结构是网状的,从逻辑上将他们分为三个层次,核心层由一个主干网和多个网络接入点组成,NAP作为核心路由器,将不同的Internet主干网连起来,也将下层网络服务提供商NSP的流量交换到Internet主干网上,NSP以及底层的ISP都拥有自己的网络,然后接入互联网。
(2)根据Internet的层次模型,自治系统路由体系结构将每个主干网络划分为若干自治系统,其目的是对路由信息的传播进行限制,将巨大复杂的Internet路由管理问题分解到不同的自治系统中。每个自治系统内部可以自行选择内部网关,进行路由发现与传播,共同维护内部路由消息的一致性,此外,内部路由信息包含了到本自治系统内所有目的站的路由,每个自治系统通过选取一个或多个处于自治系统边界的路由器作为代表,向其他路由器通告路由信息,自治系统间交换的路由信息是粗粒度的可达信息。