HTTP请求的完全过程

 HTTP请求的完全过程

1.1 浏览器根据域名解析IP地址

       浏览器根据访问的域名找到其IP地址。DNS查找过程如下:

  1. 浏览器缓存:首先搜索浏览器自身的DNS缓存(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否是有域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
  2. 系统缓存:如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
  3. 路由器缓存:如果系统缓存也没有找到,则会向路由器发送查询请求。
  4. ISP(互联网服务提供商) DNS缓存:如果在路由缓存也没找到,最后要查的就是ISP缓存DNS的服务器。

1.2 浏览器与WEB服务器建立一个TCP连接

       TCP的3次握手。

1.3 浏览器给WEB服务器发送一个HTTP请求

       一个HTTP请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。

1.3.1 请求行

       请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1。

1.请求方法

       HTTP/1.1 定义的请求方法有8种:GET(完整请求一个资源)、POST(提交表单)、PUT(上传文件)、DELETE(删除)、PATCH、HEAD(仅请求响应首部)、OPTIONS(返回请求的资源所支持的方法)、TRACE(追求一个资源请求中间所经过的代理)。最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。

(1)GET

       当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,会送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号‘?’代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。显然这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一半最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。如果数据是英文字母/数字,原样发送;如果是空格,转换为+;如果是中文/其他字符,则直接把字符串用BASE64加密,得出:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

(2)POST

       允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

2.URL

       URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。

       组成:<协议>://<主机>:<端口>/<路径>

       端口和路径有事可以省略(HTTP默认端口号是80)

3.协议版本

       协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

1.3.2 请求头部

       请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

       请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。

1.3.3 请求数据

       请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最长使用的请求头部是Cntent-Type和Content-Length。下面是一个POST方法的请求报文:

POST  /index.php HTTP/1.1    请求行

Host: localhost

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

Accept-Language: zh-cn,zh;q=0.5

Accept-Encoding: gzip, deflate

Connection: keep-alive

Referer: http://localhost/

Content-Length:25

Content-Type:application/x-www-form-urlencoded

  空行

username=aa&password=1234  请求数据

1.4 服务器端响应HTTP请求,浏览器得到HTML代码

       HTTP响应报文由状态行(status line)、相应头部(headers)、空行(blank line)和响应数据(response body)4个部分组成。

1.4.1 状态行

       状态行由3部分组成,分别为:协议版本、状态码、状态码扫描。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。

1.4.2 响应头部

1.4.3 响应数据

       用于存放需要返回给客户端的数据信息。

HTTP/1.1 200 OK  状态行

Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部

Server: Apache/2.2.8 (Win32) PHP/5.2.5

X-Powered-By: PHP/5.2.5

Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Content-Length: 4393

Keep-Alive: timeout=5, max=100

Connection: Keep-Alive

Content-Type: text/html; charset=utf-8

  空行

 

<html>  响应数据

<head>

<title>HTTP响应示例<title>

</head>

<body>

Hello HTTP!

</body>

</html>

1.5 浏览器解析HTML代码,并请求HTML代码中的资源

       浏览器拿到HTML文件后,开始解析HTML代码,遇到静态资源时,就向服务器端去请求下载。

1.6 关闭TCP连接,浏览器对页面进行渲染呈现给用户

       浏览器利用自己内部的工作机制,把请求到的静态资源和HTML代码进行渲染,呈现给用户。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 239
    点赞
  • 1380
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: RPC请求HTTP请求的不同之处在于RPC请求是一种远程过程调用的协议,它可以让计算机上的不同程序之间进行交互,而HTTP请求则是超文本传输协议,是客户端和服务端之间进行通信的一种标准协议。以下是RPC请求的示例代码: ``` const rpc = new RpcClient({ url: 'http://localhost:8080/rpc', username: 'admin', password: 'admin' });rpc.call('add', [1, 2], (err, result) => { if (err) { console.error(err); } else { console.log(result); } }); ``` 以下是HTTP请求的示例代码: ``` const options = { method: 'GET', url: 'http://localhost:8080/api/data', headers: { 'Content-Type': 'application/json' }, body: { foo: 'bar' } };request(options, (err, response) => { if (err) { console.error(err); } else { console.log(response.body); } }); ``` ### 回答2: RPC请求HTTP请求是两种不同的通信协议,它们在实现上有以下几个方面的不同: 1. 通信协议层面: - RPC(远程过程调用)是一种协议,用于实现分布式系统中的进程之间通信。它使用自定义的二进制协议,通过网络传输数据并调用远程方法。 - HTTP(超文本传输协议)是一种通信协议,用于传输超文本和相关资源。它是基于TCP/IP协议的应用层协议。 2. 数据传输格式: - RPC框架通常使用二进制传输,并且支持各种序列化框架,如Protocol Buffers、Thrift等。这种格式可以实现高效的数据传输,因为它们相对较小,且解析速度较快。 - HTTP请求使用文本传输,以JSON或XML等格式来传输数据。这种格式的优点是易读性好,但相对较大,且解析速度相对较慢。 3. 连接方式: - RPC请求通常使用长连接(Keep-Alive)方式,即保持与服务器的连接状态,可以实现多次请求/响应的通信,提高通信效率。 - HTTP请求默认使用短连接方式,每次请求都需要建立和断开连接,对于频繁的请求,会带来较大的通信开销。 4. 通信协议选择: - RPC框架允许根据实际需求选择不同的通信协议,如TCP、UDP等,并可以加密和压缩数据,增加网络安全性和传输效率。 - HTTP请求通常使用HTTP/1.1协议作为基础协议,也可以使用HTTPS协议进行加密传输。 下面是一个示例,演示了使用RPC框架(以gRPC为例)和HTTP请求调用远程方法的差异: ```python # 使用gRPC进行RPC请求的示例代码 import grpc # 定义proto文件中的方法 import helloworld_pb2 import helloworld_pb2_grpc def run_rpc_request(): # 连接RPC服务器 channel = grpc.insecure_channel('localhost:50051') # 创建客户端存根 stub = helloworld_pb2_grpc.GreeterStub(channel) # 调用远程方法 response = stub.SayHello(helloworld_pb2.HelloRequest(name='Alice')) # 输出结果 print("Greeter client received: " + response.message) # 使用HTTP请求调用远程API的示例代码 import requests def run_http_request(): # 发送HTTP请求 response = requests.get('https://api.example.com/hello?name=Alice') # 解析响应数据 data = response.json() # 输出结果 print("API response: " + data['message']) # 调用示例函数 run_rpc_request() run_http_request() ``` 以上示例中,`run_rpc_request()`函数使用gRPC框架发送RPC请求,而`run_http_request()`函数使用HTTP请求调用远程API。两者在实现和使用上都有较大的差异。 ### 回答3: RPC (Remote Procedure Call,远程过程调用) 请求HTTP (Hypertext Transfer Protocol,超文本传输协议) 请求在很多方面有所不同。下面是它们的详细说明。 1. 协议格式:RPC 请求HTTP 请求使用不同的协议格式。RPC 请求通常使用二进制格式,如Protocol Buffers或Thrift,在网络传输中更高效。而HTTP 请求使用明文文本格式。 2. 功能定位:RPC 请求用于调用远程服务的特定函数或方法。它们更加强调服务的函数调用,将请求和响应看作远程过程调用的结果。HTTP 请求则更多用于资源访问,如获取网页或执行 CRUD 操作。 3. 通信模型:RPC 使用一对一的通信模型,即一个请求和一个响应之间的点对点通信。HTTP 请求则是基于客户端-服务器模型,客户端发送请求给服务器,服务器返回响应给客户端。 4. 协议支持:RPC 请求可以使用不同的传输协议,如TCP、UDP或HTTP。而HTTP 请求完全基于HTTP 协议。 5. 交互方式:RPC 请求通常是同步的,即发送请求后阻塞等待响应返回。HTTP 请求可以是同步的,也可以是异步的,在发送请求后可以继续执行其他操作。 下面是一个简单的示例,展示了使用gRPC(一种常见的RPC框架)发送RPC 请求和使用Node.js发送HTTP 请求的例子: ``` // RPC 请求示例 (使用gRPC) const { GreeterClient } = require('example_grpc_pb'); const { HelloRequest } = require('example_pb'); const client = new GreeterClient('localhost:50051', grpc.credentials.createInsecure()); const request = new HelloRequest(); request.setName('John'); client.sayHello(request, (error, response) => { if (error) { console.error(error); } else { console.log(response.getMessage()); } }); // HTTP 请求示例 (使用Node.js) const http = require('http'); const options = { hostname: 'localhost', port: 3000, path: '/', method: 'GET', }; const req = http.request(options, (response) => { response.on('data', (chunk) => { console.log(`Received data: ${chunk}`); }); response.on('end', () => { console.log('Request finished.'); }); }); req.on('error', (error) => { console.log(`Request error: ${error.message}`); }); req.end(); ``` 总结:RPC 请求HTTP 请求在协议格式、功能定位、通信模型、协议支持和交互方式等方面都存在差异。了解它们的区别有助于选择适合具体需求的通信方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾伦lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值