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

我们看看http协议的数据包格式,首先可以使用wireshark抓包,由于http协议使用80端口,因此可以在wiresharks中使用过滤条件tcp.prot==80,然后用浏览器打开一个页面,在wireshark里会看到这样的抓包:
屏幕快照 2020-04-17 下午5.44.59.png
双击打开会看到如下内容,这就是http协议的主要内容和结构:
屏幕快照 2020-04-17 下午5.50.41.png
下面我们对其内容进行详细解读。HTTP数据包遵守以下基本格式:
<起始行>
<消息头>
<空白行>
<消息体>
<消息尾>
要注意的是每一行都必须以/r/n结尾。起始行就是上图中被选中的那行"HTTP1.1 204 No Centent\r\n",如果数据包是客户端对服务器的请求,那么起始行就会包含数据请求的方法,数据在服务器上的位置,如果是服务器回复给客户端的数据包,起始行就包含请求的状态,后面我们会详细分析起始行的内容。

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

客户端发送给服务器的数据包里,第一行叫请求行。它包含三个目的,第一是表明请求的来意;第二,指明请求对应资源所在位置;第三,告诉服务器采用哪个版本的HTTP协议。因此请求行的基本结构就是<方法><请求资源URI><HTTP版本>,例如一个具体例子的请求行为: 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部分,它也叫头部,这部分进一步告诉服务器请求的详细信息。头部信息根据作用不同也分成不同种类。一种叫广义头部,这种头部表述的内容与客户端要请求的资源无关,但与如何处理当前消息有关,它主要用来给服务器提供更多有关当前消息数据包的信息。第二种叫请求头部,它用来详细指导服务器如何处理当前请求,例如告诉服务器如何编码客户端所请求的资源等。第三种叫实体头部,他用来告诉服务器返回的数据包中应该包含哪种信息,头部部分会在后续章节中详细解读。

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

屏幕快照 2020-04-18 上午10.49.39.png

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

下一小节我们队HTTP数据包中的请求方法及其作用做详细的解析。

更详细的讲解和代码调试演示过程,请点击链接

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值