文章目录

一,应用层规范

应用层的具体内容就是精确定义这些通信规定

  • 应用进程交换的报文类型,如请求报文和响应报文
  • 各种报文类型的语法,如报文中的各个字段及其详细描述
  • 字段的语义,即包含在字段中的信息含义
  • 进程何时,如何发送报文,以及对报文进行响应的规则

二,应用层协议

1.域名系统DNS

简介

互联网的命名系统,将人们便于记住的名字转为ip地址,为网络应用提供核心服务

作用

将互联网上的主机名字解析为ip地址

补充

  1. 为什么机器在处理ip数据报时要使用ip地址而不使用域名呢?
    ip地址的长度是固定的32位,如果是ipv6地址,则是固定的128位,长度固定,但是域名是便于用户记忆,长度一般是不固定的,机器处理起来比较困难

域名解析过程

宏观:

应用层_ip地址

递归查询和迭代查询:

  1. 主机向本地域名服务器的查询一般都是采用递归查询。
    所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
  2. 本地域名服务器向根域名服务器的查询的迭代查询。
    迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机

应用层_域名服务器_02

全:

应用层_域名服务器_03

补充问题:

为什么域名解析请求和响应过程都是基于UDP协议?

2.FTP简单文件传输协议

基本原理

文件传输协议ftp是基于tcp协议的文件传输服务。提供对远程计算机文件的增删改查操作,主要是为了减少或者消除在不同操作系统上处理文件的不兼容性

这些不兼容性体现在:

  • 计算机存储数据的格式不同
  • 文件的目录结构和文件命名的规定不同
  • 对于相同的文件存取功能,操作系统使用的命令不同
  • 访问控制的方法不同

ftp工作流程:

应用层_服务器_04

数据传输:

应用层_服务器_05

补充问题:

  1. 为什么建立两个独立连接?
    使协议更加简单,容易实现,同时在传输文件时还可以利用控制连接对文件传输进行控制

3.http协议

简介

http协议是一个基于tcp/ip的应用层协议,是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

工作流程

应用层_域名服务器_06


一次HTTP操作称为一个事务,所以也称http是面向事务的协议

所以一次http请求的时间 = 2*往返rtt + 文档传输时间

特点:

  1. 简单快速:客户向服务器请求服务时,只需要传送请求方法和路径,请求方法常用的有get,post,每种方法规定了客户和服务器联系的类型不同,由于http协议简单,使得http服务器程序规模小,通信速度快
  2. 灵活:http允许传输任意类型的数据对象,正在传输的类型由content-type加以标记
  3. 无连接:每次连接只处理一个请求。服务器处理完客户端的请求并收到客户端的回应后就断开连接,采取这种方式可以节省传输时间,http1.1版本支持可持续连接
  4. 无状态:http是无状态协议,无状态是指协议对事务处理没有记忆能力,对于后续请求如果需要用到前面的信息,则他必须重新传,这样可能导致每次连接传输的数据量增大,另一方面,在服务器不需要先前信息时,应答就比较快

请求和响应

请求报文格式:

应用层_域名服务器_07

响应报文格式:

应用层_ip地址_08

请求和响应报文的不同之处在于请求行和响应行

在请求行中比较重要的就是请求方法:

  • get : 从服务器获取资源
  • post :请求修改服务器资源
  • put :向服务器上传资源
  • delete : 删除服务器资源
  • head : 获得服务器文档首部

在响应行中最重要的就是状态码:

  • 1xx :表示HTTP请求已经接受,继续处理请求
  • 2xx :表示HTTP请求已经处理完成
  • 3xx :表示把请求访问的URL重定向到其他目录
  • 4xx :表示客户端出现错误
  • 5xx :表示服务端出现错误

常见状态码:

  • 200 OK : 请求处理成功
  • 301 MOVE PERMANENTLY ;永久跳转
  • 403 FORBIDDEN :客户端无权限访问
  • 404 NOT FOUND:服务器找不到响应资源
  • 500 INTERNAL SERVER ERROR : 服务器出错
  • 502 BAD GATEWAY :后端没有按照http协议返回响应
  • 503 SERVICE UNAVALIBILE :服务不可用
  • 504 GATEWAY TIMEOUT : 请求超时

http响应模型:

服务器收到HTTP请求之后,会有多种方法响应这个请求,下面是HTTP响应的四种模型:

  • 单进程I/O模型
    服务端开启一个进程,一个进程仅能处理一个请求,并且对请求顺序处理;
  • 多进程I/O模型
    服务端并行开启多个进程,同样的一个进程只能处理一个请求,这样服务端就可以同时处理多个请求;
  • 复用I/O模型
    服务端开启一个进程,但是呢,同时开启多个线程,一个线程响应一个请求,同样可以达到同时处理多个请求,线程间并发执行;
  • 复用多线程I/O模型
    服务端并行开启多个进程,同时每个进程开启多个线程,这样服务端可以同时处理进程数M*每个进程的线程数N个请求。

session和cookie

cookie原理:

应用层_域名服务器_09

session原理:

应用层_服务器_10

区别:

  • session是服务器端技术,数据保存在服务器端,cookie是客户端技术,数据保存在客户端文件
  • session的安全性高于cookie
  • session保存在服务端,当服务端访问增多时,会比较占用性能

http版本比较

应用层_域名服务器_11

4.https

简介

http是超文本安全传输协议,由于http在网络上是明文传输,可能会被拦截,而https是加密传输,加密和解密工作交由ssl完成

区别:

应用层_ip地址_12

应用层_ip地址_13

HTTPS和HTTP的区别主要为以下四点:

  • 一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
  • 二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  • 三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • 四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

ssl加密解密

加密方法:

对称加密:

对称加密原理:

  • 对称加密靠秘钥来进行加密,也靠同一个秘钥来进行解密

常用的对称加密算法:

  • DES
  • 3DES
  • AES
/**
* AES加密
* @param data
* @return
*/
public static String encrypt(String data){
String result = null;
try {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,getSecretKey());
result = new String(cipher.doFinal(data.getBytes("utf-8")));
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

/**
* AES解密
* @param data
* @return
*/
public static String decrypt(String data){
String result = null;
try{
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE,getSecretKey());
result = new String(cipher.doFinal(data.getBytes("utf-8")));
}catch (Exception e){
e.getMessage();
}
return result;
}

/**
* 获得加密和解密所需的密钥
* @return
*/
private static SecretKey getSecretKey(){
SecretKey secretKey = null;
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom();
keyGenerator.init(secureRandom);
secretKey = keyGenerator.generateKey();
} catch (Exception e) {
e.printStackTrace();
}
return secretKey;
}

对称加密算法的优缺点:

  • 优点:计算量相对较小,可以处理数据量较大的数据的加密工作
  • 缺点:密钥容易泄露,且服务器管理密钥比较麻烦

非对称加密

非对称加密原理:

  • 非对称加密靠公钥来进行加密,靠私钥来进行解密

常见的非对称加密算法:

  • rsa加密算法
public class RSA {

/**
* 公钥加密
* @param data
* @param publicKey
* @return
*/
public static byte[] publicEncrytype(String data,PublicKey publicKey){
byte[] result = null;
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
result = cipher.doFinal(data.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

/**
* 私钥解密
* @param data
* @param privateKey
* @return
*/
public static String privateDecrytypr(byte[] data,PrivateKey privateKey){
String result = null;
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
result = new String(cipher.doFinal(data),"utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}


/**
* 获得公钥
* @param keyPair
* @return
*/
private static PublicKey getPublicKey(KeyPair keyPair){
return keyPair.getPublic();
}

/**
* 获得私钥
* @param keyPair
* @return
*/
private static PrivateKey getPrivateKey(KeyPair keyPair){
return keyPair.getPrivate();
}

/**
* 获得密钥对
* @return
*/
private static KeyPair getKeyPair(){
KeyPair keyPair = null;
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom secureRandom = new SecureRandom();
keyPairGenerator.initialize(64,secureRandom);
keyPair = keyPairGenerator.generateKeyPair();
} catch (Exception e) {
e.printStackTrace();
}
return keyPair;
}
}

非对称加密优缺点:

  • 优点:数据传输安全
  • 缺点:计算量大,加密和解密速度较慢

https工作流程

应用层_服务器_14

​https原理简单介绍​