Appearance
网络有哪几层?
应用层:http,ssh,stmp,dns等
表示层:
会话层:
传输层:TCP,UDP
网络层:ip,arp,
数据链路层:
物理层:
HTTP常用的请求方式和用途?
GET:获取数据
POST:提交数据
PUT:提交修改数据
DELETE:删除
HEAD:获取头部信息
CONNECT:建立连接隧道,用于代理服务器
OPTIONS:列出可对资源请求的方法,常用于跨域
TRACE:追踪请求,响应传输的数据
CORS跨域
同源策略
Http 请求的方法 HEAD?OPTION?PATCH,什么是 restful?Https 的握手过程?哪四次?有什么区别?
状态码
HTTP常用状态码
101 :Switching Protocols,请求切换协议,比如:http切换为websocket
200:OK,请求成功
204:No Content,成功状态码,但响应头没有body数据
301:Moved Permanently,永久重定向,请求的资源不在了,需要改用新url访问
302:Found,临时重定向,请求的资源还在,但暂时需要另一个url
304:Not Modified,客户端缓存的资源是最新的,不需要重新获取
400:Bad Request,请求报文语法错误
403:Forbidden,禁止访问的资源
404:Not Found,访问的资源不存在或找不到
500:Internal Server Error,服务器发生了错误
502:Bad Gateway,网关出错
503:Service Unavailable,服务器维护或者过载,服务不可用,无法处理
504:Gateway Timeout,网关超时
301和302的区别
301:表示url已永久转移到了新的url上,以后都用这个新的url,浏览器会缓存这个重定向,以后都直接访问新url
302:表示只是临时移动了新的位置,但原url还是有效的,浏览器不会缓存,
500原因?处理?
解决:
查看nginx,php的日志,看有没有错误记录;
如果是too many open files,修改nginx的worker_rlimit_nofile参数,使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf,还是出现too many open files,那就要考虑做负载均衡,把流量分散到不同服务器上去
如果是脚本问题,修改脚本错误,优化代码
502原因?处理?
Bad Gateway,作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
Nginx将请求提交给网关(php-fpm)处理异常
php-fpm的问题:进程数设置太少,无法处理大量请求;
nginx配置问题:缓冲区设置过小,fastcgi_buffers 8 16k 或 fastcgi_buffer_size 32k 设置过小,无法容纳php-fpm返回大量数据;
资源不足:cpu,内存等不足使php-fpm无法处理;
网络问题:nginx和php-fpm的网络不稳定或延迟
注:location ~ .php$ {
include snippets/fastcgi-php.conf;
//设置为sock或tcp
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
}
503原因?处理?
服务不可用,可能请求过载,限流等
比如:nginx 设置了 每个ip的连接数限制(limit_conn)或请求数限制(limit_req)
504原因?处理?
Gateway timeout网关超时; 可能因为程序的执行时间超过了nginx的等待时间 php执行时间超过nginx等待时间:php的max_execution_time设置不合里
nginx等待时间过短:fastcgi_connect_timeout,fastcgi_read_timeout,fastcgi_send_timeout,导致php未处理完就关闭连接
网络问题:nginx和php-fpm的网络不稳定或延迟
注:location ~ .php$ {
include snippets/fastcgi-php.conf;
//设置为sock或tcp
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
}
GET和POST的区别?
| 特性 | GET | POST |
|---|---|---|
| 用途 | 获取资源 | 提交数据 |
| 参数显示 | 参数在URL | 参数不会URL |
| 参数长度限制 | 长度受限于浏览器 | 没有参数长度限制 |
| 安全性 | 较低,历史记录看见 | 较高 |
| 幂等性 | 是,多次请求同一URL,结果相同 | 否,多次请求可能产生不同的结果,或产生副作用 |
| 缓存 | 可 | 不 |
| 后退/刷新按钮 | 无害,可以安全使用 | 数据会被再次提交(F5刷新页面) |
| 书签 | 可以被书签保存 | 无法被书签保存 |
| 传输类型 | 适用于请求数据 | 适用于提交数据 |
POST和GET那个更安全?
①如果是对于普通用户来说,post更安全,因为get网址(历史书签记)上能看到参数,而post网址看不到参数,刷新后退浏览器会有提示;
②对于专业人员来看,都不安全,使用了https加密好些;
③http协议上定义的安全请求是不会破坏资源,get是只读的,无论多多少次都是安全,结果都一样;post是提交数据会创建资源,所以是不幂等的;
④取决开发者怎么用;
COOKIE和SESSION区别?
1.cookie是服务端发送给客户端的,并保存在本地的数据,在浏览器下次向同一域名发起请求时会携带上cookie。用于告知多个请求是否来自于同一个用户,保持登录状态等。使基于HTTP无状态协议记录稳定的信息成为可能 2.因为http是无状态的协议,要识别哪些请求是有关联的;session指服务器和客户端一次会话的过程, 3.cookie存在客户端,session存在服务端 4.单个cookie长度有限制不能大于4k,session无限制 5.cookie不够安全可能,session依赖于cookie 6.客户端请求服务器创建session后,返回seseionid,保存在cookie那,下次请求携带上这个cookie,从而判断登录状态等
HTTP
HTTP和HTTPS的区别?
HTTP,超文本传输协议,是基于TCP/IP的通信协议;
HTTPS为了解决HTTP不安全的问题,使用SSL证书来验证服务器身份,并对传输数据进行加密;
1.HTTP是明文传输,HTTPS是密文
2.HTTP默认端口为80,HTTPS默认端口为443
3.HTTPS消耗更多的资源,因为需要加密解密
4.HTTP不安全,HTTPS安全;
5.从浏览器同源策略上来说是不同的url,算跨域

HTTP的请求过程和原理?
HTTP是基于TCP/IP的超文本传输协议
1.客户端DNS解析,得到IP地址
2.对这个IP的服务器建立连接(三次握手)
3.建立TCP连接后发起HTTP请求
4.服务端处理请求后响应,的到html代码
5.客户端解析html代码,渲染
6.服务端关闭连接(四次挥手)
HTTPS的流程是怎样的?
1.用户在浏览器输入https的网址,然后连接到server的443端口 2.服务端有一套证书(公钥和私钥),服务端将自己的公钥发送给客户端 3.客户端收到公钥后,进行校验,有问题就弹出警告;生成一个密钥(对称加密),用证书的公钥进行加密 4.客户端发起https中的第二个http请求,将加密的密钥发给服务端 5.服务端收到密文后,用私钥进行非对称解密,解密得到客户端密钥,然后用客户端密钥进行非对称加密,形成密文 6.服务端将密文发给客户端 7.客户端用客户端密钥对密文进行非对称解密得到数据 
HTTP的几种缓存机制?
1.强缓存:不会发起请求,直接从(客户端)缓存中读取资源; 打开chrome的控制台的network,请求的size变成from disk cache 或from memory cache; expires:过期时间; Cache-Control:max-age;一个过期就过期了;
2.协商缓存:发起请求,request header带参数判断是否命中缓存, 命中就返回304并带上新的response header通知浏览器从(客户端)缓存中读取资源; Etag:唯一标识; If-None-Match, Last-Modified, If-Modified-Since
对称加密和非对称加密区别?
1.对称加密:加密解密使用相同的密钥的加密算法 2.非对称加密:加密和解密使用公钥私钥的加密算法
什么是XSS攻击?如何避免?
XSS攻击:跨站脚本攻击;在web里嵌入恶意代码,浏览网页时会执行,达到攻击目的 避免 1.用户传的参数有进行校验, 2.要进行hmtl转义(htmlspecialchars转义,strip_tags过滤html)
3.对script a 标签等进行过滤,dom里的事件 4.限制输入长度 5.前端使用vue等mvvm框架,只有使用v-html才渲染html
什么是CSRF攻击?如何避免?
CSRF:跨站请求伪造攻击;盗用了你的身份,去做恶意请求; 比如:你A网站登陆了,点击一个B网站连接,这个网站跳转到A网站发红包的页面
避免:
1.添加refer字段标明来源;
2.加token;
3.尽量post请求,判断post请求的来源($_SERVER['HTTP_REFERER'] )
从浏览器输入网址到页面显示,发生了什么?
1.浏览器解析url 2.DNS查找真正的ip; 3.与服务器三次握手,建立tcp连接; 4.发起http请求 5.服务器处理请求,并返回HTTP报文 6.浏览器解析渲染页面 7.连接结束
DNS的作用?
是一个将域名和IP地址相互映射的域名系统。
解析过程(分级解析): 根域名 — 顶级域名 — 二级域名
步骤(递归查询本地服务器,迭代查询其他远程服务器):
看看DNS缓存里有没有,有的话直接返回; 使用UDP向DNS服务器发送查询消息; 接收返回的响应消息;
DNS的解析过程?
就是为了找ip 1.检查浏览器缓存,找ip 2.本地DNS服务器缓存中 3.根域名服务器,告诉本地DNS服务器去哪个顶级域名域名服务器查找 4.顶级域名服务器查找,告诉本地DNS服务器去哪个权限域名服务器查找 5.权限域名服务器告诉哪个ip
TCP
TCP是一个可靠的,面向连接,基于字节流,全双工的协议 面向连接:发送数据前要进行握手,断开要挥手 可靠:对包校验和;包的序列号解决重复,乱序的问题;超时重传;流量控制,拥塞控制 基于字节流:没有边界(\r\n区分) 全双工:在 TCP 中发送端和接收端可以是客户端/服务端,也可以是服务器/客户端,通信的双方在任意时刻既可以是接收数据也可以是发送数据,每个方向的数据流都独立管理序列号、滑动窗口大小、MSS 等信息。
TCP和UDP的区别?
tcp是面向连接,可靠的传输层协议,只能一对一,全双工,使用场景:http,ssh,smtp等
tcp是无连接的,一对一,多对多全都行,使用场景:dns
| 对比项 | UDP | TCP |
|---|---|---|
| 连接性 | 无连接 | 面向连接 |
| 可靠性 | 不可靠 | 可靠 |
| 报文 | 面向报文-数据报模式 | 面向字节流-流模式 |
| 双工性 | 一对一、一对多、多对一、多对多 | 全双工 |
| 流量控制 | 无 | 有(滑动窗口) |
| 拥塞控制 | 无 | 有(慢开始、拥塞避免、快重传、快恢复) |
| 传输速度 | 快 | 慢 |
| 资源要求 | 较少 | 较多 |
| 首部开销 | 8字节 | 20字节 |
| 数据顺序 | 不保证 | 保证 |
TCP是如何保证可靠性的?
1.连接基于三次握手,断开基于四次挥手,保证了连接和断开的可靠性
2.TCP是有状态的传输协议;会记录哪些数据发送了,哪些接受了,哪些没接受,并且保证包的有序到达,
3.可控性:数据包校验,ACK应答,超时重传(发送方),失序数据重传(接收方),丢弃重复数据,流量控制(滑动窗口,控制拥塞),等
TCP/IP如何保证包的传输的有序性?
对字节流分段并进行编号然后通过 ACK 应答和超时重发这两个机制来保证。 (1)为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区; (2)并为每个已发送的数据包启动一个超时定时器; (3)如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区; (4)否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止。 (5)接收方收到数据包后,先进行CRC校验,如果正确则把数据交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可方在数据包中捎带过去。
半连接是什么?
当客户端发syn到服务端,服务端收到后回syn+ack,服务端的tcp从listen状态变为syn_rcvd,会将连接信息放入队列(半连接队列)
TCP粘包?怎么发送?
Tcp粘(年)包是指发送方发送若干个包到接收方,接收方接收时粘在一起了,前一个包的后头紧接者包的头。 通过特殊字符区分边界,比如\r\n
TCP流量控制
TCP流量控制的核心就是动态地调整发送窗口和接收窗口的大小 流量控制是为了调整发送方的发送速率,使得接收方来得及接收。
接收方的确认报文中有一个窗口字段,用来控制发送方的窗口大小,从而控制发送速率。
发送窗口(swmd=min(rwmd,cwmd)),接收窗口(rwnd,接收端),拥塞窗口(cwmd,发送端的);偏移量,序号(seq) Seq=x,rwnd=200,接收者返回窗口的大小,可以动态调整
TCP超时重传?
将数据包未ack的重新传一遍
TCP滑动窗口?
如果tcp传一段,应答一段,那性能会更差;为了更快地传输,所以就有了滑动窗口。 会设定了窗口的大小, 开始会按照窗口的大小发送数据段,然后ack的偏移量,进行滑动这个窗口。 出现丢失会进行重传,在将后边的数据段继续发送
假设发送100字节的数据包,每次发送的长度就是窗口的大小; 假设窗口大小是5字节,一开是从0到4发送; 返回了0,1,3,4的ack,2没成功; 就会定时重传,法松2位置的包,直到成功; 发送过程中,接收方告知能它的接收窗口多大,能处理多少,然后会调整发送窗口的大小; 全部发送成功之后,就将窗口滑动到5-10(假设窗口还是6)
TCP拥塞控制?
网络出现拥堵时,可能会出现数据丢失,延时;这是tcp会重传数据,但是重传可能导致更多的延时和丢失,导致恶性循环。为了避免这些情况,就有了拥塞控制。 过程: 1.三次握手后,双方通过ack告诉对方接收窗(rwnd)口的大小 2.双方初始化拥塞窗口(cwnd)的大小 3.cwnd初始值较小,每收一个ack就+1,每经过一个rtt(往返时间),就变为2倍
拥塞窗口:只要网络无故障,就会不断增大;反之减少; 发送窗口=min(接收窗口,拥塞窗口(发送端的)); 算法:慢启动,拥塞避免,快速重传和快速恢复 慢启动阈(玉)值(ssthresh) Cwnd <ssthresh,慢启动; Cwnd>ssthresh,拥塞避免; 慢启动:拥塞窗口的初始值很小(linux默认10),随着时间推移,一直不丢包的话,拥塞窗口的值会越来越大。 拥塞避免:每一个rtt(往返时间),+1; 快速重传和快速恢复: 收到不按顺序的数据段时,tcp就发送重复的ack,当发了3个重复ack,就意识到丢包了,进行重传 三次重复ack,进入快快速恢复,拥塞阈值和拥塞窗口变为1半,拥塞窗口线性增加
TCP keepalived 是什么,有什么作用
该机制用于检测TCP连接是否存活;
三次握手的过程?
三次握手就是建立tcp连接时要发三个包 1.第一次握手,客户端发送(SYN=1,seq=x)的包,发送后,客户端进入SYN_SEND状态 2.第二次握手,服务端发(SYN=1,ACK=1,seq=y,ACKnum=x+1)的包,发送后,服务端进入SYN_REV状态 3.第三次握手,客户端发(ACK=1,ACKnum=y+1)的包,客户端进入ESTABLISHED 状态,建立三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次握手:服务器收到syn包并确认客户的SYN(ack=j+1),同时也发送一个自己的SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
四次挥手的过程?
客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最 后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。