8.5 KiB
1. HTTP协议
HTTP(HTTPS)是建立在TCP协议层上的应用层协议。区别在于HTTP使用明文传输,HTTPS是在SSL加密层上进行传输的。SSL加密层可以看成是TCP的扩展,因此在应用层上,HTTP和HTTP可以看成是一样的。
HTTP的默认端口是80;HTTPS的默认端口是443。
另外为了提升服务器的负载能力,HTTP是应答完成后就断开TCP的方式。
HTTP是纯文本的应用层协议,无论是Request或者是Response都是一致的结构,分为头(head)和体(body)两个部分。
一个典型的Request由客户端发起:
GET /index.php?a=1&b=2 HTTP/1.1
Host: localhost
sec-ch-ua: "Not.A/Brand";v="99", "Chromium";v="136"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Linux"
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.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
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Cookie: Lg4E_2132_saltkey=FQXT9TSx; Lg4E_2132_lastvisit=1761101776; Lg4E_2132_ulastactivity=e3c3eG8C3HO%2FWXweKkNzw5nEuS2QRbsVqRZ82RGJGMn3uL7a3K1D; Lg4E_2132_nofavfid=1; Lg4E_2132_visitedfid=2; Lg4E_2132_smile=1D1; Lg4E_2132_lastcheckfeed=1%7C1761124759; DedeUserID=2; DedeUserID__ckMd5=1be68b23ddcae297; PHPSESSID=0eae6bcf13b88d56b155bb3e33921404; DedeLoginTime=1761882038; DedeLoginTime__ckMd5=4e7ad3dc7f3a81b5
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
b=2
整个的HTTP协议由head和body构成;head和body之间用一个空行隔开。
1.1. HTTP请求
1.1.1. Head
1.1.1.1. 方法(Method)
GET /index.php?a=1&b=2 HTTP/1.1
方法行定义了三个部分,
第一个部分是方法,常见的方法如下:
GET:获取资源(如网页、文件)。POST:提交数据(如表单、文件上传)。PUT:更新资源。DELETE:删除资源。HEAD:仅获取响应头。OPTIONS:查询服务器支持的通信选项。
第二个部分是请求资源的路径以及GET参数:
/index.php?a=1&b=2
这里的路径是 /index.php 问好后面的是参数列表,多个参数用&进行分割;注意这里路径应该符合URL的编码规则。
第三部分是HTTP的版本号。
1.1.1.2. Host
Host: localhost
host表示的是请求的主机(host)的域名、IP地址均可。主机名或者是ip地址后面可以带端口号(tcp监听端口),如果不带,表示默认端口80。
Host: localhost
Host: www.test.com:8080
1.1.1.3. 其他头
其他头由很多,比如 cookie,用到的时候再讲解。
1.1.2. Body
body部分是请求的附加数据,例如Post的数据;发送的文件等。
1.2. HTTP回应
HTTP/1.1 200 OK
Server: nginx/1.15.11
Date: Fri, 31 Oct 2025 03:53:44 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.2.17
Content-Length: 63690
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html>
<head>
</head>
<body>
</body>
</html>
1.2.1. head
响应头中最重要的是
HTTP/1.1 200 OK
后面的 200 表示响应代码,OK 表示响应代码的描述。具体的响应代码可以查看HTTP响应码。
1.2.2. body
根据请求的资源,返回的响应具体内容。可以是几乎任何的文档,包括html、文件、图片等。
2. 什么是cookie
Cookie 是网站存储在用户设备(如电脑、手机)上的小型数据文件,主要用于记录用户信息、跟踪行为或保持会话状态。以下是简单解释:
2.1. 核心作用
- 记住用户信息
- 例如:登录网站后,下次访问时自动填充用户名/密码(需用户允许)。
- 保存偏好设置(如语言、主题颜色)。
- 跟踪用户行为
- 广告商通过 Cookie 记录你的浏览习惯,推送相关广告(如你搜过鞋子后,其他网站显示鞋类广告)。
- 维持会话状态
- 购物车功能依赖 Cookie:即使你关闭页面再打开,商品仍保留在购物车中。
2.2. 工作原理
- 服务器发送 Cookie
- 当你访问网站时,服务器可能通过 HTTP 响应头(如
Set-Cookie)发送一个或多个 Cookie 到你的浏览器。
- 当你访问网站时,服务器可能通过 HTTP 响应头(如
- 浏览器存储 Cookie
- 浏览器将 Cookie 保存在本地文件或内存中(按域名分类,不同网站互不干扰)。
- 后续请求携带 Cookie
- 再次访问同一网站时,浏览器会自动在 HTTP 请求头中附加相关 Cookie,服务器据此识别用户。
简单说来,cookie 就是存储在客户端的一段数据,在访问相同的域名的时候(可能还会限制域名下面的路径),会自动发送给服务器。cookie可以由response中的head字段发送给客户端(服务器向客户端写cookie);也可以在客户端通过js读取和设置cookie(客户端读写cookie)。这样服务器就可以记住客户端是谁。例如把用户ID存放在cookie中,每次都自动发送给服务器(在head中),服务器就会知道收到的request是谁发送的。
但是在客户端存放敏感信息是一种不安全的做法,客户端的环境是不可控的,cookie可能会被伪造。这样我们就需要使用到session来解决这个问题。
注意:cookie 的存放有两个重要参数,第一是作用域,其实就是路径;第二就是过期时间。
3. session
显然cookie值可以在客户端进行读写,如果把敏感信息存放到cookie中是不安全的。因此服务器需要识别到底是哪个客户端的访问情况就需要使用到session。
Session是存放在服务器的数据,一般用来存放某个用户的信息。当客户端访问服务器,服务器就会读取出客户端对应的Session,从而知道是那个客户端发起的请求。
那么服务器是如何知道是哪个客户端访问服务器,并读取出该客户端对应的Session?这就需要使用到cookie。注意cookie的特点,服务器是可以设置cookie的,通过response中在回应头加入相应的cookie字段,客户端收到该回应就会设置自己的cookie;以后每次访问服务器就会自动发送该cookie。
<?php
session_start();
echo "hello";
?>
访问这个页面,F12打开调试。
在4这个位置可以看到服务通过返回头设置了客户端的的一个cookie,这个cookie 就对应服务器的session。进一步验证,在客户端的cookie中可以看到这个值(4位置)。
在后续的访问中,这个cookie值被自动发送给服务器,服务器就通过这个值来和服务器端的session联系起来,确定是那个客户端在发出请求。
就好像是给每个客户端临时进行了编号,通过编号就能只能是谁在访问。同时session在服务器端是一个数组,数组中可以增加,修改项目,用来存放该用户的状态或者是临时数据。例如是否登陆、用户ID等。
Session的读取是自动的,通过$_SESSION 数组来进行读写。另外session也是有过期时间的。
这样,客户端只用在cookie中存放一个随机字符串,服务器就可以读取在服务器端对应的session来获得该用户的信息,要比把敏感信息放在cookie中安全很多。
注意:老的浏览器可能不支持cookie,因此也可以把上述的PHPSESSION这个字符串通过GET参数传递给服务器。
关于SESSION的配置,在phpinfo中有详细的描述:



