HTTP报文格式详解

HTTP报文传过来都是一堆的0x ASCII码,诸如“41 63 63 65 70 74” 对应的是“accept” 单词的十六进制ASCII码。

这些十六进制的数字经过浏览器或者专用工具比如wireshark的翻译,可以得到HTTP的报文结构。

Request报文

以下是wireshark抓出来的一段HTTP请求报文

GET /admin_ui/rdx/core/images/close.png HTTP/1.1
Accept: */*
Referer: http://xxx.xxx.xxx.xxx/menu/neo
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: xxx.xxx.xxx.xxx
Connection: Keep-Alive
Cookie: startupapp=neo; is_cisco_platform=0; rdx_pagination_size=250%20Per%20Page; SESSID=deb31b8eb9ca68a514cf55777744e339

HTTP的请求报文包括:请求行(request line)、请求头部(header)、空行 和 请求数据(request data) 四个部分组成。

请求行包括: 请求方法,URL(包括参数信息),协议版本这些信息(GET /admin_ui/rdx/core/images/close.png HTTP/1.1)

请求头部(Header)是一个个的key-value值,比如

  • Accept-Encoding: gzip, deflate
  • User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)

空行(CR+LF):请求报文用空行表示header和请求数据的分隔

请求数据:GET方法没有携带数据, POST方法会携带一个body

 

Response报文

下面是wireshark抓出来的一段响应报文

HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xacbbb9d800005133
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html
Cxy_all: baidu+f8b5e5b521b3644ef7f3455ea441c5d0
Date: Fri, 12 Oct 2018 06:36:28 GMT
Expires: Fri, 12 Oct 2018 06:36:26 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1433_21112_18560_26350_27245_22158; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked

<!DOCTYPE html>
<!--STATUS OK-->

HTTP的响应报文包括:状态行,响应头,空行,数据(响应体)

状态行包括:HTTP版本号,状态码和状态值组成。

响应头类似请求头,是一系列key-value值

  • Cache-Control: private
  • Content-Encoding: gzip
  • Server: BWS/1.1
  • Set-Cookie: delPer=0; path=/; domain=.baidu.com

空白行:同上,响应报文也用空白行来分隔header和数据

响应体:响应的data,本例中是一段HTML

 

HTTP请求的一个完整过程

  • 建立 TCP 连接(之前可能还有一次DNS域名解析)
  • 三次握手建立TCP完成后,客户端向服务器发送请求命令,比如 GET https://www.baidu.com?name=xx&addr=xx HTTP1.1
  • 客户端发送请求头信息,发送完了header后会接着发送一个空白行,GET请求没有数据,POST请求要发送body数据
  • 服务器接收到以上信息后,开始处理业务,处理完有了结果以后,服务器开始应答
  • 服务器返回响应头信息,发送完response header以后,再发送一个空白行
  • 然后服务器向客户端发送数据
  • 发送完了服务器四次挥手关闭 TCP 连接
  • 22
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
HTTP(Hypertext Transfer Protocol)是一种应用层协议,它是在计算机网络中传输超文本(Hypertext)的标准,是Web数据通信的基础。HTTP工作的过程如下: 1. 建立连接:客户端通过TCP连接向服务器发起请求。 2. 发送请求:客户端发送HTTP请求消息给服务器,请求消息包括请求方法、请求URI、协议版本、请求头部信息以及请求数据等内容。 3. 处理请求:服务器接收到客户端的请求消息后,根据请求消息中的URI和协议版本等信息,解析出客户端需要的资源,并进行相应的处理。 4. 发送响应:服务器将处理结果封装成HTTP响应消息发送给客户端,响应消息包括协议版本、状态码、状态码描述、响应头部信息以及响应数据等内容。 5. 关闭连接:HTTP是一种无状态协议,处理完一次请求后,服务器和客户端之间的连接就会断开。 HTTP报文格式包括请求报文和响应报文两种类型: 1. 请求报文:请求报文由请求行、请求头和请求体组成,其中请求行包括请求方法、请求URI和协议版本三部分;请求头部包括多个请求头字段,用于描述客户端请求的附加信息;请求体包括请求数据,用于向服务器传递数据。 2. 响应报文:响应报文由状态行、响应头和响应体组成,其中状态行包括协议版本、状态码和状态码描述三部分;响应头部包括多个响应头字段,用于描述服务器响应的附加信息;响应体包括响应数据,用于向客户端返回数据。 HTTP的工作原理是基于请求-响应模式的,客户端向服务器发送请求,服务器处理请求并返回响应,然后连接就断开了。HTTP使用TCP作为传输协议,它通过传输层提供可靠的数据传输,同时通过应用层提供HTTP协议的功能。HTTP协议使用请求-响应模式,客户端发送请求消息给服务器,服务器接收请求消息后,进行相应的处理,然后将处理结果封装成HTTP响应消息发送给客户端。在HTTP协议中,客户端和服务器都可以发送请求和响应消息,但通常情况下,客户端发送请求消息,服务器发送响应消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值