vlambda博客
学习文章列表

01网络面经:你每天都用的HTTP协议,到底是什么鬼?

程序新视界
Java后端编程、职场经验分享,带你开启程序新视界!
448篇原创内容
Official Account

作为开发人员,每天都在使用HTTP协议,但是否详细了解过一下该协议的构成及特性吗?本文就带大家全面的梳理一下。先来看一下本篇文章涉及到的知识点脑图。

01网络面经:你每天都用的HTTP协议,到底是什么鬼?

http

HTTP协议简介

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网的数据通信的基础。

HTTP协议基本格式:

协议://服务器IP:[端口]/路径/[?查询]

1999年6月公布的RFC 2616定义了HTTP协议中现今广泛使用的HTTP 1.1。HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。

HTTP协议概述

HTTP是一个客户端与服务器端请求应答的标准(TCP)。可通过浏览器或者其它的工具,发起一个HTTP请求到服务器上指定端口(默认:80)。

HTTP协议广泛应用于TCP/IP协议之上,但并非必须使用TCP/IP协议。HTTP假定下层协议可靠传输,因此能够保证这一要求的协议都可被使用。

HTTP协议数据是明文传输,不安全,可基于HTTPS进行加密处理,通常使用SSL/TLS协议进行加密。

基本使用流程:客户端发起HTTP请求,创建到指定服务器(端口)的TCP连接。服务器监听对应端口(默认80端口),接收并处理请求,返回状态码(比如:"HTTP/1.1 200 OK")、内容、错误消息或其他信息。

HTTP协议特性

HTTP是无状态的

HTTP协议是无状态(stateless)协议。每次请求都是相互独立的,不会对请求或响应做持久化处理。好处:可以更快地处理大量事务、确保协议的可伸缩性。

针对业务需要,可引入了Cookie(HTTP 1.1)和Session技术,用于管理状态。

多次HTTP请求

针对一个网页,并不是一次请求完成。客户端首先响应的是HTML页面,然后再加载其他资源(CSS、JS、图片等)。HTTP 2.0 支持管道机制,可以同时请求和响应多个请求,大大提高了效率。

无连接

HTTP 1.0每次连接只处理一个请求。服务器处理完客户的请求,收到客户的应答后,即断开连接。目的是节省传输时间、提高并发性能。

HTTP 1.1 会等待一段时间,如无后续请求则断开,否则继续使用。目的是提高效率,减少短时间内建立连接的次数。

基于TCP协议

HTTP协议的目标是规定客户端和服务端数据传输的格式和数据交互行为,并不负责数据传输的细节。大多数底层是基于TCP实现。现在使用的版本当中是默认持久连接的,也就是多次HTTP请求使用一个TCP连接。

HTTP工作流程

客户端向服务器发送请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器响应请求结果,响应内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

HTTP 请求/响应的基本步骤:

步骤一:客户端(比如浏览器)连接到Web服务器(默认80端口),并建立TCP连接。

步骤二:基于TCP,发起HTTP请求;

步骤三:服务接受请求并返回相应报文;

步骤四:释放连接TCP连接;

步骤五:客户端(浏览器)解析HTML内容并呈现;

HTTP请求报文

HTTP请求包含四个部分,分别是请求行(请求方法)、请求头(消息报头)、空行和请求正文。

01网络面经:你每天都用的HTTP协议,到底是什么鬼?
http

HTTP请求报文示例:

# 请求行
POST /index.html HTTP/1.1
# 请求头
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:67.0) 
Accept: text/html,application/xhtml+xml,application/xml;
Accept-Language: zh-CN,zh;
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1/index.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
Connection: close
Cookie: security=impossible; PHPSESSID=8vv0n11btuol45hqcm5recmfp7
Upgrade-Insecure-Requests: 1

# 请求正文
username=admin&password=admin

需要注意的每一行末尾都有回车和换行,在内容实体和请求头之间有一个空行。

HTTP响应报文

HTTP响应由四部分组成,分别是响应行、响应头(消息报头)、空行和响应正文(消息主题)。

01网络面经:你每天都用的HTTP协议,到底是什么鬼?
http

响应报文示例:

# 响应行
HTTP/1.1 200 OK
# 响应头
Date: Tue, 10 Aug 2021 09:09:09 GMT
//...省略...
Content-Length: 5185
Connection: close
Content-Type: text/html;charset=gb2312

# 响应正文
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

其中,Content-Length表示响应正文中内容的长度。

HTTP请求方法

请求方法是客户端用来告知服务器其动作意图的方法,HTTP/1.1协议中共定义了8种方法来操作指定的资源。需要注意的是方法名区分大小写,都是大写字母。

GET:获取资源

请求获取指定URI对应的资源,只读,不应该产生“副作用”。

HEAD:获得报文首部

HEAD方法类似GET方法,但HEAD方法不要求返回数据。用于确认URI的有效性及资源更新时间等,可以理解为“元数据”。

POST:传输实体主体

POST方法用来传输实体的主体。

PUT:传输文件

PUT 方法用来传输文件,向指定资源位置上传其最新内容。

DELETE:删除资源

请求服务器删除所标识的资源,与PUT方法相反。

TRACE:追踪路径

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

OPTIONS:询问支持的方法

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

CONNECT:要求用隧道协议连接代理

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

不支持对应方法时,返回状态码405(Method Not Allowed);未实现方法时,返回状态码501(Not Implemented)。

HTTP服务器至少应该实现GET和HEAD方法,其他方法可选。且所支持方法实现应匹配方法的语义定义。

HTTP状态码

状态码是用来告知客户端服务器端处理请求的结果。HTTP响应的第一行都是状态行(包括版本号、状态码、短语),具体内容见返回报文。

其中状态码包含以下类型:

  • 1xx消息——接收的请求正在处理
  • 2xx成功——请求正常处理完毕
  • 3xx重定向——需要进行附加操作以完成请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器处理请求出错

常见状态码:

  • 200:客户端请求成功,是最常见的状态。
  • 302:重定向。
  • 404:请求资源不存在,是最常见的状态。
  • 400:客户端请求有语法错误,不能被服务器所理解。
  • 401:请求未经授权。
  • 403:服务器收到请求,但是拒绝提供服务。
  • 500:服务器内部错误,是最常见的状态。
  • 503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

URL构成

以http://www.choupangxia.com:80/blog/index.html?id=10&page=1 为例。

其中:

  • http,是协议;
  • www.choupangxia.com,是服务器;
  • 80,是服务器上的默认网络端口号,默认不显示;
  • /blog/index.html,是路径(URI:直接定位到对应的资源);
  • ?id=10&page=1,是查询。

小结

关于HTTP协议相关的知识就汇总这么多,重点关注HTTP协议使用场景、请求返回报文格式、使用流程以及特性。


往期推荐




一篇文章就看透技术本质的人,
  和花一辈子都看不清的人,
  注定是截然不同的搬砖生涯。
01网络面经:你每天都用的HTTP协议,到底是什么鬼?01网络面经:你每天都用的HTTP协议,到底是什么鬼?
▲  按关 注”程序新视界“,洞察技术内幕