kaixin
Published on 2023-11-20 / 62 Visits
0

HTTP了解

HTTP了解

访问一个网站:

  1. 浏览器本身是⼀个客户端,当你输⼊URL的时候,⾸先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP。
  2. 然后通过IP地址找到IP对应的服务器后,要求建⽴TCP连接。
  3. 等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包。
  4. 服务器调⽤⾃身服务,返回HTTP Response(响应)包。
  5. 客户端收到来⾃服务器的响应后开始渲染这个Response包⾥的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。

image-20250310230127627

1.服务端与客户端通信过程

Web服务器的⼯作原理可以简单地归纳为:
    1.客户端通过TCP/IP协议建⽴到服务器的TCP连接。
    2.客户端向服务器发送HTTP协议请求包,请求服务器⾥的资源⽂档(动态或者静态数据)。
    3.服务器向客户端发送HTTP协议应答包,如果请求的资源包含有动态语⾔的内容,那么服务器会调⽤动态语⾔ 的解释引擎负责处理“ 动态内容”,并将处理得到的数据返回给客户端。
    4.客户端与服务器断开。由客户端解释HTML⽂档,在客户端屏幕上渲染图形结果。


客户端请求到达服务端流程:
    1.当客户端拿到服务端的域名后(进行域名解析,拿到服务端的ip地址),然后浏览器会选择一个随机的端口(1024 - 65535 )像服务端发送请求(nginx或者apache)80或者433发送tcp请求。
    2.请求通过复杂的网络环境后到达服务端,进行服务端的网卡,在进行linux的内核tcp/ip协议栈(内核层),一层层进行解析后经过防火墙然后最后到达用户层的nginx进程确认tcp/ip链接。
    3.确定链接后,客户端会发送http请求,如post,get,delete等方式。

image-20250311221421346


2.TCP/IP协议

是什么:

  • 它是传输控制协议/互联网协议的缩写,它是一组有数据通信的网络协议,构成了现代的互联网的基础。

作用:

  1. 数据传输:tcp/ip协议允许不同类型的计算机和设置之间进行互联网通信,实现数据的传输。
  2. 网络互连:它支持不同的网络之间的互连,使全球范围内的计算机网络能够进行通信连接。
  3. 数据封装:TCP/IP协议定义了数据在网络中传输时的封装方式,包含数据包格式,地址信息等。
  4. 错误检测与纠正:提供了错误检测和纠正机制,确保数据传输的可靠性。
  5. 流量控制:还提供了流量控制,防止网络阻塞。

注意:

  1. 从名称上看到,TCP/IP协议,它是两种协议的组合后的名字。
    1. TCP(传输协议):负责将数据可靠的传输,它通过确认机制,重传机制,确保数据包的顺序和完整到达目的地。
    2. IP(网络协议):负责数据包的寻址和路由。它定义了数据包在网络中的传输路径,确保数据能够从源地址正确地传输到目的地址。
  2. TCP和IP是两个重要的协议,它们共同工作形成了TCP/IP协议族,其中协议族中,还包括其他的协议,UDP,ICMP等协议。
  3. 其他的协议都是围绕这这两个协议展开的(应用层协议),也就是TCP与IP这两个协议属于底层协议,而FTP,HTTP等协议建立在这两个协议之上。

3.OSI7层模型

是什么:

  • 七层模型是一个理论上的网络通信模型,由国际标准化组织(ISO)在1984年提出。它将网络通信分为七个抽象的层次,每一层都完成特定的功能,并且为上一层提供服务。
  • 然而在实际应用时,TCP/IP模型更为广泛,它是四层模型,但是7层模型则是提供了更为详细和全面的网络通信视角。

7层模型:

层名称 作用
应用层 提供网络服务给引用程序,例如:http,https,ftp,smtp等,直接与用户交互,处理特定的应用细节。
表示层 确保一个系统的应用层发送的信息可以被另外一个应用读取到,负责数据格式转换,数据加密解密,数据压缩和解压缩。
会话层 建立管理终止应用程序之间的会话,提供会话检查点和恢复方案,防止数据丢失。
传输层 提供端到端的通信服务,确保数据的完整性和可靠性,传输层协议有TCP(传输控制协议)和UDP(用户数据报协议)。
网络层 负责数据包的寻址和路由,确保数据包从源地址到目标地址的传输,主要协议IP协议(网络协议)。
数据链路层 提供节点到节点的数据传输和错误检测。负责帧的传输和接收,包括MAC(媒体访问控制)地址。
物理层 负责在物理媒介上传输原始比特流。包括定义物理设备标准、电气特性、接口特性等。

image-20230930154347184

4层模型(TCP/IP模型):

  • 将应用层 + 会化层 + 表示层合并到应用层中。将 物理层+ 链路层合并到链路层。
层名称 作用
应用层 应用层是TCP/IP模型的最高层,负责处理特定的应用程序细节。它直接与用户交互,提供各种网络服务和应用功能。协议有:HTTP,HTTPS,FTP,POP3,DNS,SSH,Telnet等等
传输层 传输层负责端到端的通信和数据传输。它确保数据的完整性和可靠性。TCP(传输协议):提供可靠的、面向连接的通信。它确保数据按顺序传输,并进行错误检测和纠正。UDP(用户数据报协议):提供不可靠的、无连接的通信。它适用于对实时性要求高但可以容忍一定丢包率的应用,如视频流、在线游戏等。
网络层 网络层负责数据包的寻址和路由。它确保数据包能够从源地址正确地传输到目的地址。主要协议IP(网络协议),ICMP(互联网控制消息协议),ARP(地址解析协议),PARP(反向地址解析协议)。
链路层 链路层负责在物理网络上传输原始比特流。它处理与网络硬件相关的细节,如帧的传输和接收。以太网(Ethernet):一种广泛使用的局域网技术。Wi-Fi:一种无线局域网技术。等等

image-20250311225440899

4.TCP与UDP理解

了解:

  • UDP(用户数据报协议)和TCP(传输控制协议)都是传输层协议,用于在网络中传输数据,但它们在设计和工作方式上有着显著的不同。

TCP协议:

  • 是面向连接,可靠,基于字节流的传输协议。
  • 由于TCP提供可靠的连接和数据传输服务,它适用于对数据完整性和顺序要求较高的应用,如Web浏览(HTTP)、文件传输(FTP)、电子邮件(SMTP)等。

TCP协议特点:

  1. 面向连接:数据在传输过程中,需要先进行三次握手建立连接,建立连接后,数据才能在两个端点之间传输。
  2. 可靠性:提供可靠的数据传输服务,它通过序列号,确认应答,重传机制确保数据的完整和顺序。
  3. 流量控制:TCP通过滑动窗口机制实现流量控制,防止发送方发送数据过快导致接收方无法处理。
  4. 阻塞控制:TCP还提供拥塞控制机制,通过监测网络状况动态调整发送速率,避免网络拥塞。
  5. 错误检测:TCP使用校验和机制对数据进行错误检测,确保数据的完整性。

UDP:

  • 是一种无连接的、不可靠的、基于数据报的传输层通信协议。
  • 由于UDP的简单性和低延迟特性,它适用于对实时性要求高但可以容忍一定丢包率的应用,如视频流、在线游戏、IP语音(VoIP)等。

UDP的特点:

  1. 无连接:不需要进行确认连接,直接可以发送到目标地址。
  2. 不可靠:它发送的数据不会保证顺序,完整性,数据可能在中途丢包,重复或者乱序。
  3. 低延迟:由于不需要建立连接,所以效率方面高于TCP。
  4. 简单性:头部开销小,只有8个字节,实现简单,适用于对于实时性高但是可以容忍丢包率的应用。
  5. 广播和组播:支持广播域组播,适用于向多个接受者发送相同数据的场景。

4-1.TCP的三次握手

3次握手的过程:

  1. 建立tcp链接,客户端发送请求报文,报文的标识:SYN=1,seq=x,客户端进行SYN_SEND状态,等到服务器确认。
  2. 服务器收到SYN报文,需要对SYN进行确认,对已知的数据序号 seq=x,设置一个ack=x+1标识。同时设置 seq=y,SYN=1。
  3. 看了收到服务端SYN+ACK报文将 ack=y+1 设置,然后发送ack报文,此时报文序列号变为z,客户端与服务进行ESTABLISHED状态。

image-20250312221624955

通过抓包工具展示TCP的三次握手:

image-20250312221521500

说明:

image-20230930190143542

理解标识:

主要3个标识:
    1.[syn] # 理解为 请求创建链接
    2.[syn,ack] # 请求创建,并确定创建链接
    3.[ack] # 确认创建链接

三次握手的目的:
    确保服务端与客户端之间是否有收发消息的能力。


概念:
     1.三次握手的原文是 three-way handshake,整个名词的可以翻译为:需要三个步骤才能建立握手/连接的机制。当然,三次握手也可以叫 three-message handshake,通过三条消息来建立的握手/连接。
     2.    进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的 初始化序列号(Init Sequense Number, ISN) 为后面的可靠性传输做准备。

4-2.TCP的四次挥手

过程:

  1. 客户端发送请求断开链接到客户端 FIN=1的报文。
  2. 服务端接受客户端发送的FIN=1的报文,并且发送ACK确认报文。
  3. 服务端也想断开链接(已确认没有数据发送给客户端),发送FIN=1报文,且指定序列号。
  4. 客户端接受到了服务端FIN报文,发送一个ACK=1,进行中断。

image-20250312225052837

4-3.TCP的报文格式

image-20230930185633228

源端口、目的端口
    各占 2 个字节,分别写入源端口和目的端口。IP 地址 + 端口号就可以确定一个进程地址 # 也就是4个字节 1字节=8bit

序号/序列号
    在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。该字段表示本报文段所发送的数据的第一个字节的序号。
    例如,一报文段的序号是 101,共有 100 字节的数据。(seq=101)
    这就表明:本报文段的数据的第一个字节的序号是 101,最后一个字节的序号是 200。
    显然,下一个报文段的数据序号应当从 201 开始,即下一个报文段的序号字段值应为 201。
    # 也就是说,当前序号时 101 报文数据100字节 就是 101+100=201,下一个序号就是从201开始+报文数据

确认号 ack
    期望收到对方下一个报文段的第一个数据字节的序号。
    若确认号为ack=N,则表明:到序号 N-1 为止的所有数据都已正确收到。

4-3.TCP的套接字

是什么:

  • 套接字(Socket)是用于网络通信的一个端点。TCP套接字是专门用于TCP(传输控制协议)通信的套接字。套接字为运行在不同主机上的进程提供了一种通信方式,使得这些进程能够通过网络进行数据交换。

特点:

  1. 端到端:TCP套接字支持点对点的通信,即一个套接字只能与另一个套接字建立连接。
  2. 面向连接:在数据传输开始之前,TCP套接字需要通过三次握手建立连接,确保连接的可靠性。
  3. 可靠性:TCP套接字提供可靠的数据传输,通过序列号、确认应答和重传机制等确保数据的完整性和顺序。
  4. 全双工通信:TCP套接字支持全双工通信,即数据可以在两个方向上同时传输。
  5. 字节流:TCP套接字将数据视为字节流,而不是消息或数据报,这意味着数据可以连续不断地传输,而不需要等待对方确认。

套接字分类:

  1. 本地套接字:本地套接字主要用于同一台主机上的进程间通信(IPC)。它们不使用网络协议,而是直接通过操作系统内核进行通信。
    1. 速度:由于避免了网络协议栈的开销,本地套接字通常比网络套接字更快。
    2. 简单:不需要复杂的网络配置,如端口号与IP地址。
    3. 安全性:它运行在本地,所以很安全。
    4. 流式套接字(TCP),数据报套接字(UDP)。
  2. 网络套接字:网络套接字用于不同主机之间的网络通信。它们使用网络协议(如TCP/IP)进行数据传输。
    1. 远程通信:允许在不同地理位置上的主机进行通信。
    2. 标准化:网络套接字遵守网络协议,使不同的操作系统上都能使用。
    3. 灵活性:支持多种协议。
    4. TCP套接字,UDP套接字。

理解:

  • 网络套接字:IP:端口,本地套接字:文件形式展示(只能本地的应用使用)。

意义:

  • 最大的意义在于,让不同的进程之间进行通信。

image-20250312215222059

4-4.TCP链接的状态报文

报文 说明
CLOSE 没有任何连接状态。
LISTEN 监听状态、等待来自TCP的连接请求。
SYN-SENT 发送连接请求后,等待对方确认。
SYN-RECEIVED 收到、发送一个连接请求后,等待对方确认。
ESTABLISHED 传输连接已经建立,双方进入数据传输状态。
FIN-WAIT-1 主动关闭1,主机已发送关闭连接请求,等待对方确认。
FIN-WAIT-2 主动关闭2,主机已收到对方关闭传输连接的确认,等待对方发送关闭传输连接请求。
TIME-WAIT 完成双向传输连接关闭,等待服务端最终确认。
CLOSE-WAIT 被动关闭连接,收到对方发来的关闭连接请求,且已经确认。
LAST-ACK 被动关闭,等待最后一个关闭传输连接的确认。
CLOSE 双方同时确认了关闭传输连接。

HTTP协议工作原理

TCP/IP的分层:

  1. 应用层
  2. 传输层
  3. 网络层
  4. 数据链路层

TCP/IP的传输流:

image-20250311225440899

利用TCP/IP协议进行网络通信时,会通过分层的顺序与对方进行通信,发送端从应用层向下走,接收端则往应用层往上走。

过程:
    1.在应用层(http)发送一个请求(查看一个网页)。
    2.在传输层(tcp)会将应用层接受http报文进行分割,在各个报文上标记需要和端口号转发给网络层。
    3.网络层(IP协议)增加通信目的的MAC地址转发给链路层。
    4.链路层开始发送。

image-20250312233903795

1.与HTTP协议密切相关的协议

与HTTP协议密切相关的是:
    IP TCP DNS

    
    TCP协议:属于传输层协议 

1-1.IP协议

IP协议: 
    属于网络层,所有使用网络的系统都会使用IP协议,IP协议的作用就是将数据包发送给对方,确保能够准确的发送,需要满足的条件1.IP地址 2.MAC地址。IP地址指明了节点分配的只,MAC地址指网卡所属的固定的地址。IP地址可以与MAC地址进行匹配。IP地址可以转换,但是MAC地址不会。

使用ARP协议凭借MAC地址进行通信
    在网络中,通信双方都会经过多台计算机和网络设备中转才能连接到对方,而中转过时,会利用中转设备的MAC地址搜索下一个中转目标。这时采用的就是ARP协议,它是一个解析地址协议,'根据通信方的IP地址就可以反查到对应的MAC地址'。
    ARP协议核心:通过IP地址 解析 MAC地址。

image-20250312234937174


1-2.TCP协议

TCP协议:
    属于传输层的协议,为了方便传输数据,TCP协议会将大数据切割为一块一块的小数据(报文为单位)进行管理,TCP具有可靠传输的特性,可靠传输就是完整的顺序的将数据传输给对方。为了确保数据传输正确,采用了三次握手的方式。

image-20250312235355700


1-3.DNS协议

DNS协议:
    与HTTP协议一样属于应用层,它的作用提供域名解析到IP的解析服务。计算机可以被赋予IP地址也可以被赋予域名。域名的记录对我们来说记录起来比较方便,而计算机确实对数字(IP地址)记录比较方便,所以DNS服务就产生了。DNS可以通过域名解析IP地址,同时也可以根据IP地址反向解析域名。

image-20250312235826874


1-4.总结各个协议与HTTP的关系

image-20250313220215044


2.URL与URI与URN

是什么:

  • URL:统一资源定位符号。是浏览器需要输入的网址,例如:www.baidu.com。
  • URI:统一资源标识符号。它是一种用于标识互联网上资源的标准化方式,是互联网通信中非常重要的组成部分。
  • URN:统一资源名称。是一种用来表示资源名称的,不提供直接的资源位置。
  • URL表示资源的地址(互联网的位置),URI用字符标识某个互联网的资源。

URI的作用:

  1. 唯一的标识资源:URI可以唯一标识互联网的资源,无论是图片,视频,文件等等。
  2. 定位资源:通过URI,计算机可以找到对应的资源。
  3. 提供资源信息:URI可以包含相关的额外的资源信息,例如资源类型,位置等。

URI的是英文Uniform Resource Identifier的缩写解释:

英文 说明
Uniform 统一的格式可以方便处理多种不同类型的资源,而不需要根据上下文环境来识别资源指定访问方式。
Resource 可以识别的任何东西。无论是图片,文件,视频等都作为一种资源类型。
Identifier 可以识别的对象,也就是识别符。

2-1.URL与URI与URN关系

URI是通用的标识符:包含了URL与URN
    1.URL(Uniform Resource Locator,统一资源定位符):# URL是URI的子集:所有URL都是URI,但不是所有URI都是URL。
        是URI的一种,用于定位资源的具体位置,例如http://www.example.com/image.jpg
    2.URN(Uniform Resource Name,统一资源名称):
        也是URI的一种,用于标识资源的名称,但不直接表示资源的位置,例如urn:isbn:0451450523。

URI的例子:
    http://www.example.com/path/to/resource.html(这是一个URL,也是URI)
    urn:isbn:0451450523(这是一个URN,也是URI,标识一本书的ISBN号)
    mailto:user@example.com(这是一个URI,标识一个电子邮件地址)
   

举例:从图书馆借书:《凤凰项目》这本数据URL与URN与URI的表现形式。
    URN:# 标识资源的名称,但不涉及资源的具体位置。它强调的是资源的唯一性。
        urn:isbn:978-7-111-56566-2
        这是一个URN,标识了《凤凰项目》这本书的ISBN编号,告诉我们这是一本书,但是没有告知这本书在哪。
    
    URL:# 定位资源的具体位置,并提供访问资源的路径。它强调的是“如何找到并获取资源”。
        http://www.example-library.com/catalog/books/978-7-111-56566-2
        这是一个URL,它不仅标识了这本书(通过ISBN),还告诉我们这本书在某个图书馆的在线目录中可以找到。
        提供访问路径:http://www.example-library.com/catalog/books/
        资源的具体位置:978-7-111-56566-2
    
    URI:# 它是一个通用的概念,可以理解为将URL+URN或者只有URL或者只有URN。标识资源,但是不一定提供具体位置。
        URL作为URI:http://www.example-library.com/catalog/books/978-7-111-56566-2 # 直接标记这本书,并且提供访问路径
        URN作为URI:urn:isbn:978-7-111-56566-2 # 只用于标记这本书,但是不涉及如何访问。
        其他形式的URI:mailto:librarian@example-library.com?subject=Request%20for%20Harry%20Potter%20Book # 这是一个URI,用于标识一个电子邮件地址,并附带了邮件主题。它既不是URL(因为它不直接定位一个资源),也不是URN(因为它没有标识一个资源的名称),但它仍然是一个有效的URI。

2-2.总结说明

符号 说明
URN 标识资源的名称,强调唯一性。不涉及访问的方式和位置。例如:urn:isbn:978-7-111-56566-2
URL 定位资源的具体位置,提供访问路径,强调如何访问。例如: http://www.example-library.com/catalog/books/978-7-111-56566-2
URI 通用资源标识符,可以是URN可以是URL或者是其他,用于标识资源的,但不一定以提供位置。例如:http://...(URL)、urn:...(URN)、mailto:...(其他形式)

2-3URI的格式

URI形式:

  1. ftp://ftp.is.co.ze/rfs/123.txt
  2. http://ftp.is.co.ze/rfs/123.txt
  3. ldap://[2001:db8::7]/c=GB?objectClass?one
  4. mailto:librarian@example-library.com
  5. news:comp.infosystems.www.servers.unix
  6. tel:+1-816-55-1212
  7. telnet://192.168.85.133:80/
  8. urn:oasis:names:specification:docbook:dtd:xml:4.1.2

格式:

#  这是一个绝对URI,因为它包含了完整的资源定位信息,包括协议、主机名、端口号、路径、查询参数和片段标识符。
http://user:pass@www.example.jp:80/dir/index.html?uid=1#ch1
    user:pass:登录认证。
    www.example.jp:服务的地址。
    80:服务的端口。
    /dir/index.html:带层次的访问路径。
    ?uid=1:查询字符串。
    #ch1:片段标识符,标记出当前访问的某个位置。

3.简单HTTP协议理解

通信说明:

  • HTTP主要是用于客户端与服务端之间的通信。
  • 请求访问文本或者图片等资源的被称为客户端,而响应资源的被称为服务端。

image-20230930214335321

请求报文内容说明:

# 服务端获取客户端的请求报文:
    GET /index.html HTTP/1.1
    HOST xxxx.com

# 说明:
    GET 是请求的类型,也是方法。
    /index.html:指明访问的资源路径。
    HTTP/1.1:提示客户端使用的http协议,版本 1.1
    HOST xxxx.com:指明主机名,也就是说当前客户端访问是哪个域名

响应报文内容说明:

# 服务端响应客户端
    HTTP/1.1 200 OK
    Date: Thu, 13 Mar 2025 15:01:30 GMT
    Content-Type: text/html

# 说明:
    HTTP/1.1 200 OK:协议与响应的状态码
    Date: Thu, 13 Mar 2025 15:01:30 GMT:响应的创建时间
    Content-Type: text/html:乡音过的类型

3-1.HTTP的状态

# 注意:它是无状态的,如果需要有状态就需要使用cookie或者session等技术。
    HTTP属于无状态的协议,它自身不会对请求和响应之间通信状态进行保存,发送的请求或者响应不做持久化。
    无状态的原因:
        更方便的处理大量事务,确保协议的可伸展性。
    由于随着web不断发展,无状态导致业务处理非常棘手(电商网站,不能因为每次访问其他的路径就需要用户进行登录。)。就出现了Cookie的技术。

Cookie的技术:
    报文中写入Cookie的信息来控制客户端的状态,服务端响应报文中的叫做 Set-Cookie 的首部信息,通知客户端保留Cookie。
    当客户端向服务daunt发送请求时,请求头包含Cookie的首部信息。
    Set-Cookie 是服务器用来设置Cookie的字段,位于响应头。
    Cookie 是客户端用来发送Cookie的字段,位于请求头。

3-2.HTTP的方法

请求方式 说明 支持的协议
GET 请求获取指定资源的内容。 HTTP 1.1 / HTTP 2
POST 向服务器提交数据,通常用于创建新的资源。 HTTP 1.1 / HTTP 2
PUT 向服务器上传或更新指定资源的内容。 HTTP 1.1 / HTTP 2
DELETE 请求服务器删除指定的资源。 HTTP 1.1 / HTTP 2
HEAD GET类似,但服务器只返回响应头,不返回响应体。 HTTP 1.1 / HTTP 2
OPTIONS 请求服务器返回支持的HTTP方法。 HTTP 1.1 / HTTP 2
PATCH 对资源进行部分更新。 HTTP 1.1 / HTTP 2
TRACE 用于调试,返回请求的原始内容。 HTTP 1.1 / HTTP 2
CONNECT 用于建立隧道(如代理服务器或HTTPS连接)。 HTTP 1.1 / HTTP 2

3-3.HTTP报文

是什么:

  • 用与HTTP协议的交互信息被称为HTTP报文。
  • 请求端HTTP被称为请求报文。
  • 响应端HTTP被称为响应报文。
  • 它们是由多行数据结构组成的字符串文本。

image-20250316205825380

组成:

结构名 作用
请求行 包含请求方法,请求的uri和HTTP版本。
状态行 状态码,和HTTP的版本。
首部字段 包含各种条件和属性的首部字段。
其他 可能包含没被定义的首部。

多对象集合:

  • 发送的报文包含了多种类型的实体,通常在图片或者文件中使用。
  • 字段为:content-type。包含不限于:text/html,multipart/form-data,application/json。

获取部分内容范围请求:

  • 由于在之前宽带的速度没有那么快的时候,下载或者浏览稍微大的文件或者图片就非常吃力。
  • 处理大文件下载、断点续传、或者仅需要资源的一部分时非常有用。
  • 需要使用:Content-Range的参数,可以指定资源的范围。
  • 这种机制允许客户端根据当前的网络状态和需求,请求资源的一部分而不是全部(客户端可以请求较小的数据块,以减少传输时间并提高效率,服务器通过206状态码响应,表明它支持部分内容请求,并在 Content-Range 头部中指定返回的内容范围。)。

image-20250316213731884

内容协商机制:

  • 客户端和服务端对相应的内容进行协商,提供给客户端最合适的资源。
  • 内容协商会响应资源的语言,字符集,编码方式等作为判断的基准。
  • 通过这些字段进行实现不同的内容需求:Accept,Accept-Charset,Accept-Encoding,Accept-Language,Content-Language。
  • 内容协商机制的三种类型:1.服务器驱动协商。2.客户端驱动协商。3.通明协商(前两种结合。)

3-3-1.编码传输效率

概念:
    报文:是HTTP的最基本的单位,有8个字节流组成,通过HTTP进行传输。
    实体:请求或者相应的有效载荷,也就是实际传输数据(实体首部 + 实体主体)。
# HTTP的报文的主体用于传输请求或者响应的实体主体。
    报文是传输的基本单位,有报头 + 报主体组成
    报文主体:实际传递的数据(图片,文件等等)
    报文头:就是一些源数据(状态码,内容类型(Content-Type),内容长度(Content-Length))

# 通常报文主体 = 实体主体,只有在传输过程中通过编码操作时,实体主体的内容才会发生变化,才会导致他和报文主体存在差距。

压缩传输的内容编码:
    例如:当发送邮件时,为了使邮件容量变小,就会使用zip压缩文件后添加附件在进行传输。HTTP协议中也有类似的操作。
    # HTTP内容压缩操作(内容编码):
        服务端负责将内容进行压缩编码,客户端进行解压称为原始的内容。

内容编码的格式:(响应头字段表示 content-encoding:)
    1.gzip (GNU zip)
    2.compress (UNIX 系统标准压缩)
    3.deflate (zlib)
    4.identity (不压缩)

# 分块传输编码:
    在传输大数据时,通常会将数据分割为多块,能让浏览器逐步显示。

image-20250316211802533


3-4.状态码

状态码 含义
200 请求成功。返回响应的内容。
204 请求成功,无返回资源内容。客户端不需要进行更新。
206 客户端请求返回内容,服务端执行这部分内容。
301 永久重定向。
302 临时重定向。
304 客户端发送请求条件,服务端允许访问资源,但是资源没有发生变化,客户端访问未过期资源即可。
400 请求报文中出现语法错误。
401 需要进行HTTP认证,认证信息出现错误。
403 不允许访问资源(无权限)。
404 没有这个资源。
501 服务端出现问题(服务端出现bug或者临时故障)。
503 服务器处于高负荷状态或者正在停机维护。

3-5.通信数据转发程序

# 包含如下:这些程序在HTTP通信中起到转发数据的作用,它们可以配合服务器工作,将请求转发给通信线路上的下一站服务器,并能够接收从那台服务器发送的响应再转发给客户端。
    1.代理
    2.隧道
    3.转发

代理(Proxy):
    代理服务器的基本行为是接收客户端发送的请求后转发给其他服务器。代理服务器可以对请求和响应进行缓存、过滤和修改,从而提高网络性能和安全性。代理服务器在转发请求或响应时,会追加写入Via首部信息。

隧道(Tunnel):
    隧道技术通过封装数据,在公共网络中传输专用网络数据和协议信息。HTTP隧道传输是使用高级协议(HTTP)传输低级协议(TCP)。HTTP协议指定了一种名为CONNECT的请求方法,该方法启动与请求资源的双向通信,并可用于打开隧道。隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。

网关(Gateway):
    网关的工作机制和代理十分相似,但网关能使通信线路上的服务器提供非HTTP协议服务。利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。

4.HTTP的首信息

首部字段格式:
    首部字段名称:首部字段值
    例如:
        Content-Type: text/html # 单个值
        Keep-Alive: timeout=15,max=100 # 多个值
# 注意:如果首部字段重复会怎么样
    浏览器的逻辑不同,可能处理的方式不同,有些浏览器会优先处理第一次出现的首部字段,有些会优先处理最后出现的字段。

4中HTTP首部字段类型:
    1.通用首部字段 # 请求报文和响应报文都会使用的字段
    2.请求首部字段 # 客户端向服务端发送请求报文时,使用的字段
    3.响应首部字段 # 从服务器向客户端发送的报文时,使用的字段
    4.实体首部字段 # 针对请求报文和响应报文的实体部分使用的首部字段。

4-1.通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为,如no-cachemax-age等指令
Connection 控制连接的保持时间,如keep-aliveclose
Date 表示创建报文的时间,格式为Mon, 17 Mar 2025 12:00:00 GMT
Pragma 主要用于兼容HTTP/1.0的缓存控制,如Pragma: no-cache,报文指令。
Trailer 表示在分块传输中,后续trailer部分的字段名称,报文末端的首部一览。
Transfer-Encoding 指定传输编码方式,如chunkedgzip
Upgrade 请求服务器升级到更高版本的HTTP或切换到其他协议,如Upgrade: HTTP/2.0,协议升级。
Via 表示请求经过的中间代理或网关,格式为Via: 1.1 proxy,代理服务器的相关信息。
Warning 提供关于消息的警告信息,如Warning: 110 Connection Timed Out

4-1-1.Cache-Control

**多个指令之间,进行隔开:**Cache-Control: private,max-age=0,no-cache

区分:

  • 分为缓存请求指令与缓存响应指令

缓存请求指令:

指令 含义 作用 示例
no-cache 客户端要求重新验证资源的新鲜度,即使缓存中有副本。 强制缓存向服务器发送请求,验证资源是否被修改,但允许使用缓存验证。 Cache-Control: no-cache
no-store 客户端要求不存储任何请求或响应内容。 禁止缓存存储请求或响应的任何部分,适用于敏感信息。 Cache-Control: no-store
max-age=<seconds> 客户端希望接受的资源最大新鲜度时间(以秒为单位)。 如果缓存中的资源超过这个时间,则视为过期,需要重新验证。 Cache-Control: max-age=3600
min-fresh=<seconds> 客户端希望资源至少还有多少秒的新鲜度。 如果缓存中的资源剩余新鲜度小于这个值,则需要重新验证。 Cache-Control: min-fresh=60
max-stale[=<seconds>] 客户端是否接受过期资源,以及过期的最大容忍时间。 如果未指定时间,则接受任何过期资源;如果指定时间,则过期时间不能超过这个值。 Cache-Control: max-stale=3600 Cache-Control: max-stale
only-if-cached 客户端只接受缓存中的资源,不向服务器发送请求。 如果缓存中没有资源,则返回 504 Gateway Timeout Cache-Control: only-if-cached
no-transform 中间缓存或代理服务器不得对响应内容进行任何转换或修改。 用于控制缓存或代理服务器是否可以对响应内容进行转换或修改。可以在meta标签中使用<meta http-equiv="Cache-Control" content="no-transform" /> Cache-Control: no-transform

缓存响应指令:

指令 含义 作用 示例
public 响应可以被任何缓存存储,包括共享缓存(如代理服务器)。 适用于公开资源,允许缓存共享。 Cache-Control: public
private 响应只能被单个用户缓存,不能被共享缓存存储。 适用于用户特定的资源,如用户会话信息。 Cache-Control: private
no-cache 响应必须在使用前重新验证资源的新鲜度。 强制缓存向服务器发送请求以确认资源是否被修改。 Cache-Control: no-cache
no-store 响应内容不能被存储,适用于敏感信息。 禁止缓存存储响应的任何部分。 Cache-Control: no-store
max-age=<seconds> 响应内容的最大新鲜度时间(以秒为单位)。 指定资源的有效缓存时间,在此时间内缓存无需重新验证。 Cache-Control: max-age=3600
s-maxage=<seconds> 覆盖 max-ageExpires,仅适用于共享缓存(如代理服务器)。 为共享缓存单独设置最大新鲜度时间。 Cache-Control: s-maxage=600
must-revalidate 缓存必须在资源过期后重新验证资源的新鲜度。 确保缓存不会使用过期资源,即使在客户端离线时。 Cache-Control: must-revalidate
proxy-revalidate must-revalidate 类似,但仅适用于共享缓存。 强制共享缓存重新验证过期资源。 Cache-Control: proxy-revalidate
immutable 响应内容在指定时间内不会改变,缓存无需重新验证。 适用于静态资源,减少不必要的验证请求。 Cache-Control: immutable, max-age=31536000
stale-while-revalidate=<seconds> 允许使用过期资源,同时在后台重新验证。 在重新验证期间,允许缓存继续使用过期资源。 Cache-Control: stale-while-revalidate=60
stale-if-error=<seconds> 在重新验证资源时,如果服务器返回错误,允许使用过期资源。 在服务器不可用时,确保客户端仍能访问资源。 Cache-Control: stale-if-error=3600

4-1-2.Connection

# 用于指定链接状态
Connection: close # 明确指示 HTTP 连接在当前请求/响应完成后应被关闭,每一次请求都建立一个新的TCP连接,请求完毕后关闭。
Connection: keep-alive # 通过复用连接,减少 TCP 三次握手和四次挥手的开销,提高性能。

4-1-3.Warning

Warning: <warn-code> "<warn-agent>" "<warn-text>" ["<warn-date>"]

<warn-code>:一个三位数字的警告码,定义了警告的类型。
<warn-agent>:发出警告的代理或服务器的主机名或 IP 地址。
<warn-text>:警告的具体内容,用双引号括起来。
<warn-date>:可选的时间戳,表示警告生成的时间
警告码 含义
110 响应过期(Response is stale)。表示缓存中的资源已过期,但仍然被使用。
111 重新验证失败(Revalidation failed)。表示缓存尝试重新验证资源,但失败了。
112 由于配置错误,无法遵守指令(Disconnected operation)。
113 响应体被截断(Heuristic expiration)。表示缓存使用启发式方法确定过期时间。
199 其他警告(Miscellaneous warning)。表示其他类型的警告信息。
299 其他警告(Miscellaneous persistent warning)。表示持久警告信息。

4-2.请求首部字段

请求首部字段 说明 示例
Accept 指定客户端可接受的媒体类型(MIME类型),用于内容协商。 Accept: text/html,application/xhtml+xml
Accept-Charset 指定客户端可接受的字符集。 Accept-Charset: utf-8, iso-8859-1;q=0.5
Accept-Encoding 指定客户端可接受的编码方式,如gzip、deflate等。 Accept-Encoding: gzip, deflate
Accept-Language 指定客户端可接受的语言(自然语言)。 Accept-Language: en-US,en;q=0.5
Authorization 提供认证信息,如用户名和密码(Base64编码)。web认证信息 Authorization: Basic QWxhZGprakdvc3Rlcg==
Connection 控制连接的保持方式,如keep-aliveclose Connection: keep-alive
Content-Length 指定请求体的长度(字节)。 Content-Length: 128
Content-Type 指定请求体的媒体类型(MIME类型)。 Content-Type: application/json
Cookie 发送存储在客户端的Cookie信息。 Cookie: session_token=abc123; user_id=456
Host 指定请求的主机名和端口号。 Host: www.example.com
If-Match 仅在实体匹配时才执行请求,用于条件请求(比较实体标记[ETag])。 If-Match: "737060cd8c284d8af7ad3082f209588"
If-Modified-Since 若资源自指定时间后未被修改,则返回304(Not Modified)。比较资源的更新时间。 If-Modified-Since: Mon, 17 Mar 2025 12:00:00 GMT
If-None-Match 若实体未匹配,则返回304(Not Modified)。与If-Match相反。 If-None-Match: "737060cd8c284d8af7ad3082f209588"
If-Range 资源未更新时,则仅返回请求范围的内容(实体字节)。 If-Range: "737060cd8c284d8af7ad3082f209588"
If-Unmodified-Since 若资源自指定时间后未被修改,则执行请求。与If-Modified-Since相反。 If-Unmodified-Since: Mon, 17 Mar 2025 12:00:00 GMT
Origin 指定发起跨域请求的源(协议、域名和端口)。 Origin: https://www.example.com
Range 请求资源的一部分,如指定字节范围。 Range: bytes=0-1023
Referer 指示当前请求的来源页面地址(URI的原始方)。 Referer: https://www.example.com/page
User-Agent 提供客户端的软件信息(浏览器、操作系统等)。 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
TE 传输编码的优先级,功能与Accept-Encoding类似,但是Accept-Encoding用于内容编码,TE专用与传输编码 TE: gzip, deflate;q=0.5
Expect 期待服务器的特定行为,它最常用的值是 100-continue,用于优化请求发送过程中的性能和效率。不是所有的浏览器都支持,在高延迟或者低宽带下可以提高性能,在 HTTP/2 和 HTTP/3 中使用较少,因为这些协议提供了更高效的请求/响应机制。 Expect: 100-continue
Max-Forwards 最大传输逐跳数,用于限制请求在被转发之前允许的最大转发次数。可以有效控制请求的转发次数,避免网络资源的浪费和潜在的循环问题。 Max-Forwards: 10
Proxy-Authorization 代理服务器的要求客户端认证信息 Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

4-2-1.Accept

媒体类型 用途 示例
text/html HTML 文档,用于网页内容。 Accept: text/html
application/json JSON 格式的数据,常用于 API 响应和数据交换。 Accept: application/json
application/xml XML 格式的数据,用于数据交换和文档传输。 Accept: application/xml
text/xml XML 格式的数据(与 application/xml 类似,但字符集可能不同)。 Accept: text/xml
image/png PNG 图片格式,用于图像资源。 Accept: image/png
image/jpeg JPEG 图片格式,用于图像资源。 Accept: image/jpeg
image/gif GIF 图片格式,用于图像资源。 Accept: image/gif
text/plain 纯文本内容,如日志文件或简单文本。 Accept: text/plain
application/pdf PDF 文档,用于电子文档传输。 Accept: application/pdf
application/javascript JavaScript 文件,用于前端脚本。 Accept: application/javascript
application/octet-stream 二进制数据流,用于下载文件或传输原始数据。 Accept: application/octet-stream
*/* 通配符,表示客户端可以接受任何类型的响应。 Accept: */*
带优先级的多个类型 客户端可以指定多个接受类型,并通过 q 值设置优先级。 Accept: text/html,application/json;q=0.9,*/*;q=0.8

4-3.响应首部字段

响应首部字段 含义 示例
Access-Control-Allow-Origin 指定哪些外部域可以访问资源(用于跨域资源共享,CORS)。 Access-Control-Allow-Origin: https://example.com
Age 表示响应在缓存中存储的时间(以秒为单位)。 Age: 120
Cache-Control 指定缓存策略,如是否缓存、缓存时间等。 Cache-Control: max-age=3600
Content-Encoding 指定响应体的编码方式(如压缩算法)。 Content-Encoding: gzip
Content-Language 指定响应内容的语言。 Content-Language: en-US
Content-Length 指定响应体的长度(以字节为单位)。 Content-Length: 1234
Content-Type 指定响应体的媒体类型(MIME类型)。 Content-Type: text/html; charset=utf-8
Date 表示响应生成的时间戳。 Date: Mon, 17 Mar 2025 12:00:00 GMT
ETag 用于标识资源的唯一版本,通常用于缓存验证和条件请求。 ETag: "737060cd8c284d8af7ad3082f209588"
Expires 指定响应过期的时间(用于HTTP/1.0缓存控制)。 Expires: Wed, 21 Oct 2025 07:28:00 GMT
Last-Modified 指定资源最后修改的时间。 Last-Modified: Mon, 17 Mar 2025 12:00:00 GMT
Location 用于重定向,指定客户端应访问的新URL。 Location: https://example.com/newpage
Proxy-Authenticate 指定代理服务器要求的认证方式(与Proxy-Authorization配合使用)。 Proxy-Authenticate: Basic realm="Secure Area"
Retry-After 指定客户端应在多长时间后重试请求(通常用于503 Service Unavailable)。 Retry-After: 3600
Server 指定服务器软件的名称和版本信息。 Server: Apache/2.4.41 (Ubuntu)
Set-Cookie 设置Cookie,用于在客户端存储会话信息。 Set-Cookie: session_token=abc123; Path=/; HttpOnly
Strict-Transport-Security 强制客户端使用HTTPS访问资源(HSTS)。 Strict-Transport-Security: max-age=31536000; includeSubDomains
Transfer-Encoding 指定传输编码方式,如分块传输。 Transfer-Encoding: chunked
Vary 指定响应可能因哪些请求首部字段而变化(用于缓存)。 Vary: Accept-Encoding
WWW-Authenticate 指定服务器要求的认证方式(与Authorization配合使用)。 WWW-Authenticate: Basic realm="Secure Area"****
Accept-Ranges 用于告知客户端服务器是否支持范围请求(Range Requests),以及支持的范围单位 Range: bytes=1000-2000
Retry-After 用于指示客户端在再次发送请求之前需要等待的时间。 Retry-After: Wed, 21 Oct 2015 07:28:00 GMT or Retry-After: 120

4-4.实体首部字段

实体首部字段 含义 示例
Content-Encoding 指定实体内容的编码方式,例如压缩算法(如 gzip、deflate)。 Content-Encoding: gzip
Content-Language 指定实体内容的语言。 Content-Language: en-US
Content-Length 指定实体内容的长度(以字节为单位)。 Content-Length: 1234
Content-Location 提供实体内容的替代位置(URL)。 Content-Location: /images/logo.png
Content-MD5 提供实体内容的 MD5 校验码,用于验证内容的完整性。 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 指定实体内容的范围,通常用于分块传输或部分响应。 Content-Range: bytes 0-999/10000
Content-Type 指定实体内容的媒体类型(MIME 类型)。 Content-Type: text/html; charset=utf-8
Expires 指定实体内容的过期时间(用于 HTTP/1.0 缓存控制)。 Expires: Wed, 21 Oct 2025 07:28:00 GMT
Last-Modified 指定实体内容最后修改的时间。 Last-Modified: Mon, 17 Mar 2025 10:00:00 GMT
ETag 提供实体内容的唯一标识符,用于缓存验证和条件请求。 ETag: "737060cd8c284d8af7ad3082f209588"
Allow 用于列出服务器支持的 HTTP 方法(如 GETPOSTPUTDELETE 等)。 Allow: GET, POST, HEAD

5.HTTPS

HTTP的缺点:

  1. 通信过程中明文,不加密,内容可能会被窃听。
  2. 不严重通信方的身份,可能会遭遇伪装。
  3. 无法确定报文的完整性,可能已经被篡改。

HTTPS:

  • HTTP没有加密机制,但是可以通过SSL或者TLS的组合实现HTTP的加密。
  • SSL/TLS + HTPP = HTTPS,HTTPS是一个披着SSL/TLS外壳的HTTP,所以HTTPS并不是一个新的协议,只是HTTP部分的通信接口使用的是SSL/TLS协议进行代替。
  • 通常HTTP直接与TCP通信,当使用SSL时,先和SSL进行通信,在由SSL和TCP通信,所以HTTPS是一个披着SSL/TLS外壳的HTTP。

image-20250316230047899

HTTPS的工作流程:

  1. 当客户端(如浏览器)连接到一个使用 HTTPS 的服务器时,服务器会发送其 SSL 证书给客户端。
  2. 客户端验证证书的有效性,包括证书是否由受信任的证书颁发机构(CA)签发,以及证书是否过期或被吊销。如果证书验证通过,客户端和服务器将使用证书中的公钥进行密钥交换,协商出一个对称加密密钥。
  3. 一旦协商出对称加密密钥,客户端和服务器将使用该密钥对所有传输的数据进行加密。这意味着即使数据在传输过程中被截获,没有密钥的第三方也无法解密数据。
  4. 加密后的数据在客户端和服务器之间传输,确保了数据的机密性和完整性。

HTTPS的加密方式:

  • 非对称加密:非对称加密使用一对密钥:公钥和私钥。公钥可以公开,而私钥必须保密。由于非对称加密的计算复杂性较高,它在处理数据时的速度通常比对称加密慢
  • 对称加密组合:对称加密使用相同的密钥进行数据的加密和解密。这种方式加密速度快,适合加密大量数据。
  • HTTPS使用的方式:非对称 + 对称 组合。
  • 具体使用:在秘钥交换时,使用的是非对称加密方式传递会话秘钥,在传递数据时使用的对称加密,使用的就是这个会话秘钥数据加密。秘钥交换时使用非对称(保证秘钥的安全性),在数据交互式秘钥加密使用对称(速度快,效率高)。与SSH的加密方式相同

流程:

  1. 客户端向服务器发起 HTTPS 请求,并支持的加密算法列表。服务器从列表中选择加密算法,并将自己的数字证书发送给客户端。该证书包含了服务器的公钥,通常由受信任的证书颁发机构(CA)签发。客户端验证服务器的数字证书的有效性,包括证书是否由受信任的 CA 签发、证书是否过期、证书的域名是否与请求的域名匹配等。
  2. 客户端验证后,客户端生成一个随机的对称加密密钥,这个密钥将用于后续的对称加密通信。客户端使用服务器的公钥对这个对称密钥进行加密,然后将其发送给服务器。服务器使用自己的私钥解密这个信息,从而获得对称密钥。这样,客户端和服务器都有了相同的对称密钥,可以安全地加密和解密数据。