一、抓取http数据包
我们使用免费的fiddler 去抓一个网络数据报来分析http协议。
在fiddle 中是找到抓到的http 协议包,打开之后,我们点第二张图片 来使用记事本来打开



这个就是抓取的http协议 的数据包。
二、首行
下面这个就是抓取的数据包中的首行 ,包含请求方法,请求方法的URL版本号。GET就是请求方法 ,后面的网址就是URL, HTTP/1.1 就是使用的 http 协议的版本号。

三、URL 是描述网络上唯一资源位置的文本格式。
- 就像jdbc 中的URL 的设置

- 这里面的 jdbc:mysql 就是协议名称 ,URL不是 HTTP 协议的专属概念,也是可以给各种协议提供支持的。
- 127.0.0.1:3306 其中的 "127.0.0.1" 就是要访问的服务器的 IP 或者是域名 ,"3306" 就是要访问的服务器的端口号 。域名 和IP 可以相互转化 ,这个过程是通过 DNS 域名解析系统来完成的。(DNS既是一套服务器系统,也是一种应用层协议) 。有了IP之后就能找到是哪一台主机,想要知道是这个主机上的哪个应用程序,那就得通过端口来分辨是哪个应用程序。
- "java113 " 是带有层次结构的路径,是访问某个主机上某个应用程序的某个文件夹下的某个资源。
- characterEncoding=utf8&useSSL=false 对要访问的资源进行补充说明,他也是键值对的结构,键值对之间使用& 分割。键和值之间使用= 分割。键就是属性,值就是这个属性的值。
这里的web 是指 "www.baidu.com" 这个路径下的 web 资源,我们使用这个网址进行访问就是访问这个路径下的 web 资源,如果有正常跳转,如果没有这个资源就查找不到。 

四、http网址的转义
下面这是一个http 的模板网址,http 就是我们当前这个网址

4.1 关于http网址的转义
在网址中本身就会有一些特殊符号,代表了不同的特殊含义。 因为http 中有固定的格式,又因为一些特殊字符有转义的功能 ,例如'\' 这个字符和其他字符组成会有转义功能,所以直接放在网址中还得考虑转义,所以我们可以把这些特殊字符进行转义,给它转换成下面的'%E4'等等,但是一个字符是多长,这得取决于使用的编码集。中文符号在utf8 中占3个字节,但是在其他编码集中,一般占2个字节。

五、关于 http 协议中的方法

这里面经常使用的是 GET 和 POST 方法
5.1从语义上说:
- GET 是查询、获取资源:语义上值做读操作,单纯从服务器上拿数据,不修改、不新增、不删除服务器的任何内容
- POST 是提交数据、处理资源:语义是写操作,向服务器递交数据,用来新增、修改、处理业务数据。
- 简单总结:GET(我只是看看,拿数据)、POST(我要提交、改动数据)
但是事实上,在程序员实现的时候,可以自己灵活的掌握。GET请求一般都是没有 body 的,如果现需要通过GET给服务器发送一些数据,就需要通过 query、string 传递过去。
5.2使用 POST 的两个经典场景
- 登录
- 上传, 请求带有正文的 ,正文就是保存当前上传的数据的内容,图片本身就是二进制的, 通过特殊的方式进行转码(例如base 64 编码,把二进制转换成文本 )转成文本,其实 body是可以直接填二进制数据的。
5.3GET 和 POST 的区别
首先,GET 和POST 在本质上是没有去别的,**经常是可以混着使用的,**从使用方法习惯上来说,主要有两个方面。
- 语义上的区别 :GET 是只读取,不会修改服务器上的内容 ;POST 是要修改服务器上的数据
- 携带数据的方式:
- GET :是拼接在 URL 地址栏的尾部 ,是在请求行中,是请求行中的一部分。
格式 :http://xxx.com/user?mame=test\&age=20 使用问号开头,键值是是哟个& 分割
特点 :数据明文显示在地址栏、历史记录、浏览器缓存上 ;长度收URL的限制,不能传大量的数据和文件;可以被书签保存、缓存记录参数 - POST :放在请求体(body)中,和URL分离
格式 :from表单格式name=test&age=20;JSON格式 {"name":"test","age=20"};还有二进制流等
特点:地址栏看不到参数,相对来说比较隐蔽;理论上无严格长度限制,适合传大数据、文件、复杂的JSON;不会放在缓存、书签提交数据。
- GET :是拼接在 URL 地址栏的尾部 ,是在请求行中,是请求行中的一部分。
- GET 请求同上建议设置成 幂等的,POST 无要求。
HTTP 标志文档中给的建议,但是只是建议,不是强制要求。
幂等:幂等就是,请求一定,得到的响应也是一定的。就是我这个传输的指令对应着一个固定的响应指令。 - GET 设置成幂等了,就可以允许 GET 请求的结果被缓存。
POST 由于不要求幂等,经常是不幂等的,就认为不能被缓存的。 - POST 比 GET 更安全
例如在登陆场景中,输入用户的账号和密码,GET,就会把账户和密码放到 url 和query string 中,就会显示在浏览器的地址中。
POST 传输会放在body 栏那里,虽然不会在浏览器地址栏中直接能看到 ,但是因为没有被加密,所以抓个包就能抓到账号和密码,他们都在数据包的传输数据中。 - GET 传输数据是由长度限制的。
因为 URL 的长度在很久之前是有限制的,URL 过长,传输的数据太多,可能就会被截断。现在没有这个限制,所以也会有很长的url的出现 - GET 只能传输文本,POST 可以传输二进制
GET 的url 只能放文本,可以把二进制通过 base64 转码成文本
但是GET也不是完全不能带body(但是有些客户端/服务器不支持)
POST就可以把数据放到 body 里面,
六、浏览器的缓存机制
浏览器 从服务器/通过网络加载网页 ,通常情况下,从网络加载数据比从硬盘加载还要慢 ,浏览器 为了加快访问页面的速度 ,就会把页面 上依托的一些静态资源(例如css、js、图片、字体、mp3...等等大数据)这些内容会存在硬盘上。只有第一次访问服务器会加载这么多东西,后续再访问就不需要重新加载。