HTTP/HTTPS/TCP原理
一、HTTP
1.1 网络分层请求
网络一共经历的大概以下几个分层,不同的网络介质消息需要通过转换。
1.2 OSI模型
1.3 一个HTTP的分层解析流程
- 首先输入域名http://test.com
步骤一
- 客户端1
- 应用层1:浏览器是不认识域名,只认识IP。浏览器会先查看是否有域名->IP的缓存,如果有则访问。如果没有则查看本地host文件,如果还是没有,就会发起一个DNS请求(传输层采用UDP)获取请求域名的IP地址。
- 传输层1:传输层采用UDP协议,经过传输层,处理后会在DNS请求报文的基础上添加UDP的请求头。
- 网络层1:在UDP请求报文的基础上加上IP请求头,通过ARP请求来解析出mac地址。
- 数据链路层1:将网络层的mac地址拿到,加上对应mac地址,最后交给物理层的物理介质。
- 路由器
- 物理层:通过物理层进行连接。
- 数据链路层:查看mac地址是否是自己,如果是则解析,不是则丢弃。
- 网络层:将请求报文进行解析,首先通过运营商的DNS服务器,如果解析成功则层层返回到服务器1。
步骤二
- 客户端1
- 应用层1:拿到ip地址后,使用HTTP,传输一些TCP的参数,代表使用TCP协议。
- 以上类似。
- 服务端1
- 传输层:通过运营商进行解析到达对端的服务器,进行层层解析,通过传输层的TCP请求80端口提交给应用程序。
- 应用层:解析HTTP请求报文,构造HTTP响应报文,层层解析返回到客户端。
1.4 HTTP协议
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它是一种无状态协议。
1.4.1 HTTP请求报文格式
1.4.2 HTTP请求流程
- 从URL解析出域名,检查域名有无对应的IP(通过浏览器DNS缓存和本地HOST),如果没有获取,则通过DNS服务器j进行获取。
- 进行TCP的三次握手(HTTPS还需要进行TLS交换密钥的握手)
- 浏览器发送HTTP请求
- 浏览器拿到HTTP响应
- 浏览器拿到响应报文, 渲染页面。
- TCP四次挥手
1.5 TCP协议
1.5.1 TCP的请求报文
Source port:源端口(基本上市随机生成)
Dest port:目的端口
Sequence number:序列号
Acknowledgment number:应答编号
Header length:首部的长度
Unused:保留字段
Unused右边:报文的标示,什么类型的报文(ACK为响应的报文,SYN为请求的报文,FIN为关闭连接的报文)
Receive Window:当前服务器可接收数据大小的窗口值
Urgent data pointer:紧急数据指针(有的话,应用程序会优先处理)
Options:可选参数
Data:数据
1.5.2 TCP的三次握手
- 服务器首先会处于LISTEN状态,客户端发送SYN的请求报文,seq序列号x为随机生成。
- 服务端收到SYN报文,会创建响应报文,回送一个ACK报文给客户端,通过ack=x+1来确认唯一的SYN报文,并且随机生成一个seq序列号y,回送一个SYN报文。
- 客户端收到响应报文后,会进入到ESTABLISHED状态,发送一个ACK报文给服务端,ack=y+1来确认对应的连接。
- 服务端收到ACK报文后,连接确认建立。
1.5.2 TCP的四次挥手
- 客户端发送FIN的报文,seq=i
- 服务端收到客户端的FIN报文,服务端回送ACK报文,ack=i+1
- 服务端回送FIN报文,seq=j
- 客户端回送收到服务端FIN报文,回送ACK报文,ack=j+1
- 客户端进入TIME_WAIT,等待报文来回的时间(如果上一步丢包,服务端无法关闭连接,服务端会重试FIN报文请求,需要一个来回保证关闭连接。防止滞留在网络中的报文,对新建立的连接造成数据困扰)
二、HTTPS
应用层的HTTP不再和TCP进行交互,而是SSL安全套接层(TLS),安全套接层主要是对数据进行加密和解密
2.1 摘要、对称加密算法、非对称加密算法
- 摘要算法: 哈希算法、散列算法,它通过一个函数,把任意长度的数据转换为一个长度固定的数据串
摘要结果是不可逆的,不能被还原为原数据。- 对称加密算法: 编解码使用相同的密钥的算法(如AES、RC4)
- 非对称加密算法: 使用公钥加密,需要使用私钥解密。使用私钥加密,需要使用公钥解密。
2.2 安全层的握手
- 客户端发送加密条件列表给服务端
- 服务端选择最安全的加密套件,并发送公钥数字证书
- 客户端生成随机密钥,并用公钥进行加密,并发送给服务端
- 服务端用私钥解密,获取密钥