专栏首页Coding迪斯尼Java实现HTTP协议:数据包格式概览

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

我们看看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数据包中的请求方法及其作用做详细的解析,更多详细讲解及调试演示请点击‘阅读原文’链接。

本文分享自微信公众号 - Coding迪斯尼(gh_c9f933e7765d),作者:陈屹

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DHCP:主机动态配置协议过流解析和数据包格式说明

    本节,我们使用代码实现主机配置协议。对协议实现而言,一是要理解数据包的交互流程,二是要了解数据包的结构,因此我们首先抓取DHCP协议的数据包,先了解它的大致结构...

    望月从良
  • HTTP协议的状态码解读

    当客户端把请求发送给服务器后,对方会根据处理结果返回一系列HTTP数据包。其中第一行就用给定格式表明服务器对请求处理的结果。第一行包括三部分信息,第一部分是一个...

    望月从良
  • 详解TCP数据包中SYN,ACK字段与数据发送的关联

    在TCP协议中,为了确保数据能稳定发送,协议使用数据包中的syn,ack两个字段来监控数据是否正确发生和接收,本节我们看看这两个字段如何保证数据的平稳传输。

    望月从良
  • LVS支持哪些调度算法?

    1.轮叫调度(Round Robin) 调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的...

    黄泽杰
  • Redis实现消息队列 转

    打开浏览器,输入地址,按下回车,打开了页面。于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response)内容。

    wuweixiang
  • HTTP协议概述

    HTTP1.0定义了三种请求方法:GET、POST、HEAD方法。 HTTP1.1新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRA...

    WindrunnerMax
  • 常见”HTTP状态码”大全

    当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server...

    空木白博客
  • REST API和SOAP API之间的区别

    The Representational State Transfer (REST)架构风格不是可以购买的技术,也不是可以添加到软件开发项目中的库。REST是一...

    程序你好
  • GC之ParallelGC和ConcMarkSweepGC的理解

        可以先读这篇国外的文章,https://www.cubrid.org/blog/understanding-java-garbage-collectio...

    克虏伯
  • 非常有用的并发控制-倒计时器CountDownLatch

    CountDownLatch见名思义,即倒计时器,是多线程并发控制中非常有用的工具类,它可以控制线程等待,直到倒计时器归0再继续执行。 给你出个题,控制5个线...

    Java技术栈

扫码关注云+社区

领取腾讯云代金券