目录
应用层是我们日常开发中最常用的一层,因为其他层:传输层、网络层、数据链路层、物理层这些都是操作系统和硬件、驱动已经实现好的,我们只能使用人家的。应用层我们可以使用别人已经创建好的协议(HTTP等),也可以自己定义应用层协议
自定义应用层协议要做的事情:
1、明确前后端交互的过程中,需要传递哪些信息
2、明确组织这些信息的格式,前后端要是同一种方式
网络通信常见的数据格式有:xml、JSON、yml
1、xml
采用成对的标签,类似于HTML,但是xml的标签可以自定义,例如 < userID > 1011< userID/>
2、JSON
采用键值对的形式,键和值使用冒号分开,例如 {"userID":1011,"username":"zhangsan"}
3、yml
强制了数据组织的格式,要求键值对必须占据一行
DNS
DNS是一个应用层协议,DNS就是域名解析系统。域名对应一个或者多个IP地址,或者多个域名对应一个IP地址。由于IP地址不方便记忆并且不能显示地址组织的名称和性质,人们设计出了域名,并通过域名系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串,把域名转换成IP地址,这样的系统就叫域名解析系统。
当某个电脑需要进行域名解析,直接会访问DNS服务器。全世界有非常多设备上网,一个服务器是顶不住的,所以有了镜像服务器。当服务器数据有变更,只需要修改基准的服务器(也叫根服务器),其他镜像服务器从根服务器中同步数据。
HTTP/HTTPS
HTTP全称:HyperTransferProtocol,超文本传输协议,这里的文本指的是字符串,而超文本是在文本的基础上的扩展,也就是说,HTTP不仅可以传输文本,也可以传输图片、音频等其他数据,HTTP是最广泛使用的应用层协议。HTTPS可以认为是HTTP的升级版,安全性比HTTP高。除了安全性外,其他部分都是一样的。HTTP是一问一答模型的协议,客户端发一个请求,服务器就返回一个响应。
HTTP应用场景:
1、使用浏览器,打开网页
2、打开手机App,加载相关的信息
3、服务器之间的调用,大概率也是使用的HTTP
现在HTTP已经更新至3.0版本,3.0基于UDP,但是我们最常使用的还是HTTP/1.1(基于TCP)
HTTP协议报文
在学习HTTP协议报文格式前,我们可以借助抓包工具,来了解HTTP请求响应的详细情况。
选择Fiddler进行抓包
选择Fiddler Classic
选择Try For Free
邮箱随便填一个,国家随便填一个,然后点击Download For Windows
打开软件后
点击Tools,然后点击Options
点击HTTPS,以上4个选项全部勾选,
工具的使用:
在使用前,先选中左边,ctrl+a+delete清除列表
然后再随便打开一个网页,在网页中点击刷新,这里拿CSDN网页举例
此时,会显示抓取到的数据报列表,双击CSDN的数据报列表
右上方部分是请求,右下方部分是响应
选择Raw,此时列出的是原始的HTTP请求
如果想要更清楚的观察,可以点击View in Notepad,在记事本中打开
但是响应的文本显示的是乱码,因为这里的数据是压缩后的二进制数据
此时点击如下按钮即可
很容易发现,响应其实就是HTML
HTTP协议的请求:
1)首行
http
GET https://www.csdn.net/ HTTP/1.1
GET表示HTTP请求的方法(method) ,中间部分是URL,表示访问的资源,HTTP/1.1指的是HTTP的版本是1.1版本
2)请求头(红框框)部分
请求头的每一行都是一个键值对,键和值用冒号分割。
3)空行(请求头的结束标记)
4)正文(body)
有的请求是没有body的,有的有body
如抓取gitee
HTTP请求的基本格式
HTTP协议的响应
1)首行
http
HTTP/1.1 200 OK
HTTP/1.1表示版本,200表示状态码,OK是状态码的描述
2)响应头
响应头的每一行也是一个键值对,键值对之间用冒号分割
3)空行
4)正文(body)
响应的正文通常是HTML、CSS、JS等
HTTP响应的基本格式:
URL
URL是唯一资源定位符,网络上的资源可以是一个网页、一个图片、一个文件
http
协议名://ip地址:端口号/带层次的路径/资源名称?查询字符串#片段标识符
协议方案名:指使用的是哪种协议
登录信息:进行身份认证,现在已经见不到了
服务器地址:要访问的资源的服务器地址,可以是IP也可以是域名
服务器端口号:IP是确定唯一的主机,端口号是确定主机上的程序,如果不写端口号,浏览器会根据协议类型,自动分配端口,如果是HTTP,端口号是80,如果是HTTPS,端口号是443
带层次的文件路径:确定服务器上的具体资源,
查询字符串:查询字符串是程序猿自定义的键值对结构,是针对访问的资源进行补充说明,键值对之间使用&分割,键和值之间使用=分割,等号两边不能有空格
片段标识符:标识页面中的某个部分,常见于文档类文件。例如某个文档网站中,点开目录,每个章节会对应一个片段标识符
URL encode:
查询字符串是键值对结果,但是它的值里面可能包含特殊符号,而URL中有的特殊符号是有重要意义的,如果值出现了特殊符号,在解析的时候可能会出现问题,所以需要转义,URL encode的作用就是把这些特殊意义的字符进行转义。
例如,在浏览器搜索c++,
此处把 + 字符转义成 %2B 了
转义规则:把要转义的字符或者汉字,每个字节以16进制的形式表示出来,然后给每个字节前面加上%
例如,在浏览器中搜索 你好,复制地址栏的URL
得到如下内容
https://cn.bing.com/search?q=%E4%BD%A0%E5%A5%BD&qs=n&form=QBRE&sp=-1&lq=0&pq=%E4%BD%A0%E5%A5%BD&sc=10-2&sk=&cvid=A7357277519D4F10A61D2542BB754587&ghsh=0&ghacc=0&ghpl=
根据utf编码查得你好这两个字的16进制编码
HTTP的方法
方法描述了HTTP请求的动作想要干什么,HTTP的方法如下
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0 、1.1 |
POST | 传输实体主体 | 1.0 、1.1 |
PUT | 传输文件 | 1.0 、1.1 |
HEAD | 获取报文首部 | 1.0 、1.1 |
DELETE | 删除文件 | 1.0 、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
常用的方法有GET、POST,重点掌握这两个
**GET:**直接在浏览器中输入一个URL,就会触发GET请求
打开Fiddler,在CSDN主页,按住Ctrl点击刷新,Fiddler会获取到如下的内容
这里说明了,访问一个网页并不是一个HTTP请求就能完成的,而是需要多个HTTP请求得到的结果。
上述带有csdn的都是这个页面触发的请求,其实就是css文件、JavaScript文件、图片文件、字体文件等,在你的浏览器第一次访问这个网页时,会把这些资源保存到你的电脑上,以后再访问的时候就不需要再次获取这些内容了,这个机制就叫浏览器缓存,这样的机制加快了页面展示速度,节省服务器宽度。直接点击刷新,是从缓存中读取数据,按住Ctrl再点刷新可以强制忽略缓存,重新从服务器读取数据。
POST
通常出现在登录、注册以及上传文件的场景
例如,登录Gitee的请求:
POST和GET的区别:
首先,这两个方法没有本质区别,POST能用的GET也能用,但是在使用习惯上有区别
1、语义不同:一般来说,GET用于表示从服务器获取数据,POST表示提交数据给服务器。
2、传递数据的方式不同:一般来说,GET传递数据,通过是通过query string,把自定义的数据提交给服务器;POST是通过body把自定义数据交给服务器。
3、GET方法对应的请求,通常设计成幂等的,POST方法对幂等性没有要求。幂等: 是其任意多次执行所产生的影响均与一次执行的影响相同,(牛今天吃草,今天挤出来的是奶,明天吃草明天挤出来的也是奶,结果非常稳定,就是幂等的,如果今天吃草今天挤出来的是史,那就是不幂等)。这个区别在今天不是非常合适了,实际开发中还是需要看具体的业务要求,但是http标准文档中建议这么做
4、GET如果设计成幂等性,此时GET的结果可以缓存,POST不设计成幂等性一般不会缓存
请求报头、响应报头(header)
header是键值对格式的,常见的报头:
1、Host:
表示服务器主机的地址和端口
2、Content-Length、Content-Type:
Length表示body中数据的长度,单位字节,Type表示body中数据的格式。如果请求、响应中没有body,也就没有这两个字段。HTTP是基于TCP的(1.1版本),TCP是面向字节流,存在粘包问题,有了Length、Type就能知道HTTP数据包从哪开始从哪结束。Content-Length和Content-Type在响应和请求中都会存在
常见的Content-Type的取值:
http
Content-Type:text/html;charset=utf8
http
Content-Type:text/css
http
Content-Type: application/javascript;charset=utf8
http
Content-Type: application/jason
3、User-Agent
例如:
http
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0
主要包含了操作系统信息(版本)和浏览器信息(版本),表述了你用的什么设备上网
4、Referer
描述了当前页面是从哪个页面跳转过来的,例如,在搜狗搜索主页中搜索哔哩哔哩,打开哔哩哔哩的主页
5、Cookie
Cookie也是键值对结构的,使用;分割键值对,使用=分割键和值,键值对的含义是程序员自定义的
Cookie是浏览器给网站提供的一种"客户端存储数据"的机制
浏览器禁止网页直接访问咱们的硬盘,但是浏览器允许网页通过键值对的方式存储数据,这样的键值对数据是浏览器负责存储到咱们的硬盘中,网页不能干涉。
浏览器在第一次访问某个网站时,浏览器中可能没有Cookie,服务器返回的响应会带有Set-Cookie,Cookie中的键值对就会写到浏览器中,浏览器收到Cookie就会存储到本地硬盘中。接下来浏览器访问网站时,就会带有Cookie
如何查看Cookie?
可以选择删除Cookie,删除之后本地存储的Cookie也会删除掉,在下一次访问这个网站时,服务器返回的响应会带有Set-Cookie,浏览器会根据这个重新存储Cookie。
总结:
Cookie是什么?
浏览器本地持久化存储数据的机制,按照键值对方式存储,键值对内容程序员可以自定义,按照域名为维度分别进行存储,每个网站都有自己的Cookie,互不影响。
Cookie从哪里来?
服务器返回的响应数据中会包含Set-Cookie字段。
Cookie到哪里去?
Cookie虽然会存储到本地,但是目的并不如此,存储好之后,后续浏览器再次访问同一个网站的服务器时,会把之前存储的Cookie带上,发送给服务器。为什么发回来还要再发回去?Cookie中的数据在客户端中需要使用到,在服务器这边也要使用到。
Cookie中存储的键值对是程序员自己定义的
Cookie经典使用场景:
总结:
常见的HTTP响应头属性:
- Content-Type: 指定返回的资源的MIME类型。
- Content-Length: 指定返回的资源的长度,单位是字节。
- Cache-Control: 控制响应的缓存行为。
- Connection: 控制持久连接。
- Date: 消息发出的时间。
- ETag: 资源的版本/修订号。
- Expires: 资源的过期时间。
- Last-Modified: 资源最后被修改的时间。
- Server: 服务器软件名称。
- Set-Cookie: 设置客户端的cookie。
- WWW-Authenticate: 用于HTTP认证。
- Access-Control-Allow-Origin: 跨域资源共享(CORS)策略。
- X-Frame-Options: 控制资源是否可以在iframe中显示。
- Content-Disposition: 控制内容的下载方式。
- Content-Encoding: 指定内容的编码格式。
- Content-Language: 指定内容的语言。
- Content-Security-Policy: 定义了网页的资源加载策略。
- Strict-Transport-Security: 告诉浏览器仅通过HTTPS连接。
- X-Content-Type-Options: 防止MIME类型混淆攻击。
- X-XSS-Protection: 启用浏览器的XSS过滤和阻断功能。
- Location: 用于重定向的URL。
- Retry-After: 告诉客户端在多长时间后再次发起请求。
- Vary: 告诉缓存服务器何时需要重新请求。
- Accept-Ranges: 指定服务器是否支持范围请求。
- Allow: 指定允许的HTTP方法。
- Cross-Origin-Embedder-Policy: 控制跨源嵌入策略。
- Cross-Origin-Opener-Policy: 控制跨源窗口行为。
- Cross-Origin-Resource-Policy: 控制跨源资源的加载策略。
常见的HTTP请求属性:
- Accept: 客户端能够处理的媒体类型。
- Accept-Language: 客户端能够接受的语言。
- Accept-Encoding: 客户端能够接受的编码格式。
- Authorization: 客户端发送的认证信息。
- Cache-Control: 客户端的缓存指令。
- Connection: 控制持久连接。
- Content-Length: 请求体的长度。
- Content-Type: 请求体的媒体类型。
- Cookie: 客户端发送的cookie信息。
- Host: 请求的服务器域名和端口。
- Origin: 请求的源。
- Referer: 请求的来源URL。
- User-Agent: 客户端的用户代理信息。
- X-Requested-With: 通常用于标识Ajax请求。
请求头用于向服务器提供额外的信息,以帮助服务器正确处理请求。
状态码
状态码表示访问一个页面请求是否成功,以及请求失败的原因
常见的状态码:
200 OK : 表示成功
404 Not Found :表示浏览器根据url访问的资源在服务器上没有找到,url的路径不对
403 Forbidden :访问被拒绝(没有权限)
405 Method Not Allowed :方法不支持
500 Internal Server Error :服务器内部错误,一般是服务器端代码出bug,抛出异常但是没有catch
504 Gateway Timeout :超时,响应没有在规定时间内返回
302 Found :重定向,访问A网站时会自动跳转到B网站,此时响应中返回的状态码就是302,并且在响应头中Location属性(包含B网站的地址)。浏览器收到302状态码后会自动跳转到Location中的网站。
构造HTTP请求
使用工具Postman,下载链接
点击next
这样就可以自己构造HTTP请求了
HTTPS
HTTP协议内容是以文本的形式明文传输,传输的数据容易被黑客、运营商劫持和篡改,HTTPS在HTTP的基础上,引入了加密机制,解决了上述的问题。
明文:传输的原始数据
密文:对明文进行加密后的数据
加密:明文-->密文
解密:密文-->明文
密钥:进行加密、解密的工具
对称加密:加密和解密都使用同一个密钥
非对称加密:使用一对密钥,使用A加密就使用B解密,使用B加密则使用A解密。这两个密钥一个公开一个私藏,公开的叫公钥,私藏的叫私钥。
关于HTTPS的工作过程:
这里只介绍加密过程,因为HTTPS是在HTTP基础上引入了加密机制,其他内容都是一样的。
未加密:客户端明文传输数据,很容易被黑客入侵,获取到请求的内容,并进行篡改
1、引入对称加密
一个服务器对应多个客户端,每个客户端的密钥都不同,要求每个客户端连上服务器的时候自己随机生成一个对称密钥,服务器拿到这个密钥才能进行解密,因此密钥也需要进行传输。
但是,密钥是明文传输的,黑客很容易获取到密钥。
2)引入非对称加密:
通过非对称加密,对要传输的密钥进行加密,而传输的数据还是使用对称加密。
上述流程看似安全,实则存在缺陷
3)引入证书
问题的关键是,能让客户端辨别出拿到的公钥是不是正确的。如何证明公钥是正确的?引入第三方公证机构,想搭建服务器,使用HTTPS,就需要在公证机构申请证书。申请证书时就要向机构提供信息:网站的域名,备案号,公钥等,公证机构根据这些信息生成一个证书(电子版),证书的内容包含了证书发布机构、证书有效期、公钥、证书所有者、签名等。签名则是保证证书合法性的重要内容。
服务器申请到证书后,后续客户端从服务器拿公钥,就不是拿公钥,而是拿整个证书。客户端可以根据证书的签名来验证证书的合法性。
签名的生成:校验和+加密,把证书中的所有字段综合在一起计算校验和,然后公证机构生成一对公钥私钥,公证机构持有私钥,公钥分发给客户端,公证机构拿着私钥对校验和进行加密得到数字签名。数字签名其实就是加密后的校验和。
客户端验证数字签名:
1、客户端把证书中各个字段再计算一次校验和,得到checksum1
2、客户端使用公证机构发的公钥对数字签名进行解密得到checksum2
3、比较,如果checksum1==checksum2证明当前证书和服务器发出的证书是一样的,如果checksum1!=checksum2,说明证书的内容被黑客篡改过。
客户端手里的公证机构的公钥是操作系统内置的,而不是通过网络获取的,所以不存在公证机构的公钥是黑客伪造的。
另外黑客不能做到:篡改数据后,让数字签名解密出来的checksum1和篡改后的checksum2相等,因为黑客篡改数据后需要使用公证机构的私钥来加密。如果黑客自己生成一个私钥,这时客户端拿着公证机构的公钥,也解密不了。
总结:HTTPS工作流程
1、引入对称加密
2、传输对称密钥
3、对 对称密钥进行加密,引入非对称加密
4、中间人攻击
5、引入证书,解决中间人攻击