网络结构,网络协议和网络分层
首先是自底向下地利用蟹堡王的比喻可以理解网络结构的目的
- 外卖:谁吃? 吃什么? 送到哪?
- 转发分店: 来自,发往,内容; 转发分店的位置;
- 顾客:客户端; 分店:服务端; 转发分店:路由器; 转发表格:网络协议; 总体来说,结构是:服务器->企业路由器->ISP路由器->家庭路由器->终端 另外,根据网络规模可将比奇堡,几个分店,全国通信分别比作网络局域网,城域网,广域网; 电路交换, 分组交换分别比作电话和传真;
接下来利用快递体系来比喻网络协议分层: 网络分层:应用层(快递员),传输层(卡车),网络层(高速公路),链路层,物理层; 协议定义了两个和多个通信实体间交换的报文格式和顺序, 以及报文发送和接受报文后或其他事件所采取的动作; 报文大体分为标头和载荷, 寄件人和收件人(应用层)关注寄件收件地址和寄件收件人信息, 而快递公司(网络层)还需要关注中间的集散地;
然后就是硬核的报文展示:
- 链路层帧(frame):介质, 源,目标;(协议?)
- ip分组(packet): 协议版本, 源ip, 目标ip,载荷长度, (下一个协议?);
- tcp报文段(segment): 源端口号, 目标端口号,序列号(seq),确认序号(?)(ack(=seq`+1)) 头部长度, 窗口大小
- http报文(message): 请求方法, 路径, 协议版本,请求头;
然后是tcp报文结构
http1.0/http1.1/http2.0/http3.0
首先是http协议报文结构
-
请求:
- 请求行: 方法 路径 协议版本
- 请求头/空行
- 请求体
-
响应
- 响应行:协议版本 状态码
- 响应头/空行
- 响应体
http的发展问题:
- 短连接浪费: http1.1改为了默认长连接,不需要keep-alive;
- 队头堵塞: http2.0使用帧,实现了一条tcp连接多路复用;(还介绍了帧的结构);另外实现了头部压缩,服务端推送;
- tcp自身的队头堵塞问题, tcp+tls握手时间3rtt(这里涉及的略复杂,暂时不探究);所以使用QUIC协议,融合了tcp和tls,第一次1rtt连接,第二次0rtt;
cdn运行原理
用cdn来减轻服务器压力,降低延迟; dns解析时,如果解析发现是cdn服务,就交给cdn专用的dns服务器解析,返回负载和位置合适的cdn服务器ip; cdn拷贝策略:拉策略,用户请求了就进行拷贝,过段时间丢弃;推策略:服务端主动要求拷贝和丢弃;
websocket
特点:有状态的持久连接,服务器推送,延迟更低; 由http升级而来(Connect:upgrade,upgrade:websocket;101 swtiching pro);
网络安全(https/ssl/tls/)
三要素:机密性, 完整性, 身份验证; 对称加密和非对称加密:公钥私钥是否使用相同密钥(保证机密性) 密码散列函数(哈希函数,摘要函数):任何不同的输入都会生成不同的哈希值(保证完整性) 数字签名: 私钥加密后的明文内容的哈希值, 内容一般是包含公钥的证书;(保证身份验证)
验证数字签名具体过程是:服务器将自己的信息和公钥登记到CA机构, CA机构颁发公钥证书并用独有的私钥并进行数字签名;客户端拿到服务端的公钥证书后,用哈希函数生成证书内容的消息摘要,用植入浏览器的CA公钥对数字签名解密,对比两者;然后就可以用服务器公钥加密来向服务器发送对称密钥的协商信息了;
总的来说: https= http+tls tls = 身份验证+加密和解密 客户端身份验证使用http协议, 服务端身份验证通过pki