计算机网络--HTTP协议
1. 什么是 HTTP 协议
全称:Hyper Text Transfer Protocol(超文本传输协议)
作用:用于在服务器与客户端(通常是浏览器)之间传输超文本数据(如文字、图片、视频、音频)的应用层协议。
工作模式:HTTP 是一个双向协议,基于经典的客户端-服务器架构(B/S架构)进行工作。通信流程是:浏览器(客户端)发送请求(Request)给服务器,服务器处理请求后,向浏览器返回响应(Response)。
2. HTTP 协议通信过程
HTTP 本身不负责传输,它依赖于下层的 TCP 协议(默认端口 80)来建立可靠连接。
http 协议通信过程包括如下步骤:
1.当用户发起一个新的请求;2.浏览器发起对服务器的 TCP 连接请求;
3.服务器与浏览器之间会按照 TCP 协议的三次握手,建立之间的 TCP 连接;
4.浏览器按照 http 协议格式,创建请求数据包( http 请求报文)
5.将请求数据包( http 请求报文)发送至服务器;
6.服务器按照 http 协议格式,解析请求报文;
7.执行请求处理,调用相关业务逻辑方法,产生响应数据;
8.服务器按照 http 协议格式,将响应数据封装至响应数据包( http 响应报文)
9.服务器将响应数据包,发送至浏览器
10.浏览器按照 http 协议格式,对响应数据包进行解析;11.浏览器将响应数据包中的响应内容,显示至浏览器页面,呈现给用户;
3. URL - 如何定位资源?
HTTP 协议使用 URL(统一资源定位符)来指明要访问的网络资源。
格式:
http://host[:port][abs_path]
- 示例:http//192.168.0.116:8080/index.html
http
:协议类型。host
:服务器的主机域名或 IP 地址(如www.example.com
或192.168.1.1
)。port
:端口号,可选(省略时使用默认端口 80)。abs_path
:资源的路径(如/index.html
)。
URL 与 URI 的关系:
URI(统一资源标识符)是一个更广泛的概念,用于标识一个资源。
URL(统一资源定位符)是 URI 的子集,不仅标识了资源,还提供了定位(找到)该资源的方式。
另一个子集是 URN(统一资源名称),它只定义资源名称而不提供定位方式(例如
urn:isbn:0451450523
只告诉我们有一本书,但没告诉我们去哪找)。
4.HTTP报文
4.1.请求报文
请求行(Request Line):包含请求方法(如GET/POST)、请求的URL、HTTP协议版本。
示例:
GET /index.html HTTP/1.1
请求头(Request Headers):包含若干行首部字段,以键值对形式传递附加信息(如客户端类型、接受的数据格式等)。
示例:
Host: www.example.com
,User-Agent: Chrome/...
空行:用于分隔头部和主体。
请求体(Request Body):可选部分,通常用于 POST 或 PUT 等方法,存放要提交给服务器的数据(如表单数据、JSON等)。GET 请求没有请求体。
4.2响应报文
状态行(Status Line):包含HTTP协议版本、状态码、状态描述。
示例:
HTTP/1.1 200 OK
响应头(Response Headers):包含若干行首部字段,以键值对形式传递关于响应的附加信息(如服务器类型、内容类型、内容长度等)。
示例:
Content-Type: text/html
,Content-Length: 1024
空行:用于分隔头部和主体。
响应体(Response Body):服务器返回的实际内容(如请求的HTML文档、图片数据等)。
5.请求方式
定义了对资源要执行的操作。最常用的两种是 GET 和 POST。
方法 | 描述 | 特点 |
---|---|---|
GET | 获取资源。 | 参数通过URL传递(在请求头中),有长度限制,幂等(多次执行结果相同),可被缓存。 |
POST | 提交/增加数据。 | 参数放在请求体中,更安全,无长度限制,不幂等(多次提交可能产生不同结果)。 |
HEAD | 获取资源的响应头,不返回响应体。 | 用于检查资源是否存在、是否被修改等。 |
PUT | 修改/替换资源。 | 将数据体内容保存到请求URL指定位置。幂等。 |
DELETE | 删除指定资源。 | 幂等。 |
OPTIONS | 查询服务器对指定URL支持的请求方法。 | 返回 Allow: GET, POST, HEAD...等请求方式的内容 |
GET和POST的区别:
用途不同:GET 主要用于获取数据,POST 主要用于提交数据。
请求报文格式不同:
GET 方法请求报文第一行格式为:
GET /URL HTTP/1.1 \r\n
POST 方法请求报文第一行格式为:
POST /URL HTTP/1.1 \r\n
参数位置不同:GET 通过 URL 的查询字符串(Query String) 传递参数,POST 通过请求体(Request Body) 提交数据。
特性不同:
GET 是幂等的且可缓存。
POST 是非幂等的且不可缓存。
幂等:指多次执行相同的操作,结果都是相同的。
6.HTTP首部字段
通用类:
Connection: keep-alive
:客户端要求服务器使用长连接,以便复用TCP连接。请求头(Client -> Server):
Host: www.example.com
:必须的字段,指定请求的目标服务器域名。
Accept: text/html
:告诉服务器客户端能处理哪些类型的响应内容。
Accept-Encoding: gzip
:告诉服务器客户端支持哪些压缩格式。响应头(Server -> Client):
Content-Type: text/html; charset=utf-8
:极其重要,告诉客户端响应体的媒体类型(MIME type)和字符编码。浏览器据此决定如何解析内容。
Content-Length: 1000
:指明响应体的长度(字节数)。
Content-Encoding: gzip
:说明响应体使用的压缩格式(与Accept-Encoding
对应)
7.HTTP状态码
分类 | 含义 | 常见状态码 |
---|---|---|
1xx | 信息性状态码 | 表示请求已被接受,需要继续处理。(不常见) |
2xx | 成功 | 200 OK:请求成功。 204 No Content:成功,但无内容返回。 |
3xx | 重定向 | 301 Moved Permanently:永久重定向。 302 Found:临时重定向。 |
4xx | 客户端错误 | 400 Bad Request:请求报文有语法错误。 |
5xx | 服务器错误 | 500 Internal Server Error:服务器内部错误。 502 Bad Gateway:网关/代理错误,后端服务器无响应。 503 Service Unavailable:服务器当前忙,暂时无法处理请求。 |
8.HTTP加密
8.1HTTP协议存在的问题
HTTP 由于使用明文传输,所以存在以下安全问题:
使用明文进行通信,内容可能会被窃听,比如被抓包;
不验证通信方的身份,通信方的身份有可能遭遇伪装,比如钓鱼网站;
无法证明报文的完整性,报文有可能遭篡改,比如强制在线广告植入。
8.2什么是HTTPS协议
HTTPS 并不是一个新的协议,它使用了隧道进行通信, 让 HTTP 先和 SSL (Secure Sockets Layer) 通信,再由 SSL 和 TCP 通信。通过使用 SSL , HTTPS 实现了加密 (防窃听) 、认证 (防伪装) 和完整性保护 (防篡改) 。
8.3HTTP和HTTPS有哪些区别?
HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。 HTTPS 则解决 HTTP ”不安全的缺陷, 在 TCP 和 HTTP 网络层之间加入了 SSL 安全协议,使得报文能够加密传输。
HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL 的握手过程,才可进入加密报文传输。
HTTP的端口号是80,HTTPS的端口号是443.
HTTPS协议需要CA申请数字整数,来保证服务器的身份是可信的。
8.4加密方式
8.4.1对称密钥加密
对称密钥加密 ( Symmetric-Key Encryption ) ,加密和解密使用同一密钥。
优点: 运算速度快;
缺点: 无法安全地将密钥传输给通信方。
8.4.2飞非对称密钥加密
非对称密钥加密,又称公开密钥加密 ( Public-Key Encryption ) ,加密和解密使用不同的密钥。
公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
非对称密钥除了用来加密,还可以用来进行签名。因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。
优点: 可以更安全地将公开密钥传输给通信发送方;
缺点: 运算速度慢。
8.5. HTTPS的工作原理
用户通过浏览器请求 https 网站,服务器收到请求,选择浏览器支持的加密和 hash 算法,同时返回数字证书给浏览器,包含颁发机构、网址、公钥、证书有效期等信息。
浏览器对证书的内容进行校验,如果有问题,则会有一个提示警告。否则,就生成随机密钥 X ,同时使用证书中的公钥进行加密,并且发送给服务器。
服务器收到之后,使用私钥解密,得到随机密钥 X ,然后使用随机密钥 X 对网页内容进行加密,返回给浏览器。
浏览器则使用随机密钥 X 和之前约定的加密算法进行解密,得到最终的网页内容。