我的世界做壁纸网站打不开,做网站都需要哪些软硬件,运营和广告投放的区别,网络推广优化工具1、说一说三次握手
当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候#xff0c;我想很多人会这样回答#xff1a;
首先很多人会先讲下握手的过程#xff1a;
1、第一次握手#xff1a;客户端给服务器发送一个 SYN 报文。
2、第二次握手我想很多人会这样回答
首先很多人会先讲下握手的过程
1、第一次握手客户端给服务器发送一个 SYN 报文。
2、第二次握手服务器收到 SYN 报文之后会应答一个 SYNACK 报文。
3、第三次握手客户端收到 SYNACK 报文之后会回应一个 ACK 报文。
4、服务器收到 ACK 报文之后三次握手建立完成。
作用是为了确认双方的接收与发送能力是否正常。 这里我顺便解释一下为啥只有三次握手才能确认双方的接受与发送能力是否正常而两次却不可以 第一次握手客户端发送网络包服务端收到了。这样服务端就能得出结论客户端的发送能力、服务端的接收能力是正常的。 第二次握手服务端发包客户端收到了。这样客户端就能得出结论服务端的接收、发送能力客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。 第三次握手客户端发包服务端收到了。这样服务端就能得出结论客户端的接收、发送能力正常服务器自己的发送、接收能力也正常。 因此需要三次握手才能确认双方的接收与发送能力是否正常。
这样回答其实也是可以的但我觉得这个过程的我们应该要描述的更详细一点因为三次握手的过程中双方是由很多状态的改变的而这些状态也是面试官可能会问的点。所以我觉得在回答三次握手的时候我们应该要描述的详细一点而且描述的详细一点意味着可以扯久一点。加分的描述我觉得应该是这样
刚开始客户端处于 closed 的状态服务端处于 listen 状态。然后
1、第一次握手客户端给服务端发一个 SYN 报文并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。
2、第二次握手服务器收到客户端的 SYN 报文之后会以自己的 SYN 报文作为应答并且也是指定了自己的初始化序列号 ISN(s)同时会把客户端的 ISN 1 作为 ACK 的值表示自己已经收到了客户端的 SYN此时服务器处于 SYN_REVD 的状态。
3、第三次握手客户端收到 SYN 报文之后会发送一个 ACK 报文当然也是一样把服务器的 ISN 1 作为 ACK 的值表示已经收到了服务端的 SYN 报文此时客户端处于 establised 状态。
4、服务器收到 ACK 报文之后也处于 establised 状态此时双方以建立起了链接
三次握手的作用
三次握手的作用也是有好多的多记住几个保证不亏。例如
1、确认双方的接受能力、发送能力是否正常。
2、指定自己的初始化序列号为后面的可靠传送做准备。
1、ISN是固定的吗
三次握手的一个重要功能是客户端和服务端交换ISN(Initial Sequence Number), 以便让对方知道接下来接收数据的时候如何按序列号组装数据。
如果ISN是固定的攻击者很容易猜出后续的确认号因此 ISN 是动态生成的。
2、什么是半连接队列
服务器第一次收到客户端的 SYN 之后就会处于 SYN_RCVD 状态此时双方还没有完全建立其连接服务器会把此种状态下请求连接放在一个队列里我们把这种队列称之为半连接队列。当然还有一个全连接队列就是已经完成三次握手建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。 这里在补充一点关于SYN-ACK 重传次数的问题 服务器发送完SYNACK包如果未收到客户确认包服务器进行首次重传等待一段时间仍未收到客户确认包进行第二次重传如果重传次数超 过系统规定的最大重传次数系统将该连接信息从半连接队列中删除。注意每次重传等待的时间不一定相同一般会是指数增长例如间隔时间为 1s, 2s, 4s, 8s, 3、三次握手过程中可以携带数据吗
很多人可能会认为三次握手都不能携带数据其实第三次握手的时候是可以携带数据的。也就是说第一次、第二次握手不可以携带数据而第三次握手是可以携带数据的。
为什么这样呢大家可以想一个问题假如第一次握手可以携带数据的话如果有人要恶意攻击服务器那他每次都在第一次握手中的 SYN 报文中放入大量的数据因为攻击者根本就不理服务器的接收、发送能力是否正常然后疯狂着重复发 SYN 报文的话这会让服务器花费很多时间、内存空间来接收这些报文。也就是说第一次握手可以放数据的话其中一个简单的原因就是会让服务器更加容易受到攻击了。
而对于第三次的话此时客户端已经处于 established 状态也就是说对于客户端来说他已经建立起连接了并且也已经知道服务器的接收、发送能力是正常的了所以能携带数据页没啥毛病。
2、说一说四次挥手
四次挥手也一样千万不要对方一个 FIN 报文我方一个 ACK 报文再我方一个 FIN 报文我方一个 ACK 报文。然后结束最好是说的详细一点例如想下面这样就差不多了要把每个阶段的状态记好我上次面试就被问了几个了呵呵。我答错了还以为自己答对了当时还解释的头头是道呵呵。
刚开始双方都处于 establised 状态假如是客户端先发起关闭请求则
1、第一次挥手客户端发送一个 FIN 报文报文中会指定一个序列号。此时客户端处于CLOSED_WAIT1状态。
2、第二次握手服务端收到 FIN 之后会发送 ACK 报文且把客户端的序列号值 1 作为 ACK 报文的序列号值表明已经收到客户端的报文了此时服务端处于 CLOSE_WAIT2状态。
3、第三次挥手如果服务端也想断开连接了和客户端的第一次挥手一样发给 FIN 报文且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
4、第四次挥手客户端收到 FIN 之后一样发送一个 ACK 报文作为应答且把服务端的序列号值 1 作为自己 ACK 报文的序列号值此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
5、服务端收到 ACK 报文之后就处于关闭连接了处于 CLOSED 状态。
这里特别需要主要的就是TIME_WAIT这个状态了这个是面试的高频考点就是要理解为什么客户端发送 ACK 之后不直接关闭而是要等一阵子才关闭。这其中的原因就是要确保服务器是否已经收到了我们的 ACK 报文如果没有收到的话服务器会重新发 FIN 报文给客户端客户端再次收到 FIN 报文之后就知道之前的 ACK 报文丢失了然后再次发送 ACK 报文。
至于 TIME_WAIT 持续的时间至少是一个报文的来回时间。一般会设置一个计时如果过了这个计时没有再次收到 FIN 报文则代表对方成功就是 ACK 报文此时处于 CLOSED 状态。
这里我给出每个状态所包含的含义有兴趣的可以看看。
LISTEN - 侦听来自远方TCP端口的连接请求
SYN-SENT -在发送连接请求后等待匹配的连接请求
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认
ESTABLISHED- 代表一个打开的连接数据可以传送给用户
FIN-WAIT-1 - 等待远程TCP的连接中断请求或先前的连接中断请求的确认
FIN-WAIT-2 - 从远程TCP等待连接中断请求
CLOSE-WAIT - 等待从本地用户发来的连接中断请求
CLOSING -等待远程TCP对连接中断的确认
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED - 没有任何连接状态
3、说一说POST与GET有哪些区别
使用场景
GET 用于获取资源而 POST 用于传输实体主体。
参数
GET 和 POST 的请求都能使用额外的参数但是 GET 的参数是以查询字符串出现在 URL 中而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高因为照样可以通过一些抓包工具Fiddler查看。
因为 URL 只支持 ASCII 码因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87而空格会转换为 %20。POST 参数支持标准字符集。
GET /test/demo_form.asp?name1value1name2value2 HTTP/1.1Copy to clipboardErrorCopied
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1value1name2value2Copy to clipboardErrorCopied安全性
安全的 HTTP 方法不会改变服务器状态也就是说它只是可读的。
GET 方法是安全的而 POST 却不是因为 POST 的目的是传送实体主体内容这个内容可能是用户上传的表单数据上传成功之后服务器可能把这个数据存储到数据库中因此状态也就发生了改变。
安全的方法除了 GET 之外还有HEAD、OPTIONS。
不安全的方法除了 POST 之外还有 PUT、DELETE。
幂等性
幂等的 HTTP 方法同样的请求被执行一次与连续执行多次的效果是一样的服务器的状态也是一样的。换句话说就是幂等方法不应该具有副作用统计用途除外。
所有的安全方法也都是幂等的。
在正确实现的条件下GETHEADPUT 和 DELETE 等方法都是幂等的而 POST 方法不是。
GET /pageX HTTP/1.1 是幂等的连续调用多次客户端接收到的结果都是一样的
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1
GET /pageX HTTP/1.1Copy to clipboardErrorCopiedPOST /add_row HTTP/1.1 不是幂等的如果调用多次就会增加多行记录
POST /add_row HTTP/1.1 - Adds a 1nd row
POST /add_row HTTP/1.1 - Adds a 2nd row
POST /add_row HTTP/1.1 - Adds a 3rd rowCopy to clipboardErrorCopiedDELETE /idX/delete HTTP/1.1 是幂等的即使不同的请求接收到的状态码不一样
DELETE /idX/delete HTTP/1.1 - Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1 - Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1 - Returns 404Copy to clipboardErrorCopied可缓存
如果要对响应进行缓存需要满足以下条件
请求报文的 HTTP 方法本身是可缓存的包括 GET 和 HEAD但是 PUT 和 DELETE 不可缓存POST 在多数情况下不可缓存的。响应报文的状态码是可缓存的包括200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。响应报文的 Cache-Control 首部字段没有指定不进行缓存。
XMLHttpRequest
为了阐述 POST 和 GET 的另一个区别需要先了解 XMLHttpRequest XMLHttpRequest 是一个 API它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。 在使用 XMLHttpRequest 的 POST 方法时浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做例如火狐就不会。而 GET 方法 Header 和 Data 会一起发送。
4、面试官说一说TCP与UDP的区别
TCP协议的主要特点
1TCP是面向连接的运输层协议所谓面向连接就是双方传输数据之前必须先建立一条通道例如三次握手就是建议通道的一个过程而四次挥手则是结束销毁通道的一个其中过程。
2每一条TCP连接只能有两个端点即两个套接字只能是点对点的
3TCP提供可靠的传输服务。传送的数据无差错、不丢失、不重复、按序到达
4TCP提供全双工通信。允许通信双方的应用进程在任何时候都可以发送数据因为两端都设有发送缓存和接受缓存
5面向字节流。虽然应用程序与TCP交互是一次一个大小不等的数据块但TCP把这些数据看成一连串无结构的字节流它不保证接收方收到的数据块和发送方发送的数据块具有对应大小关系例如发送方应用程序交给发送方的TCP10个数据块但就受访的TCP可能只用了4个数据块久保收到的字节流交付给上层的应用程序但字节流完全一样。
TCP的可靠性原理
可靠传输有如下两个特点:
a.传输信道无差错,保证传输数据正确;
b.不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据;
1首先采用三次握手来建立TCP连接四次握手来释放TCP连接从而保证建立的传输信道是可靠的。
2其次TCP采用了连续ARQ协议回退NGo-back-N超时自动重传来保证数据传输的正确性使用滑动窗口协议来保证接方能够及时处理所接收到的数据进行流量控制。
3最后TCP使用慢开始、拥塞避免、快重传和快恢复来进行拥塞控制避免网络拥塞。
UDP协议特点
UDP是无连接的传输层协议
UDP使用尽最大努力交付不保证可靠交付
UDP是面向报文的对应用层交下来的报文不合并不拆分保留原报文的边界
UDP没有拥塞控制因此即使网络出现拥塞也不会降低发送速率
UDP支持一对一 一对多 多对多的交互通信
UDP的首部开销小只有字节
TCP和UDP的区别
(1)TCP是可靠传输,UDP是不可靠传输;
(2)TCP面向连接,UDP无连接;
(3)TCP传输数据有序,UDP不保证数据的有序性;
(4)TCP不保存数据边界,UDP保留数据边界;
(5)TCP传输速度相对UDP较慢;
(6)TCP有流量控制和拥塞控制,UDP没有;
()TCP是重量级协议,UDP是轻量级协议;
()TCP首部较长字节,UDP首部较短字节;
基于TCP和UDP的常用协议
HTTP、HTTPS、FTP、TELNET、SMTP(简单邮件传输协议)协议基于可靠的TCP协议。TFTP、DNS、DHCP、TFTP、SNMP(简单网络管理协议)、RIP基于不可靠的UDP协议
TCP 和 UDP 的常用场景这个问的好挺多的例如我当时面试时就被问过QQ 登录的过程中用到了 TCP 和 UDPQQ 通话呢
5、面试题说一说HTTP1.01.12.0 的区别
HTTP/1.0
1996年5月HTTP/1.0 版本发布为了提高系统的效率HTTP/1.0规定浏览器与服务器只保持短暂的连接浏览器的每次请求都需要与服务器建立一个TCP连接服务器完成请求处理后立即断开TCP连接服务器不跟踪每个客户也不记录过去的请求。
这种方式就好像我们打电话的时候只能说一件事儿一样说完之后就要挂断想要说另外一件事儿的时候就要重新拨打电话。
HTTP/1.0中浏览器与服务器只保持短暂的连接连接无法复用。也就是说每个TCP连接只能发送一个请求。发送数据完毕连接就关闭如果还要请求其他资源就必须再新建一个连接。
我们知道TCP连接的建立需要三次握手是很耗费时间的一个过程。所以HTTP/1.0版本的性能比较差。 HTTP1.0 其实也可以强制开启长链接例如接受Connection: keep-alive 这个字段但是这不是标准字段不同实现的行为可能不一致因此不是根本的解决办法。 HTTP/1.1
为了解决HTTP/1.0存在的缺陷HTTP/1.1于1999年诞生。相比较于HTTP/1.0来说最主要的改进就是引入了持久连接。所谓的持久连接即TCP连接默认不关闭可以被多个请求复用。
由于之前打一次电话只能说一件事儿效率很低。后来人们提出一种想法就是电话打完之后先不直接挂断而是持续一小段时间这一小段时间内如果还有事情沟通可以再次进行沟通。
客户端和服务器发现对方一段时间没有活动就可以主动关闭连接。或者客户端在最后一个请求时主动告诉服务端要关闭连接。
HTTP/1.1版还引入了管道机制pipelining即在同一个TCP连接里面客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。 有了持久连接和管道大大的提升了HTTP的效率。但是服务端还是顺序执行的效率还有提升的空间。
HTTP/2
HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新主要基于 SPDY 协议。
HTTP/2 为了解决HTTP/1.1中仍然存在的效率问题HTTP/2 采用了多路复用。即在一个连接里客户端和浏览器都可以同时发送多个请求或回应而且不用按照顺序一一对应。能这样做有一个前提就是HTTP/2进行了二进制分帧即 HTTP/2 会将所有传输的信息分割为更小的消息和帧frame,并对它们采用二进制格式的编码。
也就是说老板可以同时下达多个命令员工也可以收到了A请求和B请求于是先回应A请求结果发现处理过程非常耗时于是就发送A请求已经处理好的部分 接着回应B请求完成后再发送A请求剩下的部分。A请求的两部分响应在组合到一起发给老板。 而这个负责拆分、组装请求和二进制帧的一层就叫做二进制分帧层。
除此之外还有一些其他的优化比如做Header压缩、服务端推送等。
Header压缩就是压缩老板和员工之间的对话。
服务端推送就是员工事先把一些老板可能询问的事情提现发送到老板的手机缓存上。这样老板想要知道的时候就可以直接读取短信缓存了。
目前主流的HTTP协议还是HTTP/1.1 和 HTTP/2。并且各大网站的HTTP/2的使用率也在逐年增加。
6、什么是SQL 注入举个例子
SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串最终达到欺骗服务器执行恶意的SQL命令。
1). SQL注入攻击的总体思路 (1). 寻找到SQL注入的位置 (2). 判断服务器类型和后台数据库类型 (3). 针对不通的服务器和数据库特点进行SQL注入攻击
2). SQL注入攻击实例
比如在一个登录界面要求输入用户名和密码可以这样输入实现免帐号登录
用户名 ‘or 1 1 --
密 码用户一旦点击登录如若没有做特殊处理那么这个非法用户就很得意的登陆进去了。这是为什么呢?
下面我们分析一下从理论上说后台认证程序中会有如下的SQL语句
String sql “select * from user_table where username’ “userName” ’ and password’ “password” ‘”;因此当输入了上面的用户名和密码上面的SQL语句变成
SELECT * FROM user_table WHERE username’’or 1 1 –- and password’’分析上述SQL语句我们知道username‘ or 11 这个语句一定会成功然后后面加两个-这意味着注释它将后面的语句注释让他们不起作用。这样上述语句永远都能正确执行用户轻易骗过系统获取合法身份。
3). 应对方法
(1). 参数绑定
使用预编译手段绑定参数是最好的防SQL注入的方法。目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。在mybatis的mapper文件中对于传递的参数我们一般是使用#和$来获取参数值。当使用#时变量是占位符就是一般我们使用javajdbc的PrepareStatement时的占位符所有可以防止sql注入当使用$时变量就是直接追加在sql中一般会有sql注入问题。
(2). 使用正则表达式过滤传入的参数
7、谈一谈 XSS 攻击举个例子
XSS是一种经常出现在web应用中的计算机安全漏洞与SQL注入一起成为web中最主流的攻击方式。
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点进而添加一些脚本代码嵌入到web页面中去使别的用户访问都会执行相应的嵌入代码从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
1). XSS攻击的危害
盗取各类用户帐号如机器登录帐号、用户网银帐号、各类管理员帐号
控制企业数据包括读取、篡改、添加、删除企业敏感数据的能力
盗窃企业重要的具有商业价值的资料
非法转账
强制发送电子邮件
网站挂马
控制受害者机器向其它网站发起攻击
2). 原因解析
主要原因过于信任客户端提交的数据
解决办法不信任任何客户端提交的数据只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。
进一步分析细节客户端提交的数据本来就是应用所需要的但是恶意攻击者利用网站对客户端提交数据的信任在数据中插入一些符号以及javascript代码那么这些数据将会成为应用代码中的一部分了那么攻击者就可以肆无忌惮地展开攻击啦因此我们绝不可以信任任何客户端提交的数据
3). XSS 攻击分类
(1). 反射性XSS攻击 (非持久性XSS攻击)
漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS攻击包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)例如正常发送消息
http://www.test.com/message.php?sendHello,World接收者将会接收信息并显示Hello,World但是非正常发送消息
http://www.test.com/message.php?sendscriptalert(‘foolish!’)/script接收者接收消息显示的时候将会弹出警告窗口
(2). 持久性XSS攻击 (留言板场景)
XSS攻击向量(一般指XSS攻击代码)存储在网站数据库当一个页面被用户打开的时候执行。也就是说每当用户使用浏览器打开指定页面时脚本便执行。
与非持久性XSS攻击相比持久性XSS攻击危害性更大。从名字就可以了解到持久性XSS攻击就是将攻击代码存入数据库中然后客户端打开时就执行这些攻击代码。
例如留言板表单中的表单域
input typetext namecontent value这里是用户填写的数据正常操作流程是用户是提交相应留言信息 —— 将数据存储到数据库 —— 其他用户访问留言板应用去数据并显示而非正常操作流程是攻击者在value填写:
scriptalert(‘foolish!’)/script !--或者html其他标签破坏样式。。。、一段攻击型代码--并将数据提交、存储到数据库中当其他用户取出数据显示的时候将会执行这些攻击性代码。
4). 修复漏洞方针
漏洞产生的根本原因是 太相信用户提交的数据对用户所提交的数据过滤不足所导致的因此解决方案也应该从这个方面入手具体方案包括
将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了如果在cookie中设置了HttpOnly属性那么通过js脚本将无法读取到cookie信息这样能有效的防止XSS攻击
表单数据规定值的类型例如年龄应为只能为int、name只能为字母数字组合。。。。
对数据进行Html Encode 处理
过滤或移除特殊的Html标签例如:
script, iframe , for , for, quot for过滤JavaScript 事件的标签例如 “οnclick”, “onfocus” 等等。
需要注意的是在有些应用中是允许html标签出现的甚至是javascript代码出现。因此我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等然后区别处理
8、在交互过程中如果数据传送完了还不想断开连接怎么办怎么维持
在 HTTP 中响应体的 Connection 字段指定为 keep-alive
connetion:keep-alive;9、GET请求中URL编码的意义
我们知道在GET请求中会对URL中非西文字符进行编码这样做的目的就是为了 避免歧义。看下面的例子
针对“name1value1name2value2”的例子我们来谈一下数据从客户端到服务端的解析过程。首先上述字符串在计算机中用ASCII吗表示为 6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C7565326E616D6531name1 3D 76616C756531value1 266E616D6532name2 3D 76616C756532value2 服务端在接收到该数据后就可以遍历该字节流一个字节一个字节的吃当吃到3D这字节后服务端就知道前面吃得字节表示一个key再往后吃如果遇到26说明从刚才吃的3D到26子节之间的是上一个key的value以此类推就可以解析出客户端传过来的参数。
现在考虑这样一个问题如果我们的参数值中就包含 或 这种特殊字符的时候该怎么办比如“name1value1”其中value1的值是“value1”字符串那么实际在传输过程中就会变成这样“name1value1”。这样我们的本意是只有一个键值对但是服务端却会解析成两个键值对这样就产生了歧义。
那么如何解决上述问题带来的歧义呢解决的办法就是对参数进行URL编码例如我们对上述会产生歧义的字符进行URL编码后结果“name1va%26lu%3D”这样服务端会把紧跟在“%”后的字节当成普通的字节就是不会把它当成各个参数或键值对的分隔符 10、HTTP 哪些常用的状态码及使用场景
状态码分类
1xx表示目前是协议的中间状态还需要后续请求
2xx表示请求成功
3xx表示重定向状态需要重新请求
4xx表示请求报文错误
5xx服务器端错误
常用状态码
101 切换请求协议从 HTTP 切换到 WebSocket
200 请求成功有响应体
301 永久重定向会缓存
302 临时重定向不会缓存
304 协商缓存命中
403 服务器禁止访问
404 资源未找到
400 请求错误
500 服务器端错误
503 服务器繁忙
11、HTTP 如何实现长连接在什么时候会超时
通过在头部请求和响应头设置 Connection: keep-aliveHTTP1.0协议支持但是默认关闭从HTTP1.1协议以后连接默认都是长连接
1、HTTP 一般会有 httpd 守护进程里面可以设置 keep-alive timeout当 tcp 链接闲置超过这个时间就会关闭也可以在 HTTP 的 header 里面设置超时时间
2、TCP 的 keep-alive 包含三个参数支持在系统内核的 net.ipv4 里面设置当 TCP 链接之后闲置了 tcp_keepalive_time则会发生侦测包如果没有收到对方的 ACK那么会每隔 tcp_keepalive_intvl 再发一次直到发送了 tcp_keepalive_probes就会丢弃该链接。
1tcp_keepalive_intvl 15 2tcp_keepalive_probes 5 3tcp_keepalive_time 1800
实际上 HTTP 没有长短链接只有 TCP 有TCP 长连接可以复用一个 TCP 链接来发起多次 HTTP 请求这样可以减少资源消耗比如一次请求 HTML可能还需要请求后续的 JS/CSS/图片等
12、HTTP状态码301和302的区别都有哪些用途
一. 301重定向的概念
301重定向301 Move Permanently指页面永久性转移表示为资源或页面永久性地转移到了另一个位置。301是HTTP协议中的一种状态码当用户或搜索引擎向服务器发出浏览请求时服务器返回的HTTP数据流中头信息header中包含状态码 301 表示该资源已经永久改变了位置。
301重定向是一种非常重要的自动转向“技术网址重定向最为可行的一种方法。
二. 哪些情况需要做301重定向
网页开发过程中时常会遇到网站目录结构的调整将页面转移到一个新地址网页扩展名的改变这些变化都会导致网页地址发生改变此时用户收藏夹和搜索引擎数据库中的旧地址是一个错误的地址访问之后会出现404页面直接导致网站流量的损失。或者是我们需要多个域名跳转至同一个域名例如本站主站点域名为 www.conimi.com 而还有一个域名 www.nico.cc由于对该域名设置了301重定向当输入www.nico.cc 时自动跳转至 www.conimi.com 。
三. 301重定向有什么优点
有利于网站首选域的确定对于同一资源页面多条路径的301重定向有助于URL权重的集中。例如 www.conimi.com和 conimi.com 是两个不同的域名但是指向的内容完全相同搜索引擎会对两个域名收录情况不同这样导致网站权重和排名被分散对conimi.com 做301重定向跳转至www.conimi.com 后权重和排名集中到www.conimi.com从而提升自然排名。
四. 302重定向又是什么鬼
302重定向302 Move Temporarily指页面暂时性转移表示资源或页面暂时转移到另一个位置常被用作网址劫持容易导致网站降权严重时网站会被封掉不推荐使用。
五. 301与302的区别
301重定向是页面永久性转移搜索引擎在抓取新内容的同时也将旧的网址替换成重定向之后的网址
302重定向是页面暂时性转移搜索引擎会抓取新的内容而保存旧的网址并认为新的网址只是暂时的。
13、IP地址有哪些分类
A类地址(1~126)网络号占前8位以0开头主机号占后24位。
B类地址(128~191)网络号占前16位以10开头主机号占后16位。
C类地址(192~223)网络号占前24位以110开头主机号占后8位。
D类地址(224~239)以1110开头保留位多播地址。
E类地址(240~255)以1111开头保留位今后使用
14、简单说下每一层对应的网络协议有哪些
计算机五层网络体系中涉及的协议非常多下面就常用的做了列举 15、ARP 协议的工作原理
网络层的 ARP 协议完成了 IP 地址与物理地址的映射。首先每台主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表以表示 IP 地址和 MAC 地址的对应关系。当源主机需要将一个数据包要发送到目的主机时会首先检查自己 ARP 列表中是否存在该 IP 地址对应的 MAC 地址如果有就直接将数据包发送到这个 MAC 地址如果没有就向本地网段发起一个 ARP 请求的广播包查询此目的主机对应的 MAC 地址。
此 ARP 请求数据包里包括源主机的 IP 地址、硬件地址、以及目的主机的 IP 地址。网络中所有的主机收到这个 ARP 请求后会检查数据包中的目的 IP 是否和自己的 IP 地址一致。如果不相同就忽略此数据包如果相同该主机首先将发送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中如果 ARP 表中已经存在该 IP 的信息则将其覆盖然后给源主机发送一个 ARP 响应数据包告诉对方自己是它需要查找的 MAC 地址源主机收到这个 ARP 响应数据包后将得到的目的主机的 IP 地址和 MAC 地址添加到自己的 ARP 列表中并利用此信息开始数据的传输。如果源主机一直没有收到 ARP 响应数据包表示 ARP 查询失败
16、TCP 的主要特点是什么 TCP 是面向连接的。就好像打电话一样通话前需要先拨号建立连接通话结束后要挂机释放连接 每一条 TCP 连接只能有两个端点每一条 TCP 连接只能是点对点的一对一 TCP 提供可靠交付的服务。通过 TCP 连接传送的数据无差错、不丢失、不重复、并且按序到达 TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存用来临时存放双方通信的数据 面向字节流。TCP 中的“流”Stream指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是虽然应用程序和 TCP 的交互是一次一个数据块大小不等但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
17、UDP 的主要特点是什么 UDP 是无连接的 UDP 使用尽最大努力交付即不保证可靠交付因此主机不需要维持复杂的链接状态这里面有许多参数 UDP 是面向报文的 UDP 没有拥塞控制因此网络出现拥塞不会使源主机的发送速率降低对实时应用很有用如 直播实时视频会议等 UDP 支持一对一、一对多、多对一和多对多的交互通信 UDP 的首部开销小只有 8 个字节比 TCP 的 20 个字节的首部要短。
18、TCP 和 UDP 分别对应的常见应用层协议有哪些
1. TCP 对应的应用层协议
FTP定义了文件传输协议使用 21 端口。常说某某计算机开了 FTP 服务便是启动了文件传输服务。下载文件上传主页都要用到 FTP 服务。
Telnet它是一种用于远程登陆的端口用户可以以自己的身份远程连接到计算机上通过这种端口可以提供一种基于 DOS 模式下的通信服务。如以前的 BBS 是-纯字符界面的支持 BBS 的服务器将 23 端口打开对外提供服务。
SMTP定义了简单邮件传送协议现在很多邮件服务器都用的是这个协议用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口所以在电子邮件设置-中常看到有这么 SMTP 端口设置这个栏服务器开放的是 25 号端口。
POP3它是和 SMTP 对应POP3 用于接收邮件。通常情况下POP3 协议所用的是 110 端口。也是说只要你有相应的使用 POP3 协议的程序例如 Fo-xmail 或 Outlook就可以不以 Web 方式登陆进邮箱界面直接用邮件程序就可以收到邮件如是163 邮箱就没有必要先进入网易网站再进入自己的邮-箱来收信。
HTTP从 Web 服务器传输超文本到本地浏览器的传送协议。
2. UDP 对应的应用层协议
DNS用于域名解析服务将域名地址转换为 IP 地址。DNS 用的是 53 号端口。
SNMP简单网络管理协议使用 161 号端口是用来管理网络设备的。由于网络设备很多无连接的服务就体现出其优势。
TFTP(Trival File Transfer Protocal)简单文件传输协议该协议在熟知端口 69 上使用 UDP 服务。
19、为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢
1、为了保证 A 发送的最后一个 ACK 报文段能够到达 B。这个 ACK 报文段有可能丢失因而使处在 LAST-ACK 状态的 B 收不到对已发送的 FIN ACK 报文段的确认。B 会超时重传这个 FINACK 报文段而 A 就能在 2MSL 时间内超时 1MSL 传输收到这个重传的 FINACK 报文段。接着 A 重传一次确认重新启动 2MSL 计时器。最后A 和 B 都正常进入到 CLOSED 状态。如果 A 在 TIME-WAIT 状态不等待一段时间而是在发送完 ACK 报文段后立即释放连接那么就无法收到 B 重传的 FIN ACK 报文段因而也不会再发送一次确认报文段这样B 就无法按照正常步骤进入 CLOSED 状态。
2、 防止已失效的连接请求报文段出现在本连接中。A 在发送完最后一个 ACK 报文段后再经过时间 2MSL就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。
20、保活计时器的作用
除时间等待计时器外TCP 还有一个保活计时器keepalive timer。设想这样的场景客户已主动与服务器建立了 TCP 连接。但后来客户端的主机突然发生故障。显然服务器以后就不能再收到客户端发来的数据。因此应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。
服务器每收到一次客户的数据就重新设置保活计时器时间的设置通常是两个小时。若两个小时都没有收到客户端的数据服务端就发送一个探测报文段以后则每隔 75 秒钟发送一次。若连续发送 10个 探测报文段后仍然无客户端的响应服务端就认为客户端出了故障接着就关闭这个连接。
21、TCP 协议是如何保证可靠传输的 数据包校验目的是检测数据在传输过程中的任何变化若校验出包有错则丢弃报文段并且不给出响应这时 TCP 发送数据端超时后会重发数据 对失序数据包重排序既然 TCP 报文段作为 IP 数据报来传输而 IP 数据报的到达可能会失序因此 TCP 报文段的到达也可能会失序。TCP 将对失序数据进行重新排序然后才交给应用层 丢弃重复数据对于重复数据能够丢弃重复数据 应答机制当 TCP 收到发自 TCP 连接另一端的数据它将发送一个确认。这个确认不是立即发送通常将推迟几分之一秒 超时重发当 TCP 发出一个段后它启动一个定时器等待目的端确认收到这个报文段。如果不能及时收到一个确认将重发这个报文段 流量控制TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据这可以防止较快主机致使较慢主机的缓冲区溢出这就是流量控制。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
22、谈谈你对停止等待协议的理解
停止等待协议是为了实现可靠传输的它的基本原理就是每发完一个分组就停止发送等待对方确认。在收到确认后再发下一个分组在停止等待协议中若接收方收到重复分组就丢弃该分组但同时还要发送确认。主要包括以下几种情况无差错情况、出现差错情况超时重传、确认丢失和确认迟到、确认丢失和确认迟到。
23、谈谈你对 ARQ 协议的理解
自动重传请求 ARQ 协议
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认就重传前面发送过的分组认为刚才发送过的分组丢失了。因此每发送完一个分组需要设置一个超时计时器其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求 ARQ。
连续 ARQ 协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口凡位于发送窗口内的分组可以连续发送出去而不需要等待对方确认。接收方一般采用累计确认对按序到达的最后一个分组发送确认表明到这个分组为止的所有分组都已经正确收到了。
24、谈谈你对滑动窗口的了解
TCP 利用滑动窗口实现流量控制的机制。滑动窗口Sliding window是一种流量控制技术。早期的网络通信中通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况同时发送数据导致中间节点阻塞掉包谁也发不了数据所以就有了滑动窗口机制来解决此问题。
TCP 中采用滑动窗口来进行传输控制滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时发送方一般不能再发送数据报但有两种情况除外一种情况是可以发送紧急数据例如允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
25、谈下你对流量控制的理解
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小从而影响发送方的发送速率。将窗口字段设置为 0则发送方不能发送数据。
26、谈下你对 TCP 拥塞控制的理解使用了哪些算法
拥塞控制和流量控制不同前者是一个全局性的过程而后者指点对点通信量的控制。在某段时间若对网络中某一资源的需求超过了该资源所能提供的可用部分网络的性能就要变坏。这种情况就叫拥塞。
拥塞控制就是为了防止过多的数据注入到网络中这样就可以使网络中的路由器或链路不致于过载。拥塞控制所要做的都有一个前提就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程涉及到所有的主机所有的路由器以及与降低网络传输性能有关的所有因素。相反流量控制往往是点对点通信量的控制是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率以便使接收端来得及接收。
为了进行拥塞控制TCP 发送方要维持一个拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
TCP 的拥塞控制采用了四种算法即慢开始、拥塞避免、快重传和快恢复。在网络层也可以使路由器采用适当的分组丢弃策略如主动队列管理 AQM以减少网络拥塞的发生。
慢开始
慢开始算法的思路是当主机开始发送数据时如果立即把大量数据字节注入到网络那么可能会引起网络阻塞因为现在还不知道网络的符合情况。经验表明较好的方法是先探测一下即由小到大逐渐增大发送窗口也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1每经过一个传播轮次cwnd 加倍。
拥塞避免
拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1。
快重传与快恢复
在 TCP/IP 中快速重传和快恢复fast retransmit and recoveryFRR是一种拥塞控制算法它能快速恢复丢失的数据包。
没有 FRR如果数据包丢失了TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内没有新的或复制的数据包被发送。有了 FRR如果接收机接收到一个不按顺序的数据段它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认它会假定确认件指出的数据段丢失了并立即重传这些丢失的数据段。
有了 FRR就不会因为重传时要求的暂停被耽误。当有单独的数据包丢失时快速重传和快恢复FRR能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时它则不能很有效地工作。
27、什么是粘包
在进行 Java NIO 学习时可能会发现如果客户端连续不断的向服务端发送数据包时服务端接收的数据会出现两个数据包粘在一起的情况。 TCP 是基于字节流的虽然应用层和 TCP 传输层之间的数据交互是大小不等的数据块但是 TCP 把这些数据块仅仅看成一连串无结构的字节流没有边界 从 TCP 的帧结构也可以看出在 TCP 的首部没有表示数据长度的字段。
基于上面两点在使用 TCP 传输数据时才有粘包或者拆包现象发生的可能。一个数据包中包含了发送端发送的两个数据包的信息这种现象即为粘包。
接收端收到了两个数据包但是这两个数据包要么是不完整的要么就是多出来一块这种情况即发生了拆包和粘包。拆包和粘包的问题导致接收端在处理的时候会非常困难因为无法区分一个完整的数据包。
28、TCP 黏包是怎么产生的
发送方产生粘包
采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态一次连接发一次数据不存在粘包双方在连接不断开的情况下可以一直传输数据。但当发送的数据包过于的小时那么 TCP 协议默认的会启用 Nagle 算法将这些较小的数据包进行合并发送缓冲区数据发送是一个堆压的过程这个合并过程就是在发送缓冲区中进行的也就是说数据发送出来它已经是粘包的状态了。
接收方产生粘包
接收方采用 TCP 协议接收数据时的过程是这样的数据到接收方从网络模型的下方传递至传输层传输层的 TCP 协议处理是将其放置接收缓冲区然后由应用层来主动获取C 语言用 recv、read 等函数这时会出现一个问题就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来而下一个数据又到来并有一部分放入的缓冲区末尾等我们读取数据时就是一个粘包。放数据的速度 应用层拿数据速度
29、怎么解决拆包和粘包
分包机制一般有两个通用的解决方法 特殊字符控制 在包头首都添加数据包的长度。
如果使用 netty 的话就有专门的编码器和解码器解决拆包和粘包问题了。
tipsUDP 没有粘包问题但是有丢包和乱序。不完整的包是不会有的收到的都是完全正确的包。传送的数据单位协议是 UDP 报文或用户数据报发送的时候既不合并也不拆分。
30、forward 和 redirect 的区别
Forward 和 Redirect 代表了两种请求转发方式直接转发和间接转发。
直接转发方式Forward客户端和浏览器只发出一次请求Servlet、HTML、JSP 或其它信息资源由第二个信息资源响应该请求在请求对象 request 中保存的对象对于每个信息资源是共享的。
间接转发方式Redirect实际是两次 HTTP 请求服务器端在响应第一次请求的时候让浏览器再向另外一个 URL 发出请求从而达到转发的目的。
举个通俗的例子
直接转发就相当于“A 找 B 借钱B 说没有B 去找 C 借借到借不到都会把消息传递给 A”
间接转发就相当于A 找 B 借钱B 说没有让 A 去找 C 借。
31、HTTP 方法有哪些
客户端发送的 请求报文 第一行为请求行包含了方法字段。 GET获取资源当前网络中绝大部分使用的都是 GET HEAD获取报文首部和 GET 方法类似但是不返回报文实体主体部分 POST传输实体主体 PUT上传文件由于自身不带验证机制任何人都可以上传文件因此存在安全性问题一般不使用该方法。 PATCH对资源进行部分修改。PUT 也可以用于修改资源但是只能完全替代原始资源PATCH 允许部分修改。 OPTIONS查询指定的 URL 支持的方法 CONNECT要求在与代理服务器通信时建立隧道。使用 SSLSecure Sockets Layer安全套接层和 TLSTransport Layer Security传输层安全协议把通信内容加密后经网络隧道传输。 TRACE追踪路径。服务器会将通信路径返回给客户端。发送请求时在 Max-Forwards 首部字段中填入数值每经过一个服务器就会减 1当数值为 0 时就停止传输。通常不会使用 TRACE并且它容易受到 XST 攻击Cross-Site Tracing跨站追踪。
32、在浏览器中输入 URL 地址到显示主页的过程
DNS 解析浏览器查询 DNS获取域名对应的 IP 地址具体过程包括浏览器搜索自身的 DNS 缓存、搜索操作系统的 DNS 缓存、读取本地的 Host 文件和向本地 DNS 服务器进行查询等。对于向本地 DNS 服务器进行查询如果要查询的域名包含在本地配置区域资源中则返回解析结果给客户机完成域名解析(此解析具有权威性)如果要查询的域名不由本地 DNS 服务器区域解析但该服务器已缓存了此网址映射关系则调用这个 IP 地址映射完成域名解析此解析不具有权威性。如果本地域名服务器并未缓存该网址映射关系那么将根据其设置发起递归查询或者迭代查询TCP 连接浏览器获得域名对应的 IP 地址以后浏览器向服务器请求建立链接发起三次握手发送 HTTP 请求TCP 连接建立起来后浏览器向服务器发送 HTTP 请求服务器处理请求并返回 HTTP 报文服务器接收到这个请求并根据路径参数映射到特定的请求处理器进行处理并将处理结果及相应的视图返回给浏览器浏览器解析渲染页面浏览器解析并渲染视图若遇到对 js 文件、css 文件及图片等静态资源的引用则重复上述步骤并向服务器请求这些资源浏览器根据其请求到的资源、数据渲染页面最终向用户呈现一个完整的页面。连接结束。 33、DNS 的解析过程 主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是如果主机所询问的本地域名服务器不知道被查询的域名的 IP 地址那么本地域名服务器就以 DNS 客户的身份向根域名服务器继续发出查询请求报文(即替主机继续查询)而不是让主机自己进行下一步查询。因此递归查询返回的查询结果或者是所要查询的 IP 地址或者是报错表示无法查询到所需的 IP 地址。 本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点当根域名服务器收到本地域名服务器发出的迭代查询请求报文时要么给出所要查询的 IP 地址要么告诉本地服务器“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的 IP 地址告诉本地域名服务器让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后要么给出所要查询的 IP 地址要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后本地域名服务器得到了所要解析的 IP 地址或报错然后把这个结果返回给发起查询的主机。
34、谈谈你对域名缓存的了解
为了提高 DNS 查询效率并减轻服务器的负荷和减少因特网上的 DNS 查询报文数量在域名服务器中广泛使用了高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
由于名字到地址的绑定并不经常改变为保持高速缓存中的内容正确域名服务器应为每项内容设置计时器并处理超过合理时间的项例如每个项目两天。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销而减少此时间值可提高域名解析的正确性。
不仅在本地域名服务器中需要高速缓存在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库维护存放自己最近使用的域名的高速缓存并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息而且主机必须从缓存中删除无效的项。由于域名改动并不频繁大多数网点不需花精力就能维护数据库的一致性。
35、谈下你对 HTTP 长连接和短连接的理解分别应用于哪些场景
在 HTTP/1.0 中默认使用短连接。也就是说客户端和服务器每进行一次 HTTP 操作就建立一次连接任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源如JavaScript 文件、图像文件、CSS 文件等每遇到这样一个 Web 资源浏览器就会重新建立一个 HTTP 会话。
而从 HTTP/1.1 起默认使用长连接用以保持连接特性。使用长连接的 HTTP 协议会在响应头加入这行代码
Connection:keep-alive在使用长连接的情况下当一个网页打开完成后客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭客户端再次访问这个服务器时会继续使用这一条已经建立的连接。
Keep-Alive 不会永久保持连接它有一个保持时间可以在不同的服务器软件如Apache中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
36、HTTPS 的工作过程
1、 客户端发送自己支持的加密规则给服务器代表告诉服务器要进行连接了
2、 服务器从中选出一套加密算法和 hash 算法以及自己的身份信息地址等以证书的形式发送给浏览器证书中包含服务器信息加密公钥证书的办法机构
3、客户端收到网站的证书之后要做下面的事情 验证证书的合法性 果验证通过证书浏览器会生成一串随机数并用证书中的公钥进行加密 用约定好的 hash 算法计算握手消息然后用生成的密钥进行加密然后一起发送给服务器。
4、服务器接收到客户端传送来的信息要做下面的事情
4.1 用私钥解析出密码用密码解析握手消息验证 hash 值是否和浏览器发来的一致4.2 使用密钥加密消息
5、如果计算法 hash 值一致握手成功。
37、HTTP 和 HTTPS 的区别 开销HTTPS 协议需要到 CA 申请证书一般免费证书很少需要交费 资源消耗HTTP 是超文本传输协议信息是明文传输HTTPS 则是具有安全性的 ssl 加密传输协议需要消耗更多的 CPU 和内存资源 端口不同HTTP 和 HTTPS 使用的是完全不同的连接方式用的端口也不一样前者是 80后者是 443 安全性HTTP 的连接很简单是无状态的HTTPS 协议是由 TSLHTTP 协议构建的可进行加密传输、身份认证的网络协议比 HTTP 协议安全
38、HTTPS 的优缺点
优点 使用 HTTPS 协议可认证用户和服务器确保数据发送到正确的客户机和服务器 HTTPS 协议是由 SSL HTTP 协议构建的可进行加密传输、身份认证的网络协议要比 HTTP 协议安全可防止数据在传输过程中不被窃取、改变确保数据的完整性 HTTPS 是现行架构下最安全的解决方案虽然不是绝对安全但它大幅增加了中间人攻击的成本。
缺点 HTTPS 协议握手阶段比较费时会使页面的加载时间延长近 50%增加 10% 到 20% 的耗电 HTTPS 连接缓存不如 HTTP 高效会增加数据开销和功耗甚至已有的安全措施也会因此而受到影响 SSL 证书需要钱功能越强大的证书费用越高个人网站、小网站没有必要一般不会用 SSL 证书通常需要绑定 IP不能在同一 IP 上绑定多个域名IPv4 资源不可能支撑这个消耗 HTTPS 协议的加密范围也比较有限在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的SSL 证书的信用链体系并不安全特别是在某些国家可以控制 CA 根证书的情况下中间人攻击一样可行。
39、什么是数字签名
为了避免数据在传输过程中被替换比如黑客修改了你的报文内容但是你并不知道所以我们让发送端做一个数字签名把数据的摘要消息进行一个加密比如 MD5得到一个签名和数据一起发送。然后接收端把数据摘要进行 MD5 加密如果和签名一样则说明数据确实是真的。
40、什么是数字证书
对称加密中双方使用公钥进行解密。虽然数字签名可以保证数据不被替换但是数据是由公钥加密的如果公钥也被替换则仍然可以伪造数据因为用户不知道对方提供的公钥其实是假的。所以为了保证发送方的公钥是真的CA 证书机构会负责颁发一个证书里面的公钥保证是真的用户请求服务器时服务器将证书发给用户这个证书是经由系统内置证书的备案的。
41、Cookie 和 Session 有什么区别
1、由于HTTP协议是无状态的协议所以服务端需要记录用户的状态时就需要用某种机制来识具体的用户这个机制就是Session.典型的场景比如购物车。
当你点击下单按钮时由于HTTP协议无状态所以并不知道是哪个用户操作的所以服务端要为特定的用户创建了特定的Session用用于标识这个用户并且跟踪用户这样才知道购物车里面有几本书。
这个Session是保存在服务端的有一个唯一标识。在服务端保存Session的方法很多内存、数据库、文件都有。集群的时候也要考虑Session的转移在大型的网站一般会有专门的Session服务器集群用来保存用户会话这个时候 Session 信息都是放在内存的使用一些缓存服务比如Memcached之类的来放 Session。
2、思考一下服务端如何识别特定的客户这个时候Cookie就登场了。每次HTTP请求的时候客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的第一次创建Session的时候服务端会在HTTP协议中告诉客户端需要在 Cookie 里面记录一个Session ID以后每次请求把这个会话ID发送到服务器我就知道你是谁了。
有人问如果客户端的浏览器禁用了 Cookie 怎么办一般这种情况下会使用一种叫做URL重写的技术来进行会话跟踪即每次HTTP交互URL后面都会被附加上一个诸如 sidxxxxx 这样的参数服务端据此来识别用户。
3、Cookie其实还可以用在一些方便用户的场景下设想你某次登陆过一个网站下次登录的时候不想再次输入账号了怎么办这个信息可以写到Cookie里面访问网站的时候网站页面的脚本可以读取这个信息就自动帮你把用户名给填了能够方便一下用户。这也是Cookie名称的由来给用户的一点甜头。
所以总结一下
Session是在服务端保存的一个数据结构用来跟踪用户的状态这个数据可以保存在集群、数据库、文件中。
Cookie是客户端保存用户信息的一种机制用来记录用户的一些信息也是实现Session的一种方式。