HTTP、HTTPS和TCP学习笔记
一、核心协议知识点梳理
1. TCP协议(传输控制协议)
1.1 核心定位
TCP是面向连接的、可靠的、基于字节流的传输层协议,位于IP协议之上,应用层协议(如HTTP)之下,负责在两个通信端点之间建立可靠的字节流传输通道。
1.2 核心特点
面向连接:通信前必须通过“三次握手”建立连接,通信结束后通过“四次挥手”释放连接。
可靠传输:通过序列号、确认应答、重传机制、流量控制、拥塞控制等保证数据不丢失、不重复、按序到达。
面向字节流:不关心应用层数据的具体含义,将应用层数据视为连续的字节流,拆分为TCP报文段传输。
双工通信:通信双方可同时发送和接收数据。
点到点通信:仅支持两个端点之间的通信,不支持多播或广播。
1.3 关键机制
**三次握手(建立连接)**目的:确保双方收发能力正常,协商初始序列号(ISN)。过程:
客户端 → 服务器:SYN=1,Seq=x(客户端初始序列号)
服务器 → 客户端:SYN=1,ACK=1,Seq=y,Ack=x+1(确认客户端,发送服务器初始序列号)
客户端 → 服务器:ACK=1,Seq=x+1,Ack=y+1(确认服务器,连接建立)

**四次挥手(释放连接)**目的:确保双方数据都已传输完成,正常释放连接。过程:
客户端 → 服务器:FIN=1,Seq=u(客户端无数据发送,请求释放)
服务器 → 客户端:ACK=1,Seq=v,Ack=u+1(确认客户端请求,此时服务器可能仍有数据发送)
服务器 → 客户端:FIN=1,ACK=1,Seq=w,Ack=u+1(服务器无数据发送,请求释放)
客户端 → 服务器:ACK=1,Seq=u+1,Ack=w+1(确认服务器请求,等待2MSL后释放连接)

流量控制:通过滑动窗口机制,让发送方的发送速率适配接收方的接收能力,避免接收方缓冲区溢出。接收方通过ACK报文告知发送方自己的接收窗口大小。
拥塞控制:通过慢启动、拥塞避免、快速重传、快速恢复等算法,避免网络因发送方数据过多而拥塞。
重传机制:若发送方未在超时时间内收到确认应答,会重传对应报文段;快速重传机制可在收到3个重复ACK时直接重传,无需等待超时。
2. HTTP协议(超文本传输协议)
2.1 核心定位
HTTP是基于TCP的应用层协议,用于规范客户端(如浏览器)与服务器之间的超文本(文本、图片、视频等)传输格式和交互流程,是Web服务的基础。
2.2 核心特点
无连接:HTTP/1.0默认每次请求-响应后关闭TCP连接;HTTP/1.1支持长连接(Keep-Alive),可复用TCP连接处理多个请求。
无状态:服务器不保存客户端的上下文信息,每次请求都是独立的。需通过Cookie、Session等机制实现状态保持。
简单灵活:请求格式简单(方法+URL+协议版本+请求头+请求体),支持多种数据格式。
明文传输:数据在传输过程中未加密,易被窃听、篡改、伪造。
2.3 核心组成
请求报文结构
请求行:Method Request-URI HTTP-Version (如:GET /index.html HTTP/1.1) 请求头:Key: Value (如:Host: www.example.com, User-Agent: Chrome/100.0.0.0) 空行(分隔请求头和请求体) 请求体(可选,如POST请求的表单数据、JSON数据)响应报文结构
状态行:HTTP-Version Status-Code Reason-Phrase (如:HTTP/1.1 200 OK) 响应头:Key: Value (如:Content-Type: text/html; charset=utf-8, Content-Length: 1024) 空行(分隔响应头和响应体) 响应体(如HTML页面、JSON数据、图片等)常用请求方法
- GET:获取资源(如请求网页、图片),请求参数拼接在URL后,长度有限制,幂等(多次请求结果一致)。
- POST:提交资源(如表单提交、上传文件),请求参数在请求体中,长度无限制,非幂等。
- PUT:更新资源(全量更新),幂等。
- DELETE:删除资源,幂等。
- HEAD:获取响应头,不返回响应体(用于检查资源是否存在、获取资源大小等)。
- OPTIONS:获取服务器支持的请求方法。
常用状态码
1xx(信息性状态码):请求已接收,继续处理(如100 Continue)。
2xx(成功状态码):请求正常处理完成(如200 OK,204 No Content)。
3xx(重定向状态码):需要客户端进一步操作(如301 永久重定向,302 临时重定向,304 Not Modified 协商缓存命中)。
4xx(客户端错误):请求存在错误(如400 Bad Request,401 未授权,403 禁止访问,404 资源不存在)。
5xx(服务器错误):服务器处理请求出错(如500 内部服务器错误,502 网关错误,503 服务不可用,504 网关超时)。
2.4 HTTP版本演进
HTTP/1.0:默认短连接,每次请求新建TCP连接,效率低;支持GET、POST、HEAD方法。
HTTP/1.1:支持长连接(Keep-Alive),复用TCP连接;支持管线化(批量发送请求,无需等待响应);增加PUT、DELETE等方法;支持Chunked Transfer Encoding(分块传输)。
HTTP/2:基于二进制帧传输(而非文本);支持多路复用(一个TCP连接同时处理多个请求-响应,避免队头阻塞);支持头部压缩(减少头部传输体积);支持服务器推送(主动向客户端推送资源)。
HTTP/3:基于QUIC协议(UDP之上的可靠传输协议),解决TCP队头阻塞问题;支持0-RTT握手(快速建立连接);更好的移动网络适配性。
3. HTTPS协议(超文本传输安全协议)
3.1 核心定位
HTTPS是HTTP的安全版本,通过在HTTP和TCP之间加入TLS/SSL加密层,实现数据传输的机密性、完整性和身份认证,解决HTTP明文传输的安全隐患。
3.2 核心特点(对比HTTP)
加密传输:数据通过对称加密传输,密钥通过非对称加密协商,避免数据被窃听。
身份认证:通过数字证书验证服务器(或客户端)身份,避免中间人攻击。
完整性校验:通过消息摘要算法(如SHA)验证数据完整性,避免数据被篡改。
端口不同:HTTP默认端口80,HTTPS默认端口443。
性能开销略高:TLS/SSL握手过程需要额外的网络交互和加密运算。
3.3 核心原理(TLS/SSL握手过程)
客户端 → 服务器:发送客户端支持的TLS版本、加密套件列表、随机数(Client Random)。
服务器 → 客户端:选择TLS版本和加密套件,发送服务器随机数(Server Random)、数字证书(含服务器公钥)。
客户端验证数字证书:通过CA(证书颁发机构)公钥验证证书合法性,确认服务器身份。
客户端 → 服务器:生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送给服务器。
双方生成会话密钥:客户端和服务器分别用Client Random、Server Random、Pre-Master Secret,通过相同的算法生成会话密钥(对称加密密钥)。
客户端 → 服务器:发送加密的“握手完成”消息,验证会话密钥有效性。
服务器 → 客户端:发送加密的“握手完成”消息,验证会话密钥有效性。
握手完成:后续HTTP数据通过会话密钥进行对称加密传输。
3.4 数字证书作用
数字证书是由CA颁发的电子文件,包含服务器公钥、服务器身份信息、CA签名等内容,用于证明服务器公钥的合法性和服务器身份的真实性,避免中间人替换服务器公钥的攻击。
二、面试高频问题及解析
1. TCP相关问题
Q1:TCP为什么需要三次握手?两次握手可以吗?
解析:
三次握手的核心目的是确保双方收发能力正常,并协商初始序列号(ISN),避免因延迟的旧连接请求报文导致错误。
两次握手不可行,原因:
无法确认客户端的接收能力:若服务器仅收到客户端的SYN报文就建立连接(两次握手),但客户端未收到服务器的SYN+ACK报文(如报文丢失),客户端不会认为连接建立,而服务器会等待客户端发送数据,造成资源浪费。
无法避免旧连接请求的干扰:若网络中存在延迟的旧SYN报文(如之前断开连接的残留报文),服务器收到后会误以为是新连接请求,两次握手后建立连接,向客户端发送数据,但客户端根本没有建立连接的需求,导致服务器资源浪费。三次握手的第三次ACK可让服务器确认客户端是“当前有效”的,避免该问题。
Q2:TCP四次挥手为什么需要四次?为什么不能三次?
解析:
四次挥手的核心原因是TCP是双工通信,双方都需要独立关闭自己的发送通道,不能一次性同步关闭。
具体过程分析:
第一次挥手:客户端告知服务器“我没有数据要发送了”(FIN=1),但此时客户端仍可接收服务器的数据。
第二次挥手:服务器确认客户端的FIN请求(ACK=1),但服务器可能还有未发送完的数据,需要继续发送,因此不能同时发送FIN报文。
第三次挥手:服务器发送完所有数据后,告知客户端“我也没有数据要发送了”(FIN=1)。
第四次挥手:客户端确认服务器的FIN请求,连接关闭。
不能三次的原因:服务器在第二次挥手时,无法确定自己是否还有数据要发送,若强制同时发送FIN(三次挥手),可能导致服务器未发送完的数据丢失。
Q3:TCP的流量控制和拥塞控制有什么区别?分别如何实现?
解析:
核心区别:控制对象不同——流量控制是控制“发送方与接收方之间”的速率匹配,避免接收方缓冲区溢出;拥塞控制是控制“发送方与整个网络之间”的速率匹配,避免网络拥塞。
实现方式:
流量控制:通过滑动窗口机制实现。
接收方在ACK报文中携带自己的“接收窗口大小”(rwnd),告知发送方“我当前最多能接收多少字节的数据”。发送方的发送窗口大小 ≤ 接收方的接收窗口大小,确保发送速率不超过接收方的处理能力。
若接收方缓冲区满,rwnd=0,发送方停止发送,等待接收方发送新的ACK告知可用窗口。
拥塞控制:通过慢启动、拥塞避免、快速重传、快速恢复等算法实现。
慢启动:连接建立初期,发送窗口大小按指数增长(1→2→4→…),快速试探网络容量。拥塞避免:当发送窗口大小达到慢启动阈值(ssthresh)后,改为线性增长(每次+1),避免网络拥塞。
快速重传:收到3个重复ACK时,直接重传对应报文段,无需等待超时,减少重传延迟。
快速恢复:快速重传后,将ssthresh设为当前拥塞窗口的一半,然后拥塞窗口从ssthresh开始线性增长,避免再次拥塞。
Q4:TCP和UDP的区别是什么?分别适用哪些场景?
解析:
核心区别对比:
| 维度 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 可靠(无丢失、无重复、按序) | 不可靠(可能丢失、乱序) |
| 传输方式 | 字节流 | 数据报(独立报文) |
| 头部开销 | 大(20-60字节) | 小(8字节) |
| 速度 | 慢(握手、重传等开销) | 快(无额外开销) |
| 拥塞控制 | 支持 | 不支持 |
| 适用场景 | 需要可靠传输的场景(文件传输、网页浏览、邮件发送、数据库交互) | 对实时性要求高、可容忍少量丢失的场景(视频直播、语音通话、DNS查询、游戏) |
2. HTTP相关问题
Q1:HTTP的无状态性是什么意思?如何解决?
解析:
无状态性:服务器不会保存客户端的任何上下文信息,每次HTTP请求都是独立的,服务器无法通过请求直接识别客户端的身份或之前的交互状态。
解决方式:
Cookie:客户端第一次请求时,服务器生成包含用户信息的Cookie,通过响应头的Set-Cookie字段发送给客户端;客户端后续请求时,会通过请求头的Cookie字段携带该Cookie,服务器通过Cookie识别客户端。Cookie存储在客户端(浏览器),大小有限(约4KB),可设置过期时间。
Session:客户端第一次请求时,服务器生成Session(存储用户信息),并将Session ID通过Cookie发送给客户端;客户端后续请求时,携带Session ID,服务器通过Session ID查找对应的Session。Session存储在服务器(内存、数据库等),安全性比Cookie高,可存储更多信息,但会占用服务器资源。
Token:客户端登录成功后,服务器生成Token(如JWT)并返回给客户端;客户端后续请求时,通过请求头(如Authorization: Bearer Token)携带Token,服务器验证Token合法性。Token无需存储在服务器,可跨域使用,适合分布式系统、前后端分离项目。
其他:URL重写(将Session ID拼接在URL后)、隐藏表单域等,安全性较低,现在较少使用。
Q2:HTTP的301和302状态码有什么区别?应用场景是什么?
解析:
两者均为重定向状态码,核心区别是重定向的永久性:
301 Moved Permanently(永久重定向):
含义:请求的资源已永久迁移到新的URL,后续所有请求都应直接访问新URL。浏览器行为:会缓存新URL,后续再次请求原URL时,直接跳转到新URL,无需向服务器发送请求。
应用场景:域名更换、网站结构调整(资源永久迁移)、HTTP跳转HTTPS。
302 Found(临时重定向):
含义:请求的资源暂时迁移到新的URL,后续请求仍可能访问原URL。浏览器行为:默认不缓存新URL,每次请求原URL时,都会向服务器发送请求,由服务器告知新URL。
应用场景:网站维护时临时跳转至维护页面、A/B测试时临时跳转不同页面、登录后跳转回原页面。
补充:307 Temporary Redirect(临时重定向)与302类似,但要求客户端必须使用原请求方法(如原请求是POST,重定向后仍用POST);302可能被浏览器默认转为GET请求。
Q3:HTTP/1.1和HTTP/2的主要区别是什么?
解析:
HTTP/2在HTTP/1.1的基础上做了大幅优化,核心区别如下:
传输方式:HTTP/1.1基于文本传输,报文解析复杂,易出错;HTTP/2基于二进制帧传输,将请求/响应拆分为多个二进制帧(帧头部+数据),解析效率更高,错误率更低。
多路复用:HTTP/1.1的长连接虽可复用TCP连接,但同一连接内的请求需按顺序处理(管线化也无法彻底解决队头阻塞),一个请求阻塞会影响后续所有请求;HTTP/2通过二进制帧的“流标识”(每个请求对应一个唯一流标识),实现同一TCP连接内同时处理多个请求-响应,彻底解决队头阻塞问题。
头部压缩:HTTP/1.1的请求头/响应头每次都需完整传输,头部信息(如User-Agent、Host)重复率高,浪费带宽;HTTP/2使用HPACK算法压缩头部,通过静态字典、动态字典缓存重复的头部字段,大幅减少头部传输体积。
服务器推送:HTTP/1.1只有客户端主动请求,服务器才能返回资源;HTTP/2支持服务器推送,服务器可在客户端请求一个资源(如HTML页面)时,主动向客户端推送相关资源(如CSS、JS文件),减少客户端的请求次数。
流量控制:HTTP/2支持基于流的流量控制,可对每个流独立设置接收窗口,更精细地控制数据传输速率。
3. HTTPS相关问题
Q1:HTTPS为什么比HTTP安全?HTTPS的加密过程是怎样的?
解析:
HTTPS比HTTP安全的核心原因是加入了TLS/SSL加密层,实现了三大安全目标:
机密性:数据通过加密传输,只有发送方和接收方才能解密,避免被窃听。
完整性:通过消息摘要验证数据,确保数据在传输过程中未被篡改。
身份认证:通过数字证书验证服务器身份,避免中间人攻击。
HTTPS的加密过程(TLS/SSL握手+数据传输):
握手阶段(协商密钥):
客户端向服务器发送“客户端问候”:包含支持的TLS版本、加密套件列表、随机数A。服务器向客户端发送“服务器问候”:包含选择的TLS版本、加密套件、随机数B、数字证书(含服务器公钥)。
客户端验证证书:用CA公钥解密证书中的CA签名,验证证书合法性(如证书是否过期、是否被篡改、域名是否匹配),确认服务器身份。
客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送给服务器。
客户端和服务器分别用随机数A、随机数B、预主密钥,通过相同的密钥派生算法生成会话密钥(对称加密密钥)。
双方互发“握手完成”消息,并用会话密钥加密,验证密钥协商成功。
数据传输阶段:
后续的HTTP请求/响应数据,都通过会话密钥进行对称加密传输(如AES算法)。同时会对数据进行哈希运算生成消息摘要,附加在数据后,接收方通过验证摘要确认数据完整性。
补充:为什么要结合对称加密和非对称加密?——非对称加密安全性高,但加密解密速度慢;对称加密速度快,但密钥协商过程不安全。HTTPS用非对称加密协商对称密钥,用对称加密传输数据,兼顾安全性和效率。
Q2:HTTPS的数字证书是什么?作用是什么?如何验证证书的合法性?
解析:
数字证书的定义:由权威的CA(证书颁发机构,如Verisign、Let’s Encrypt)颁发的电子文件,是服务器身份的“电子身份证”。
核心作用:身份认证:证明服务器的真实身份,避免客户端连接到伪造的服务器(中间人攻击)。
分发公钥:将服务器的公钥安全地分发给客户端,用于后续的密钥协商。
证书验证过程(客户端执行):
验证证书签名:CA用自己的私钥对证书内容(服务器公钥、服务器域名、证书有效期等)进行签名;客户端用CA的公钥(内置在浏览器/操作系统中)解密签名,得到证书内容的哈希值;同时客户端对收到的证书内容重新计算哈希值,对比两个哈希值,若一致则证书未被篡改。验证证书有效期:检查证书的“生效时间”和“过期时间”,确认当前时间在有效期内。
验证域名匹配:检查证书中绑定的域名,是否与客户端请求的域名一致(避免证书被滥用)。
验证证书链:若证书是二级CA颁发的,需验证二级CA的证书是否由根CA颁发,直到验证到根CA(根CA证书是自签名的,默认信任),形成完整的证书链。
Q3:HTTP和HTTPS的区别是什么?
解析:
| 维度 | HTTP | HTTPS |
|---|---|---|
| 安全性 | 明文传输,不安全(易窃听、篡改、伪造) | TLS/SSL加密,安全(机密性、完整性、身份认证) |
| 端口 | 默认80 | 默认443 |
| 协议栈 | 应用层 → TCP | 应用层 → TLS/SSL → TCP |
| 握手过程 | 无额外握手,直接发送HTTP请求 | 需先完成TLS/SSL握手(协商密钥),再传输HTTP数据 |
| 性能开销 | 低(无加密、无额外握手) | 高(TLS/SSL握手、加密解密运算) |
| 证书要求 | 无需证书 | 需向CA申请数字证书(免费/付费) |
| 适用场景 | 非敏感数据传输(如公开的静态网页) | 敏感数据传输(如登录、支付、个人信息) |
4. 综合问题
Q1:从输入URL到页面加载完成,整个过程经历了哪些步骤?
解析:
URL解析:浏览器解析输入的URL,提取协议(HTTP/HTTPS)、域名(如www.example.com)、端口(默认80/443)、路径(如/index.html)等信息。
DNS解析:将域名转换为服务器的IP地址。
浏览器先查询本地DNS缓存(如浏览器缓存、操作系统缓存),若命中则直接获取IP。
若本地缓存未命中,向本地DNS服务器(如路由器DNS、运营商DNS)发送查询请求,本地DNS服务器查询自身缓存或向上级DNS服务器(根服务器、顶级域服务器、权威DNS服务器)递归查询,最终返回IP地址。
建立连接:根据协议类型建立连接:
- HTTP:与服务器的IP:80端口建立TCP连接(三次握手)。
- HTTPS:先与服务器的IP:443端口建立TCP连接,再完成TLS/SSL握手(协商会话密钥)。
发送HTTP请求:浏览器通过建立的连接,向服务器发送HTTP请求报文(包含请求行、请求头、请求体)。
服务器处理请求:服务器接收请求,解析请求内容,处理业务逻辑(如查询数据库、生成页面),生成HTTP响应报文(包含状态行、响应头、响应体)。
服务器返回响应:服务器将响应报文通过连接发送给浏览器。
浏览器接收响应并渲染页面:
浏览器解析响应头,判断响应类型(如HTML、CSS、JS、图片)。
若响应是HTML,浏览器解析HTML生成DOM树,解析CSS生成CSSOM树,结合两者生成渲染树,然后进行布局(Layout)和绘制(Paint),最终在页面上显示内容。
过程中若遇到CSS、JS、图片等资源,会重复步骤2-6,请求并加载这些资源。
关闭连接:所有资源加载完成后,根据协议版本关闭连接(HTTP/1.0直接关闭,HTTP/1.1可复用连接或等待Keep-Alive超时后关闭)。
Q2:为什么HTTPS的TLS握手需要两次网络往返?如何优化?
解析:
TLS握手的网络往返次数:标准TLS 1.2握手需要2次网络往返(RTT):
第一次RTT:客户端发送Client Hello → 服务器发送Server Hello + 证书 + Server Hello Done。第二次RTT:客户端发送Client Key Exchange + Change Cipher Spec + Finished → 服务器发送Change Cipher Spec + Finished。
优化方式:
会话复用:会话ID复用:第一次握手后,服务器生成会话ID并存储会话密钥;客户端后续连接时,在Client Hello中携带会话ID,服务器通过会话ID查找会话密钥,直接跳过证书验证和密钥协商步骤,握手仅需1次RTT。
会话票据复用:服务器生成会话票据(包含会话密钥,用服务器密钥加密)发送给客户端;客户端后续连接时携带会话票据,服务器解密票据获取会话密钥,无需存储会话信息,更适合分布式服务器。
TLS 1.3协议:TLS 1.3简化了握手过程,支持0-RTT或1-RTT握手:
1-RTT握手:将Server Hello、证书、密钥协商信息合并发送,减少一次RTT,标准握手仅需1次RTT。
0-RTT握手:客户端可在第一次Client Hello中携带加密的应用数据(如HTTP请求),服务器验证后直接返回响应,无需额外RTT,大幅降低延迟(适合频繁访问的网站)。
证书优化:使用ECDSA证书(椭圆曲线加密,签名验证速度快)、减少证书链长度、启用OCSP Stapling(服务器提前获取证书状态信息,避免客户端单独查询OCSP服务器)。
HTTP/3协议:基于QUIC协议(UDP之上),QUIC的握手仅需0-RTT或1-RTT,同时集成了TLS 1.3加密,进一步降低HTTPS的连接延迟。
三、学习与面试建议
核心重点:优先掌握TCP三次握手/四次挥手、可靠传输机制、HTTP报文结构/状态码/请求方法、HTTPS加密原理与证书机制,这些是面试高频考点。
版本演进:理解HTTP/1.1→HTTP/2→HTTP/3、TLS 1.2→TLS 1.3的演进逻辑(解决了什么问题、优化了什么),体现技术深度。
实践结合:通过抓包工具(如Wireshark、Chrome开发者工具)分析真实的HTTP/HTTPS请求报文、TCP连接过程,加深对理论知识的理解。
问题延伸:回答面试题时,不仅要给出答案,还要解释“为什么”(如TCP三次握手的目的)、“有什么例外情况”(如三次握手失败怎么办)、“实际应用中的优化”(如HTTPS延迟优化),展现思考的全面性。




