【知识详解】应用层详解(秋招总结)

应用层详解

1.应用层概述

应用层是分层模型的最高层,用于为用户提供服务。从应用层来看通信,是两个通信端点之间进程之间的逻辑通信,虽然在实际中存在多个物理链路,但是对应用层而言,其只关注程序A到程序B的连接

2. Http协议

问:http的无状态指的是什么意思?

Http是无状态的,也就是说http对于事务的处理是没有记忆能力的; 也就是服务器是不知道客户端处于一个什么状态的,比如说在服务器上打开一个网页和之前打开的网页是没有任何关系的;

  • http是无状态的,但是是面向连接的,所以无状态并不一定代表http请求不能保持TCP连接;
  • 在http1.1中,是默认都开启了keep-alive,也就是保持连接特性,也就是说当一个网页打开后,客户端和服务端之间用于传输http数据的TCP是不会关闭的;但是这个连接也不是永久的,有一个保持时间;
    https过程
    HTTPS在传输数据之前需要客户端与服务器进行一个握手(TLS/SSL握手),在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL使用了非对称加密,对称加密以及hash等。具体可参考:Https详解
    HTTPS相比于HTTP,虽然提供了安全保证,但是势必会带来一些时间上的损耗,如握手和加密等过程,是否使用HTTPS需要根据具体情况在安全和性能方面做出权衡。

Http过程

1.客户端发起请求

发送http请求就是构建http报文并通过TCP协议发送到服务器指定端口(http:80,https:443),报文由3部分组成:请求行,请求头,请求体

image

请求行
    Method Request-URL HTTP-Version CRLF
eg: GET index.html HTTP/1.1

方法有get、post、put、delete
URL:统一资源定位符;
组成:组成:<协议>://<主机>:<端口>/<路径> 注:端口和路径有时可以省略(HTTP默认端口号是80)
比如:https://localhost:8080/index.html?key1=value1&keys2=value2

问:get和post有什么区别?

1、在没有参数时两者的请求行中只有method不同;在带参数时,get请求的数据会附在URL之后(放在请求行),以?分割,多个参数用&连接,而post请求会放在请求体中,比如,如果参数是:name=xin, age=22
get方法的报文:

GET /index.php?name=xin&age=22 HTTP/1.1
Host: localhost

post方法的报文

POST /index.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded

name=xin&age=22

2、从URL来看post请求比get请求要安全,因为参数信息不会显示在地址栏上,但从传输上来看两者都是不安全的,因为都是用的http,在网络上上是明文传输,随时都可能被抓包获取。
3、get方法在浏览器地址栏上输入的参数是有限的,这并不是http协议的限制,而是浏览器和服务器的限制。而post请求请求体并没有长度限制。所以get请求传输数据较少,post请求能传输大量数据。
4、get主要用于信息获取。不会增加或修改资源,只是查询。post主要用于更新资源信息。
5、get方法产生一个TCP数据包,浏览器会把请求头和请求体一并发出去,服务器响应200 ok。post方法产生两个TCP数据包,浏览器会先把请求头发给服务器,返回100 continue,再发请求体,返回200 ok。
它们的本质都是 TCP 链接,并无区别。但是由于 HTTP 的规定以及浏览器/服务器的限制,导致它们在应用过程中可能会有所不同。

2. 服务器处理请求并返回HTTP报文

后端从固定的端口收到TCP报文后,这一部分对应编程语言的socket,它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用,这一部分工作由Web服务器进行,比如Tomcat。
HTTP响应报文也由3部分组成:状态码,响应头,响应体;

状态码
状态码就是服务器告诉客户端,发送了什么事;

问:常见状态码?

1**:指示信息--表示请求已接收,继续处理;
2**:成功--表示请求已被成功接收、理解、接受
   200 OK 服务器成功处理了请求
3**:重定向--要完成请求必须更进一步的操作
   301/302 Moved Permanently 请求的URL已移走,Response中应该包含一个Location URL, 说明资源现在所处的位置
4**:客户端错误--请求有语法错误或请求无法实现
   404 Not Found 未找到资源
5**:服务端错误--服务器未能实现合法的请求(自己出错了或网站都挂了)
   501 Internal Server Error服务器遇到一个错误,使其无法为请求提供服务
状态码 含义
101 切换请求协议
200 请求成功
301 永久性重定向,会缓存
302 临时重定向,不会缓存
400 客户端请求的语法错误
403 服务器禁止访问,权限有关
404 服务器找不到资源
500 服务端错误

响应头
响应体
服务器返回给浏览器的信息,比如html、css、js等。

问:说下请求转发和重定向?

  • 请求转发是指服务器收到请求以后,从一个资源跳转到另一个资源的操作,其实就是访问servert1,然后servert1做不到,它会接着去给你做,接着到了servert2,本质上是一次请求,在浏览器地址栏上是没有变化的,共享request域中的数据;
  • 重定向是指服务器收到请求后,自己做不了会返还给客户端一个新的地址,然后客户端向新地址再发出一个请求,这是两次请求的过程,浏览器地址栏会发生改变,不共享request域中的数据;

问:说下http/1.0 1.1 2.0的区别?

  • Http1.0默认使用的是短连接,每次请求都需要去建立一个TCP连接,可以通过设置Connection:keep-alive这个字段来开启长连接;
  • Http1.1
    • 引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用;
    • 采用了分块传输编码,也就是服务器每产生一块数据,就发送一块,用“流模式”取代了“缓存模式”;
    • 管道机制,在同一个TCP连接里面,客户端可以同时发送多个请求;
  • Http2.0
    • 二进制协议,在2.0中,头信息和数据体都是二进制,抛弃了ASCII码,提高了解析效率;
    • 完全多路复用:在一个连接里,可以同时发送多个请求或响应,而且不用按照顺序一一对应;
    • 报头压缩:在之前经常会出现请求头容量很大,导致报头偏重,所以在2.0中会采用HPACK就行压缩;

http的长连接和短连接是什么?

问:if数据传送完毕,但是还不想断开连接怎么办?

可以将Http响应体的connection字段指定为keep-alive;

3.Https协议

1.什么是Https

Http + SSL = Https (SSL:安全套接字协议)
一句话说:Https是身披SSL的Http,当使用了SSL后,Http先和SSL通信,再由SSL和TCP通信,

2.为什么需要Https

在用Http协议时,主要可能存在以下三个问题。

  • 1.通信使用明文,内容可能会被窃听。
  • 2.不验证通信方的身份,可能遭遇伪装。
  • 3.无法证明报文是否完整,可能遭到篡改

相应的,Https就是解决上述三个问题

  • 1.数据隐私:内容经过对称加密。
  • 2.身份认证:第三方无法伪造身份。
  • 3.数据完整性:内容传输经过完整性校验。

所以也可以这样说:
Http+加密+认证+完整性保护=Https

image

3.加密

3.1 对称加密

加密和解密使用同一个密钥,想要加密信息,那就需要把密钥传给客户端,只能通过光盘拷给对方,不能在网络上传输,因为很容易就被其他人获得密钥,这样谁都可以解密信息了,失去了加密的意义。优点是效率高

3.2 非对称加密

是一个密钥对,一把公钥,一把私钥,公钥任何人都能获得,但是私钥只有自己知道,发送方使用公钥加密,接收方收到后使用私钥解密,只有公钥信息也不能做到解密。缺点是加密解密需要一定时间。

3.3 对称加密+非对称加密

为了结合效率高且安全加密,使用两者混合:在交换密钥环节使用非对称加密,数据传输时用对称加密。具体是:发送密文的一方使用对方的公钥加密对称密钥,然后用对称密钥加密文件,接收方用私钥解密对称密钥,用对称密钥解密文件。

4.数字签名

数字签名是用来解决数据可能遭到篡改的情况,即校验数据完整性。
实现:A在发送文件前,先用单向散列函数(Hash)生成消息摘要,然后再用A私钥进行加密生成数字签名,然后将其与文件和A公钥一起发给B,B收到后先对文件使用相同的散列函数得到摘要,然后用A的公钥解密数字签名得到原来的摘要,两个摘要进行对比,若不相同,则证明文件被篡改。
数字签名的特点就是发送文件不加密,但不能更改,比如发送红头文件到各个地方或者官方群发特定通知,文件本身不是机密,但不能更改;
问题:A的公钥怎么传给B,或者说如何证明这个公钥就是A的。比如C可以用自己的私钥生成数字签名,然后把自己的公钥给A,然后冒充B

image

5.CA证书

CA证书是为了解决通信方身份被伪装的问题。
CA机构使用散列函数将证书上的明文信息(申请者公钥,申请者信息等)计算得到信息摘要,然后用CA私钥加密得到数字签名,然后将证书和数字签名一起发给客户端,客户端得到后,使用CA公钥对数字签名解密得到摘要,然后对证书计算得到摘要,将两者对比如果一样表示证书没有被中间人篡改过,确认证书的合法性,也就是服务器的公钥是值得信赖的。

:即使中间人有CA公钥,能够解析数字签名并篡改,但是篡改完成后中间人仍然需要将证书重新加密,但是中间人没有CA私钥,无法加密,强行加密会导致客户端无法解密(客户端只认那几个权威机构的公钥)。

6.公钥和私钥

要明白两种用法:

  • 1.公钥加密,私钥解密 -- 用于传输密文
  • 2.私钥签名,公钥验证 -- 用于签名

第一种情景:既然是加密,那肯定不想让别人知道我的信息,只有我才能解密,所以公钥加密,私钥解密。这过程中信息不可见,但是可能被篡改。
第二种情景:既然是签名,我就不希望别人冒充我发信息,只有我才能发,所以是私钥签名,公钥验证。这过程中信息不可篡改,但是他人可以获得。

7.Https工作流程

1、客户端发起一个https请求,根据规定,知道需要连接服务器的443端口。
2、服务器把配置好的公钥证书返回给客户端。
3、客户端验证公钥证书,比如是否在有效期内等信息。如果验证通过则继续,不通过则显示警告信息。
客户端拿CA机构的公钥解密数字签名,得到摘要,然后用散列函数计算证书得到摘要,对两个摘要进行对比,验证证书是否被篡改,服务器公钥是否可靠。
4、客户端使用伪随机数生成加密要用的对称密钥,然后用证书的公钥加密这个对称密钥,发给服务端。
5、服务端使用自己的私钥解密这个消息,得到对称密钥,现在,服务器和客户端都拥有了相同的对称密钥。(所以使用https开始的时候会有点慢)
6、服务器用对称密钥加密明文内容A,发给客户端。
7、客户端使用对称密钥解密密文,得到明文内容A。

image

8.https和http区别

  • http是明文传输,而https是使用SSL+http构成的加密传输,更安全。
  • http使用80端口,https使用443端口
  • http基于应用层,而https基于传输层

3.SMTP协议

简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,基于 TCP 协议,用来发送电子邮件。接收邮件一般用IMAP 或者 POP3。使用TCP的25号端口。

参考链接

深入理解HTTPS工作原理

数字签名
非对称加密

posted @ 2021-07-29 16:41  Curryxin  阅读(1025)  评论(0编辑  收藏  举报
Live2D