Http协议你都了解吗?

网络 网络管理
通过 HTTP 或者 HTTPS 协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。由 HTTP 客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的 TCP连接。

[[390013]]

1. HTTP协议

超文本传输协议(HyperText Transfer Protocol),缩写HTTP

通过 HTTP 或者 HTTPS 协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。由 HTTP 客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的 TCP连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如" HTTP/1.1 200 OK ",以及返回的内容,如请求的文件、错误消息、或者其它信息。

2. URI 和 URL

▐ 2.1 URI

Uniform Resource Identifier,统一资源标识符Web上可用的每种资源如HTML 文档、图像、视频片段、程序等都是用URI来定位的;

URI 一般由三部分组成:

  1. 访问资源的命名机制
  2. 存放资源的主机名
  3. 资源自身的名称,由路径表示,着重强调于资源

▐ 2.2 URL

Uniform Resource Location,统一资源定位符

URL 是 Internet 上用来描述信息资源的字符串,主要用在各种 WWW 客户程序和服务器程序上。URL 是 URI 的一种。

采用 URL 可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL 一般由三部组成

  1. 协议
  2. 可访问该资源的主机IP地址(或带有端口号)
  3. 主机资源的具体地址(目录加文件名)

▐ 2.3 URL 的构成

  1. 协议部分:协议部分为 http:
  2. 域名部分:域名部分例如"www.jianshu.com",当然域名也可以用 IP 地址,IP 少 一步用DNS服务器解析
  3. 端口部分:域名和端口之间使用":"分隔。
  4. 端口不是URL必须的部分,如果端口省略,将采用默认端口号80,所以实际请求地址是http://www.jianshu.com:80
  5. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。
  6. 文件名部分:指在服务器中访问的资源文件的路径。
  7. 锚部分:从“#”开始到最后,都是锚部分,也不是必须的部分。
  8. 做过 html 的都知道,用于定位到页面的滑动位置。
  9. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。例如?page=1。

3. 请求的种类

HTTP 协议中共定义了八种方法或者叫“动作”来表明对 Request-URI 指定的资源的不同操作方式。就类似操作数据库和文件系统一样,设计网络的请求也是一样。URL 用于定位了网络资源,创造 PUT,DELETE,POST,GET 来对应增,删,改,查操作。但是我们在实际应用中常用的也就是 get 和 post,其他请求方式也都可以通过这两种方式间接的来实现。

GET

向指定资源发出“显示“信息。使用GET方法只用于获取数据,而不应该改变数据本身,即不对数据进行操作和提交信息。

POST

向指定资源提交数据,请求服务器进行处理(例如提交参数/表单,或者上传文件)。可能会对数据进行操作和提交信心,创建资源。

PUT

向指定资源位置上传其最新内容。

DELETE

顾名思义,请求服务器删除 URI 所对应的资源。

HEAD

与 GET 方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

TRACE

回显服务器收到的请求,主要用于测试或诊断。

OPTIONS

这个方法可使服务器传回该资源所支持的所有 HTTP 请求方法。用'*'来代替资源名称,向 Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作。

CONNECT

HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器)。

4. GET 和 POST 的区别

1.参数携带位置不同。

GET 提交的数据会附加家 URL 之后(即把数据放在请求行中),会在地址栏中显示,接?=传值,多个参数用&连接。POST 提交的数据放在 HTTP 包体中,地址栏不显示。

2.传输数据大小限制不同。

不同浏览器对 URL 的长度有限制,因此对于 GET 提交时,传输数据就会受到URL 长度的限制。POST 由于不是通过 URL 传值,理论上数据不受限。

3.POST 的安全性要比 GET 的安全性高。因为浏览器可能对请求地址做历史记录的存储,对于 GET 请求的登录,那其他人就可以直接在 URL 上拿到你的账号和密码了,而 POST 拿不到参数。

5. HTTP 请求信息

客户端发送一个 HTTP 请求到服务的请求信息包括以下格式:

请求行(request line)、请求头(header,常用于存放 token)、空行和请求数据四个部分。

例如:

  1. GET /8669504-c2641e8e6eed5904.png HTTP/1.1 
  2. Host    www.jianshu.com 
  3. User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 
  4. Accept    image/webp,image/,/*;q=0.8 
  5. Referer  www.jianshu.com 
  6. Accept-Encoding    gzip, deflate, sdch 
  7. Accept-Language    zh-CN,zh;q=0.8 
  8. name=Professional%20Ajax&publisher=lili 
  1. 第一行请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本。
  2. 第二部分,大括号之间的请求头部,用于提交服务器的附加信息。
  3. 第三部分,空行,请求头部后面的空行是必须的。
  4. 第四部分,请求数据也叫主体,可以添加任意的其他数据。

6. HTTP 响应信息

服务器接受请求回传响应信息也由四分部组成:

状态行,消息报头,空行和响应正文。

例如:

  1. 第一行包括协议版本号,返回状态码
  2. 第二行为响应日期时间
  3. 第三行为响应消息报头,Content-Type: 指定了 MIME 类型的 HTML(text/html),编码类型是 UTF-8
  4. 响应正文,服务器返回给客户端的文本信息。

7. HTTP 状态码

状态码有三位数字,第一数字表示当前相应的类型,各个类型有:

  • 1xx消息——请求已被服务器接受,继续处理
  • 2xx成功——请求已成功被服务器接收(如见到就像亲人的200,201)
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——客户端错误:请求含有词法错误或无法被执行(如见到就想暴走的404 Not Found)
  • 5xx服务器错误——服务端错误:服务器在处理某个正确请求时发生错误(如一见到就想找后台的500)

常见的状态码如下:

  • 200 OK:客户端请求成功
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务
  • 500 Internal Server Error:服务器发生不可预期的错误
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

8. 总结HTTP一次请求的完整过程

  1. 客户端与服务端建立 TCP 连接
  2. 通过 TCP 套接字连接,发送 HTTP 请求
  3. 服务器解析请求,定位请求资源,将查询资源然后返回 HTML 文本数据,由客户端读取。
  4. 释放 TCP 连接
  5. 客户端浏览器解析 HTML 内容

浏览器输入网站发生的事件:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的 HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP 连接;
  6. 浏览器将该 html 文本并显示内容;

以上是 Http 的全部总结,该篇文章不断完善不断更新。

 

责任编辑:姜华 来源: 网罗开发
相关推荐

2022-07-11 07:10:48

HTTP协议类型

2023-12-07 08:13:58

Java开发

2021-01-07 05:40:13

BLE模块Android

2020-02-20 08:30:49

OSPF网络协议路由协议

2019-11-25 12:38:14

混合云云计算企业

2024-01-18 09:07:04

Errors函数Golang

2023-12-11 07:40:00

CDN网络服务器

2019-09-17 09:31:10

2018-06-21 07:25:04

2023-06-08 11:57:15

Matter协议家庭智能

2015-11-06 10:52:51

2015-11-06 09:39:52

2024-10-12 08:52:16

权限模型RBAC

2021-08-29 18:01:57

HTTP协议版本

2020-07-06 12:09:24

DNS域名系统IP地址

2019-05-12 14:35:03

恶意软件网络攻击网络安全

2020-02-11 17:39:44

RSAC信息安全会议RSA大会

2010-09-03 12:20:54

数据库

2024-01-09 07:42:46

Shutil 模块Python 编程工具

2022-07-26 00:00:22

HTAP系统数据库
点赞
收藏

51CTO技术栈公众号