前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java实现HTTP协议:数据包格式概览

Java实现HTTP协议:数据包格式概览

作者头像
望月从良
发布2020-04-21 17:10:25
8650
发布2020-04-21 17:10:25
举报
文章被收录于专栏:Coding迪斯尼Coding迪斯尼

我们看看http协议的数据包格式,首先可以使用wireshark抓包,由于http协议使用80端口,因此可以在wiresharks中使用过滤条件tcp.prot==80,然后用浏览器打开一个页面,在wireshark里会看到这样的抓包:

双击打开会看到如下内容,这就是http协议的主要内容和结构:

下面我们对其内容进行详细解读。HTTP数据包遵守以下基本格式: <起始行> <消息头> <空白行> <消息体> <消息尾> 要注意的是每一行都必须以/r/n结尾。起始行就是上图中被选中的那行”HTTP1.1 204 No Centent\r\n”,如果数据包是客户端对服务器的请求,那么起始行就会包含数据请求的方法,数据在服务器上的位置,如果是服务器回复给客户端的数据包,起始行就包含请求的状态,后面我们会详细分析起始行的内容。

接下来是消息头,它以key-value的方式组织,通常为:,消息体其实是可选项,如果服务器告知客户端请求失败,那么消息体就包含失败的具体原因,如果请求成功,那么消息体就包含要传递给客户端的数据内容。由于HTTP1.1要求保持持久连接,于是数据有可能通过多个数据包传递,这样就需要对消息体进行标记,用来说明那些消息体里面的内容属于同一个整体。通常情况下会有一个特别字段指明消息的长度,也就是图中的content-Length,如果所有的数据传输完毕,在最后一个数据包还会有消息尾,消息尾和头结构基本上一样。

客户端发送给服务器的数据包里,第一行叫请求行。它包含三个目的,第一是表明请求的来意;第二,指明请求对应资源所在位置;第三,告诉服务器采用哪个版本的HTTP协议。因此请求行的基本结构就是<方法><请求资源URI>,例如一个具体例子的请求行为: GET /index.html HTTP/1.1,它表示客户端想获取数据,数据的地址就是位于当前根目录下的index.html,双方使用HTTP/1.1版本的协议进行交互。其中<方法>真的的是服务器,它告诉服务器应该怎么做,注意它一定要使用大写字母。在1.1版本的协议中,常用方法有GET,HEAD,POST,这些方法的具体内容我们在后续章节中还要深入解析。

请求行中的<请求资源URI>对应浏览器去掉域名后的那部分内容。例如当浏览器中输入内容为”http://www.mysize.com:8080/chatware/chatroom.php",那么对应的资源URI就是"/chatware/chatroom.php",那么在消息头中就可能包含这句"Host:www.mysize.com:8080"。情况也有例外,如果是代理服务器收到该请求时,他必须把整个URL当成URI转发给下一个服务器。

最后的协议版本会让服务器决定如何与客户端保持连接。如果是0.9或1.0版本,服务器在发送完数据后会自己将TCP连接给断掉,如果是1.1版本,那么服务器就会保持着与客户端的连接。

接下来看header部分,它也叫头部,这部分进一步告诉服务器请求的详细信息。头部信息根据作用不同也分成不同种类。一种叫广义头部,这种头部表述的内容与客户端要请求的资源无关,但与如何处理当前消息有关,它主要用来给服务器提供更多有关当前消息数据包的信息。第二种叫请求头部,它用来详细指导服务器如何处理当前请求,例如告诉服务器如何编码客户端所请求的资源等。第三种叫实体头部,他用来告诉服务器返回的数据包中应该包含哪种信息,头部部分会在后续章节中详细解读。

接下来看服务器的返回数据包格式,其大体结构如下: <状态行> <广义头部> <回复头部> <空行> [<消息体>] [<消息尾>] 状态行用来告诉客户端服务器支持什么版本的协议,请求处理的结果等,状态行的基本格式为<协议版本><状态码><状态码说明>,我们看一个具体例子:

其中第一行就是状态行,它表示服务器支持版本1.1 状态码和接下来的”OK“表明请求成功,下面粉色部分是消息体,它在回复数据包中可有可无。在服务器的回复数据包中肯定包含头部部分,它的类型与客户端数据包的头部部分一样。如果回复数据包中包含消息体的话,那么这部分基本上对应客户端要请求的资源内容。

下一小节我们对HTTP数据包中的请求方法及其作用做详细的解析,更多详细讲解及调试演示请点击‘阅读原文’链接。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coding迪斯尼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档