HTTP报文格式

一、报文格式
     http报文的三个组成部分
     1.起始行,在请求报文中,起始行用于说明要做什么,响应报文中,起始行用于说明发生了什么。
     2.首部字段,起始行后跟随零个或多个首部字段,首部字段为key:value的格式。首部以空行为结束。
     3.主体,在空行后即为主体,主体部分是可选的,可以没有。
     这是请求报文的格式:
          <method> <request-URL> <version>
          <headers>
          </r/n>(严格来说,这个是属于上面的<headers>,但为了提醒必须有空行,还是写在这边,下同)
          <entity-body>
      这是响应报文的格式(注意,只有起始行的语法有所不同):
          <version> <status> <reason-phrase>
          <headers>
          </r/n>
          <entity-body>
二、起始行
    1.请求行
     如上面所说,请求行包含方法,请求的URL,版本三个部分。方法告知服务器应进行的操作,URL告知服务器要操作的资源,版本告知服务器所用的http版本。
     方法有很多种,我个人比较常用的是GET、HEAD和POST。
     GET:用于请求服务器返回某个资源
     HEAD:与GET类似,但只返回响应行和头部。
     POST:常用于向服务器提交数据。
     2.响应行
     如上面所说,响应行包括版本,状态码和原因短语三部分。
     状态码解释:
          100~199——信息性状态码
          200~299——成功状态码
          300~399——重定向状态码     <p65>
          400~499——客户端错误状态码
          500~599——服务器错误状态码
三、其他
     首部字段和报文主体涉及的有很多,日后有空再写。
HTTP协议的报文结构分为请求报文和响应报文两种类型,分别用于客户端向服务器发起请求和服务器向客户端返回响应。报文格式由起始行、头部字段(Header)和消息主体(Body)组成。 ### HTTP请求报文结构 HTTP请求报文由以下三部分组成: 1. **请求行(Request Line)** 请求行包含三个关键部分: - **HTTP方法**:常见的方法包括GET、POST、PUT、DELETE等,用于指定客户端希望执行的操作。例如,GET用于获取资源,POST用于提交数据[^3]。 - **URL**:请求的目标资源的统一资源定位符(Uniform Resource Locator),例如`/index.html`。 - **协议版本**:如HTTP/1.1或HTTP/2.0,表示客户端使用的HTTP协议版本。 2. **请求头部(Request Headers)** 请求头部包含多个键值对,提供请求的附加信息。常见请求头包括: - **Host**:指定请求的目标服务器的主机名和端口号[^3]。 - **User-Agent**:标识客户端的类型,如浏览器版本和操作系统信息。 - **Content-Type**:指明请求体的媒体类型,例如`application/json`或`application/x-www-form-urlencoded`[^3]。 - **Content-Length**:表示请求体的长度,单位为字节,用于告知服务器请求体的大小[^3]。 - **Referer**:指明请求来源页面的URL。 - **Cookie**:包含客户端存储的会话信息,用于服务器识别用户。 3. **请求体(Request Body)** 请求体用于传输客户端向服务器提交的数据,通常在POST或PUT请求中使用。例如,提交表单数据或上传文件时,数据会包含在请求体中。 ### HTTP响应报文结构 HTTP响应报文同样由三部分组成: 1. **状态行(Status Line)** 状态行包含以下三个部分: - **协议版本**:如HTTP/1.1,表示服务器使用的HTTP协议版本。 - **状态码**:三位数字代码,用于表示服务器对请求的处理结果。例如,200表示成功,404表示资源未找到,500表示服务器内部错误[^4]。 - **状态码描述**:对状态码的简要说明,例如“OK”或“Not Found”。 2. **响应头部(Response Headers)** 响应头部同样由多个键值对组成,提供响应的附加信息。常见响应头包括: - **Content-Type**:指明响应体的媒体类型,例如`text/html`或`application/json`[^3]。 - **Content-Length**:表示响应体的长度,单位为字节,用于告知客户端响应体的大小[^3]。 - **Server**:标识服务器的软件信息,例如Apache或Nginx。 - **Location**:用于重定向,指示客户端新的URL。 - **Set-Cookie**:用于服务器向客户端发送会话信息。 3. **响应体(Response Body)** 响应体包含服务器返回给客户端的实际数据,例如HTML页面内容、JSON数据或图片二进制流。响应体的内容格式由`Content-Type`指定,长度由`Content-Length`确定[^3]。 ### HTTP报文示例 以下是一个HTTP请求和响应的示例: #### HTTP请求示例 ```http GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 ``` #### HTTP响应示例 ```http HTTP/1.1 200 OK Date: Tue, 10 Jan 2023 12:34:56 GMT Server: Apache/2.4.1 (Unix) Content-Type: text/html; charset=UTF-8 Content-Length: 1234 <!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <h1>Hello, World!</h1> </body> </html> ``` ### 抓包工具分析 使用抓包工具(如Fiddler)可以捕获HTTP请求和响应的详细数据格式。通过查看请求和响应的原始数据,可以分析HTTP报文的结构和内容。例如,在Fiddler中,左侧窗口显示所有HTTP请求/响应,右侧窗口显示详细的请求和响应报文内容,切换到Raw标签页可以看到完整的数据格式[^5]。 ### 状态码分类 HTTP状态码分为以下几类: - **1xx(信息性状态码)**:表示服务器已接收请求,客户端可以继续发送请求。 - **2xx(成功状态码)**:表示服务器成功处理了请求,例如200 OK。 - **3xx(重定向状态码)**:表示客户端需要进一步操作,例如301 Moved Permanently。 - **4xx(客户端错误状态码)**:表示客户端的请求有误,例如404 Not Found。 - **5xx(服务器错误状态码)**:表示服务器未能处理请求,例如500 Internal Server Error。 ### 报文头部字段 HTTP报文头部字段是键值对形式,用于传递附加信息。例如: - **Cache-Control**:控制缓存的行为,如`max-age=3400`表示缓存有效时间为3400秒。 - **Connection**:管理连接,如`keep-alive`表示长连接。 - **Content-Encoding**:实体主体适用的编码方式,如gzip。 - **ETag**:资源的匹配信息,用于验证资源是否发生变化[^4]。 ### 相关问题 1. HTTP协议中的状态码200、301、404和500分别表示什么含义? 2. 如何通过Fiddler抓包分析HTTP请求和响应? 3. HTTP请求中的User-Agent和Referer头部字段的作用是什么? 4. Content-Type和Content-Length在HTTP报文中有什么作用? 5. HTTP协议中常见的响应头部字段有哪些?它们的作用是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值