从输入URL到页面显示发生了什么
简洁步骤
- 浏览器使用DNS协议查找URL对应的IP地址,生成Http请求报文
- 客户端通过ip和端口号向服务端发起建立TCP连接
- 在TCP连接的基础上向服务端发送http请求报文
- 服务端接收到请求报文并解析,生成对应的html页面发送给客户端
- 客户端解析http请求,渲染并展示html页面,同时根据Html中的其他资源的url(例如图片,css等)再次发起http请求,获取完整资源内容
使用到的协议
- 应用层:DNS协议,Http协议
- 传输层:TCP协议
- 网络层:IP协议,OSPF(开放最短路径优先协议), ARP协议(ip地址寻找转换为MAC地址)
- 网络接口层
HTTP状态码
- 1xx:正在处理请求
- 2xx:成功处理
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务端错误
Http与Https有什么区别
- 端口号:http默认为80,https默认443
- URL前缀
- https具有安全性:https是运行在SSL/TLS之上的HTTP协议,ssl协议运行在TCP协议之上,所有传输内容都经过对称加密,但对称加密的密钥用服务方的证书进行了非对称加密
- SEO(搜索引擎优化):搜索引擎会更优先使用https协议
Http1与http1.0区别
- 连接方式:http1.1支持长连接。http协议的长短连接实质上是TCP协议的长短连接
- 状态响应码:http1.1中新增了大量的状态码,比如100(continue)在请求大资源前的预热请求
- 缓存机制:HTTP/1中主要使用header的 if-modified-since,Expires作为缓存是否可用的标准,Http/1.1引入了更多的缓存控制策略例如Entity tag,if-Unmodified-Since,If-Match,If-None-Match等更多的请求头控制缓存策略
- 带宽:http1.1在请求头中引入了range头域,它允许只请求资源的某个部分
- Host头:http1.1引入了host头字段,允许在同一ip地址上托管多个域名,从而支持虚拟主机的功能。
Http/2
http1.1与http2.0区别
- 多路复用:http/2在同一连接上可以同时传输多个请求和响应,互不干扰。http1.1使用串行方式,每个请求和响应都需要独立的连接
- 二进制帧:http2使用二进制帧进行数据的传输,http1.1使用文本格式的报文
- 头部压缩:http1.1支持body压缩,header不支持压缩,http2使用HPACK算法压缩头部
- 服务器主动推送:客户端使用奇数Stream号发起请求,服务端使用偶数号Stream进行主动推送
Http2和http3的区别
- 传输协议:
- http2是基于tcp协议实现的,而http3在http2的基础之上新增了QUIC(quick UDP Internet Connections)协议来实现可靠传输。QUIC可以看作UDP的升级版本,在其基础上增加了加密,重传等。
- 连接建立:
- Http2由于底层是TCP协议,需要经过三次握手过程,需要3个RTT来实现连接的建立和通信。而http3由于底层是QUIC协议(如果使用TLS1.3传输,TLS1.3支持1个RTT握手,还支持0个RTT握手),连接的建立仅需要1个或0个RTT。
- 对头阻塞:
- Http2由于多个请求复用一个tcp连接,一旦发生丢包,会阻塞所有的Http请求。由于QUIC协议本质上是多路复用+轮询机制,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,在一定程度上解决了对头阻塞问题。
- 错误恢复:
- Http3具有更好的错误恢复机制,当出现丢包、网络延迟等问题时可以更快地进行恢复和重传。http2需要依赖TCP地错误恢复机制。
- 安全性:
- HTTP2使用TLS协议进行加密,而http3基于QUIC协议,包含了内置的加密和身份验证机制,可以提供更强的安全性。
Http1,hhttp2,http3对比
协议栈对比 ![[Pasted image 20240616104511.png]]
- HTTP2使用TLS协议进行加密,而http3基于QUIC协议,包含了内置的加密和身份验证机制,可以提供更强的安全性。
http2的升级
- 兼容http1.1
- 只在应用层做了改变,仍然基于TCP协议传输,但是把http分解为了【语义】和【语法】两部分
- 语义层与http/1.1一致,请求方法,状态码,头字段等规则保持不变
- 语法层面做了很多改造
头部压缩
http报文是由header+body构成的,header部分有很多重复的占字节量大的字段,因此需要采用HPACK算法对header部分做改造。
- 需要压缩:很多固定字段,Cookie,User Agent,Accept等
- 减少重复字段
- 字段为ASCII编码,有必要改成二进制编码
HPACK算法
三个组成部分
- 静态字典:包含61组index–header name–header value的维护关系,例如index=2代表采用post请求
- 动态字典:静态表只包含了61种高频出现的头字符串,不在静态表范围内的字符串需要自行构建动态表
- Huffuman编码(压缩算法) 客户端与服务端都会建立和维护【字典】,用索引号表示重复的字符串,再用Huffman压缩数据,可达到50%-60%的压缩率。
二进制帧
把http/1.1中的文本格式改成二进制格式传输数据,提高了传输与解析数据的效率 http/2把传输报文分为两类帧,headers和DATA帧。这两种帧都分别有各自的格式。
并发传输
http/1.1对头阻塞:1.1是基于请求-响应模型的,如果上一个事务未响应,则后续事务需要等待,这就会造成队头阻塞 通过Stream设计,多个Stream复用一条TCP连接,从而达到并发效果。
Stream的格式
一个stream里有多个Message,Message中对应Http的请求或响应(由头部和包体构成) Message中包含一条或多条Frame,Frame是Http/2的最小单位,以二进制格式压缩存放Http/1中的内容 ![[Pasted image 20240604211951.png]]
意义
- Stream帧可以乱序发送,但内部的帧必须是有序的
- Stream帧头部会携带Stream ID信息,用于组装Http消息
- 效果: 当http/2实现100个并发Stream时,只需要建立一个TCP连接,http/1.1需要建立100个TCP连接。
服务器主动推送资源
- 客户端使用奇数Stream号发起请求,服务端使用偶数号Stream进行主动推送。
- 服务端会通过PUSH_PROMISEZ帧传输Http头部,并通过promised Stream ID 字段告知客户端,接下来会在哪个偶数号Stream中发送包体。
URL和URI的区别
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。 URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
Cookie和Session的区别
todo
GET和POST的区别
- 语义:
- get通常用于资源的查询和获取资源,POST请求通常用于创建或修改资源。
- 幂等:
- GET请求是幂等的,即多次请求不会改变资源的状态,而POST请求不幂等,每次执行可能会产生不同的结果或影响资源的状态。
- 格式
- Get请求的请求数据是拼接在URL之后的,形成查询字符串,post请求通常放在请求体中(body),可以有多种编码格式。
- get请求参数长度受到浏览器和服务器的限制,而Post请求的body没有明确的大小限制。
- 缓存
- 由于get请求是幂等的,所以可以被一些浏览器或其他中间节点(代理,网关)缓存起来,以提高效率和性能。post不适合被缓存,因为每次的执行可能需要实时的响应。
- 安全性
- 其实如果二者使用http协议都不安全,但是get请求比post请求更加容易泄露敏感数据,因为get请求的参数通常放在URL中
Http协议与RPC协议
- 其实如果二者使用http协议都不安全,但是get请求比post请求更加容易泄露敏感数据,因为get请求的参数通常放在URL中
Websocket
什么是webSocket
websocket是一种基于TCP连接的全双工通信,服务端和客户端可以同时发送和接收数据。 它本质上是应用层的协议,弥补了http协议在持久通信能力上的不足。客户端和服务器 仅需要一次握手,而这就可以创建持久性的连接,进行双向数据传输。
websocket与http的区别
- websocket双向实时的通信协议,http单向通信协议。http只能由客户端发起,服务端无法主动通知客户端
- websocket协议前缀ws://,http前缀http://
- websocket通信数据格式比较轻量,数据包头相对较小,http每次通信都要携带完整的头部
Websocket工作过程
- 客户端向服务端发送http请求,请求头中包含:
Upgrade: websocket
和Sec-WebSocket-Key
等字段,表示要将协议升级为ws协议 - 服务器收到请求,支持升级协议,会回复一个HTTP101状态码,响应头中包含
Connection: Upgrade
和Sec-WebSocket-Accept: xxx
等字段、表示成功升级到 WebSocket 协议 - 连接建立,可以进行双向的数据传输,数据以帧的形式进行传输。发送端会将消息切割成多个帧发送给接收端,接收端再重新组装
- 二者可以主动发送一个关闭帧,表示断开连接,另一方收到回复一个关闭帧,双方关闭TCP连接。