网络
一、Http和Https
Http
概念:超文本传输协议,请求与响应模式,基于TCP/IP的传输数据协议,位于应用层。
特点:1.无状态(协议对客户端没有状态存储,对事物没有记忆能力,例如多次访问某个网站需要进行多次登录)2.无连接(1.1以前每次请求都需要重新建立连接,1.1以后可以使用长连接保持连接状态,也可以使用Cookie/Session技术来解决)3.请求与响应模式。4.简单、快速、灵活。5.通信使用明文,不验证通信方的身份,无法保证数据的完整性和可靠性
Https
概念:在Http的基础上增加了SSL/TLS传输加密协议。
特点:使用SSL/TLS加密数据(非对称加密——公钥加密私钥解密和对称加密——使用一个密钥加解密同时使用);验证通信方的身份;保证数据的完整性
缺点:建立连接和页面加载时间增加;占用服务器端资源多;SSL证书需要购买,增加成本;
实现原理:1、客户端向服务器发送请求。2、服务器将自己的数字证书发送给客户端,数字证书包括证书颁发机构,过期时间,服务器公钥等信息。3、客户端验证证书,产生对称密钥;使用服务器公钥加密对称密钥,发送给服务器。4、服务器使用自己的私钥解密拿到对称密钥。5、他们之间就可以使用对称密钥加密信息进行通信了。
TCP三次握手建立连接
过程:
1、客户端向服务器发送建立连接请求SYN=1 seq=x ,客户端进入SYN_SENT状态。
2、服务器回复客户端可以建立连接SYN=1 ACK=1 seq=y ack=x+1,服务端进入SYN_RECV状态。
3、客户端向服务器发送确认,表示将要进行数据传输,连接成功建立ACK=1 seq=x+1 ack=y+1,双方进入ESTABLISHED状态。
符号说明:SYN=1表示要建立连接请求,连接建立后被置为0。ACK=1表示确认收到消息,为0无效。seq表示当前数据包的序列号。ack表示下一个要接受数据包的序列号。
为什么不是两次握手而是三次呢?在两次情况下,要是服务器的回复客户端收不到,这时服务器端认为连接已经建立了,同时为客户端分配了资源,可是客户端会认为连接建立失败,此时资源就浪费了。
TCP四次挥手释放连接
过程:
1、客户端表示要断开连接,FIN=1 seq=v,客户端进入FIN_WAIT_1状态。
2、服务器回复ACK=1 seq=u ack=v+1,服务端进入CLOSE_WAIT状态,客户端收到消息后进入FIN_WAIT_2状态。此时客户端不再发送数据,而服务端还继续向客户端传输数据。
3、服务器表示要断开连接,FIN=1 ACK=1 seq=w ack=v+1,服务端进入LAST_ACK状态。
4、客户端回复ACK=1 seq=v+1 ack=w+1,客户端进入TIME_WAIT状态,服务端在收到消息后进入CLOSED状态,而客户端在等待2MSL(报文段发送和回复所需的时间)时间之后默认成功断开连接进入CLOSED状态。
为什么要四次挥手,因为TCP连接时双向的,两个方向都要关闭连接。
为什么建立连接是三次,释放连接是四次呢?
因为建立连接是连续进行的,可以通过SYN和ACK判断连接建立过程。而释放连接是双向的,当一方释放之后,另一方可能需要经过一段时间才释放,所以需要四次。
二、ISO模型和TCP/IP模型
ISO模型(七层)
应用层:网络操作系统和应用程序提供网络服务功能。
表示层:内码转换,压缩解压缩,加密解密,充当应用程序和网络之间的“翻译官”。
会话层:在网络中的两个节点之间建立和维持通信。
传输层:数据的大小控制,数据分割和编号,数据完整性和准确性校验,确保数据可靠地到达接收方。
网络层:负责数据包传输路径的选择。当接收方只能处理较小数据时,负责对数据包进行分段和重组。
数据链路层:将从网络层接收的数据分成物理层能够传输的大小的帧。帧是用来移动的结构包,包括原始数据,发送方和接收方的网络地址,纠错和控制信息。
物理层:数据传输的具体的物理实体。
TCP/IP模型(四层)
应用层:所有面向用户的应用程序的统称。这一层有许多实现应用功能的协议。如:HTTP协议(访问)、FTP协议(文件传输)、SMTP协议(电子邮件)、DNS协议(域名解析)、Telnet协议(远程登录)。
传输层:基于TCP或者UDP协议进行网络节点之间的数据传输。
网络层:定义了IP地址格式,负责在发送方和接收方之间建立虚拟路径。
链路层:负责将从网络层接收的数据分成帧,通过物理链路传输;从物理链路中接收帧,抽取数据提交给网络层。
TCP和UDP的区别
可靠 不可靠
连接 无连接
面向字节流,将数据看成一串无结构的字节流 面向报文,不拆分,保留报文边界
一对一 一对一,多对一,多对多
慢 快
耗系统资源多 耗系统资源少
三、Socket
概念:套接字,定义在应用层和传输层之间的一组接口。它使得传输层的协议对应用层隐藏,应用层可以通过调用接口进行数据传输。是一种网络间进程通信的方式(IP地址+协议+端口号可唯一确认一个应用程序)。
TCP Socket过程:
服务器端
1、服务器建立ServerSocket对象(创建socket,绑定到端口,监听端口)。
2、服务器阻塞,等待客户端连接(Accept阻塞)。
3、连接建立,通过输入流读取客户端数据,输出流给客户端传数据。
4、关闭连接。
客户端
1、客户端建立Socket对象(指定服务器IP地址,端口号)。
2、connect连接建立。
3、通过输出流发送数据,输入流接收回复。
4、关闭连接。
UDP Socket过程
不必特意区分服务端还是客户端
发送方
1、创建DatagramPacket对象用于打包数据(参数是数据,数据长度,接收方IP地址,端口号)。2、创建DatagramSocket对象用于发送数据socket.send。
接收方
1、创建DatagramPacket对象用于解析数据包。
2、创建DatagramSocket对象用于接收数据包(可指定接收的端口号)socket.receive,放到DatagramPacket对象中。
四、DNS
解析过程
1、浏览器中输入域名,浏览器检查自己的缓存中是否存在记录。
2、浏览器缓存中没有,系统到本机的hosts文件中查找。
3、hosts文件中没有,系统到本机配的DNS解析服务器(LocalDNS)中查找。
4、LocalDNS中没有,LocalDNS代替系统查找,LocalDNS到根域名服务器请求解析。
5、根域名服务器会给LocalDNS一个地址,让它去主域名服务器中查找。
6、在主域名服务器中找到对应域名空间的Name Server服务器地址,LocalDNS再去Name Server服务器中请求解析。
7、Name Server服务器返回解析的IP地址和对应TTL(Time To Live)值,LocalDNS将结果储存并传给用户,解析完毕。
解析过程中的两种查询方式
递归查询:系统去LocalDNS中查询无果,然后转由LocalDNS代替系统去根域名服务器查询,这是递归查询。(帮人帮到底)
迭代查询:LocalDNS请求根域名服务器,根域名服务器返回主服务器地址,让LocalDNS去主服务器解析,这是一种迭代查询(甩锅)
五、get和post的区别
1、get将参数直接加在url上不安全,而post在请求体中。
2、get的参数大小有限制,post没有。
3、get参数只能用ASCII编码,而post没有要求。
4、get的参数会被保留在浏览器的历史记录中,而post不会。
5、get请求的回退是无害的,而post会再次发起请求。
6、get请求会被浏览器主动cache,而post不会。
7、get请求的url地址可以被Bookmark,而post不行。
但是从本质上来说,get和post都是基于tcp协议实现的,所以二者本质上没有区别,你可以在get的请求中也加上request body,也可以在post请求的url上加上参数。不过由于http的规定和不同浏览器的限制,使得偷偷夹带的参数不一定能被解析接收。
还有一个最重要的区别是,get请求只会发送一个tcp数据包便把header和data都发出去,服务器响应200(ok);而post会发送两个数据包,先将header发出去,收到服务器响应100(continue),再把data发出去,收到服务器响应200(ok)