网络分层模型
OSI七层模型
- 物理层:底层数据传输, 为数据链路层提高传输介质。比如网线, 网卡标准。 数据被称为比特流
- 数据链路层: 定义数据基本格式,管理相邻节点是如何传输,如何标识的。比如网卡MAC地址。 数据被称为帧
- 网络层: 定义IP编址,定义路由功能, 进行路由和寻址。比如不同设备数据转发。 数据被称为包
- 传输层: 端到传输数据的基本功能,比如TCP、UDP传输协议在这一层。 数据被称为 段
- 会话层:控制应用程序之间会话能力,如不同软件数据分发给不同软件
- 表示层:数据格式标识,压缩加密功能
- 应用层:各种应用软件,包括Web应用
OSI七层只是一个标准,不是实现。TCP/IP四层是实现的应用模型。
TCP/IP 四层模型
- 应用层: 位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务。 定义信息交换格式,信息交给传输层传输
- 传输层:负责向两个终端设备进程之间之间的通信提供通用的传输服务。主要有 TCP、UDP两种协议
- 网络层:网络层选择合适的路由找到目的主机把传输层产出的报文段或者用户数据报封装成分组和包进行传送
- 网络接口层:数据链路层和物理层的合体。把网络层的IP数据报组装成帧,然后以
- 比特流进行传输
HTTP
HTTP是一个无状态协议, HTTP协议通信过程:
HTTP请求过程
- 域名解析
- 发起TCP的三次握手
- 建立TCP连接后发起HTTP请求
- 服务器响应 HTTP 请求,浏览器得到 HTML 代码
- 浏览器解析 HTML 代码,并请求 HTML 代码中的资源
- 浏览器对页面进行渲染呈现给用户, 并断开连接
简单来说就是建立连接、发送请求、响应请求、页面渲染呈现、断开连接
HTTP1.0、1.1区别,
HTTP/1.0默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接
HTTP/1.1默认使用长连接,用以保持连接特性
短连接和长连接如何选择
长连接意味着进行一次数据传输后,不关闭连接,长期保持连通状态。
长连接适用于:两个进程之间需要高频通信并且具备服务端主动推送或者有状态(串行) 的场景。 例如聊天室,实时游戏等。
短连接适用于:两个进程之间通信频率较低,属于无状态(可并行)的场景。 例如:网页浏览等
侧重性能就长连接、侧重编码便捷性就短连接
HTTP2 为什么快
HTTP/2.0采用二进制分帧+多路复用,可以在共享TCP连接的基础上同时发送多个请求和响应
HTTP 和 HTTPS协议的区别
HTTPS是HTTP的安全版本,HTTP与TCP之间有一个特殊的加密/身份验证
https的端口是443,而http的端口是80。http传输是明文的,而https是用ssl进行加密的
HTTPS的原理、请求流程
HTTPS采用数据对称加密传出,对称密钥使用非对称加密协商
HTTPS连接可以分为三个阶段:
- 证书校验:浏览器向服务器发送请求,服务器会先将含服务器公钥的证书给浏览器, 浏览器验证公钥信息, 包括域名、是否过期,签发机构等
- 对称密钥协商: 证书验证通过后,在本地生成并缓存随机串(这就是对称密钥),然后通过公钥对随机串进行加密传给服务器,服务器端用自己的私钥解密随机串,解密出来的随机串作为对称密钥
- 业务数据传输:用对称密钥加解密
TCP、UDP
TCP和UDP都是工作在传输层的协议。
TCP
TCP是面向连接的(一对一)、可靠的(保证报文一定到达接收端)、基于字节流的(不限制大小)
TCP传输前需要先连接,TCP四元组可以唯一的确定一个连接:源地址、源端口、目的地址、目的端口
主要应用在可靠连接,例如:文件传输、邮件发送与接收、重要状态的更新
UDP
UDP是不需要连接的,立即发送数据,可以一对多、多对多。 不保证可靠,一个包一个包发送、包是有界的,可能丢包和乱序。
主要应用在要求通信的响应度高,对数据信息的安全性和完整性要求相对较低。常用于实时通信, 例如:视频会议、网络电话等
TCP三次握手
TCP头部包含: 源端口号、目的端口号、序列号、确认应答号、等(首部长度、窗口大小,校验和、保留位、选项、数据)
- 浏览器向服务器发送一个 SYN报文, 随机初始化报文序列号x
- 服务器收到SYN报文,返回一个SYN/ACK报文, 也随机初始化报文序列号y,然后把 x + 1放到确认应答号
- 客户端收到报文, 回应一个ACK报文, 序列号为:x + 1(过来的确认应答号), 确认应答号为 y + 1 (回应的序列号+1)
为什么需要三次
三次握手防止旧的重复连接,造成混乱。(如果旧的响应比新的响应先到,客户端得告诉服务器旧的作废,不然就可能重复连接造成混乱)
三次握手避免浪费资源,三次握手就够同步双方初始化序列号
如果两次握手,只要收到服务器响应就建立连接。 客户端没法告诉服务器回来的这个响应是不是客户端想要的最新的响应。
TCP断开连接——4次挥手
客户端和服务端都可以主动断开连接,断开连接后,服务器资源将被释放。
假设是客户端主动断开:
- 客户端发送FIN报文,客户端进入FIN-WAIT-1状态
- 服务端接收到该报文,返回ACK报文,服务端进入COLSED_WAIT状态
- 客户端接收到ACK报文,进入FIN-WAIT-2状态。服务端完成数据处理,发送FIN报文给客户端, 服务端进入 LAST_ACK状态
- 客户端收到FIN报文,回应ACK报文,进入TIME_WAIT状态
- 服务端收到ACK报文,进入CLOSE状态。客户端等2倍报文最大生存时间后,自动今天CLOSED状态
每个方向都要发一个FIN和一个ACK报文,所有需要4次挥手
TCP滑动窗口和拥塞控制机制
TCP如何保证可靠性
概念区别
Post 和Get 请求的区别
客户端对服务器的请求有四种类型: get、post、put、delete
get 是从服务器获取数据, post 是向服务器传送数据
get 请求会把请求参数放到URL中,用户可以看到,相对不安全。 post请求在Request Body 中用户看不见,相对安全些
get产生一个TCP数据包,把header和data一起发送给服务端,成功则返回200
post产生两个TCP数据包,是先把header传给服务器端,服务器返回100,在把data 传给服务器,成功则返回200.
get是幂等的,post非幂等
Cookie 和 Session 的区别
Cookie是存在客户端的,每个网站只对应一个,存量有限。每次浏览器访问对应服务器的时候,如果有cookie就会带上cookie。
比如如果我们在网页上登录某网站时输入用户名和密码时如果保存为cookie,那么每次访问都不需要登录网站了,为了安全最好不要在cookie中放敏感信息
Cookie限制数据量4KB
Session 是针对每个用户的,一般存在服务器上,主要负责访问者与网站之间的交互。当访问增多会占用服务器性能。
两者都是为了记录用户信息以便服务器分辨不同的用户,有各自的使用局限