定义
超文本传输协议,用于从万维网服务器传输超文本到本地浏览器的传送协议。
URL与URI
URI
统一资源标识符,用于识别互联网资源名称的字符串,HTTP使用统一资源标识符来传输数据和建立连接,web上的各种资源,比如HTML文档、视频、图片等都是由统一资源标识符进行定位。具体的格式如下:
格式:[协议名]: //[用户名]:[密码]@[服务器地址]:[服务器端口号]/[路径]?[查询字符串]#[片段ID]。
URL
统一资源定位符,用于识别互联网上某一处资源的地址。
基本规则:
http: //< host>:< port>/< path>?< searchpart>
比如:https://baike.baidu.com/item/8937042?fromtitle=URL&fromid=110640&fr=aladdin。
- 协议部分。http、https、ftp,都是协议,一般在协议后面添加“//”作为分隔符。
- 域名部分。baike.baidu.com就是域名,IP地址也可以作为域名。
- 端口部分。示例中没有写端口,如果有,写法为:baike.baidu.com:8080,在域名后面紧跟“:”。
- 虚拟目录。域名后面第一个“/”与最后一个“/”之间,示例中/item/就是虚拟目录部分。
- 文件部分。域名后面最后一个“/”到“?”为止,如果没有“?”就到“#”为止,如果都没有,就到参数之前都是文件部分。文件名部分是可以没有的,如果省略了,就使用默认的文件名。
- 参数部分。从“?”到“#”之间的部分都是参数部分,也可以叫搜索部分、查询部分。参数可以有多个,参数之间用“&”分隔,比如“fromtitle=URL&fromid=110640&fr=aladdin”。
- 锚部分。“#”后面的都是锚部分,非必须,可不要。
区别与联系
URL是URI的子集,URL都是URI,但是URI并不都是URL。URI中还有URN(统一资源名称),所以有些URI只是表示符,没有办法定位任何资源。
请求过程
- 首先进行DNS域名解析,因为本地浏览器、操作系统、DNS服务器都有DNS缓存,所以首先会搜索浏览器自身的DNS缓存。如果本地浏览器缓存中没有找到,就去操作系统的缓存中找,如果操作系统缓存中没有,就去hosts文件中去找,如果都没有就去域名服务器中去找。
- 通过三次握手建立TCP连接。
- 客户端发起HTTP请求。
- 服务端响应HTTP请求。
- 客户端解析html代码,并根据html中的代码按需向服务器请求下载资源。
- 客户端将内容渲染出来。
- 四次挥手关闭TCP连接。
一般来讲,服务端将客户端的请求数据返回之后就要关闭TCP请求,但是如果在头信息中使用了Connection:keep-alive,TCP连接会继续保持打开状态,服务端和客户端可以持续进行HTTP通信,这样做节约时间,节省带宽。
请求方法
方法 | 描述 |
---|---|
GET | 请求指定信息,并返回实体主体,且不对资源进行操作 |
HEAD | 返回中没有具体内容的GET,用于获取报头 |
POST | 对指定资源进行处理,请求数据包在请求体中,不是明文,安全性高于GET,可对资源进行创建和修改 |
PUT | 取代指定内容 |
DELETE | 删除指定内容 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器 |
PATCH | PUT的补充方法,用于对已知资源的局部更新 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
请求消息结构
请求消息包括:请求行,请求头,空行,请求数据。
响应消息结构
响应消息保包括:状态行,消息报头,空行,响应数据。
- 状态行,比如:HTTP/1.1 200 OK
- 消息报头,比如:Date: Mon, 27 Jul 2022 14:22:63 GMT,Content-Length: 99,Content-Type: text/html; charset=utf-8等
- 响应数据,html页
状态码
状态码,我们常用的就四种:200,404,500,301。
状态码 | 描述 |
---|---|
200 | 请求成功 |
404 | 找不到资源,404页面可定制 |
500 | 服务器错误 |
301 | 请求的资源被移动到其他位置了 |
100 | 客户端应继续其请求 |
101 | 切换协议 |
201 | 成功请求并创建了新的资源 |
202 | 已经接受请求,但未处理完成 |
203 | 请求成功,但返回的meta信息不在原始的服务器,而是一个副本 |
204 | 服务器成功处理,但未返回内容 |
205 | 服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | 服务器成功处理了部分GET请求 |
300 | 请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
302 | 请求资源只是临时被移动,客户端应继续使用原有URI |
303 | 使用GET和POST请求查看其它地址 |
304 | 所请求的资源未修改,服务器返回此状态码时,不会返回任何资源,告诉客户端资源没有被修改 |
305 | 所请求的资源必须通过代理访问 |
307 | 临时重定向,与302类似,使用GET请求重定向 |
400 | 客户端请求的语法错误 |
401 | 请求要求用户的身份认证 |
402 | 保留,将来使用 |
403 | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
405 | 客户端请求中的方法被禁止 |
406 | 服务器无法根据客户端请求的内容特性完成请求 |
407 | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | 服务器等待客户端发送的请求时间过长,超时 |
409 | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | 客户端请求的资源已经不存在,410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | 客户端请求信息的先决条件错误 |
413 | 由于请求的实体过大,服务器无法处理,因此拒绝请求 |
414 | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | 服务器无法处理请求附带的媒体格式 |
416 | 客户端请求的范围无效 |
417 | 服务器无法满足Expect的请求头信息 |
501 | 服务器不支持请求的功能,无法完成请求 |
502 | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
DNS劫持
DNS是域名系统,将域名与其具体的IP地址相互映射成一个分布式数据库,可以让用户更加方便进行访问,不然,每次访问都输入IP地址,谁记得住呀。比如:www.baidu.com是可以输入的,但是百度的IP是多少很多人都不知道,所以需要DNS将www.baidu.com解析成具体的IP地址。
DNS劫持就是将劫持DNS服务器,将映射表改掉,导致输入的正确的域名,但访问的却是其他的网站,就是返回一个不匹配的,错误的IP让用户访问。DNS劫持一般有三种情况。
- 错误域名解析到有广告的纠错导航网页。输入的错误域名,肯定跳转不到想要的页面,但是会跳转到一些官方的导航页面,电信和联通都有这样的域名纠错导航页面。
- 错误的域名跳转到导航页问题不算大,就怕这些导航页上有很多恶意的站点,总是跳转到一些广告页或游戏页面,比如:贪玩蓝月等等等等。
- 最严重的是正确的域名错误的页面,有时没有输错,就是页面不对,一般是运营商的一些节点被恶意控制了,或者设备中毒了,路由器被黑了,都有可能。所以一般不用运营商默认的DNS,容易被劫持,因为比较容易。
HTTP劫持
DNS劫持发生在请求中,而HTTP劫持更像是发生在返回中。通过向返回的数据中插入JS或其他的东西,导致正确的页面出现很多小广告,小弹窗,当然也有像DNS劫持那样直接对请求进行拦截返回错误信息。
一般防止HTTP劫持有两种方法:
- 使用https,因为多了一些加密和ssl握手,所以时间和性能可能会耗费一些。
- 对https进行简单加密,比如RSA对称加密,这样就没有快速获取http请求特征,不好劫持,当然这个需要请求方和服务方进行配合。为什么不用非对称加密,因为耗时。