https协议请求原理
2023-12-28 19:34:40 0 举报
HTTPS(Hypertext Transfer Protocol Secure)是HTTP协议的安全版本,用于在网络上进行安全通信。其请求原理主要包括以下几个步骤: 1. 建立连接:客户端(如浏览器)与服务器建立TCP连接,并完成TLS/SSL握手。在这个过程中,客户端与服务器交换公钥,验证证书,生成会话密钥,并建立安全的通信通道。 2. 发送请求:客户端在安全的通信通道上向服务器发送HTTP请求,包括请求方法(如GET、POST等)、请求URI、协议版本、请求头等信息。 3. 服务器响应:服务器收到请求后,根据请求信息生成响应,包括协议版本、状态码、响应头、响应体等。 4. 客户端接收响应:客户端收到服务器的响应后,解析响应,并根据需要处理响应内容,如显示网页、下载文件等。 5. 关闭连接:通信完成后,客户端与服务器关闭TCP连接,结束HTTPS请求。 简单来说,HTTPS协议通过加密通信、身份验证等方式保障了网络通信的安全,使得客户端与服务器之间的数据传输更加安全可靠。
作者其他创作
大纲/内容
okUrlFactory
RealConnection
Route
整个流程都是为了生成最后的HttpStream对象返回
HttpStream中保存了两个对象,BufferedSource和BufferedSink
HttpsUrlConnectionImpl
生成BufferedSink对象
sslSocket#startHandshake
HTTPSURLConnectionImpl中通过代理HttpURLConnectionImpl对象来执行connect方法
URL.openUrlConnection
传入fd,调用JNI方法,来进行socket通信
ConnectionPool
SSLSocketFactoryImpl
通过bufferSink的flush方法,发送数据给服务
getResponse
如果找不到对应目标地址的RealConnection,那么会通过RouteSelector来选择一个Route
StreamAllocation主要用于管理连接池中的连接,控制其创建和回收
新建的RealConnection才会执行connect方法
所以建立隧道之后,BufferSource和BufferSink会具有超时时间的概念
RealConnection#connect
RealConnection#connectTls
...
创建Socket对象
通过Route生成一个RealConnection对象
新生成的RealConenction会放到连接池中做缓存
写入请求头和请求体到BufferSink中
通过SSLSocketFactory来生成一个SSLSocket对象
验证服务器的证书
Response
ANdroid中默认获取到的factory对象是SSLSocketFactoryImpl
验证通过
开始从BufferedSource中读取响应数据
HttpsUrlConnectionImpl中会维护一个HttpURLConnectionImpl对象,后续的connect操作就是直接执行该对象的connect方法,所以其连接逻辑和http一致
sendRequest
生成对应http协议类型的socket的实现类
内部维护一个HttpEngine,如果没有会生成一个
基于OKHttpclient返回一个继承自HttpUrlConenction的对象实例
HttpsHandler中定义了https默认端口为443
每个OKHttpClient对象会单独维护一个自己的连接池
通过socket对象
当前连接池中是否存在对应目标地址的RealConnection?
我们主动调用HttpURLConnection对象的connect方法
OkHttpClient
Socket
建立通道
HttpEngine
StreamAllocation
生成BufferedSource对象
HttpsHandler
重新生成两个对象
否
这里会生成一个FD,用于后续socket通信
BufferedSource:存储来自服务response的数据BufferedSink:可以写入数据,写入的数据将发送给服务器
HttpConnectSocketImpl
将获取到的Response数据解析为Response对象保存到HttpEngine中
https会维护一套自己的相关对象,内部逻辑和http的类似
RouteSelector
connect
SSLSocketImpl
后续我们直接从HttpEngine中获取到Response对象使用里边的数据
ReaelConnection是真正会通过socket发送接收数据的类
连接超时是在connect时候使用的
从连接池中选择出合适的RealConnection
是
HttpConnectSocketImpl#socketConnect
由于创建SSLSocket对象时候,已经存在socket对象了,且socket也建立了连接,所以sslsocket对象里包含其对应的socket对象,复用其连接进行tls验证
socket#connect
从对象中取出HttpStream实例
X509Certificate
如果需要会建立隧道
HttpStream的实现类为Http1xStream
建立隧道时候,会传入读和写的超时时间
0 条评论
下一页