网络
- http协议
- http与网络安全
- TCP/UDP
- DNS解析
- Session/Cookie
HTTP
- 请求/响应报文
- 连接建立的流程
- HTTP的特点
请求报文
- 请求行
- 方法、URL、协议版本、
- CRLF (Carriage-Return Line-Feed)回车换行符
- 请求头部
- 首部字段名:值 CRLF
- 首部字段名:值 CRLF
- CRLF
- 实体
- get不带
- post带
响应报文
- 响应行
- 版本、状态码、短语(状态码的描述)、CRLF
- 响应头部
- 首部字段名:值 CRLF
- 首部字段名:值 CRLF
- CRLF
- 响应实体
HTTP的请求方式都有哪些?
get、post、head、put、 delete、options
get和post方式有何区别?
get请求参数以?分割拼接到URL后面,post请求参数在Body里面
get参数长度限制2048个字符,post一般没有该限制
get请求不安全,post请求比较安全
-
get用来获取资源?
- 安全的
- 幂等的
- 可缓存的
-
post处理资源
- 非安全的
- 非幂等的
- 不可缓存的
这些数据都是从RFC(Request For Comments)获取的。
安全性
- 不引起server端的任何状态变化
- get、head、options
幂等性
- 同一个请求方法执行多次和执行一次的效果完全相同。
- get、put、delete
可缓存性
- 请求是否可以被缓存
- get 、head
- 官方文档定义的一个规范,代理服务器可以缓存,
状态码
2XX(成功)、3XX(发生网络的重定向)、4XX(客户端发出的请求有异常)、5XX(server有异常)
HTTP的连接过程
HTTP中的TCP连接的三次握手,和四次挥手
三次握手
- 1、client -> syn -> server
- 2、server -> syn,ack -> client
- 3、client -> ack -> server
传输数据
- 4、Client -> http请求报文 ->server
- 5、Server -> http响应报文 ->Client
四次挥手
- 6、client -> FIN -> server
- 7、server -> ACK -> client
- 8、server -> FIN、ACK -> Client
- 9、Client -> ACK -> server
HTTP的特点
-
无连接
- HTTP的持久连接方案
- 如何理解HTTP的持久连接方案
-
无状态 (多次发送http请求,如果是同一个用户,server端是不知道的)
- http如何规避无状态?
- Cookie、session
- http如何规避无状态?
HTTP的持久连接
非持久连接
每次发送网络请求都是需要重新创建TCP的连接的。
持久连接
打开一条TCP通道,之后在一定时间,多个HTTP请求可能都是这条TCP链路上面进行的请求的。在经历一定时间之后,会关闭这条TCP通道。提升的HTTP请求响应的效率。
请求头部字段
- Connection :keep-alive
- time:20 持续多久有效
- max: 这条连接最多发生多少次请求报文和响应报文对的次数。
如何判断一个请求是否结束的?
- content-length : 1024
- 响应报文有一个content-length,当我们响应完成以后,根据这个字段的内容,来判断我们接收到的数据字节数有没有达到content-length,如果达到就代表已经完成了请求。
- Chunked
- 在响应报文中的头部字段有一个chunked,该请求的最后一次请求中的响应报文头部字段有一个Chunked为空的字段,那么久整个这个请求已经完成了。
Charles抓包的原理是怎么样的?
- 利用了中间人攻击漏洞来实现的。
HTTPS与网络安全
HTTPS是安全的HTTP,它的安全是由应用层之下,传输层之上的TLS/SSL协议决定的
HTTPS和HTTP什么区别?
HTTPS = HTTP + SSL/TLS
HTTPS的协议栈
HTTPS连接建立流程是怎么样的?
- client -> (报文)client支持TLS版本号,支持的加密算法,Random numberC -> server
- server -> 选择的加密算法,random number S, server证书 -> client
- client -> 验证server证书,也就是验证公钥、私钥是否正确,server是否合法
- client -> 组装会话密钥,通过Random numberC、S和预主密钥。
- Client -> 通过server的公钥对预主密钥进行加密传输 -> server
- server -> 通过私钥来解密的到预主密钥
- server -> 组装会话密钥,通过Random numberC、S和预主密钥组装会话密钥
- client -> 加密的握手消息 -> server 验证安全通道是否完成
- server -> 返回一个加密的握手消息 -> client 安全通道创建完成
会话密钥
会话密钥 代表的是对称加密的一个结果。
会话密钥 = 一定的算法(random S + random C + 预主密钥)
HTTPS都使用了哪些加密手段? 为什么?
- 对称加密
- 非对称加密
- 耗时
因为加密和解密非对称加密的算法是不一样的,所以在连接建立过程中,使用非对称加密来保证安全。
如果连接建立以后,数据传输的时候用对称加密,来解决这种耗时操作带来的性能损耗。
TCP/UDP
传输层协议
TCP
传输控制协议
TCP的特点
- 面向连接
- 可靠传输
- 面向字节流
- 流量控制
- 拥塞控制
面向连接
- 数据连接之前,需要建立连接
- 三次握手
- 数据传输完成以后,需要释放连接
- 四次挥手
可靠传输
无差错
不丢失
不重复
按序到达
-
可靠传输在TCP层面是通过停止等待协议来实现的。
- 无差错情况
- 超时重传
- 确认丢失
- 确认迟到
无差错情况:
超时重传:
通过重传策略能保证:1、差错校验2、不丢失
确认丢失:
client -> 分组报文 -> server
server -> 确认报文 -> 丢失没有传给client
这个时候,client可以冲过超时重传,来解决没有响应的问题,client超时重传,同时server在收到这个分组报文以后,要做两个步骤:1、丢弃掉重传的M1报文,发送给client确认报文
确认迟到:
确认报文,在网络当中被堵死,等client超时重传已经完成以后才拿到server的确认报文时,这个超时的确认报文,client接收以后不做任何操作。
面向字节流
- 当发送方发送数据,有一个发送缓冲,而接收方也有一个接收缓冲
- 发送方每次发送给接收方的字节数,TCP会根据自己的情况进行划分,发送方发送了10个字节,并不是一次性把10个字节全部发送给接收者,一次性发送多少字节的数据时TCP根据情况自己决定的。
流量控制
是基于滑动窗口协议实现的
发送窗口时根据接收窗口的大小来控制的。是根据报文的头字段进行控制的。
当我们现在要继续发送数据的时候,可能由于接收方的接收窗口没有那么大,如果说发送方的窗口非常大的话,实际上就是需要确认报文的时候,在头部添加一个字段来控制发送窗口的大小。
拥塞控制
- 慢开始、拥塞避免
- 快恢复、快重传
慢开始、拥塞避免:
一开始发送1个报文,如果没有产生拥塞就继续发送2个,如果还是没有拥塞就继续按照指数增长发送报文,直到发送到门限初始值的时候,发送的报文指数增量变成了线性增量,直到出现网络拥塞(网络拥堵判断比较复杂,比如可以这么理解连续三个报文的确认ACK都没有收到那么就可以判定时网络拥塞),然后按乘法减小,来减少发送报文的数量直到发送一个报文,再重新开始开始,并调整它的门限值。
快恢复、快重传:
在拥塞以后,直接从新的门限值开始使用拥塞避免加法增大策略进行发送报文
TCP的问题
为什么要做三次握手?
假如是2次握手。
假设发送一个syn同步报文,在网络环境中超时,发生超时以后,客户端会发生一个超时重传的策略,重新发送一个syn同步报文,当server端收到syn的报文以后,会向client发送一个syn、ack确认报文,如果是2次握手那么就相当于建立了tcp连接,
假如说,上述2次握手已经完成了,那么重试之前的超时syn报文,发送到了server端,那么server端肯定会认为又有一个TCP建立连接的请求。实际上client建立的连接只有一次。
那么我们用三次握手?
当我们超时的报文被server接收以后,会发送一个确认报文给client,,如果说client已经建立起了TCP连接,那么就不会向Server发送最终确认报文,那么server短也就不会建立起来第二个TCP连接。
为什么要四次挥手
client跟server是全双工的概念
- Client -> FIN -> server
- Server -> ACK -> client 此时client就已经关闭了。而server端并没有关闭
- 如果这时候server端还有数据没有传完,那么继续传数据。
- 当server数据发送完成以后 Server -> FIN\ACK -> client
- client -> ACK -> server
UDP
用户数据报协议
UDP特点
- 无连接, 不需要建立连接
- 尽最大努力交付 ,不可靠传输
- 面向报文,既不合并,也不拆分
UDP的功能
- 复用
- 分用
- 差错检测
复用
socket使用的时候需要ip和端口号,同一个IP地址的电脑上面不同的端口代表不同的应用。同一个应用也可能使用不同的应用层的协议,它们对应的端口号不一样,不管哪一个端口即将要传输数据出去都可以传输层UDP数据报,在经由IP。这就是多端口复用的概念。
分用
从Ip层接收了一个IP数据报数据(每一个数据报都有源端口和目标端口的概念),把它拆分成UDP,根据目标端口进行分发,这就是分用的概念
差错检测
UDP进行差错检测的时候需要拼接的内容。
上述表红色位校验位,当接收方接收到UDP数据的时候采用同样的办法的到检验和,是否和传过来的检验和一样,如果一样就没问题,如果不一样就会出现问题
NDS解析
了解NDS解析吗?
域名到IP地址的映射,DNS解析请求采用UDP数据包,且名文
client通过DNS协议向DNS服务器请求对相应域名的解析,得到Ip地址,再由client向对应的IPserver发送相应的网络请求。
NDS解析查询方式?
- 递归查询 (我去帮你问一下)
- client去本地DNS请求获取IP,本地DNS不知道,它会去找根域,根域没有找顶级DNS,顶级没有就找权限DNS,找到以后在按照原路返回给Client
- 迭代查询 (我告诉你谁可能知道)
- client去本地DNS请求获取IP,本地DNS不知道,它会去找根域DNS,根域会告诉你顶级DNS有可能知道,我告诉你谁可能知道,你自己去问
NDS解析存在哪些常见的问题?
- DNS劫持
- DNS解析转发问题
DNS劫持
DNS解析是UDP数据报,且是名文的,钓鱼服务器会劫持到你的请求,并返回给你错误的IP地址,最终客户端拿到一个错误的serverIP。
DNS劫持与HTTP的关系是怎么样的?
- DNS劫持根HTTP完全没有关系的。
- DNS解析发生在HTTP建立之前
- DNS解析请求使用UDP数据报,端口号是53
DNS解析转发
如何解决DNS劫持?
- httpDNS
- 长连接
httpDNS
使用DNS协议向DNS服务器的53端口进行请求换成使用HTTP协议向DNS服务器的80端口进行请求
,119.29.29.29 时中国最大的DNS中介服务器,名字叫DNSport
http://119.29.29.29/d?dn=域名&ip=自己的ip地址
长连接
Session/Cookie
HTTP协议无状态特点的补偿
Cookie
Client多次发送请求,server是无法记住到用户是不是之前的某个用户
Cookie主要用来记录用户状态,区分用户:状态保存在客户端。响应报文头部有一个setCookie这个字段。后续的请求报文头部添加Cookie字段值为响应的Set-Cookie
怎么样修改Cookie?
- 新Cookie覆盖旧Cookie
- 覆盖规则:name、path、domain等需要与原Cookie一致。
怎么样删除一个Cookie?
- 新Cookie覆盖旧Cookie
- 覆盖规则:name、path、domain等需要与原Cookie一致。
- 设置Cookie的expires=过去的一个时间点,或者maxAge=0
怎么保证Cookie的安全?
- 对Cookie进行加密处理 脚本可以破解
- 只在https上携带Cookie 不容易破解
- 设置Cookie为httpOnly,防止跨站脚本攻击
Session
Session也是用来记录用户状态,区分用户的。状态存放在服务器
Session和Cookie的区别
- Session把状态存放到服务器端
- Cookie把状态存放在客户端
Session和Cookie关系是怎么样?
Session需要依赖与Cookie机制来实现
Session的工作流程
面试题
HTTP的GET和POST方式有什么区别?
GET
- 安全是的get请求不会改变server的状态
- 幂等的,请求一次或者多次的到的结果是一样的
- 可缓存的
POST
- 不安全的,post可以修改server的状态
- 不幂等的,请求一次或者多次的到的结果是不一样的
- 不可缓存
HTTPS连接建立流程是怎么样?
TCP和UDP有什么区别?
TCP
- TCP是面向连接的,支持可靠传输、面向字节流,
- 包括TCP提供了流量的控制跟拥塞的控制
UDP
- 只是简单的提供了复用、分用、差错检测的基本传输层的功能
- 无连接的
简述TCP的慢开始过程?
客户端怎么样避免DNS劫持?
- httpDNS
- 长链接DNS
TCP连接的时候为什么是三次,而不是二次?
假如是2次握手。
假设发送一个syn同步报文,在网络环境中超时,发生超时以后,客户端会发生一个超时重传的策略,重新发送一个syn同步报文,当server端收到syn的报文以后,会向client发送一个syn、ack确认报文,如果是2次握手那么就相当于建立了tcp连接,
假如说,上述2次握手已经完成了,那么重试之前的超时syn报文,发送到了server端,那么server端肯定会认为又有一个TCP建立连接的请求。实际上client建立的连接只有一次。
那么我们用三次握手?
当我们超时的报文被server接收以后,会发送一个确认报文给client,,如果说client已经建立起了TCP连接,那么就不会向Server发送最终确认报文,那么server短也就不会建立起来第二个TCP连接。
四次的挥手,为什么要两方面的断开
Client和server是全双工的概念
- Client -> FIN -> server
- Server -> ACK -> client 此时client就已经关闭了。而server端并没有关闭
- 如果这时候server端还有数据没有传完,那么继续传数据。
- 当server数据发送完成以后 Server -> FIN\ACK -> client
- client -> ACK -> server
在client关闭完成以后,server如果还有数据没有发送完成,server端还是可以单独向client发送数据,直到完成在发送 FIN\ACK结束报文,client在响应ACK报文,这样就相当于整个HTTP请求结束