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保存在服务器上。客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上。