欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 网络协议基础--HTTP协议

网络协议基础--HTTP协议

2025/1/18 18:30:39 来源:https://blog.csdn.net/qq_37107430/article/details/145189784  浏览:    关键词:网络协议基础--HTTP协议

一.HTTP介绍

HTTP 是基于 TCP/IP 协议栈之上的应用层协议,旨在规定客户端和服务器之间请求和响应的标准格式与交互方式,以实现超文本(包含文本、图片、音频、视频等多种格式的文档)的传输,让用户能够在浏览器中轻松访问网页内容。

二.TCP连接

1.三次握手
  • 基本介绍

    1. 概念:在发送数据的准备阶段,需要先建立连接,而三次握手就是用于建立连接的过程。
    2. 场景类比:以日常打电话为例,当信号不好时,正式通话前需确认对方能否听到自己讲话。就像你问朋友 “你能听到我说话吗?”,朋友回应 “我能听到你说话,你能听到我说话吗?”,你再回复 “我也能听到你说话”。通过这三次交流建立了连接,双方确认都能听到对方讲话,随后便可开始交谈正式内容。
  • 关键参数

    1. 同步序号(SYN):用于发起连接请求或在连接过程中同步序列号。
    2. 确认字段(ACK):用于确认收到对方的报文。
    3. 随机数据(seq):即序列号,用于标识发送的数据段顺序。
    4. 规定:当 SYN = 1,ACK = 0 表示连接请求;当 SYN = 1,ACK = 1 表示同意建立连接。
  • 详细过程

    1. 第一次握手

      • 时间点 1:客户端向服务端发送连接请求报文段。此时,设置 ACK = 0,SYN = 1,seq = x,将 SYN 位置为 1,并设定 Sequence Number 为 x。
      • 状态变化:客户端发送该报文段后,进入 SYN_SEND 状态,开始等待服务器的确认。
    2. 第二次握手

      • 服务器动作:服务器收到客户端的 SYN 报文段。一方面,服务器需要对这个 SYN 报文段进行确认,设置 Acknowledgment Number 为 x + 1(即 Sequence Number + 1);另一方面,服务器自己还要发送 SYN 请求信息,将 SYN 位置为 1,Sequence Number 为 y。
      • 报文发送与状态变化:服务器端将上述所有信息放到一个报文段(即 SYN + ACK 报文段)中,一并发送给客户端,此时服务器进入 SYN_RECV 状态。
    3. 第三次握手

      • 客户端动作:客户端收到服务器的 SYN + ACK 报文段。然后将 Acknowledgment Number 设置为 y + 1,向服务器发送 ACK 报文段。
      • 状态变化:这个报文段发送完毕以后,客户端和服务器端都进入 ESTABLISHED 状态,至此完成 TCP 三次握手。完成三次握手后,客户端和服务器端就可以开始传送数据。


  • 为什么是三次握手而非两次?

    1. 确保双向通信畅通:TCP 是一个双向传输协议,两次握手只能保证单向连接是畅通的。例如在打电话场景中,若只有两次握手,即你问 “你能听到我说话吗?”,朋友回答 “我能听到你说话,你能听到我说话吗?”,此时仅确认了对方能听到你说话,但无法确认你能听到朋友说话。若此时就开始正式谈话,若你听不到朋友声音,朋友所说的话就会丢失。只有经过第三次握手,才能确保双向都可以接收到对方发送的数据。
    2. 防止失效连接请求导致错误与资源浪费:假设使用两次握手建立连接,存在这样一种场景:客户端发送的第一个请求连接报文没有丢失,只是在网络中滞留时间过长。由于 TCP 的客户端迟迟没有收到确认报文,以为服务器没有收到,此时会重新向服务器发送这条报文。此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。而之前滞留的那个请求连接报文,因网络通畅到达了服务器,这本该是失效的报文,但两次握手机制会使客户端和服务器再次建立连接,从而导致不必要的错误和资源的浪费。
2.四次挥手
  • 初始状态:刚开始客户端和服务器端都处于 ESTABLISHED 状态,假如客户端发起关闭请求,四次挥手过程便开始。

  • 详细过程

    1. 第一次挥手:

      • 客户端动作:客户端向服务器发送 FIN 报文(FIN = 1, seq = u),该报文表示客户端主动关闭 TCP 连接,发完此报文后客户端进入 FIN_WAIT_1 状态。此时客户端不再发送数据,但仍可以接收服务器发来的报文,开始等待服务器回复。
    2. 第二次挥手:

      • 服务器动作:服务器接到 FIN 报文后,返回一个 ACK 报文(ACK = 1, ack = u + 1, seq = v),此报文表明服务器已接收到客户端的 FIN 报文。
      • 状态变化:服务器进入 CLOSE_WAIT 关闭等待状态。客户端收到该 ACK 报文后,知道服务端已接到自己的断开连接请求,进入到 FIN_WAIT_2 状态,此时 TCP 处于半关闭状态,不过服务器端可能还有数据要传输。
    3. 第三次挥手:

      • 服务器动作:当服务器完成数据传输后,关闭与客户端的连接,发送 FIN 报文(FIN = 1,seq = w, ack = u + 1)给客户端,此时服务器处于 LAST_ACK 状态,等待客户端回应。
    4. 第四次挥手:

      • 客户端动作:客户端收到 FIN 报文后,发送一个 ACK(ACK = 1, ack = w + 1, seq = u + 1)给服务器作为应答。
      • 状态变化:此时客户端处于 TIME_WAIT 状态,这个状态是为了等待足够的时间以确保 TCP 接收到连接中断请求的确认,防止最后一个 ACK 报文丢失导致服务器重发 FIN 报文而客户端未收到的情况,一定时间后客户端才会彻底关闭连接。


参考链接:详解 TCP 连接的 “三次握手” 和 “四次挥手”


三.HTTP工作流程

1.流程概述

HTTP 的工作过程主要包含以下几个关键步骤:域名解析 -> 三次握手 -> 发起 HTTP 请求 -> 响应 HTTP 请求并得到 HTML 代码 -> 浏览器解析 HTML 代码 -> 浏览器对页面进行渲染呈现给用户。

2.工作流程
  1. 地址解析

    • 分解 URL 信息:当客户端浏览器请求一个页面,例如:http://localhost.com:8080/index.htm ,可以从中分解出协议名、主机名、端口、对象路径等部分。对于此地址,解析结果为:协议名:http;主机名:localhost.com;端口:8080;对象路径:/index.htm。
    • 域名解析:在这一步,通常需要借助域名系统 DNS 对域名localhost.com 进行解析,从而得到主机的 IP 地址。但如果直接访问的是形如 http://IP:8080/index.htm 的地址,就无需进行域名解析。这就好比我们要去一个地方,如果只知道地方的名字(域名),就需要通过某种方式(DNS)找到它的具体位置(IP 地址);但如果我们直接知道具体位置,就可以直接前往。
  2. 封装 HTTP 请求数据包
    将解析出的各部分信息,结合本机自身的相关信息,封装成一个 HTTP 请求数据包。这个数据包就像是一个装满了各种请求信息的包裹,准备发送给服务器。

  3. 封装成 TCP 包,建立 TCP 连接(TCP 的三次握手)

    • TCP 连接的重要性:在 HTTP 工作开始之前,客户机(Web 浏览器)首先要通过网络与服务器建立连接,而这个连接是通过 TCP 来完成的。TCP 协议与 IP 协议共同构建了 Internet,也就是著名的 TCP/IP 协议族,因此 Internet 也被称作是 TCP/IP 网络。

    • 协议层次关系:HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有在低层协议(如 TCP)建立之后,才能进行更高层协议(如 HTTP)的连接。

    • 端口选择:一般 TCP 连接的默认端口号是 80,但在此例中指定了 8080 端口。就像不同的门对应不同的通道,端口号就是不同服务的通道标识,通过指定端口号,数据就能准确地到达对应的服务程序。

    • 三次握手过程:

      • 第一次握手:客户端向服务器发送一个带有 SYN(同步序列号)标志的 TCP 报文段,该报文段中还会包含客户端随机生成的初始序列号(Sequence Number),此时客户端进入 SYN_SENT 状态,等待服务器的响应。
      • 第二次握手:服务器接收到客户端的 SYN 报文段后,会向客户端发送一个 SYN + ACK 报文段。其中,SYN 标志用于同步服务器的序列号,ACK 标志用于确认收到客户端的 SYN 报文段,同时服务器也会生成自己的初始序列号,并将客户端的序列号加 1 作为确认号(Acknowledgment Number),此时服务器进入 SYN_RCVD 状态。
      • 第三次握手:客户端收到服务器的 SYN + ACK 报文段后,会向服务器发送一个 ACK 报文段,确认号为服务器的序列号加 1,序列号为客户端自己的序列号加 1,此时客户端和服务器都进入 ESTABLISHED 状态,TCP 连接建立成功。
  4. 客户机发送请求命令
    建立连接后,客户机向服务器发送一个请求。请求方式的格式为:请求方法、统一资源标识符、协议版本号,后边是 MIME 信息,包括请求修饰符、客户机信息和可能的内容。例如,常见的 GET 请求格式可能为:GET /index.htm HTTP/1.1,这里 “GET” 是请求方法,用于获取指定资源;“/index.htm” 是统一资源标识符,指定要获取的资源路径;“HTTP/1.1” 是协议版本号。MIME 信息则进一步丰富了请求的细节,比如请求修饰符可以对请求进行一些特殊设定,客户机信息可以让服务器了解请求来自何种设备和浏览器等。

  5. 服务器响应

    • 响应格式:服务器接到请求后,会给予相应的响应信息。其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息,包括服务器信息、实体信息和可能的内容。
    • 状态行示例:例如,常见的成功响应状态行可能为:HTTP/1.1 200 OK,其中 “HTTP/1.1” 是协议版本号,“200” 是成功代码,表示请求成功,“OK” 是对状态码的文本描述。
    • MIME 信息与数据发送:实体消息是服务器向浏览器发送头信息后,会发送一个空白行来表示头信息的发送到此结束,接着,它就以 Content - Type 应答头信息所描述的格式发送用户所请求的实际数据。比如,如果 Content - Type 为 text/html,服务器就会按照 HTML 格式发送数据。
  6. 服务器关闭 TCP 连接

    • 一般情况:一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接。
    • 保持连接情况:然而,如果浏览器或者服务器在其头信息加入了 Connection:keep - alive,TCP 连接在发送后将仍然保持打开状态。这样一来,浏览器可以继续通过相同的连接发送请求。保持连接不仅节省了为每个请求建立新连接所需的时间,还节约了网络带宽。就像我们去一个地方,如果每次去都要重新开辟一条路,会花费很多时间和精力;但如果有一条路可以重复使用,就能提高效率并节省资源。
3.URL(统一资源定位符)
  • 我们常说的网址,包含了用于查找资源的足够的信息,而一个完整的URL包含下面几部分:


四.客户端请求

  • 介绍:客户端请求包括请求行、请求头部、空行和请求体


1.请求行


  1. 请求方法:表示客户端希望执行的操作。例如 GET、POST、PUT、DELETE等。

    请求方法描述
    GET请求指定页面信息,并返回实体主体
    POST向服务器提交数据以进行处理。通常用于创建或提交表单数据。例如,提交表单、上传文件等,又可能导致新的资源的建立或原有
    资源的修改
    OPTIONS用于获取服务器支持的HTTP请求方法和其他选项
    PUT用于将客户端的数据存储到指定的服务器资源位置。如果目标资源已存在,PUT 请求会用请求中的数据替换服务器上该资源的内容;若目标资源不存在,服务器会根据请求创建一个新的资源
    HEAD与GET方法类似,但只返回资源的头部,不返回资源的主体内容。常用于获取元数据
    DELETE请求服务器删除request-URL所标示的资源(请求
    服务器删除页面)
    TRACE用于诊断和调试,客户端可以发送TRACE请求查看请求在网络中经过的路径
    CONNECTHTTP/1.1协议中能够将连接改为管道方式的代理
    服务器
  2. 请求路径:指向请求的资源的URL路径。例如 /index.html 或 /api/data。

  3. HTTP版本:指向所使用的HTTP协议版本。例如 HTTP/1.1。

2.请求头部


  • 常见的请求头部:

    头部字段解释示例
    HOST指定服务器的域名或IP地址,必要时包含端口号HOST:www.example.com
    User-Agent发送请求的客户端软件的信息,通常是浏览器或其他HTTP客户端User-Agent:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppIeWebKit/537.36(KHTML,like Gecko)Chrome/92.0.4515.159 Safari/537.36
    Accept指定客户端能够接收的内容类型Accept:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
    Accept-Language指定客户端接收的语言Accept-Language: en-US,en;q=0.5
    Accept-Encoding指定客户端支持的内容编码方式(如gzip、deflate)Accept-Encoding: gzip,deflate,br
    Content-Type指定请求主体的MIME类型,通常用于POST和PUT请求Content-Type: application/json
    Authorization包含认证信息,用于客户端身份验证Authorization: Basic YWxhZGRpbjpvcGVuc2VzYw11
    Referer指定请求的来源页面URLReferer:https://www.example.com/previous-page
    X-Forwarded-For识别客户端的真实IP地址,通常由代理服务器添加X-Forwarded-For:192.168.1.1,203.0.113.1
    X-Frame-Options防止页面被嵌入到其他站点的<iframe>​中,用于防御点击劫持攻击X-Frame-Options:DENY
    X-Content-Type-Options防止浏览器MIME类型嗅探,强制其使用指定的Content-TypeX-Content-Type-Options:nosniff
    Strict-Transport-Security(HSTS)强制客户端通过HTTPS连接服务器,并且未来一段时间内(如一年)只通过HTTPS访问strictsTransport-Security: max-age-31536000; includeSubDomains
3.空行


  • 请求头部和请求体之间的空行,用于分隔头部信息和请求体。
4.请求体


  • 包含客户端要发送到服务器的数据,通常用于POST或PUT请求,也可能包含表单数据、JSON数据、文件上传等。

五.服务端响应

  • 介绍:服务端响应包括状态行、响应头部、空行、响应正文。


1.状态行
  • 介绍:状态行有协议版本、状态码和状态码描述组成,表示响应状态。

  • 常用的状态码

    状态码状态码描述中文描述
    200OK表示请求成功。一般用于GET与POST请求
    201Created表示请求成功,并在服务器上创建了新的资源。通常在POST请求中用于创建资源时返回。
    204No Content表示请求已成功处理,但没有返回任何内容。通常用于PUT或DELETE请求成功后,表示资源已被更新或删除。
    301Moved Permanently表示请求的资源已被永久移动到新的URL,客户端应使用新的URL进行后续请求。
    302Found表示请求的资源临时被移动到另一个URL。但资源只是临时被移动。客户端应继续使用原有URL进行请求,但可以根据响应中的Location头部字段进行重定向。
    304Not Modified表示资源未被修改,客户端可以使用缓存的版本。通常在客户端发送条件请求(如带有If-Modified-Since或If-None-Match头部)时返回。
    400Bad Request表示客户端发送的请求有语法错误或无法被服务器理解。
    401Unauthorized表示请求需要用户进行身份认证,通常是因为客户端没有提供有效的身份验证凭证。
    403Forbidden表示服务器理解请求,但拒绝执行,通常是因为客户端没有足够的权限访问资源。
    404Not Found表示服务器无法请求的找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
    405Method Not Allowed表示客户端请求的方法不被允许,例如使用了不支持的HTTP方法请求某个资源。
    500Internal Server Erro表示服务器在处理请求时发生了内部错误,无法完成请求。通常是服务器端的程序出现了异常。
    502Bad Gatewa表示作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到了一个无效的响应
    503Service Unavailable表示服务器暂时无法处理请求,通常是由于服务器过载或正在进行维护。
    504Gateway Timeout表示作为网关或代理的服务器在等待上游服务器响应时超时。
2.响应头部
  • 常见的响应头部

    Header头部解释示例
    Data原始服务器消息发出的时间Date: Mon, 23 Mar 2020 03:57:16 GMT
    Serverweb服务器软件名称Server: nginx/1.5.6
    Content-Type返回内容的MIME类型Content-Type: text/html
    Set-Cookie设置和页面关联的CookieSet-Cookie: sessionTd-abc123; Path=/;Secure;Httponly
    Content-Length响应体的长度Content-Length: 12
    ETag请求变量的实体标签的当前值,用于标识出资源的状态ETag: W/"91992-
    1583487900000"
    refresh表示浏览器应该在多少时间之后刷新文档,以秒计Refresh: 5
    WWW-Authenticate表明客户端请求实体应该使用的授权方案WWW-Authenticate: Basic
    Allow服务器支持哪些请求方法Allow: GET, HEAD
    Location用来重定向接收方到非请求URL的位置来完成请求或标识新的资源Location:http://www.baidu.com
3.空行
  • 响应头部和响应正文之间的空行,用于分隔头部信息和响应正文。
4.响应正文
  • 介绍:响应正文中是服务器返回的资源内容,比如:{"result":"success","message":null}​

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com