夜阑卧听风吹雨
铁马冰河入梦来
前言
大学老师曾经说过,计算机界有三本天书,分别是:数据结构、计算机组成原理、计算机网络。所以网络也是我们从事计算机开发必须了解且掌握的一门技术,本文我将以为所理解的网络知识来用通俗的语言描述网络
网络七层模型
-
应用层
访问网络服务的端口,如HTTP传输 ‘hello,world’
-
表示层
提供数据格式转换
-
会话层
建立端连接并提供访问验证 如SSL/TLS认证
-
传输层
UDP/TCP + ‘hello,world’
-
网络层
IP + UDP/TCP + ‘hello,world’
-
数据链路层
MAC地址 + IP + UDP/TCP + ‘hello,world’ + 帧尾
-
物理层
传输二进制 01010101001
HTTP
-
请求/相应报文
**请求报文包括:** 请求方法 URL 协议版本HTTP1.0 首部字段名 请求体 (POST请求) **响应报文包括:** 版本 状态码 短语 首部字段名 响应实体
-
请求方法
GET:代表获取资源 特点: 安全:不应该引起Server端的任何状态变化 幂等:请求多次的结果一样 可缓存:代理服务器可以缓存
POST:
代表处理资源 特点: 不安全 不幂等 不可缓存
HEAD
OPTION
PUT -
状态码
200:请求成功
300:
请求重定向
400:
由于客户端请求地址和参数引用的失败
500:
服务端原因
-
连接接建立流程
TCP:三次握手、四次挥手
-
HTTP特点
无连接:每次请求都需要建立TCP连接
无状态
不会保存记录用户的信息和状态
-
解决HTTP无连接问题
在同一条TCP上面产生多次HTTP请求
头部字段(Header):Connection:keep-live Time: 20 在一定时间内不需要再次建立TCP连接 Max: 在建立连接时间内最多请求次数
判断一个请求的结束?
Content-length 空chunked
- 解决HTTP无状态问题
解决方案:Cookie / Session
HTTPS与HTTP的区别
HTTPS=HTTP+SSL/TLS:
在应用层和传输层之间增加了 SSL/TLS认证
查阅多方资料:SSL/TLS认证在会话层
HTTPS链接建立流程
- Client->Server:发送支持的TLS版本号,支持的加密算法,random number C
- Server->Client:商定的加密算法,random number S,server 证书(包括公钥)
- Client验证证书
- Client组装会话密钥
- Client通过server的公钥对预主密钥进行加密传输
- Server通过密钥解密得要预主密钥
- Server组装会话密钥
- Client发送加密的握手消息 (验证)
- Server发送加密的握手消息 (验证)
HTTPS的加密手段
- 建立连接的过程使用非对称加密(耗时)
- 后续通信过程使用对称加密
非对称加密
- 私钥加密公钥解密
- 公钥加密私钥解密
- 公钥:在网络中传输,密钥保存在服务端,所以非对称加密相对安全
对称加密
- 一把秘钥在网络中传递,不安全
TCP 控制传输协议
特点:
-
面向连接
数据开始传输之前建立连接(三次握手) 数据传输之后释放连接(四次挥手)
-
可靠传输
无差错、不丢失、不重复、按序到达、超时重传
-
面向字节流
会自动根本TCP自身情况传输字节大小,不受发送方控制, 最大传输单元 = 1500 =20个IP头+20个tcp头+data
-
流量控制
滑动窗口协议
-
拥塞控制
慢开始、拥塞避免 指数规律增长(报文个数:1、2、4、8、16) 达到门限初始值:开始加法增大 网络拥塞的时候:乘法减小到新的门限值 快恢复、快重传
滑动窗口协议
发送窗口以很快的速率去发送消息时,由于服务端接收窗口比较小,
此时接收窗口通过向TCP的报文首部字段去更改窗口值去更正或者调整发送端的发送速率
UDP 用户数据协议
特点
无连接:不需要建立连接流程
最大能力传输: 不保证按序到达
面向报文:不合并 不拆分
功能
复用、分用
DNS解析
域名到IP地址的映射,解析请求采用UDP数据报且明文的形式
使用DNS协议向DNS服务器的53端口进行请求
DNS解析过程
- Client通过DNS协议向DNS服务器请求相应域名的解析
- DNS服务器返回给客户端相应的IP
- 客户端拿到IP再向服务端发送网络请求
DNS解析查询方式
-
递归查询
依次询问返回:Client->本地DNS->根域DNS->顶级DNS->权限DNS
-
迭代查询
Client: 本地DNS、根域DNS、顶级DNS、权限DNS互相询问
DNS劫持
**原因在公网中存在第三方钓鱼DNS服务器拦截我们的DNS解析请求,返回给我们错误的IP**
怎样解决DNS劫持
httpDNS
DNS解析:使用DNS协议向DNS服务器的53端口进行请求
HTTPDNS解析:使用HTTP协议向DNS服务器的80端口进行解析,不会产生DNS解析就不会有DNS劫持
http://119.29.29.29/d?dn=www.xiaozhu.com&ip=172.18.134.109
长连接
Client <-(长连通道)>长连server(代理服务器) <-> API server
Client的HTTP请求是通过代理服务器通过内网专线进行内网的DNS解析这样就规避了公网DNS解析劫持的问题
DNS劫持和HTTP的关系?
没有关系
因为DNS解析发生在HTTP建立连接之前
因为DNS解析请求使用的UDP数据报,端口号53
DNS解析转发
Client->中国移动DNS->中国电信DNS->中国联通DNS ,由于协议限制,导致各个DNS解析商互相推脱,造成DNS解析缓慢,从而导致网络请求慢
Session/Cookie
对HTTP无状态的补偿,例如client发送请求之后,再次请求 无法记住用户
Cookie
用来记录用户状态,区分用户,状态保存在客户端
怎样保证cookie安全?
对cookie进行加密处理
只在HTTPS上携带cookie(推荐)
设置cookie为HTTPonly ,防止跨站脚本攻击
怎样修改cookie
新cookie覆盖旧cookie
覆盖规则:name、path、domian需要与原cookie一致
怎样删除cookie
新cookie覆盖旧cookie
覆盖规则:name、path、domian需要与原cookie一致
设置cookie的expire=过去的某个时间点或者设置maxAge=0
session
用来记录用户状态,区分用户,状态保存在服务端端
工作流程
Client向server发送消息,server记录用户状态生成sessionID
通过存在cookie中传给client
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。