HTTP处于TCP/IP五层协议栈的应用层

HTTP/1,HTTP/2是基于TCP的,HTTP/3是基于UDP的

和UDP,TCP不一样(他俩是二进制的协议),HTTP是一个文本格式的协议,不需要理解具体的二进制位,只需理解文本的格式即可

我们怎样才能看到HTTP的报文格式呢?-------->利用"抓包工具"来获取到具体的HTTP交互过程中的请求和响应。请求和响应都是要路过代理的,因此代理就能获取到请求和响应的详细内容

解释一下抓包工具----->它是一个第三方的程序,在网络通信过程中类似于"代理"这样一个角色。就比如说我妹想吃薯片,她让我去超市帮她买一包,那么我就是代理

当前课堂上我们用抓包工具是Fiddler(他是一个专门抓HTTP的抓包工具)


下面讲一下HTTP请求

举个例子:

下面对HTTP请求做一个详细的解释

1.关于URL

(1)URL的基本格式:

(2)URL encode

当query string中包含了特殊字符(比如/ : ? & =等),就需要对特殊字符进行转义,这个转义的过程就叫做URL encode。

URL encode的规则就是把要转义的内容的ascii码(二进制值)取出来,然后用十六进制表示,同时加上%

举个例子:

在实际开发中前后端交互的时候,尤其是需要通过URL给服务器传递一些信息的时候,一定要针对里面的特殊符号(不仅仅是标点符号,还有中文字符)进行URL encode

反之,把转义后的内容还原回来就叫做URL decode

2.方法

(1)GET方法

在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求.
另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.
使用 JS 中的 ajax 也能构造 GET 请求

(2)POST方法

多用于提交用户输入的数据给服务器(例如登陆页面).
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JS 的 ajax 也可以构造 POST 请求

(3)其他方法

这些方法的 HTTP 请求可以使用 ajax 来构造. (也可以通过一些第三方工具)

我们需要浅浅的知道一下:HTTP最初引入这些方法是为了表示不同的语义 ,想让程序员按照HTTP语义来使用各种方法。--------------->但是现在大家使用这些方法的时候都不怎么考虑语义的事情了,因此HTTP方法之间的界限就变得模糊了,比如GET也可以给服务器送东西,POST也可以给服务器拿东西


这里有一道面试题哦!前方高能预警!!!!

回答:


继续说哈

上面介绍完方法下面继续介绍报头(header)

3.报头(header)

下面介绍几个请求报头中常见的key

(1)Host:表示服务器主机的地址和端口

(2)Content-Length:表示 body 中的数据长度

(3)Content-Type:表示请求的 body 中的数据格式

我们上面也说了HTTP是基于TCP的协议,TCP是一个面向字节流的协议,我们之前有讲过粘包问题(合理设计应用层协议,来明确包和包之间的边界)

HTTP中对于边界的划分也有所体现,HTTP中时使用分隔符和使用长度来进行划分边界---------->如果当前有若干个GET请求,到了TCP接收缓冲区中,应用程序读取请求的时候就以空行为分隔符 ;如果当前是有若干个POST请求,到了TCP缓冲区中,这儿时候空行后面还有body,当应用程序读到空行之后,就需要按照Content-Length表明的长度,继续读若干长度的数据

(4)User-Agent (简称 UA):表示当前用户使用什么样的东西来上网(显示的是操作系统信息+浏览器信息)

举个例子:

关于User-Agent以前和现在的用处做一个小了解:

User-Agent以前是用于对于不同浏览器的信息作出区分的。什么意思呢?以前由于浏览器发展很快,导致市场被严重割裂了,一部分用户用的是比较老的浏览器,一部分用户用的是比较新的浏览器,为了解决这个问题,我们就想出来,让浏览器发送的请求来个自报家门,服务器就可以根据浏览器中的自报家门的信息,对于不同浏览器版本的用户,做出区分

现在主流浏览器的功能差别很小,就用不到User-Agent了,User-Agent的新用处是用来区分是PC端还是手机端。服务器可以根据User-Agent来区分如果是手机端就返回手机版的网页,如果是PC端(电脑)就返回电脑版的网页

(5)Referer:表示这个页面是从哪个页面跳转过来的

如果直接在浏览器中输入URL, 或者直接通过收藏夹访问页面时是没有 Referer 的

我们来简单的举一个例子来介绍Referer可以用在什么地方吧:

我们经常在网页上会看到一些广告的投放,只要用户点击了这条广告信息,就会触发计费,广告主就要给为广告主打广告的平台钱。一个广告主可能在多个平台投放广告,广告主可以通过Referer来区分当前的请求是哪个平台导入过来的流量

(6)Cookie

浏览器为了安全,默认情况下是不能让页面的js访问到用户电脑上的文件系统的。

但是这样的安全限制也带来了一些麻烦,有时候确实又需要让页面持久化存储一些数据,方便后续访问网站(其中最典型的就是需要存储用户当前的身份信息------->当用户在登录页面完成身份验证之后,此时服务器就会给浏览器返回一个用户的身份信息,浏览器把这个信息就保存到了一个特定的位置上,后续再访问同一个网站的其他页面的时候,浏览器再自动的带上这个身份信息,服务器就能识别了)

那么怎么办呢?-------->虽然不能让页面的js访问你的整个磁盘数据,但是我们可以单独给浏览器开辟一个空间,把需要的文件拷贝到这个空间,只给这个空间权限

这个单独开辟出来的空间有多种不同的形式,其中Cookie是一种比较经典且古老的形式

那么我们下面就具体了解下Cookie~

Cookie具体的组织形式:

1.先按照域名来组织,针对每个域名分别分配一个空间(比如我访问搜狗,浏览器就会给sogou这个域名记录一组Cookie;我访问码云,浏览器就会给码云也记录一组cookie)

2.一个空间里面又会按照键值对的方式来组织数据

Cookie数据是从服务器返回给客户端的

我们用生活中的场景举个例子,便于理解:

Cookie里面保存身份信息就类似于去医院看病。去医院要先挂号,在挂号处除了要交钱以外,人家还会给你一个就诊卡,给你就诊卡的时候,工作人员会问你要你的具体信息(名字、身份证号码、电话号码...),后续看病的过程中,这个就诊卡就起到了至关重要的作用。到了诊室,医生先要刷一下你的就诊卡,刷卡就是在获取你的身份信息,身份信息里除了基本信息外,还有过往病例。经过一番诊断,医生给你开了一些单子,然后你就去检验科抽血化验,做血常规,还是拿着就诊卡一刷,就能获取到你的基本信息和刚才医生给开的具体的化验内容......在上述过程之中,你手里的就诊卡就是Cookie

虽然就诊卡上可以存储一些信息,带是保存的数据是有限的。真正保存你的这些信息的并不是就诊卡,而是医院的服务器。而卡上只需要存储你的身份标识(存一个用户id)。毕竟你把数据放到就诊卡上容易丢,还是存在服务器上比较靠谱。那么这些关键信息,存储在服务器上,我们管存这些关键信息的东西叫做“session”(会话)。服务器里管理着很多的session,每个session里面都存储了用户的关键信息(基本信息,要做的检查,以往病例...),每个session也有一个sessionId(会话的标识),就诊卡上存储的就是这个会话的Id

Cookie是浏览器提供的一个持久化存储数据的机制,Cookie最重要的应用场景就是存储会话Id,进一步的让访问服务器后续页面的时候能够带上这个Id,从而让服务器能知道当前的用户信息(服务器上保存用户信息的机制就是Session会话)


下面我们来说下HTTP响应

举个例子: 

下面具体说下HTTP响应中的状态码

归纳一下:


我们可以通过代码构造HTTP请求(可以去码云上看5.12的代码示例)

一.基于HTML/JS

1.基于form表单构造HTTP请求

(1)form 发送 GET 请求

(2)form 发送 POST请求

我们能够看到:form 发送GET请求和POST请求主要区别是--------->

2.基于ajax构造HTTP请求

使用form一定会涉及到“页面跳转”(浏览器需要加载出全新页面)

随着前端页面越来越复杂,就希望能够让页面不去整个全部加载,而是只加载其中需要变化的某个小部分,这种时候就可以使用ajax了

通过js代码来构造出HTTP请求,再通过js代码来处理这里的响应,并且把得到的一些数据更新到页面上

我们举一个例子来看下同步等待(这里的同步和加锁那里说的同步不是一个同步)和异步等待 

同步等待分为两种:1.同步阻塞等待2.同步非阻塞等待

ajax所使用的等待方式就是异步等待:

首先构造出一个HTTP请求,发给服务器。但是浏览器不确定服务器什么时候才有响应,于是就先不管了,浏览器里面就继续执行其他代码(该干啥干啥),等到服务器的响应回来之后,再由浏览器通知咱们对应的JS代码,以回调函数的方式来处理响应

下面我们基于jQuery中的ajax来演示相关代码:

首先:

然后创建一个本地html文件

 ajax不仅仅支持GET和POST,也支持PUT,DELETE等其他方法

jQuery ajax - ajax() 方法

完成上述操作之后打开浏览器发现是一个"出错"的请求,出现这个报错的原因是浏览器禁止ajax进行跨域访问(跨越多个域名/服务器) ,当前页面处在的服务器是本地文件,页面中ajax请求的URL域名是www.sogou.com。只有说当前页面处在的服务器就是在www.sogou.com中,页面再通过ajax请求URL,域名为www.sogou.com这种才不算跨域。因此当前咱们构造的ajax请求是无法被正确处理的,只有我们自己有一个服务器,让页面和ajax的地址都是这个服务器就行了

二.基于Java

基于socket(这种方案是完全可行的,但是实际开发中用的不如上面的方式多)

​​​java构造一个HTTP请求主要就基于TCP socket,按照HTTP请求的报文格式,构造出一个匹配的字符串,再写入socket即可。在实际开发中确实也会有一些基于java构造http请求的情况,可以直接基于第三方库实现,不一定非得是直接使用socket

到此HTTP讲完


下面我们来讲HTTPS

之前的HTTP是明文传输,传输的数据容易被获取,也容易被篡改

HTTPS就是在HTTP的基础上引入了加密机制,这个加密机制主要是为了防止被篡改而不是为了防止被窃取

HTTPS中引入的加密层称为SSL/TLS

在SSL中涉及到的加密操作主要有两种方式:

1.对称加密:使用同一个密钥,既可以进行加密,又可以进行解密

我们需要知道对称加密的方式,客户端和服务器持有同一个密钥,客户端传输的数据通过这个密钥进行对称加密,服务器收到密文后,根据密钥来进行解密,拿到明文

因为一个服务器是可以对应多个客户端的,因此不同的客户端需要用不同的密钥,同时这个服务器需要记住和每个客户端相对应的密钥,而且得让每个客户端和服务器之间都能传递这个对应的密钥。那么每个客户端和服务器相对应的这个密钥,要么是客户端主动生成的,然后通过网络进行传递告诉服务器;要么是服务器生成的,通过网络进行传递告诉客户端

那么知道了这个前情提要,我们来看一个例子:

这个图里是假设客户端生成的密钥,客户端需要把密钥通过网络告诉服务器。但是设备有可能早就被黑客入侵了,密钥是什么,如果像这样明文传输(咱俩密钥是888888),也就很容易被黑客入侵,如果黑客知道了你的密钥,后面不管怎么加密,都是形同虚设了

​​​​​​​到这里我们就知道了,使用对称加密最大的问题在于密钥得能够传递过去,如果明文传递是不行的,必须针对这个密钥进行加密。那么解决问题的关键就是,需要引入非对称加密~

2.非对称加密

非对称加密有两个密钥,分别叫做公钥和私钥,公钥就是人人都能获取到,私钥就是只有自己才知道。使用公钥加密,使用私钥解密(或者使用私钥加密,使用公钥解密)

基于非对称加密,就可以让服务器自己生成一对公钥和私钥,公钥发出去,私钥自己保存。客户端生成一个对称密钥,客户端就可以使用服务器的公钥,对对称密钥进行加密,然后把数据给服务器,服务器再通过私钥进行解密

就像下图这样

看似安全了,黑客入侵不了了是不是?实则不然,因为服务器要把自己的公钥返回给客户端,在这个操作中就会涉及到一个非常经典的"中间人攻击"

我们来看看什么是"中间人攻击":

中间人攻击的关键就是黑客自己也生成一对公钥私钥,拦截到服务器给客户端返回的公钥,用自己生成的公钥替换之。然后等客户端返回对称密钥的密文后,由于这个密文使用的是public key2来进行加密,因此黑客就可以使用private key2来进行解密,黑客就拿到了对称密钥888888,紧接着黑客为了隐藏自己,把888888再使用之前从服务器拿到的public key进行加密,得到另一个密文发给服务器

既然存在"中间人攻击",那么如何解决这个问题呢?

关键要点就是让客户端能够确认当前的公钥确实是来自服务器,而不是由黑客伪造的

解决办法就是:引入一个第三方公信机构,来证明这个公钥是一个合法的公钥

到此非对称加密我们就讲完了

当然哈,实际上现实中不会每次都访问这个公信机构来求证,这样太麻烦了,客户端自身会包含一些公信机构的信息(内置在操作系统里),不需要通过服务器网络请求,直接本地就能进行认证

以上描述的东西都是包含在SSL中的。不过SSL不仅是应用于HTTPS,很多地方也会用到SSL的哟~

​​​​​​​

JAVAEE---HTTP协议+HTTPS相关推荐

  1. SSL协议(HTTPS) 握手、工作流程详解(双向HTTPS流程)

    SSL协议的工作流程: 服务器认证阶段:1)客户端向服务器发送一个开始信息"Hello"以便开始一个新的会话连接:2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器 ...

  2. HTTP协议SSL协议HTTPS协议

    文章目录 1.HTTP协议 1.1.HTTP 简介 1.2.HTTP 消息结构 1.3.HTTP 请求方法 1.4.HTTP 响应头信息 1.5.HTTP 状态码 1.6.HTTP协议的优点与缺点 2 ...

  3. asp.net 无法获取客户端请求的真实协议https

    问题: a) 客户端请求的是https,但服务端Request.Url获取的却是http: b) 负载均衡连接协议服务端与客户端协议不一致. 有时候我们需要获取或拼接连接,但是可能会出现客户端使用ht ...

  4. 网络协议-HTTPS(笔记)

    HTTPS ◼ HTTPS(HyperText Transfer Protocol Secure),译为:超文本传输安全协议 常称为HTTP over TLS.HTTP over SSL.HTTP ...

  5. 互联网协议 — HTTPS 安全的超文本传输协议

    目录 文章目录 目录 为什么需要 HTTPS HTTPS HTTPS 单向认证 HTTPS 双向认证 为什么需要 HTTPS 保护隐私(Privacy):所有信息都是加密传播,第三方无法窃听数据.如果 ...

  6. JavaEE——HTTP协议

    前端的知识伴随着博客系统这个项目的完结而告一段落,在接下来的博客中,将详细介绍如何将前后端连接起来,使得我们的博客系统更加牛逼 HTTP协议 是应用层中最典型的协议,供浏览器和服务器,手机和杜武器,服 ...

  7. 网络协议 -- HTTPS(2)数字签名与数字证书

    一.数字签名 数字签名(英文:Digital Signature)类似于我们写在纸上的手写签名,它的诞生主要是为了解决如下问题: 1. 证明该文件(或信息)是由你发送的. 2. 证明该文件(或信息)没 ...

  8. SSL协议、HTTP和HTTPS和区别

    SSL协议 SLL协议的握手过程 开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake). 第一步,客户端给出协议版本号.一个客户端生成的随机数(Clien ...

  9. HTTP协议和HTTPS协议初探

    概况 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程. HTTP是 ...

最新文章

  1. 2020年度“社区之星”出炉!原来社区里的技术大佬们是这样成长起来的!
  2. 费氏搜寻法之算法分析与实现
  3. MySQL用户及权限管理
  4. python数据结构的应用场景不包括,Python 数据结构学习
  5. 从Qt4 迁移到Qt5 winEvent代替为nativeEvent
  6. 【BZOJ2337】XOR和路径,概率期望DP+高斯消元
  7. 人类社会发明的第一台计算机是什么,第二周第一课概述计算机
  8. 安装scrapy报错
  9. Tor源码 -- 启动模块
  10. IDC发布最新中国AI云服务市场报告,百度智能云连续三次排名第一
  11. WinCC 中批量绑定变量
  12. MariaDB 10.6.10离线安装
  13. 人民网:《百度公布博客服务商前十强 MSN博客超过本土博客》
  14. 厦大C语言上机 1394 抛硬币
  15. 会玩计算机游戏英语,英语口语表达:他整天就只会玩计算机游戏
  16. iOS 15Beta5版本更新变化,这些细节你发现了吗?
  17. 计算机组成原理1(现代计算机细分组成框图)
  18. 韩国MBC、KBS、SBS
  19. 测试相机的软件叫什么,拍照查花软件叫什么 三款识花神器App评测
  20. linux下keytool生成证书_使用keytool 生成证书

热门文章

  1. 施工安全技术交底_安全施工技术
  2. kylin focal fossa ubuntu20.04安装 cuda cudnn lib
  3. CESM2.1.3移植 XML文件的填写
  4. Unity 3D开发--Shader入门基础
  5. 【D3D11游戏编程】学习笔记九:编译Effect的方法
  6. 笔记本支架选购需要考虑的四大要素
  7. 可以设置彩虹头像了,来试试吧
  8. springboot 多线程实现
  9. jmeter+exexl实现接口自动化
  10. Android 获取SIM卡手机号