计算机网络模型
键入网址后会发生什么
浏览器对URL进行解析
通过DNS域名解析获取IP地址
生成HTTP请求报文
TCP三次握手建立连接
客户端向服务端发送HTTP请求
服务端收到请求向客户端返回数据
浏览器渲染页面
TCP四次挥手断开连接
HTTP
HTTP是什么?
HTTP是超文本传输协议,是应用层协议,超文本是指可以传输的内容不只是简单的文本还可以有视频图片等,传输协议是指一种计算机之间通信的行为约定和规范
HTTP常见的状态码
HTTP有哪些字段
Host字段:客户端发送请求时用来指定服务器的域名
content-Length字段:服务器返回数据时,用来表明本次回应的数据长度是多少字节
connection字段:用于 TCP持久连接设置成keep-alive即可持久连接
content-Type字段:用于服务器响应时告诉客户端返回数据的格式
content-encoding:说明数据的压缩方式
Get和Post的区别
Get请求的含义是请求从服务器获取资源,Post则是向服务器提交数据,数据放到请求体里
Get请求参数url可见,Post参数url不可见(Post相对安全)
Get请求可以缓存,Post不可以缓存
Get请求传输数据的大小在2k-4k,Post请求可以手动设置,且可以无限大
HTTP的优缺点
优点
简单:基本报文格式是请求行、请求头、请求体而且头部信息是key-value形式好理解
灵活易于扩展:HTTP协议中的各类请求方法都不是固定死的,比如URL、状态码、头信息都可以用户自定义和扩充HTTP位于应用层,所以下层可以发生变化HTTPS就是在应用层和传输层加了SSL/TLS
应用广泛跨平台
缺点
HTTP协议里有优缺点一体的两大双刃剑分别是无状态和透明传输,还要不安全的缺点
无状态
无状态的好处:服务区不需要记忆HTTP状态所以减轻了服务器的负担
无状态的坏处:既然不能记忆状态,那一些相关联的操作会有问题,比如添加购物车、下单、支付
解决方案:会话技术
明文传输
明文传输的好处:明文意味着传输过程中的信息方便阅读通过浏览器f12控制台直接就能看到
明文传输的坏处:正因为方便阅读,HTTP信息容易被人窃取
不安全
通信使用明文,内容可能被窃听。比如账号泄露
不验证通信放的身份,因此有可能遭遇伪装,比如假淘宝
无法证明报文完整性,有可能已经被篡改
HTTP与HTTPS的区别
HTTP是明文传输不安全,HTTPS解决了不安全的缺陷在HTTP和TCP之间加了SSL/TLS安全协议,使得报文加密传输提高安全性
HTTPS在TCP三次握手之后还需要进行SSL/TLS握手过程,才能进行加密传输
HTTP端口号80,HTTPS端口号443
HTTPS需要向CA申请数字证书
HTTPS解决了HTTP的窃听风险、篡改风险和冒充风险
HTTP版本的演变
HTTP/1.1相比于1.0多了长连接和管道通信提高了性能
但仍然存在性能瓶颈:
头信息没有压缩就发送,首部信息越大延迟越大
服务器按请求的顺序响应,如果服务器响应慢会导致对头阻塞
没有请求优先级控制
请求只能从客户端开始,服务端只能被动响应
HTTP2协议基于HTTPS相比于HTTP1.1有以下变化
头部压缩:如果同时发送多个请求他们的头是相似的或一样的协议会消除重复的部分
二进制格式:头部信息和数据体都换成了二进制格式
多路复用:HTTP2可以并发处理多个请求或回应而不用按顺序挨个处理
服务器推送:服务器不再被动响应,而可以主动向客户端发送数据
TCP
什么是TCP
TCP是面向连接的、可靠的、基于字节流的传输层通信协议
面向连接:一定是一对一才能进行连接,不像UDP可以一对多发送消息
可靠的:无论网络出现什么状况TCP都可以保证报文一定传输到接收端
字节流:消息是无边界的,无论多大都可以传输
如何唯一确定一个TCP连接
TCP和UDP的区别
TCP面向连接UDP无连接
TCP只能是一对一服务,UDP可以一对一、一对多、多对多
TCP可靠传输、UDP不可靠传输
TCP首部开销最低20个字节、UDP首部开销固定8字节
TCP是流式传输没有边界、UDP是按包传输有边界
TCP三次握手建立连接
一开始客户端和服务端都处于closed状态
首先客户端会随机初始化一个序列号将序列号置于TCP首部的序号字段,同时把SYN字段置为1,表示向服务端发起同步请求建立连接
服务端收到SYN报文后也会初始化一个序列号将其填入TCP报文首部然后把TCP首部的确认应答号填入 客户端序列号+1,接着把ACK和SYN设置成1,发送给客户端
客户端收到服务端报文后像服务端发送确认应答报文
服务端和客户端建立连接成功
为什么要三次握手?
三次握手可以阻止重复历史连接和初始化
三次握手可以同步双方序列号
三次握手可以避免资源浪费
TCP四次挥手断开连接
客户端打算断开连接时会发送一个TCP首部FIN=1的报文
服务端收到该报文后发送ACK=1的应答报文
客户端收到ACK应答报文之后进入等待状态
等服务端处理完数据后像客户端发送FIN=1的报文
客户端收到FIN=1的报文后回复一个ACK应答报文
服务端收到应答报文后进入closed状态
客户端等待2MSL后进入closed状态