http详解
2021-01-30 17:40:13 3 举报
AI智能生成
http详解
作者其他创作
大纲/内容
基础
什么是 HTTP
HyperText Transfer Protocol「超文本传输协议」
超文本
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
传输
传输意味着至少有两个参与者,比如 A,B
HTTP 协议是个双向协议
允许中间有中转或者接力,只要参与者间遵循约定的协议即可传输
与 HTTP 相关的各种协议
URI/URL
URI
统一资源标识符
URL
URL 其实是 URI 的一种子集
URI 定义资源,而 URL 不单定义这个资源,还定义了如何找到这个资源
由四个部分组成:协议、主机、端口、路径
TCP/IP 协议
网络分层
link layer: 链接层
负责在以太网,WIFI 这样的底层网络上发送原始数据包,工作在网卡这一层,使用 MAC 地址来标记网络上的设备,所以也叫 MAC 层
Internet layer: 网络层
IP 协议即处于这一层,提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,並具有一定的拥塞控制和流量控制的能力
transport layer: 传输层
该层的协议为应用进程提供端到端的通信服务,这层主要有 TCP,UDP 两个协议,TCP 提供面向连接的数据流支持、可靠性、流量控制、多路复用等服务,UDP不提供复杂的控制机制,利用 IP 提供面向无连接的简单消息传输
application layer: 应用层
应用层协议可以想象为不同的服务,每个应用层协议都是为了解决某一类应用问题而生的,每一个服务需要用不同的协议,规定应用进程在通信时所遵循的协议
应用层在请求传输数据时必须事先要知道对方的 IP 地址,然后才能开始传输
DNS 协议
以www.example.com为例的DNS的解析流程
HTTP 报文格式
连接管理
HTTP 0.9,1.0
发送完 HTTP 报文后, 连接立马关闭,这种连接被称为短链接
HTTP 1.1
Connection: keep-alive
默认开启
保持长链接,进行多次http请求响应
队头阻塞
HTTP 规定报文必须一发一收,如果在要连接上发多个 HTTP 报文,多个报文会被累积到队列里依次处理(不能并行处理)只要队首的请求被阻塞了,后续 HTTP 的发送就受到影响
HTTP 2.0
头部压缩,最高达 90% 的压缩率
维护一份静态的字典
维护一份相同的动态字典
支持基于静态哈夫曼码表的哈夫曼编码
二进制格式
Header+Body 消息打散为了数个小版的二进制"帧"(Frame),
“HEADERS”帧存放头数据、“DATA”帧存放实体数据
“HEADERS”帧存放头数据、“DATA”帧存放实体数据
流
二进制帧的双向传输序列
同一个消息往返的数据帧 (header 帧和 data 帧)会分配一个唯一的流 ID,区分每一个请求
在 HTTP 2 中,两个请求同时发送,可以同时接收,而在 HTTP 1.1 中必须等上一个请求响应后才能处理下一个请求
HTTP 2 的队头阻塞
分帧最终还是要传给下层的 TCP 层经由它封装后再进行传输,每个连接最终还是顺序传输这些包
在网络不佳的情况下只要一个包阻塞了,由于重传机制,后面的包就被阻塞,导致上层应用拿不到包处理
https加解密过程
tpc网络协议
三次握手
简化
1. A:在不在?
2.B:在,有屁快放
3.A:好的,可以说正事
四次挥手
简化
1.A:分手!
2.B:好的,我收到。等我先把你的东西还给你
3.B:东西都还给你了,分手吧!
4.A:拜拜
(B收到确定后删掉联系方式)
(B收到确定后删掉联系方式)
为什么TCP要三次握手?
防止重复连接
防止旧的重复连接引起连接混乱问题,如果 TCP 握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接。
如果 TCP 是三次握手的话,那么客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接
如果 TCP 是三次握手的话,那么客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接
同步初始化序列化
TCP 为了保证在不稳定的网络环境中构建一个稳定的数据连接,它就需要一个“序列号”字段来保证自己的稳定性,而这个序列号的作用就是防止数据包重复发送,以及有效的解决数据包接收时顺序颠倒的问题
三次握手可以实现 TCP 初始化序列号的确认工作,TCP 需要初始化一个序列号来保证消息的顺序
为什么连接的时候是三次握手,关闭的时候却是四次握手?
挥手的时候,服务端收到FIN指令,需要先把还在发送的数据包发送完毕,
所以需要先响应ack,数据包发送完毕事项准备好之后,才能向客户端发送FIN指令
所以需要先响应ack,数据包发送完毕事项准备好之后,才能向客户端发送FIN指令
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
在Client发送出最后的ACK回复,但该ACK可能丢失。
Server如果没有收到ACK,将不断重复发送FIN片段。
所有client要等到2MSL都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接
Server如果没有收到ACK,将不断重复发送FIN片段。
所有client要等到2MSL都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接
MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间
0 条评论
下一页