所谓Web的工作流程,简单来说就是从你在浏览器输入一个网址,比如 https://blog.csdn.net/a1766855068, 然后按下回车键后,直到整个网页完整显示出来。
接下来我来给大家简单讲解一下:数据通讯过程中的电脑、互联网和服务器之间是怎么一回事儿。
我先给大家理一下思路:
顺序 | 步骤 | 详情 |
---|---|---|
1 | 建立TCP连接 | 首先在HTTP工作开始之前Web浏览器通过网络与Web服务器建立TCP连接。 |
2 | 浏览器发出请求 | 一旦建立了TCP连接,Web浏览器向Web服务器发送请求命令。例如:GET/hello.php HTTP/1.1。 |
3 | 浏览器发送请求头信息 | 之后,Web浏览器以头信息的形式向Web服务器发送,头信息发送完之后,浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。 |
4 | Web服务器响应 | Web服务器应答 客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。 |
5 | Web服务器回复应答头信息 | Web服务器发送应答头信息 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。 |
6 | Web服务器回复数据 | Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。 |
7 | Web服务器关闭或维持TCP的连接 | 一般情况下:浏览器向Web服务器发出请求之后就会关闭TCP连接。 其他情况:请求之后TCP仍然保持连接状态,前提是浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive |
保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
首先,浏览器发送请求之前,会进入DNS解析阶段(DNS解析就是将一个域名转换为一个IP的过程,这可以为我们省下不少事情):dns解析以本地hosts文件优先级最高,接着是你系统所配置的上游dns服务器结果。
(有关DNS的原理、工作过程、搭建可以参考我的另一篇博客:Linux中怎么搭建主DNS、辅助DNS、缓存DNS服务器)
URL中显示http://即为HTTP协议。除了这些协议之外呢,现在的浏览器还支持:WebSocket、FTP、File协议等。
在服务器收到HTTP请求之后,就会进行一系列的运作,比如根据URL解析出具体的内容,包括协议、账号密码、域名、端口、路径、查询内容等。
hosts文件所在目录:
在windows中:
在Linux中:
URL(统一资源定位符):它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
这里以下面这个URL为例来说明其中的每一部分的作用
http://hello:[email protected]:9999/123/?a=1&b=中文#abc
编号 | URL中对应的部分 | 说明 | 注解 |
---|---|---|---|
1 | http |
协议名称 | |
2 | :// |
层级URL的标记符号 | |
3 | hello:12345 | 访问资源需要的凭证信息 | 用户名是lihao,密码是12345,url中@结尾只是用于分隔 |
4 | test.shuimugan.net | 需要从哪个服务器获取数据 | |
5 | 9999 | 需要连接的端口号(默认80,可选) | |
6 | /123/ | 指向资源的层级文件路径 | |
7 | a=1&b=中文 | 这里携带了2个参数:a=1和b=中文,用&分隔参数 | |
8 | #abc | 片段id | 片段id是不会往服务器传输的 |
在日常情况中:当服务器收到请求后,就会给浏览器发回被请求的HTML文件,这时候浏览器就看到了HTML,然后顺便加载HTML里要的CSS和JavaScript,一般都是一边加载一边请求。
HTTP协议的主要特点可概括如下: |
---|
1.支持客户/服务器模式。(C/S架构) |
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。(每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。) |
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 |
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。(采用这种方式可以节省传输时间) |
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 |
HTTP请求由3部分组成,分别是:请求行、消息报头、请求正文
请求方法 | 请求内容 |
---|---|
GET | 请求获取Request-URL所标识的资源 |
POST | 在Request-URL所标识的资源后附加新的数据 |
HEAD | 请求获取由Request-URL所标识的资源的响应消息报头 |
PUT | 请求服务器存储一个资源,并用Request-URL作为其标识 |
DELETE | 请求服务器删除Request-URL所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
在接收和解释请求消息后,服务器返回一个HTTP响应消息。
HTTP响应也是由三个部分组成,分别是:状态行、响应头、响应正文
状态码数值 | 注解 |
---|---|
1xx | 指示信息:表示请求已接收、继续处理 |
2xx | 成功:表示请求已被成功接收、理解、接受 |
3xx | 重定向:要完成请求必须进行更进一步的操作 |
4xx | 客户端错误:请求有语法错误或请求无法实现 |
5xx | 服务器端错误:服务器未能实现合法的请求 |
常见状态代码 | 状态描述 | 说明 |
---|---|---|
200 | OK | 客户端请求成功 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经授权 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 | Not Found | 请求资源不存在 |
500 | Internal Server Error | 服务器发生不可预期的错误 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
HTTP请求的方式有很多种,我们先从最基本的 GET 方式说起,为了更好的说明请求过程,我这里采用了火狐浏览器,然后使用Burpsuit进行抓包,并且自己制作一个表单用于提交数据。
表单代码如下,提交方式为get:
<meta charset="utf-8">
<form action="https://blog.csdn.net/a1766855068" method="get">
<input type="text" name="name">
<br>
<input type="password" name="password">
<br>
<input type="submit" value="go">
</form>
效果如图:
Burp的使用这里不再多说了,我们直接开抓吧。
首先我们在表单中输入admin,另一栏输入123456,点击go。之后Burp就显示抓住了数据包:
浏览器中的URL显示的是这样的:https://blog.csdn.net/a1766855068?name=admin&password=123456
行数 | 提交方式、消息头 | 注解 |
---|---|---|
1 | GET /a1766855068、HTTP/1.1 | 请求方法是GET,路径是/a1766…,最后的HTTP/1.1是说这次请求是用HTTP 1.1协议进行请求的 |
2 | Host | host按照字面意思就是主机,也就是说访问的是blog.csdn.net这个域名,默认端口是443 |
3 | User-Agent | 用户代理,通俗的说,通过User-Agent,浏览器就可以告诉服务器,我是谷歌浏览器,还是火狐,版本号是多少,里面也可以看出我们的系统信息。这里就能看出我们的系统是win10 x64版本,浏览器是Firefox 66.0版本 |
4 | Accept | accept字面意思就是接收,浏览器用这行内容来告知服务器,自己可以处理内容类型。从这里我们可以看出有html、xhml、xml以及所有格式 |
5 | Accept-Language | 浏览器结合系统环境,告诉服务器希望返回的哪种语言的内容,比如中文、台湾繁体、香港繁体、英文 |
6 | Accept-Encoding | 浏览器告诉服务器,自己支持用gzip算法或者用deflate算法压缩过的资源 |
7 | Connection | Connection是当前这个请求结束后,还会不会保留tcp连接 ①keep-alive:代表网络连接状态要保持连接,让后续的请求沿用这个连接。 ②close:网络连接状态要关闭 |
8 | Cookie | cookie是用来保存信息的,通常大小不超过4kb。它的内容可以由服务端或者JavaScript脚本生成。保存的信息里一般会放一些请求之间保存的凭证,比如登录状态等 |
9 | Upgrade-Insecure-Requests | 用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证的响应,一般配合https协议使用 |
其他 | Referer | 表示当前请求页面的来源页面的地址,从http://xxx.com/1.php |
其他 | Pragma: no-cache Cache-Control: no-cache |
顾名思义就是缓存控制,这里是要求服务端不缓存 |
第1、2行结合起来之后,说明我们访问的是这个地址:https://blog.csdn.net/a1766855068?name=admin&password=123456
行数 | 消息头 | 注解 |
---|---|---|
1 | HTTP/1.1 200 OK | 协议是HTTP1.1 返回的状态码是200,返回状态消息是OK |
2 | Server | Web服务器表明自己是什么软件及版本等信息,这里是openresty |
3 | Date | 服务器当前的时间,一般用来配合浏览器做一些缓存控制 |
4 | Content-Type: text/html; charset=UTF-8 | 说明返回的内容格式是 text/html,编码是utf-8 |
5 | Connection | 保持连接 |
6 | Keep-Alive | 保持连接,超时时间为20s,timeout=20 |
7 | Vary | WEB服务器告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求,防止Cache服务器用自己Cache 里面压缩后的实体响应给不具备解压能力的浏览器。 |
9 | Content-Length: 45090 | Web服务器告诉浏览器 自己响应的对象 的长度或尺寸 |
10 | 空白行 | 用于分隔消息头和服务端返回的正文 |
关于HTTP的请求头更多内容请点击这里:http请求头响应大全
同理我们还是制作一个post提交方式的表单,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="urf-8" />
<title>POST request</title>
</head>
<body>
<form action="https://blog.csdn.net/a1766855068" method="post">
<input type="text" placeholder="username" name="name">
<br>
<input type="password" placeholder="password" name="password">
<br>
<input type="submit" value="go">
</form>
</body>
</html>
这里把之前的get请求的包的截图复制过来,进行对比一下:
它们最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数,web服务器日志默认会记录url的内容
编号 | GET、POST区别: |
---|---|
1 | GET在浏览器回退时是无害的,POST会再次提交请求 |
2 | GET产生的URL地址可以被Bookmark,而POST不可以 |
3 | GET请求会被浏览器主动cache,而POST不会(除非手动配置) |
4 | GET请求只能进行url编码,而POST支持多种编码方式 |
5 | GET请求参数会被完整保留在浏览器历史记录中,而POST中的参数不会被保留 |
6 | GET请求在URL中传送的参数是有长度限制的,而POST没有 |
7 | 对于参数的数据类型,GET只接受ASCII字符,而POST没有限制 |
8 | GET比POST更不安全,参数被直接暴露在URL中,所以不可以传递敏感信息 |
9 | GET参数通过URL 传递,POST放在request body中 |
本标准答案参考来自=>更多详情请点击这里=>GET、POST请求方式的区别
我们直接将name、password后面的参数直接进行修改,之后点击放行即可。