TCP/IP 模型:数据链路层、网络层、传输层、应用层
OSI模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
HTTP2
- 常见头部用静态表和Huffman编码压缩,后续请求头部也可用动态表,体积也大大压缩
- 实现Stream并发
- 服务器支持主动推送资源
- 二进制编码
缺点:队头阻塞,握手时延高,连接迁移需要重新连接
HTTP3
- 无队头阻塞
- 连接快,内部有TLS1.3,一个RTT就可以完成连接与密钥协商
- 连接迁移,通过连接ID标记通信端点
TCP连接
客户端 | 服务器端 |
---|---|
SYN = 1,seq = x(发送随机初始化序号x) | |
SYN = 1,ACK = 1,seq = y,ack = x+1(收到序号为x的报文,应答x+1,随机初始化自己的序号y) | |
ACK = 1,seq = x+1,ack = y+1(收到序号y,并将y+1作为应答号,报文序号为x+1)【请注意TCP规定,普通的TCP确认报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下所发送的下一个数据报文段的序号仍是x + 1。】 |
采用三报文握手,而不是两报文握手来建立TCP连接,是为了防止已失效的连接请求报文段突然又传送到了TCP服务器进程因而导致错误。
seq即同步序列编号(Synchronize Sequence Numbers)syn->Synchronize
ack即确认号(acknowledgement number)
TLS
RSA四次握手(TLS 1.2)
客户端 | 服务器端 |
---|---|
ClientHello - TLS Version(客户端使用的TLS版本号) - CLient Random(生成的随机数) - Cipher Suites(支持的密码套件) |
|
ServerHello - TLS Version(确认的TLS版本) - Server Random(服务器端随机数) - Cipher Suite(最终选择的密码套件) Server Certificate(发送服务器端证书) Server Hello Done(服务器Hello完成) |
|
Client Key Exchange(检验完证书后,再次生成随机数PreMaster,发送) Change Cipher Spec(由CLient Random、Server Random、PreMaster生成会话密钥,以后改用会话密钥加密通信) Finished |
|
Change Cipher Spec(解密出PreMaster,同样生成一样的会话密钥,以后改用密钥加密通信) Finished |
共需要4次握手,2个RTT时延( RTT(Round-Trip Time):往返时延。从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。)
RSA密钥协商不支持前向加密。客户端一开始传递随机数时使用服务器公钥加密,由服务器私钥解密,这里可能存在服务器私钥泄露,后续所有信息被第三方截获破解。
ECDHE四次握手(TLS 1.3)
客户端 | 服务器端 |
---|---|
ClientHello - TLS Version(客户端使用的TLS版本号) - CLient Random(生成的随机数) - Cipher Suites(支持的密码套件) |
|
ServerHello - TLS Version(确认的TLS版本) - Server Random(服务器端随机数) - Cipher Suite(最终选择的密码套件) Server Certificate(发送服务器端证书) Server Key Exchange(选择椭圆曲线,生成随机数为私钥,由私钥通过椭圆曲线算出公钥,发送椭圆曲线、公钥给客户端) Server Hello Done(服务器Hello完成) |
|
Client Key Exchange(检验完证书后,生成随机数为私钥,由椭圆曲线算出客户端公钥,发送公钥) Change Cipher Spec(自身私钥对方公钥椭圆曲线算出一个值,再由该值、CLient Random、Server Random,生成最终会话密钥,以后改用会话密钥加密通信) Encrypted Handshake Message(将之前发送的数据做一个摘要,再用会话密钥发送加密后,验证对称密钥是否可用) |
|
Change Cipher Spec(自身私钥对方公钥椭圆曲线算出一个值,再由该值、CLient Random、Server Random,生成最终会话密钥,以后改用会话密钥加密通信) Encrypted Handshake Message(将之前发送的数据做一个摘要,再用会话密钥加密加密后,验证对称密钥是否可用) |
ECDHE 相比 RSA 握手过程省去了一个消息往返的时间(1 RTT),在还没连接完全建立前,就发送了应用数据,这样便提高了传输的效率。
TCP断开连接
客户端 | 服务器端 |
---|---|
FIN = 1,ACK = 1,seq = u,ack = v | |
ACK = 1,seq = v,ack = u+1 | |
(中间还可以继续传数据) | |
FIN = 1,ACK = 1,seq = w,ack = u+1 | |
ACK = 1,seq = u+1,ack = w+1 | |
在没有数据要发送且开启TCP 延迟确认机制后,第二次挥手和第三次挥手会合并成一次
等待2MSL原因:1.防止旧连接的数据包影响 2.保证连接正常关闭