HTTP协议

147 阅读6分钟

HTTP协议

HTTP协议是最重要的应用层协议,全称为超文本传输协议,意为可以传输多种资源,不限于文本,HTTP协议的主要内容包括:

  1. HTTP请求和响应的格式
  2. HTTP协议的请求方法
  3. HTTP协议的版本,长短链接
  4. HTTP响应的状态码及其描述
  5. HTTP报头中的属性字段
  6. cookie与session

HTTP请求和响应的格式

http请求和响应的格式如下:

image.png HTTP请求:

  • 请求行:包括请求方法、客户端的http版本、请求的URL,其中URL表示客户端想要获取资源的路径,例如https://www.baidu.com/index.html,表示客户端想要获取的资源是百度的首页。请求行与请求报头之间通过空行(\n)进行分隔

  • 请求报头:请求报头是以key:value形式陈列的一系列属性,例如

    Host: 192.168.43.55:8080
    Connection: keep-alive
    

    其中Host表示客户端的ip和端口,Connection表示连接的形式是短链接还是长链接。每一个属性都用空行作为分隔

  • 空行:空行用于将http报文的报头和有效载荷分离,服务端读取到客户端的一个http请求之后,从前向后读取其中的内容,当服务端连续读取到2个空行时,表示报头已经读取完毕,再根据报头中的Content-Length字段读取指定长度的正文

  • 请求正文:客户端向服务器发送的正文

HTTP响应:

  • 状态行:包括HTTP版本、状态码、状态码描述,常见的状态码404就表示客户端请求的资源不存在
  • 响应报头:响应报头的作用与请求报头基本一致
  • 空行:用于将报头与有效载荷分离
  • 响应正文:服务器向客户端发送的正文,可以为空

HTTP协议的请求方法

方法含义
GET客户端请求获取指定的资源
POSTPOST方法意为提交资源,实际上也可以用于获取资源
PUT将指定资源上传到服务器
DELETE删除服务器上的某些资源,DELETE方法一般被禁用
HEADHEAD方法也是向服务器获取资源,使用HEAD方法服务器返回的http响应中没有正文,只有报头

可以使用telnet工具验证HEAD方法得到的响应中没有正文

cat@cat $ telnet www.baidu.com 80
Trying 112.80.248.76...
Connected to www.a.shifen.com.
Escape character is '^]'.
^]
telnet> 
HEAD / HTTP/1.1 

HTTP/1.1 302 Found
Connection: keep-alive
Content-Length: 17931
Content-Type: text/html
Date: Sat, 10 Jun 2023 02:55:24 GMT
Etag: "54d9749e-460b"
Server: bfe/1.0.8.18

HTTP协议的请求方法中,GET方法和POST方法最为常用,它们的主要区别在于传参方式不同,客户端在进行请求时,若服务器向客户端返回一个html,要求客户端填写用户名和密码,并且采用GET方法进行传参,此时参数会通过URL传递给服务器

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>登录页面</title>
</head>
<body>
	<form action="/login" method="get"> 
		<h2>请输入用户名和密码:</h2>
		<div>
			<label for="username">用户名:</label>
			<input type="text" id="username" name="username" required/>
		</div>
		<br />
		<div>
			<label for="password">密码:</label>
			<input type="password" id="password" name="password" required />
		</div>
		<br />
		<input type="submit" value="登录"/>
	</form>
</body>
</html>

服务器收到的http请求如下:

GET /login?username=cat&password=123456 HTTP/1.1
Host: 192.168.43.55:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.43.55:8080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

若通过POST方法进行传参,那么参数会以正文的形式进行传递,服务器收到的请求如下:

POST /login HTTP/1.1
Host: 192.168.43.55:8080
Connection: keep-alive
Content-Length: 28
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.43.55:8080
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.43.55:8080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username=cat&password=123456

GET方法与POST方法的区别:

  • POST方法使用正文传参,参数更加私密
  • URL的长度是有限制的,GET方法可以传递的参数数量小于POST方法,如果需要传参,应该尽量使用POST方法

HTTP协议的版本,长短链接

HTTP协议常见的版本有1.0和1.1,其中1.1支持长链接,1.0只支持短链接,在http的Connection字段可以提现

Connection: keep-alive

http协议底层使用的传输层协议为tcp协议,http1.0只支持短链接,意味着客户端每一次与服务端进行tcp三次握手建立连接之后,只能进行一次http请求与响应,之后链接断开。http1.1支持长链接,客户端与服务器建立链接之后可以进行多次http请求和响应,充分利用了链接资源。

HTTP响应的状态码及其描述

状态码含义
200ok,表示服务端正常进行响应
301永久重定向
302、307临时重定向
403服务器拒绝执行客户端的请求(Forbidden)
404客户端要访问的资源服务器找不到
502表示当前服务器作为代理服务器,无法获取上层服务器的响应(Bad Gateway)

重定向相关的状态码一般用于实现网站搬迁和网页跳转,若服务器给出的http响应中状态码为301、302或307,那么在响应报头中必须包含Location字段,用于指明要跳转的目标网址,例如:

Location: https://www.baidu.com

HTTP报头中的属性字段

属性字段含义
Host表示客户端的ip和端口
Content-Type表示正文的类型
Content-Length表示正文的长度
Connection表示是否支持长链接
User-Agent表示客户端的操作系统和版本
Location表示要重定向的目标网址
Set-Cookie服务器设置Set-Cookie信息,浏览器收到响应后保存在本地
Cookie浏览器向服务器发送的Cookie数据

cookie与session

http协议是一种无状态协议,cookie和session可以使http协议具有会话保持的功能,若服务器给浏览器的http响应中设置了Set-Cookie字段,浏览器会保存该字段,下一次进行访问时会携带该字段。这种技术一般用于保存用户名和密码,让用户每一次访问网站时不用重复的输入用户名和密码。

由于cookie信息保存在浏览器中,且一般为用户的私密数据,为了加强其安全性,一般与session技术配合使用,session技术指的是用户在第一次输入用户名和密码之后,服务器将其保存在磁盘上,同时给用户返回一个session_id,与用户的信息一一对应,这样用户浏览器的cookie中保存的就是session_id信息,用户名和密码实际保存在服务端,即使cookie被盗,服务端也可以通过ip等信息进行检测,除此之外,服务端还会定期清理session_id,要求用户重新输入用户名与密码,进一步确保账号安全。