个人对http的一点理解

想必大家都对http协议都十分的收悉,我本人对http也不是特别的陌生,但是也没有特别的具体,那么今天就打算来地毯式的扫一遍这个http不同版本的之间相同之处和不同之处。

重要的事情多说一遍,你们一定要自己去亲自去试一试socket,socket真的很重要,你想完全明白http协议最好自己去玩玩socket,反正socket在我心目中的地位是排很前面的,你可以自己通过他实现一些自己定义的协议,特别是粘包问题的时候,想玩懂http协议一定要去用socket,并把它玩好。

http协议由三部分组成

1.状态行:

也就是 大家最熟悉的 GET / HTTP/1.1 GET /login HTTP/1.1 GET /register HTTP/1.1

或者是响应报文中的 HTTP/1.1 200 OK

2.header

这个类似于一个key-value结构的:

比如         cookies:loginStatus=1,vipLev=2;

                Content-Length: 81;这个就是body的长度

                Content-Type: text/html;指明这个body中的数据是什么类型,比如是json或者二进制形式的文件内容等等。

3.body:个人最喜欢body这部分

        本人刚开始学习这个web开发的时候,基本的获取什么前段传过来的参数,也就是大家入门时学的 get请求中带的http://localhost:8080/login?username=123&&password=123,这个最基本的参数获取,当然这个username和password可不是放在body里面的啊,他是放在header中,post方式提交的时候才会出现在body中,给大家一个例子

POST / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: baidu.com
User-Agent: HTTPie/1.0.2

username=123&&password=1213

post方式就是这样提交的,其实浏览器发送数据的时候,就是将上面那串文本发送过去的这就是大家所谓的http报文,他没有大家想的那么神奇,个人觉得自己手写一个http请求,比当时自己用c++写的一个tcp syn数据包要简单的多,大家完全可以自己在linux平台上安装一个clion(编程代码编写工具和java idea一样)来自己构造一个原始套接字,然后自己构造ip数据包和tcp数据包,通过原始套接字,进行发送,我劝大家千万别再windows上进行测试,因为我在windows上就没成功发到我阿里云服务器上,我猜测归结其有两个原因,一.网上说windows不允许发送用户自己构造的tcp报文的数据包,2.当时自己太菜了,可能代码细节那出现问题,不过我在我的物理机kali上测试成功了,大家也可以通过原始套接字实现udp洪水攻击,代码我会发布到github上我会把他放到我下一篇文章上。

这里有点扯远了,我的意思就是大家完全可以通过自己构造一个socket,然后绑定一个端口,然后用你浏览器来访问你的socket,然后将收到的数据打印出来,你就可以看到上面哪些类似的文本,这样你对http协议就会有更深得理解,http协议就是你看到的那串文本。

http协议是应用层协议,意思就是他是给应用 程序看的,不是给你的操作一同或者网卡这些硬件看的。tcp是给你的网卡硬件看的,他来处理tcp ip这类的数据报文,而http报文是给你的tomcat服务器看的。

重点来了,那就是,body的作用,我刚开始学的时候也特别不明白,他是干嘛的,后来我接触到文件上传,比如最基本的图片验证码,我当时用springboot来写的时候用了一个ImageUtill的这个工具类,来将我的生成的二维码图片,通过他发送,当时我特别不明白,为什么他就能发送给我的浏览器。后来我就猜测,是不是就在body里面。然后我就自己用go gin框架搭建了一个http服务,然后自己在用go http.get() 来请求那个gin框架中那个自己实现的文件下载的接口,结果整的是那样,那个文件的数据,就在那个body里面,我当时将其打印出来,然后出了响应行 header,是正常打印的,因为文件是二进制格式,所以就是乱码。重要的事情多说一遍,你们一定要自己去亲自去试一试socket,socket真的很重要,你想完全明白http协议最好自己去玩玩socket,反正socket在我心目中的地位是排很前面的,你可以自己通过他实现一些自己定义的协议,特别是粘包问题的时候,想玩懂http协议一定要去用socket,并把它玩好。回归正题,我们大体明白了,不管是服务器返回html文件给你还是你上传文件或者其他的东西,基本上都在body中,body就是,那个http header头后面有个空行。空行后面就是body中的内容。

HTTP/1.1 200 OK           # 响应状态行,包括HTTP版本、状态码200、OK表示成功
Accept-Ranges: bytes      
Cache-Control: max-age=86400
Connection: Keep-Alive
Content-Length: 81
Content-Type: text/html
Date: Fri, 02 Aug 2019 10:13:42 GMT
ETag: "51-47cf7e6ee8400"
Expires: Sat, 03 Aug 2019 10:13:42 GMT
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
Server: Apache
                                                 //我的下面就是body,这个就是大家所说的body,紫色的文本内容
<html>         # 响应正文。返回的是一个HTML
<body>

<p>我是html文件</p>

</body>
</html>

然后再回到正题,就是我们知道了什么body,那么大家就可以为所欲为了,因为http的本质我们已经可以摸透了,这样我们就可以完全按照自己的玩法来玩http了,大家可以自己定义协议,将自己定义的协议,放入body中,然后在服务器端自己获取到body中的所有内容,然后自己解码,获取到正确的数据内容,比如用protobuf来压缩自己的数据,然后服务端在自己将其解码出来。至于大家想怎么弄那是大家的事情。

下面的内容是我现在在写这篇文章的时候现学的的东西。http,先从http的无状态协议的内容说起,http协议,我从我写的web服务端来理解的,我们每访问一个接口,就会调用响应的方法,方法里面会做很多响应的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值