/@TOC
1. 长连接优缺点
优点:省去较多的TCP建立和关闭的操作,较少浪费,节约时间,对于频繁请求的客户端比较适用。例如数据库的连接,网络游戏
缺点:维护链接浪费资源,在大量长连接连接的情况下,服务器负载过大
2. UDP比TCP快的原因
无需建立和维护连接,没有流量控制和拥塞控制,没有超时重传机制,不需要回应
UDP多用于:视频聊天,广播,直播
TCP:面向连接,提供可靠交付,有流量控制,拥塞控制,面向字节流,提供全双工通信,每一条连接是一对一;
UDP:无连接的,面向报文,支持一对一,一对多,多对多通信
3. 网络的7层协议(5层)
①物理层,考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异
②链路层,网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧
③网络层,为主机提供数据传输服务。而传输层协议是为主机中的进程提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组
④传输层,为进程提供通用数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:传输控制协议 TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段;用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。TCP 主要提供完整性服务,UDP 主要提供及时性服务
⑤应用层,为特定应用程序提供数据传输服务,例如 HTTP、DNS 等。数据单位为报文
4. 三次握手(建立连接)
原因:为了防止失效的连接请求到达服务器,让服务器错误打开连接
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。有了第三次握手,客户端会忽略掉超时的那个连接
过程:
①首先客户端发送连接请求syn,携带随机数x
②服务端返回请求ack,x + 1,说明服务端对x进行了回复
③客户端返回请求ack,y,说明接受到了信息并且开始传输数据,起始数据为y
5. 四次挥手(断开连接)
过程:
①客户端请求断开连接,发送fin请求
②服务端返回ack,进入close_wait状态,继续处理需要处理的数据,tcp变为半关闭
③服务端返回fin,将处理完的数据发到客户端,表明自己已经关闭
④客户端进入TIME_WAIT状态,客户端发最后一个ack到服务端,如果服务端已关闭则无反应,客户端经过2MSL(报文最大存活时间)后释放连接,确认服务端断开
⑤服务端接收确认后释放连接
TIME_WAIT作用:
①服务端需要可靠地终止连接,如果最后一次客户端发给服务端的ack报文丢失,则服务端会再发一次fin,此时客户端不应该关闭
②保证迟来的tcp报文有时间被丢弃,因为2MSL里超时抵达的报文都会被丢弃,使得下一个新的连接不会出现旧的连接请求报文
注意:大量的TIME_WAIT会占用大量的的端口和资源,要避免:修改etc/systl.conf
6. TCP可靠传输:
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段
7. TCP流量控制:
流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据
8. TCP拥塞控制:
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复
慢开始:cwnd=1,然后加倍传报文,直到设置的慢开始门限值ssthresh
拥塞避免: cwnd>=ssthresh 时,每次轮询只将cwnd加1,如果超时,则令ssthresh = cwnd/2,然后重新执行慢开始
快重传: 在接收方,要求每次接收到报文段都对最后一个有序报文段进行确认,例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认
在发送方,如果收到三个重复确认,那么可以知道有一个报文段丢失,此时执行快重传,例如收到三个 M2,则 M3 丢失,立即重传 M3
快恢复:令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免,即最后一段。慢开始每次的 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh
9. 相关协议
ARP:由IP地址得到MAC地址:每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射
NAT:专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP
DHCP:动态主机配置协议,配置内容包括:IP地址,子网掩码,网关IP
DNS: 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据
ICMP:控制报文协议,用于在IP主机、路由器之间传递控制消息,网络层,控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息
DNS查找过程 https://blog.youkuaiyun.com/wxy941011/article/details/80822987
递归查询:DNS服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS服务器本地没有存储查询DNS信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机(用于主机向本地域名服务器的查询)
迭代查询:DNS所在服务器若没有可以响应的结果,会向客户机提供其他能够解析查询请求的DNS服务器地址,当客户机发送查询请求时,DNS服务器并不直接回复查询结果,而是告诉客户机另一台DNS服务器地址,客户机再向这台DNS服务器提交请求,依次循环直到返回查询的结果(用于本地域名服务器向根域名服务器的查询)
查询过程:
①客户机提出请求,首先在host文件,DNS缓存中查找IP地址,如果没有,向本地域名服务器进行递归查询,如果缓存没有,进行下一步
②本地域名服务器采用迭代查询,向根域名服务器查询
③根域名服务器返回一个查询域(根的子域)
④该子域查询自己的缓存,没有的话,子域返回本地域名服务器下一次查询的ip地址
⑤重复第四步,直到找到结果
⑥本地域名服务器把返回的结果进行缓存,同时将结果返回给客户机
10. Web请求过程:
①如果主机最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取
②ARP解析MAC地址
③知道网关路由器的MAC地址,开始DNS解析,浏览器缓存 -> 系统缓存 -> 路由器缓存
④web端向服务端发起请求,三次握手建立连接
⑤发送HTTP请求报文
⑥服务器接收请求,处理后返回
⑦断开TCP连接,四次挥手
11. HTTP方法:
①GET:获取资源
②POST:传输实体的主体
③HEAD:获取报文首部,和GET一样,但是不返回报文实体部分
④PUT:上传文件,但是自身不带验证机制,存在安全性问题,一般不使用
⑤PATCH:对资源进部分修改,PUT只能完全替代原始资源,PATCH可以部分
⑥DELETE:删除文件,自身不带验证机制
⑦OPTIONS:返回指定URL能够支持的方法,比如会返回 Allow: GET, POST
⑧CONNECT:要求在与代理服务器通信时建立隧道
⑨TRACE:服务器会将通信路径返回给客户端
12. HTTP的header包含的内容
Host:请求的主机地址
Accept:客户端可以接受的内容类型
Accept-Language:客户端可以接受的语言类型
Accept-Encoding:客户端可以接受的压缩编码格式
User-Agent:浏览器类型的详细信息
响应首部内容:
Date:服务器端发出信息的时间
Range:后面是范围字节的大小,如500字节,用于下载断点恢复,不用重新下载整个文件(Range: bytes=0-1023)
Accept-Ranges:是否接受字节范围请求,否则使用none
Connection:colse(长连接关闭,1.1版本后默认是开启的,keep_alive)
13. http状态码:
①1XX: 接收的请求正在请求
②2XX: 请求正常处理完毕
③3XX: 需要进行附加操作才能完成操作
④4XX: 服务器无法处理请求(客户端错误状态码)
⑤5XX: 服务器处理请求出错(服务端错误状态码)
**3XX 重定向**
①301 Moved Permanently :永久性重定向
②302 Found :临时性重定向
③303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源
注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法
④304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码
⑤307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法
**4XX 客户端错误**
①400 Bad Request :请求报文中存在语法错误
②401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败
③403 Forbidden :请求被拒绝
④404 Not Found
⑤405 方法不被允许
**5XX 服务器错误**
①500 Internal Server Error :服务器正在执行请求时发生错误。服务端代码出错
②503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
14. 如何保证数据库中用户的安全性,传输过程中的安全性
哈希,用md5,有的用户信息过于简单,如123456,防止被拖库,对每个数据加salt后再md5加密。使其更复杂。
HTTPS:安全传输,因为http是明文传输的,不够安全,需要加密:对称加密,非对称加密,数字证书。
HTTPS采用混合加密机制,使用非对称加密传输密钥,用对称加密保证通信效率
对称加密:速度快,不够安全
非对称加密:速度慢,安全性高,用公钥加密的数据,只有对应的私钥才能解密;用私钥加密的数据,只有对应的公钥才能解密。但是,黑客截取了server给client传输的公钥,黑客把自己的公钥给client,client发送数据,黑客截取,用自己的密钥破解,再用server的公钥发数据给server。这样数据就被篡改了。
https://www.cnblogs.com/kubidemanong/p/9390021.html
数字证书:为了解决非对称加密的公钥,密钥的归属问题:
为了防止摘要被人调换,用CA提供的私钥对消息摘要进行加密来形成数字签名
最后还会把原来没Hash算法之前的信息和数字签名合并在一起,形成数字证书
比对过程:(前提:客户端会内置CA的证书)
15. HTTP和TCP区别:
Http在应用层,Tcp在传输层,前者负责数据如何进行包装,后者负责传输
16. 浏览器禁用Cokkie的处理:
使用 URL 重写技术,将 Session ID 作为 URL 的参数进行传递
17. GET和POST区别
https://www.cnblogs.com/logsharing/p/8448446.html
GET:参数出现在URL中,因为URL只支持ASCII码,GET的中文参数会被转码。浏览器默认使用GET方式,理论上没有长度限制,除非浏览器限制。GET会将header和data一起发送出去,只产生一个TCP数据包,GET没有请求体,放在url中,所以不安全
POST:参数存储在主体中,也不是很安全,可以被抓包获取。POST会先发header再发数据,产生两个TCP数据包,节约带宽,POST不会缓存数据,GET会
实质上都是TCP连接,由于HTTP和浏览器/服务器的限制,导致了不同
18. 幂等性
https://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html
幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用,所有的安全方法也都是幂等的,在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。性能上比分布式事务高。
应用场景:扣钱操作,超时处理,避免多次扣钱,给每一个扣钱操作分配一个action_id, action_id只能被处理一次
19. 可缓存
如果要对相应进行缓存,要满足以下条件:
①请求报文的HTTP方法本身是可以缓存的,包括GET和HEAD,PUT和DELETE不支持缓存,一般POST也不支持缓存
②相应报文的状态码是可缓存的
③响应报文的 Cache-Control 首部字段没有指定不进行缓存
20. HTTP1.0,HTTP1.1,HTTP2.0区别
HTTP1.1主要改进:
①提出的长连接,减少了建立和关闭连接的消耗和延迟
②支持只发送Header而不发送Body,先判断Header是否成功,再发数据,节约带宽,和POST一样
③增加host字段,由于虚拟主机可以支持多个域名,所以一般将域名解析后得到host
HTTP2.0主要改进:
①支持多路复用,用一个连接并发处理多个请求,把http数据包拆为多个帧,并发有序的发送,根据序号在另一端进行重组,而不需要一个个http请求顺序到达
②压缩请求头,使用二进制数据流(实现方便且健壮)1.1每次都要重复发送,要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输
③服务器推送:客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求,比如请求页面,server会返回js和css资源文件
④支持流量控制,和TCP的滑动窗口类似
⑤2.0只适用于HTTPS,因为其在HTTP和TCP加了一层ssl层
21. 常见网络攻击处理
①DDos:前端加一个CDN中转,购买盾机,用于隐藏真实ip,IP黑名单,访问次数限制,防火墙
②XSS跨站脚本攻击:对输入进行检验(恶意添加脚本)
③跨站点请求伪造CSRF: 禁止js跨域访问,避免全站通用的cookie,严格设置cookie的域,添加token验证,通过 referer 判定来源页面(伪造用户的操作,服务器难以区别,token比较有效)
④SQL注入: 预处理语句,信息别明文存放,过滤参数
22. SSL和TLS
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使 用加密确保私密性,以实现客户端和服务器之间的安全通讯
TLS :(Transport Layer Security Protocol):安全传输层协议 ,安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性