美文网首页Java
Java实现HTTP协议:数据包格式概览

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

作者: 望月从良 | 来源:发表于2020-04-18 11:03 被阅读0次

    我们看看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的方式组织,通常为<header-name>:<header-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数据包中的请求方法及其作用做详细的解析。

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

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


    这里写图片描述

    相关文章

      网友评论

        本文标题:Java实现HTTP协议:数据包格式概览

        本文链接:https://www.haomeiwen.com/subject/ubwyvhtx.html