网络编程

1、IP地址和端口号是什么?

  • IP地址由4个0-255之间的数字组成,每个网卡有一个唯一的IP地址, 在同一个网络内部,IP地址不能相同(IP冲突)。 IP地址的概念类似于电话号码、身份证这样的概念。
  • 为了方便记忆, 专门创造了域名的概念,IP和域名之间存在一定的对应关系( 例如163.com、sina.com等)。
  • IP 地址与网络服务的关系是一对多的关系, 实际上是通过“IP地址+端口号”来区分不同的服务的。
  • 为了在一台设备上可以运行多个程序,人为的设计了端口(Port)的概念
  • 每个网络程序,无论是客户端还是服务器端,都对应一个或多个特定的端口号

2、域名解析的过程是什么?

  • 域名解析系统(DNS)是域名和IP地址的一种映射关系,因为IP地址是由数字组成,不方便记忆,而域名方便记忆,且与IP地址一一对应,所以通过DNS将域名解析成IP地址以实现网络访问是比较好的选择。
  • 解析过程如下:
    • 在浏览器中输入域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,有则直接访问;
    • 如果hosts里没有 这个域名的映射,则查找本地DNS解析器缓存;
    • 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器;(具有权威性)
    • 如果要查询的域名,不由本地DNS服务器解析,但该DNS服务器已缓存了此网址的映射关系,则调用这个IP地址映射,解析域名;
    • 如果没有缓存,那么本地DNS就会把请求发送给13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是由谁授权管理的,并会返回一个负责该顶级域名服务器的IP。本地DNS服务器收到IP信息后,会联系负责该顶级域名的服务器
    • 如果使用的是转发模式,此DNS服务器就会把请求转发到上一级DNS服务器,由上一级服务器进行解析

3、简单介绍传输协议TCP和UDP

  • TCP:传输控制协议
    • 特点:
      • 面向连接:传输数据之前需要建立连接
      • 在连接过程中进行大量数据传输
      • 通过“三次握手”的方式完成连接,是安全可靠的协
      • 传输速度慢,效率低
      • 应用场景:打电话。下载文件等。
  • UDP:用户数据报协议
    • 特点:
      • 面向无连接:需要传输数据的两端不需要建立连接
      • 每个数据报的大小限制在8个字节以内
      • 是一种不可靠协议(发出去的数据不一定会接收的到)
      • 传输速率快,效率高
      • 应用场景:实时在线聊天,视频会议等。

4、TCP三次握手

  • 所谓三次握手即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
    这里写图片描述

  • 流程如下

    • 客户端发起请求,并将支持的协议版本,加密算法等一起发送给服务端,同时生成一个随机数标记此次请求;
    • 服务端收到请求并做出回应,确定协议版本以及加密算法,并给客户端下发一个证书,同时生成第二个随机数标记此次回应;
    • 客户端收到服务端发来的证书,进行验证,并使用证书中的公钥加密生成第三个随机数,并向服务端发送通知,告诉服务端编码已改变,握手结束;
    • 服务端收到通知,生成一个私钥,并给客户端做出回应,告诉客户端已经收到编码改变通知,以及握手结束通知;
    • 这个时候客户端就可以和服务端进行数据传输了。

5、简单介绍一下OSI七层协议和TCP/IP四层协议

这里写图片描述

  • 应用层
    • 直接为用户的应用进程提供服务。常见协议有:FTP、HTTP、Https
  • 表示层
    • 负责数据的编码和转化。
  • 会话层
    • 为网络中两个结点(通信双方)制定通信方式,并建立、维护、控制、注销会话等。
  • 传输层
    • 为两个主机中进程之间的通信提供服务。常见协议:TCP协议、UDP协议。
  • 网络层
    • 决定如何将发送方的数据传到接收方。
  • 数据链路层
    • 管理第一层的比特数据,并将正确的数据传送到没有传输错误的路线中。
  • 物理层
    • 负责在网络上透明地传送比特流。

6、客户端与服务端的scoket连接是如何实现的?

这里写图片描述

  • 客户端连接
    • 创建Socket对象
    • 建立连接后,通过输出流向服务端发送信息
    • 通过输入流获取服务器响应的消息
    • 关闭响应资源
public class ClientSocketDemo {
    public void test() throws IOException {
        //客户端
        //1、创建客户端的Socket,指定服务器地址和端口
        Socket socket = new Socket("localhost", 10086);
        //获取输出流,向服务器发送消息
        OutputStream os = socket.getOutputStream();//字节输出流
        PrintWriter pw = new PrintWriter(os);//将输出流打包成打印流
        pw.write("用户名:admin;密码:123");
        pw.flush();
        socket.shutdownOutput();

        //获取输入流,并读取服务器端的响应信息
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String info=null;
        while((info=br.readLine())!=null){
            Log.e(TAG, "我是客户端,服务器说:"+info);
        }
        //关闭资源
        br.close();
        is.close();
        pw.close();
        os.close();
        socket.close();
    }
}
  • 服务端连接
    • 创建SocketServer对象
    • 通过accept方法监听客户端请求(阻塞方法)
    • 建立连接后,通过输入流读取客户端发送的信息
    • 通过输出流向客户端发送信息
    • 关闭相关资源
public class ServerSocketDemo {
    public void test() throws IOException {
        /**
        * 基于TCP协议的socket通信,实现用户登录,服务端
        */
        //1、创建一个服务器端Socket,即SocketServer,指定绑定的端口,并监听次端口
        ServerSocket serverSocket = new ServerSocket(10086);//1024~65535的某口端口
        //2、调用accpet方法开始监听,等待客户端的连接
        Socket socket = serverSocket.accept();
        //3、获取输入流,并读取客户端信息
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String info=null;
        while((info=br.readLine())!=null){
            Log.e(TAG, "我是客户端,服务器说:"+info);
        }
        socket.shutdownInput();//关闭输入流
        //4、获取输出流,响应客户端的请求
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.write("欢迎您!");
        pw.flush();
        //5、关闭资源
        pw.close();
        os.close();
        br.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}
  • 总结:
    • 创建ServerSocket和Socket
    • 打开连接到Socket的输入/输出流
    • 按照协议对Socket进行读写操作
    • 关闭输入输出流。关闭Socket

7、APP中的网络请求是如何加密的?

  • app中的网络请求主要通过密钥来进行加密。密钥是一种参数,是使用加密算法过程中输入的参数。同一明文在相同的加密算法和不同的密钥计算下会产生不同的密文。

    • 密钥分为两种:对称和非对称。

      • 对称密钥又称共享密钥,对称密钥在加密和解密的过程中使用的密钥是相同的,常见的加密算法有DES、3DES等。优点是计算速度快,缺点是密钥需要在通讯的两端共享。
      • 非对称密钥又称公开密钥加密。服务端会生成一对密钥,一个私钥保存在服务器,另一个公钥发布给客户端。
  • RSA加密的过程:
    • 服务端生成配对的公钥和私钥;
    • 私钥保存在服务端,公钥发给客户端;
    • 客户端使用公钥加密明文传输给服务端;
    • 服务端使用私钥解密密文得到明文。
  • 为了保证传输内容的真实性,需要使用数字签名;
  • 为了保证公钥的真实性,需要用到使用数字证书技术。

8、Http协议的特点

  • 简单快速

    • 只需传送请求方法和路径就能获取数据
  • 无连接

    • 限制服务器每次只处理一个请求,服务器收到客户端的回应后才会断开连接,节省传输时间。
  • 无状态

    • 服务器不会记忆客户端发来的请求,意思就是如果有重复的请求必须发送一个新的request,可能会造成请求过多的情况。

9、网络连接中,服务器如何记录客户状态?

  • Cookie技术
    • Cookie技术是客户端的结局方案,Cookie就是由服务器发送给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务端发送请求的时候都会带上这些特殊信息。
  • Session技术
    • Session是另外一种记录客户状态的机制,不同的是Cookie保存在客户端的浏览器中,而session保存在服务器上。客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值