网络中应用层协议

一:基础概念:

(一)应用层的功能/职责

应用层负责程序之间的数据沟通–而应用程序是程序员写的,所以应用层协议也是程序员自己制定的,通常应用层协议分为自定制协议(自己定义的协议)与知名协议(HTTP/HTTPS/DNS…)

(二)超文本文件

WWW上的每个网页都对应一个文件。我们浏览一个页面,要先把页面所对应的文件从提供这个文件的计算机里,通过Internet传送到我们自己的计算机中,再由WWW浏览器翻译成为我们见到的有文字、有图形甚至有声音的页面。这些页面对应的文件不再是普通的“文本文件”,文件中除包含文字信息外,还包括了一些具体的链接。这些包含链接的文件被称为超文本文件

和普通文本相比,超文本文件中多了一些对文件内容的注释,这些注释表明了当前文字显示的位置、颜色等信息,更重要的是,在有些注释中包含了对用户计算机应做出何种反应的说明,这些注释的内容经过浏览器的翻译后就成了不同的操作

为了使各种不同类型的WWW服务器都能正确地认识和执行,超文本文件要遵从一个严格的标准,这个标准就是超文本标识语言(HTML),我们也可以利用这种语言来编写超文本文件,在Internet上制作自己的WWW的主页。

(三)URL

URL称为统一资源定位符是用来表示从因特网上得到的资源位置和访问这些资源的方法。

URL给资源的位置提供了一种抽象的识别方法并用这种方法给资源定位,只要能够定位,系统就可以对资源进行各种操作,如存取,更新,替换和查找其属性。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置有以及浏览器应该怎么处理它。

  1. URL与URI的区别
    URI表示 统一资源标识符,标识某一个互联网的资源,URL是URI的子集。
    URL是URI的一种具体表现形式
    URL就是用定位的方式实现URI,不仅唯一标识资源,而且还提供了定位该资源的信息。

(四)长链接与短链接

  1. 长连接: 浏览器服务器建立连接后,如果两次以上的请求复用同一个TCP连接,则称为长连接,即连接一次后可以进行多次数据交互。

  2. 短连接: 如果浏览器发送一次请求报文,服务器回复一次应答就断开连接,下次交互再重新进行三次握手建立连接,那么就称为短连接。

因为长链接中减少了同步报文,可以使服务器响应速度变快

二:应用层协议:

(一):自己定制的协议

网络版计算器:
客户端向服务端传递两个数字以及一个运算符,服务端收到数据后进行解析得到数字与运算符,然后进行计算,把结果返回给客户端 int num1 = 10;int num2 = 20; char op = ‘+’
客户端需要将多个数据对象进行格式组织,然后通过网络数据传输,传递给服务端
1.将三个数据对象组织成一个字符串:”10;20;+”
2.将三个数据对象在内存中进行二进制的排列:定义9个字节的空间,前4个字节放第一个数字,中间4个字节放第二个数字,最后一个字节放运算符 — 如何实现数据在内存中的组织排布呢? ---- 结构体
Typedef struct_tmp_t{
Int num1;
Int num2;
Char op;
}
序列化:将数据对象按照指定协议进行组织成可持久化存储/数据传输的二进制数据串
反序列化:将持久化存储/数据传输的二进制数据串按照指定协议解析出各个数据对象
常见的数据序列化方式有很多:json序列化;protobuf序列化
1.自定制协议的思路
2.序列化/反序列化的概念
使用结构体组织数据其实就是数据对象的二进制序列化

(二):知名协议DNS

DNS:域名系统—用于域名解析,通过域名获取IP地址的系统
域名:www.baidu.com — 服务器的名称,方便记忆
域名服务器:采用分布式存储,域名解析服务器遍布世界各地、进行了层级划分,增加了容灾能力,并且提高了性能压力
域名服务器的层级划分:根域名服务器,顶级域名服务器,二级域名服务器,三级域名服务器
域名
在这里插入图片描述

域名的解析流程:
Zhidao.baidu.com
1.查看浏览器缓存
2.解析hosts文件
3.向本地dns服务器发送请求
4.请求根域名服务器
5.请求顶级域名服务器
6.请求二级域名服务器
7.请求三级域名服务器
在第3步没找到时,就从第4步开始可以进行递归或者迭代的请求
域名的划分:顶级域名(.com/.org/.cn/.jp),二级域名(.baidu.com),三级域名(.zhidao.baidu.com)

浏览器中输入www.baidu.com发生了什么?

  1. 域名解析,得到服务器IP地址
  2. 组织http请求数据
  3. 搭建tcp客户端,请求建立连接,发送http请求数据
  4. 等待服务器响应,进行解析(根据content-type判断是什么类型的数据,是否展示在页面上,如果是html类型,就要对其进行渲染),解析后将正文数据展示在浏览器上

1 . DNS解析是一种查询服务,查询要求的是速度,而不是精准度,所以用UDP。
2 . DNS大多数的名字都在本地进行解析,仅少量解析需要在因特网上通信,因此DNS系统的效率很高。

(三):知名协议HTTP与HTTPS

1.HTTP

用一句话总结,HTTP就是用来规范web服务器与浏览器客户端之间传输超文本文件的一个协议,它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等,使用的是80号端口

http协议有一个非常好的优点:http协议给程序员留有一定的自定制空间

浏览器与Web服务器在应用层通信使用 HTTP协议。HTTP协议在传输层使用的是TCP协议,所以:

  1. 浏览器需要和Web服务器三次握手建立连接:连接建立成功后才可以发送HTTP请求报文,服务器收到请求报文后,向浏览器回复HTTP应答报文。
  2. 浏览器向服务器发送连接前,需要得到服务器的IP及端口:用户在浏览器中通常只输入网址(网站域名),浏览器会通过DNS服务查询获取到的服务器的IP地址,对于端口来讲,使用HTTP协议的程序一般默认使用80端口。

网址:统一资源定位符(定位网络中唯一一份资源) – URL
统一资源定位符如何定位网络中唯一的资源? — URL的格式以及所包含的要素如下图:
在这里插入图片描述
URL主要的信息就是请求的资源路径以及提交的查询字符串

为什么要进行URL编码:
用户提交给服务器的查询字符串中的val需要进行URL编码–因为URL中有很多特殊字符具有特殊的含义,如果用户提交的数据中也有相同的特殊字符,就会造成歧义,因此需要对val进行URL编码操作

URL编码规则:
URL编码:将特殊字符(中文也是特殊字符)的每一个字节都转换成为16进制数字的字符:如 ‘+’ 转换为 2b;万一要是用户本身提交的数据就与2b,也会造成歧义;因此对每个字节进行转换之后,需要在前边加上一个%表示紧跟其后的两个字符经过了url编码 ‘+’ 转换为 %2b,C++转换程 C%2b%2b

URL解码规则:
URL解码:得到查询字符串之后,在val中若遇到%,则认为紧跟其后的两个字符需要解码–将两个字符转换为数字%2b -> 2 11 ,2*16+11 = 43即 ‘+’的ASCII值

抓包工具:
HTTP的抓包工具,在LINUX下自带有tcpdump,在windows可以用Fiddler工具来进行抓包
Fiddler是一个浏览器抓包工具,抓取浏览器与服务器之间的通信数据

Fiddler的原理以及如何使用如下图:
在这里插入图片描述

HTTP的通信过程:
在这里插入图片描述
过程的文字描述:

  1. 输入域名,例如百度的网址,客户端先通过本地DNS服务器获取百度服务器的IP地址,端口号默认80.
  2. 得到IP和端口号,通过connect和服务端进行三次握手建立连接。
  3. 连接建立成功后,浏览器向服务器发送HTTP请求报文,即想要获取的网页信息如百度首页
  4. 服务器根据请求返回应答报文和应答数据
  5. 客户端收到后浏览器通过渲染得到网页画面

1.1HTTP的特点

  1. 无状态
    无状态的含义:是每一次HTTP请求是没有联系的,当客户端一次HTTP请求完成过后,再一次请求,HTTP并不知道当前客户端是一个老用户。也就是说一个浏览器的连续两次网页请求之间没有任何关联,它们将被Web服务器独立处理。

    无状态会带来很多问题,比如你在京东网站第一个页面选择购买商品,跳转到第二个页面进行支付,这个时候服务器无法显示信息,因为它认为这两个页面是独立的,所以需要使用机制,让服务器知道始终是一个客户端在访问。

    解决这个问题的办法就是使用Cookie/Session:
    (1) Cookie:在客户端内存中开辟一块内存,即给每一个客户端设置一个标识符,第一次进行页面请求时,设置Cookie,下一次访问就不用再次进行页面请求了。Cookie保存在客户端浏览器上,用来确定身份;
    (2)Session:当访问服务器某个页面时,在服务器开辟一块内存,这块内存就是Session,记录了当前客户端的信息,同一个session就被认为是一个客户端。
    Session 是保存在服务器端上会存在一段时间才会消失,如果 Session 过多会增加服务器的压力。

  2. 无连接:
    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
    可以用keep-alive长链接来解决

  3. 简单快速:
    客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

  4. 灵活:
    HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。

1.2HTTP请求报文

HTTP请求报文结构:
在这里插入图片描述

  1. 请求行:请求方法 URL 协议的版本 Get /index.html HTTP/1.1

(一)请求方法:不同的请求方法具有不同的负责功能
GET:请求获取一个资源,并要求服务器返回实体的正文数据,GET是没有正文的
POST:向服务器提交表单数据
HEAD:请求获取一个资源,并不要求服务器返回实体数据,只要头部信息
GET/POST的区别:get也能向服务器提交数据,但是提交的数据是在URL中的查询字符串/而POST提交的数据是在正文中,GET提交数据是不太安全的,因为URL是暴露的,并且URL的长度是有限制的
DELETE:请求服务器删除指定资源

(二)URL:主要信息就是请求的资源路径以及提交的查询字符串

(三)协议版本: HTTP 0.9/1.0/1.1/2
0.9中默认只支持一个GET请求方法并且是短连接,http在传输层使用TCP协议,短连接指的是发送一个请求,得到一个响应这个来回结束后就断开连接
1.0支持了GET/HEAD/POST请求方法,并且支持长连接,默认的还是短链接
1.1支持了更多的请求方法,并且新增了更多的特性,比如默认支持长连接,并且支持管线化传输
2.0以前都是客户端主动向服务器发送请求,2.0中支持服务端向客户端主动推送消息

浏览器向服务器HTTP请求报文示例:
在这里插入图片描述
HTTP的常见请求方法:

请求方法请求方法的含义
GET申请获取资源,而不对服务器产生任何其他影响
HEAD和GET方法类似,不过仅要求服务器返回头部信息,而不需要传输任何实际内容
POST客户端向服务器提交数据的方法,这种方法会影响服务器,服务器可能根据收到的数据动态创建新的资源,也可能更新原有的资源
PUT上传某个资源
DELETE删除某个资源

1.3HTTP响应报文

HTTP响应报文结构:

在这里插入图片描述
HTTP响应报文:

  1. 状态行:HTTP 协议版本、状态码、状态信息 HTTP/1.1 200 OK。
  2. 头部字段:其表示方法和 HTTP 请求中的头部字段的相同
  3. 实体主体:一般不使用

(一)响应首行:包含三大信息,以空格进行间隔,以\r\n作为结尾,协议版本 响应状态码 状态码描述\r\n

(二)响应状态码:向客户端反应本次请求的处理结果状态–包含五大类型:1xx,2xx,3xx,4xx,5xx
1xx:一些描述信息
2xx:本次请求正确处理完毕,200表示请求成功
3xx:重定向,本次请求的资源可能移动到其他位置,请客户端重新请求新的位置,301,302,303–查看其他地址
4xx:客户端错误,400客户端请求语法错误/404访问资源不存在
5xx:服务端错误,500服务器内部错误,501服务器不支持请求的功能
(三)状态码描述:对于本次状态码的描述信息

服务器对浏览器的响应示例:
在这里插入图片描述
HTTP响应状态码:

状态类型状态码状态码含义
1XX100 Continue服务器端收到了客户端发送的请求行与头部信息,并要求客户端继续发送
2XX200 OK请求成功
3XX301资源被转移,请求被重定位
4XX404 NotFound请求资源不存在
5XX500服务器端出错

1.4请求报文与响应报文的其他部分

  1. 头部:针对本次请求/响应的一些键值对信息,每个键值对都用\r\n隔开,如Content-Lenth:xx\r\nContent-Type:xx\r\nLocation:xx

    1. Connection:描述当前连接是否是长连接 close/kepp-alive
    2. Content-Length:描述当前正文数据的长度(通过这个描述信息告诉对方本次请求应该接收多长的数据)
    3. Content-Type:描述了正文的类型—告诉对方应该怎么处理正文
    4. Referer:告诉服务器,本次请求是从哪个网页点击请求过来的
    5. Location:http://123.207.58.25/ 用来搭配3xx使用,通过描述的地址信息告诉客户端重新去请求指定的这个地址
    6. Cookie/Set-Cookie:因为HTTP协议是一个无状态协议,例如网上购物:http是一个短链接,买个硬盘要登陆一次,买个键盘又要登陆一次
      服务端为每一个登陆的客户端在服务端主机上创建一个session(会话);会话中描述了客户端的各种信息;将session保存在数据库中,通过Set-Cookie将sessionid以及重要的信息返回给客户端;客户端将其中的信息保存在Cookie文件中,下次请求服务端的时候会自动从cookie文件中读取信息,通过cookie传递给服务端
    7. Cookie与Session的区别:
      Session是服务端为每一个客户端单独创建的一个会话,会保留有客户端的认证等信息,保存在服务端
      Cookie是服务端通过Set-Cookie响应给客户端的信息,保存在客户端,下次请求服务器的时候会携带有Cookie信息
  2. 空行:用来间隔头部与正文

  3. 正文:可选的消息体,在请求报文中一般不使用这个字段,在响应报文中也可能没有这个字段。如果消息体非空,则 HTTP 请求的头部字段必须包含该消息体长度的字段 Content-Length。

1.5补充

网址的元素:协议方案名称://用户名:密码@服务器IP地址:端口/资源路径?查询字符串#片段标识符 — 用户名和密码使用的比较少因为容易泄露隐私
服务器端口:http默认使用80,https默认使用443端口
GET和HEAD的区别:是否要服务器响应正文
GET和POST的区别:发送的请求是否可以有正文;POST提交的数据在正文中,GET提交的数据在URL的查询字符串中(安全性/长度限制)
HTTP 1.1版本支持管线化传输 – 什么叫管线化传输?

通常接受http数据的时候的流程:
1.接收完整的http头部—接收数据直到\r\n\r\n的时候,认为头部到此结束
2.解析头部,根据头部中的Content-Length决定,正文应该接收多长,接收多少长度的相应
正文:客户端提交给服务端的数据/服务端要给客户端发送的数据

2.HTTPS

HTTPS协议:其实就是加密后的HTTP协议;443端口

HTTPS主要作用是:

  1. 对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
  2. 对网站服务器进行真实身份认证。

HTTPS到底是如何进行加密传输的:通过ssl加密实现–非对称加密算法/对称加密算法 + 签名证书
数据直接在网络中传输很容易被劫持修改,造成很大的安全隐患 – 对传输过程进行传输加密

Https:将非对称加密和对称加密结合起来:将客户端与服务端进行动态协商对称加密算法的过程使用非对称加密进行保护起来,然后使用协商后的对称加密算法,对数据通信过程进行加密,这样既保证了安全,也保证了效率。
但是若中间黑客劫持了公钥数据,然后将自己的公钥发送给客户端
所以有个签名证书(CA):进行身份认证并且传输公钥信息
一个公司生成一对密钥之后,拿着密钥去权威机构掏钱生成一个签名证书,证书中包含:公钥信息,权威机构信息,当前公司机构的信息,有效时间…
签名证书的作用就是防止黑客中间劫持了公钥数据,然后将自己的公钥发送给客户端

2.1对称加密与非对称加密

  1. 对称加密算法:如何加密就如何解密—加密算法和解密算法是一样的
    对称加密算法的优点:加密解密的效率比较高;缺点:容易被破解,使用时间长了就会被中间劫持,根据数据规律破解出加密算法,然后就可以解密数据
    缺点的解决方案:最好每次通信都动态协商一个新的加密算法

  2. 非对称加密算法:加密和解密的算法是不一样的—服务端生成一个公钥和私钥,将公钥传递给客户端,客户端使用公钥进行加密,服务端使用私钥解密
    公钥和私钥:通过加密算法得到的一对密钥(两串数据),公钥用于对于数据加密,私钥用于对加密后的数据进行解密,因为加密和解密方式不同,所以很难破解;就算中间公钥被人劫持,客户端使用公钥加密的数据也只能用私钥进行解密
    非对称加密算法的优点:安全性高,不容易被破解
    缺点:解密效率比较低

  3. 大家可能都听说过 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实:HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

  4. HTTPS协议的加密流程图:
    在这里插入图片描述
    描述:Tcp通信的时候,连接建立成功之后,服务端就会生成一对公钥与密钥,然后拿着公钥去权威机构生成CA证书,然后将公钥与CA证书一起发送给客户端,客户端根据证书中的机构信息,进行身份验证,若身份验证不通过则可以直接断开连接;若身份验证通过,客户端生成一个随机值,然后使用公钥加密把随机值发送给服务段,服务段收到后根据这个随机值再自己生成一个随机值,然后两个随机值协商出一个对称加密算法,最终使用协商成功的对称加密算法对传输数据进行加密。

2.2HTTPS可能会收到的威胁

  1. 威胁情况如何产生:
    中间人的确无法得到浏览器生成的密钥B,这个密钥本身被公钥A加密了,只有服务器才有私钥A’解开拿到它呀!然而中间人却完全不需要拿到密钥A’就能干坏事了。请看:
    1.某网站拥有用于非对称加密的公钥A、私钥A’。
    2.浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
    3.中间人劫持到公钥A,保存下来,把数据包中的公钥A替换成自己伪造的公钥B(它当然也拥有公钥B对应的私钥B’)。
    4.浏览器随机生成一个用于对称加密的密钥X,用公钥B(浏览器不知道公钥被替换了)加密后传给服务器。
    5.中间人劫持后用私钥B’解密得到密钥X,再用公钥A加密后传给服务器。
    6.服务器拿到后用私钥A’解密得到密钥X。
    这样在双方都不会发现异常的情况下,中间人得到了密钥B。根本原因是浏览器无法确认自己收到的公钥是不是网站自己的。那么下一步就是解决下面这个问题:

  2. 如何解决这种不安全情况:
    怎么解决https不安全情况即如何证明浏览器收到的公钥一定是该网站的公钥?
    数字签名的制作过程:
    1.CA拥有非对称加密的私钥和公钥。
    2.CA对证书明文信息进行hash。
    3.对hash后的值用私钥加密,得到数字签名。
    明文和数字签名共同组成了数字证书,这样一份数字证书就可以颁发给网站了。
    那浏览器拿到服务器传来的数字证书后,如何验证它是不是真的?(有没有被篡改、掉包)

  3. 浏览器验证的过程:
    1.拿到证书,得到明文T,数字签名S。
    2.用CA机构的公钥对S解密(由于是浏览器信任的机构,所以浏览器保有它的公钥。详情见下文),得到S’。
    3.用证书里说明的hash算法对明文T进行hash得到T’。
    4.比较S’是否等于T’,等于则表明证书可信。
    为什么这样可以证明证书可信呢?我们来仔细想一下。
    中间人有可能篡改证书吗?假设中间人篡改了证书的原文,由于他没有CA机构的私钥,所以无法得到此时加密后签名,无法相应地篡改签名。浏览器收到该证书后会发现原文和签名解密后的值不一致,则说明证书已被篡改
    中间人有可能把证书掉包吗?
    假设有另一个网站B也拿到了CA机构认证的证书,它想搞垮网站A,想劫持网站A的信息。于是它成为中间人拦截到了A传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到B的证书里的公钥了,会导致上文提到的漏洞。
    其实这并不会发生,因为证书里包含了网站A的信息,包括域名,浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉包了。

三:HTTP与HTTPS的区别:

  1. HTTP是互联网上应用最为广泛的一种网络协议,用于www服务器传输超文本到本地浏览器的传输协议,他可以使浏览器更加高效时网络传输减少。

  2. HTTPS简单来说就是HTTP的安全版。即在HTTP下加入SSL层,HTTPS的安全基础就是SSL。其主要作用包括建立一个信息安全通道来保证数据传输的安全另一个是确认网站的真实性。

  3. SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:
    SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
    ,不提供任何方式的数据加密。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。由此设计出的HTTPS协议:由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。

  4. HTTP与HTTPS的主要区别:
    1.https协议需要到CA (Certificate Authority,证书颁发机构)申请证书,需要一定费用。
    2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
    3.http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四:GET与POST的区别:

  1. 本质: GET是从服务器获取数据,不会对服务器进行影响,POST不仅可以获取数据还可以向服务器传送数据即影响服务器
  2. 安全性:POST的安全性比GET安全性高,GET提交数据,是通过URL传递数据,所以会将信息明文出现在URL上,POST是通过body体传输。
  3. 缓存:GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,能够保存为浏览器书签;POST不能被缓存,因为post可以修改数据,是有副作用的。
  4. 传输数据的大小:GET传递数据通过URL进行传递,受到不同浏览器的URL大小的限制,最长2048字符;POST没有长度限制。
  5. 后退方式:GET后退没有影响;POST会重新提交请求,因为后退相当于将修改的数据变成修改前。
  6. 编码方式:GET只支持URL编码方式,POST支持多种编码方式。
  7. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制 。

优缺点:

  1. 做数据查询的时候建议用GET
  2. 查询包含机密信息的话,建议用Post数据方式;在做数据添加、修改或删除时,也建议用Post方式。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值