http报文格式

 

一、URI结构

HTTP使用统一资源标识符(URI)来传输数据和建立连接。URL(统一资源定位符)是一种特殊种类的URI,包含了用于查找的资源的足够的信息,我们一般常用的就是URL,而一个完整的URL包含下面几部分:

http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first

1.协议部分

URL的协议部分为http:,表示网页用的是HTTP协议,后面的//为分隔符

2.域名部分

域名是www.fishbay.cn,发送请求时,需要向DNS服务器解析IP。如果为了优化请求,可以直接用IP作为域名部分使用

3.端口部分

域名后面的80表示端口,和域名之间用:分隔,端口不是一个URL的必须的部分。如果端口是80,也可以省略不写

4.虚拟目录部分

从域名的第一个/开始到最后一个/为止,是虚拟目录的部分。其中,虚拟目录也不是URL必须的部分,本例中的虚拟目录是/mix/

5.文件名部分

从域名最后一个/开始到?为止,是文件名部分;如果没有?,则是从域名最后一个/开始到#为止,是文件名部分;如果没有?#,那么就从域名的最后一个/从开始到结束,都是文件名部分。本例中的文件名是76.html,文件名也不是一个URL的必须部分,如果没有文件名,则使用默认文件名

6.锚部分

#开始到最后,都是锚部分。本部分的锚部分是first,锚也不是一个URL必须的部分

7.参数部分

?开始到#为止之间的部分是参数部分,又称为搜索部分、查询部分。本例中的参数是name=kelvin&password=123456,如果有多个参数,各个参数之间用&作为分隔符。

作者:飞鱼湾 链接:https://www.jianshu.com/p/8fe93a14754c 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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、付费专栏及课程。

余额充值