# 1. HTTP 协议介绍
HTTP 协议是超文本传输协议,属于应用层协议,基于 TCP/IP 通信协议来传递数据,是无状态的协议。
HTTP 报文由起始行,首部以及数据主体三个部分
# HTTP 请求方法
GET: 请求指定的页面信息,并返回实体主体
HEAD:: 类似于 get 请求,返回的内容不包含实体部分,用于获取报头
POST: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)
PUT: 从客户端向服务器传送的数据取代指定的文档的内容
DELETE: 请求服务器删除指定的页面
OPTIONS:允许客户端查看服务器的性能。询问支持请求的方法
TRACE: 将服务器收到的请求回送到客户端,主要用于测试或诊断。
# 2. TCP/IP 协议
- TCP/IP 协议族是由一个四层协议组成的系统,这四层分别为:应用层、传输层、网络层和数据链路层
应用层: 一般是我们编写的应用程序,其决定了向用户提供的应用服务。(如 FTP、HTTP、DNS)等
传输层: 通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。(如 TCP、UDP)
TIP
udp 和 tcp 的区别
1、TCP 是面向连接;UDP 是无连接的
2、TCP 提供可靠的服务(三次握手),而 UDP 尽最大努力交付,TCP 不会出现丢包并且能够保证数据的顺序
3、TCP 传输的速度比 UDP 慢
4、TCP 适用于传输大量数据,而 UDP 适用于传输少量数据
# 3. TCP三次握手(建立连接)
目的:确保客户端和服务端双方的发送和接收能力正常。
# 流程:
第一次握手(SYN=1, seq=x)
- 客户端发送 SYN 报文(同步序列号),并随机生成初始序列号 seq=x,进入 SYN_SENT 状态。
- 作用:服务端确认客户端的发送能力正常。
第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)
- 服务端收到 SYN 后,返回 SYN+ACK 报文,随机生成自己的序列号 seq=y,并确认客户端的序列号 ack=x+1,进入 SYN_RCVD 状态。
- 作用:客户端确认服务端的接收和发送能力正常。
第三次握手(ACK=1, seq=x+1, ack=y+1)
- 客户端收到 SYN+ACK 后,发送 ACK 报文确认,序列号为 seq=x+1,确认号为 ack=y+1,进入 ESTABLISHED 状态。
- 服务端收到 ACK 后也进入 ESTABLISHED 状态。
- 作用:服务端确认客户端的接收能力正常。

- TCP flag表示TCP标志位,主要介绍两个ACK和SYN:
- SYN同步序号,用于建立连接过程。
- ACK确认序号标识,标识表示发送信息已确认接收。
# 为啥 TCP 需要三次握手,不是两次,四次?
TCP三次握手是为了确认双方的序列号,这就像一个发送—应答机制,客户端发序列号,服务端返回确认号,此时确认了客户端的序列号。
如果是两次握手,只能确认客户端的序列号,无法确认服务端的序列号。三次握手是确认两个序列号最小的连接次数。 四次也可以,但是没有必要,需要减少握手的次数,加快连接速度。
# 4. TCP 四次挥手(断开连接)
目的:双方安全关闭连接,确保数据完整传输。
# 流程:
第一次挥手(FIN=1, seq=u)
- 主动关闭方(客户端)发送 FIN 报文,序列号为 seq=u,进入 FIN_WAIT_1 状态。
- 作用:通知服务端“客户端不再发送数据”。
第二次挥手(ACK=1, ack=u+1)
- 服务端收到 FIN 后,返回 ACK 报文,确认号为 ack=u+1,进入 CLOSE_WAIT 状态。
- 客户端收到 ACK 后进入 FIN_WAIT_2 状态。
- 作用:服务端确认收到关闭请求,但可能还有数据未发送完。
第三次挥手(FIN=1, ACK=1, seq=v, ack=u+1)
- 服务端完成剩余数据发送后,发送 FIN+ACK 报文,序列号为 seq=v,进入 LAST_ACK 状态。
- 作用:通知客户端“服务端也准备关闭”。
第四次挥手(ACK=1, ack=v+1)
- 客户端收到 FIN 后,发送 ACK 报文,确认号为 ack=v+1,进入 TIME_WAIT 状态(等待 2MSL 后关闭)。
- 服务端收到 ACK 后立即关闭连接。
- 作用:确保服务端收到最后的确认(防止 FIN 重传)。
# 为什么需要四次挥手?
- TCP 是全双工的,需分别关闭两个方向的连接:
- 客户端主动关闭发送方向(第一次挥手)。
- 服务端确认后关闭接收方向(第二次挥手)。
- 服务端再关闭自己的发送方向(第三次挥手)。
- 客户端确认后完全关闭(第四次挥手)
# 为什么握手是三次,挥手是四次?
握手时,服务端的 SYN 和 ACK 可以合并发送;
而挥手时,服务端可能还有未发送完的数据,需先发 ACK 再发 FIN。
# 5.http 状态码
200 OK 服务器成功处理了请求(这个是我们见到最多的)
301/302 Moved Permanently(重定向)请求的 URL 已移走。Response 中应该包含一个 Location URL, 说明资源现在所处的位置
404 Not Found(页面丢失)未找到资源
501 Internal Server Error 服务器遇到一个错误,使其无法对请求提供服务
1 开头:(被接受,需要继续处理。)
100:客户端继续请求
101:客户端切换协议2 开头:(请求成功)
200:请求成功
202:服务器已接受请求,但尚未处理
204:服务器成功处理了请求,但未返回内容3 开头:(请求被重定向)
301:(永久重定向)
302: (临时重定向)
303:http1.1 协议,禁止被缓存
304:(协商缓存成功(资源未修改)的返回值)4 开头:(客户端请求错误)
400:客户端请求的语法错误,服务器无法理解
403:服务器理解请求客户端的请求,但是拒绝执行此请求(一般客户端没有权限)
404:服务器无法根据客户端的请求找到资源(网页)5 开头:(服务器错误)
# 6.http 和 https 的区别
http: 超文本传输协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的传输协议
http 的默认端口:80
https 的默认端口:443
https 是在应用层(HTTP)和传输层(TCP)之间添加一个 SSL 的安全层
# HTTPS 的缺点:
(1)HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近 50%,增加 10%到 20%的耗电
(2)HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响
(3)SSL 证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
(4)SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗
# 7. 浏览器输入 url 发生了什么
# 总体来说分为以下几个过程:
- DNS 解析
- TCP 连接
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面(浏览器渲染原理)
HTML parser --> DOM Tree
标记化算法,进行元素状态的标记
dom 树构建
CSS parser --> Style Tree
解析 css 代码,生成样式树
attachment --> Render Tree
结合 dom 树 与 style 树,生成渲染树
layout: 布局
GPU painting: 像素绘制页面
连接结束

# DNS 解析:将域名解析成对应的 IP 地址
①、查找浏览器自身缓存
②、查找操作系统(hosts 文件)
③、本地域名服务器
④、根域名服务器..
# 8. 正向代理和反向代理
# 正向代理:
正向代理类似一个跳板机,代理访问外部资源
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了
正向代理的用途:
1、访问原来无法访问的资源,如google
2、可以做缓存,加速访问资源
3、对客户端访问授权,上网进行认证
4、代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
# 反向代理:
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,
然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
反向代理的作用:
1、保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
2、负载均衡,通过反向代理服务器来优化网站的负载
总结:
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端
正向代理: 买票的黄牛
反向代理: 租房的代理
# 9. WebSocket 协议详解
WebSocket 是一种在 单个 TCP 连接 上进行 全双工通信 的协议,旨在解决 HTTP 协议在实时通信中的局限性。
# WebSocket 的握手过程
- 客户端发起 HTTP 升级请求
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
2
3
4
5
6
Upgrade: websocket
表示希望升级到 WebSocket 协议。Sec-WebSocket-Key
是一个随机生成的 Base64 字符串,用于安全验证。
- 服务器响应确认升级
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
2
3
4
101 Switching Protocols
表示协议升级成功。Sec-WebSocket-Accept
是服务器对客户端Sec-WebSocket-Key
的计算结果,用于验证握手合法性。