HTTP协议格式详解之首行信息解析

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本文档的应用层协议,通常用于在客户端和服务器之间传输网页、图片、视频等资源。它是建立在TCP/IP协议栈之上的应用层协议,使用标准的TCP连接来传输数据。HTTP的主要特点包括简单、灵活、可扩展性强等。

在OSI(Open Systems Interconnection)模型中,HTTP位于应用层,负责定义客户端和服务器之间的通信规则。应用层是OSI模型中最高层,它负责为用户提供各种网络服务和应用,如文件传输、电子邮件、Web访问等。HTTP作为应用层协议,定义了客户端和服务器之间如何发送和解释消息,以实现网页访问等功能。

HTTP通常使用TCP作为传输层协议,因为它需要可靠的数据传输服务来确保数据的完整性和可靠性。当客户端发起HTTP请求时,它会首先与服务器建立TCP连接,然后通过这个TCP连接来发送HTTP请求和接收HTTP响应。因此,HTTP和TCP之间是一种客户端-服务器的关系,HTTP依赖于TCP来提供可靠的数据传输服务。

总之,HTTP是应用层协议,用于在客户端和服务器之间传输超文本文档;TCP和UDP是传输层协议,负责在网络上传输数据。HTTP通常使用TCP作为传输层协议,以实现可靠的数据传输服务。

HTTP协议格式

请求行(Request Line)

1)请求(request)

请求行包含了请求方法、请求的资源路径和HTTP协议版本。常见的请求方法包括GET、POST、PUT、DELETE等。例如:

GET /index.html HTTP/1.1
1.请求方法(Request Method):

请求方法指示了客户端希望服务器对资源执行的操作。

a) 常见的请求方法包括:
  • GET:请求获取指定资源。GET请求通常用于从服务器获取数据,不会对服务器上的资源进行修改。
  • POST:向服务器提交数据,用于向服务器提交数据,比如表单数据。POST请求可能会导致服务器上的资源状态发生变化。
  • PUT:用于更新服务器上的资源,通常用于上传文件或更新已有资源。
  • DELETE:请求服务器删除指定的资源。
  • HEAD:类似于GET请求,但服务器只返回请求头部,不返回实际的资源内容。主要用于获取资源的元信息,比如检查资源是否存在、获取资源的大小等。
  • OPTIONS:用于获取目标资源所支持的通信选项。
  • TRACE:用于测试客户端到服务器之间的路径。
  • CONNECT:用于将连接改为管道方式的代理服务器。
b) GET和POST的区别:
  • 幂等性
    • GET请求:通常是幂等的,即对同一个URL的多次GET请求应该返回相同的结果。GET请求不应该对服务器的状态产生影响。
    • POST请求:通常不是幂等的,即对同一个URL的多次POST请求可能会产生不同的结果,因为POST请求通常用于提交数据,可能会导致服务器的状态发生变化。
  • 使用场景
    • GET请求:用于获取资源,通常用于向服务器请求特定资源,不应该对服务器的状态产生副作用。例如,获取网页、图片或其他静态资源。
    • POST请求:用于提交数据,通常用于向服务器提交表单数据、上传文件、进行数据更新或者创建新资源等操作。
  • 数据传输方式

    • GET请求:通过URL的query string 传输数据,body通常为空。数据以查询字符串的形式附加在URL的末尾,如https://www.example.com/search?q=query
    • POST请求:通过请求体(Request Body)传输数据,数据被包含在HTTP请求的消息体中发送给服务器。因此,POST请求的数据不会暴露在URL中。
2.资源路径(URL):

URL(统一资源定位符)是用于标识和定位互联网上资源的地址。它由多个组成部分组成,包括协议、主机、端口、路径、查询参数和片段等。

a) URL的具体组成部分:
  • 协议(Protocol):URL的第一部分指定了要用于访问资源的协议,通常是HTTP或HTTPS。协议部分以冒号加两个斜杠开头。例如,http://https://

  • 主机(Host):主机部分指定了资源所在的服务器的主机名或IP地址。例如,www.example.com192.168.1.1

  • 端口(Port):端口部分指定了服务器上正在监听的端口号。如果未指定端口号,则使用默认的端口号。HTTP协议的默认端口是80,HTTPS协议的默认端口是443。如果使用了默认端口,则通常不需要在URL中显式指定端口号。如果使用了非默认端口,则需要在主机名后面加上冒号和端口号。例如,www.example.com:8080表示使用了8080端口。

  • 路径(Path):路径部分指定了服务器上资源的路径。它以斜杠/开头,可以包含多个子路径,每个子路径用斜杠分隔。路径部分表示服务器上资源的位置或层次结构。例如,/index.html/blog/posts/2024/april

  • 查询参数(Query Parameters):查询参数部分用于向服务器传递额外的数据,通常以键值对的形式组成,多个参数之间用&符号分隔。查询参数通常用于GET请求,用于向服务器传递搜索条件、过滤条件或其他参数。查询参数以问号?开头,例如,?page=2&category=technology

  • 片段(Fragment):片段部分指定了资源中的一个特定片段或位置。它位于URL的最后,以井号#开头,常用于标识HTML文档中的特定元素或位置。片段通常用于在浏览器中滚动到特定位置或定位到特定内容。例如,#section2

b) URL encoding:

URL编码(URL encoding),也称为百分号编码(percent-encoding),是一种在URL中转义特殊字符和非ASCII字符的方法,以便它们能够在网络上进行安全传输和正确解释。URL编码将特殊字符替换为百分号(%)后面跟着两位十六进制数的形式。

URL编码通常用于以下情况:

  • 保留字符(Reserved Characters):URL中的某些字符具有特殊含义,例如问号(?)、井号(#)、百分号(%)、斜杠(/)等,如果这些字符需要作为普通字符的一部分出现在URL中,就需要对它们进行编码。

  • 非ASCII字符(Non-ASCII Characters):URL中只能包含ASCII字符,而对于非ASCII字符(如中文、日文、俄文等),需要进行编码,以便它们在URL中传输时不会出现乱码或被错误解释。

URL编码的过程很简单,就是将每个非ASCII字符或者需要转义的特殊字符转换成百分号(%)后跟着两位十六进制数的形式。例如:

  • 空格(空格在URL中需要转义为%20)被转码为 %20
  • 问号(?在URL中需要转义为%3F)被转码为 %3F
  • 字符"#"(#在URL中需要转义为%23)被转码为 %23
3.HTTP协议版本: HTTP1.0,HTTP1.1,HTTP2.0,这三者基于TCP,HTTP3(基于UDP)
2) 响应(response)

包含了HTTP协议的版本号、状态码和状态消息。状态码表示服务器对请求的处理结果,状态消息是对状态码的文本描述。例如,状态码200表示请求成功,状态消息为OK。

HTTP/1.1 200 OK
1.版本号 

HTTP状态码是服务器对客户端请求的响应结果的标识,每个状态码都有特定的含义。下面是一些常见的HTTP状态码及其含义:

  • 1xx(信息性状态码):表示请求已被接收,正在处理。

    • 100 Continue:服务器已收到请求的一部分,客户端应继续发送剩余的请求。
  • 2xx(成功状态码):表示请求已成功处理。

    • 200 OK:请求成功,服务器已成功处理了请求。
    • 201 Created:请求已被成功处理,并且在服务器上创建了新资源。
    • 204 No Content:服务器成功处理了请求,但不需要返回任何实体内容。
  • 3xx(重定向状态码):表示需要进行进一步的操作以完成请求。

    • 301 Moved Permanently:请求的资源已永久移动到新位置,客户端应该使用新的URL重新发起请求。
    • 302 Found:请求的资源临时移动到新位置,客户端应该使用新的URL重新发起请求。
    • 304 Not Modified:客户端可以通过缓存的版本访问资源,未返回实体内容。
  • 4xx(客户端错误状态码):表示客户端发送的请求有错误。

    • 400 Bad Request:服务器无法理解客户端发送的请求,通常由于语法错误。
    • 401 Unauthorized:请求需要用户身份认证。
    • 403 Forbidden:服务器拒绝请求,通常因为客户端没有访问资源的权限。
    • 404 Not Found:请求的资源未找到。
  • 5xx(服务器错误状态码):表示服务器在处理请求时发生了错误。

    • 500 Internal Server Error:服务器内部错误,无法完成请求。
    • 502 Bad Gateway:作为网关或代理服务器工作的服务器从上游服务器收到无效的响应。
    • 503 Service Unavailable:服务器当前无法处理请求,通常是由于维护或过载。
2.状态消息

状态消息往往与状态码对应

  • "OK" (200):请求成功。服务器成功处理了客户端的请求,返回了请求的资源或内容。

  • "Moved Permanently" (301):永久重定向。请求的资源已永久移动到新位置,客户端应该使用新的URL重新发起请求。

  • "Found" (302):临时重定向。请求的资源临时移动到新位置,客户端应该使用新的URL重新发起请求。

  • "Not Modified" (304):未修改。客户端可以通过缓存的版本访问资源,服务器未返回实体内容。

  • "Bad Request" (400):无效请求。服务器无法理解客户端发送的请求,通常由于语法错误。

  • "Unauthorized" (401):未授权。请求需要用户身份认证。

  • "Forbidden" (403):禁止访问。服务器拒绝请求,通常因为客户端没有访问资源的权限。

  • "Not Found" (404):未找到。请求的资源未找到。

  • "Internal Server Error" (500):服务器内部错误。服务器无法完成请求,发生了意外错误。

  • "Service Unavailable" (503):服务不可用。服务器当前无法处理请求,通常是由于维护或过载

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值