网络分层
1.物理层:提供比特流传输的中间介质。
2.数据链路层:保证物理线路上进行可靠的数据传递,主要有arp协议
3.网络层:连接网络中不同的机器,主要协议是ip协议
4.传输层:连接不同机器上的应用,协议有TCP和UDP。
5.应用层:接受信息并处理信息,代表协议有DNS域名解析协议,http协议
网络中两台机器之间的链接:数据链路层,网络层
源端机器先通过子网掩码与目的端机器ip进行与运算,判断是否处于同一子网(局域网)内。
如果在:则通过arp协议得到目的端ip对应的mac地址,并将mac信息封装到ip报文中得到帧。再将帧传输到交换机中,由交换机中的mac地址表查询到对应机器并转发报文。
如果不在:则通过arp协议拿到默认网关(可以理解为路由器)的mac地址,也将mac信息封装的ip报文中得到帧,再将帧传输到交换机中,由交换机中的mac地址表查询到路由器并转发报文。路由器得到报文后,先在数据链路层解析mac信息,并将ip报文传输到网络层,在网络层中得到对方ip地址后,根据路由表(路由算法得到,或者手工维护)得到下一跳地址(可能是网关,路由,对应服务器),并在数据链路层通过arp协议得到对应mac地址,并转发。直到找到对应ip的mac地址。
以上就是在广域网和局域网中两台机器通过数据链路层和网络层将报文发送到对方机器上,是属于机器与机器之间的链接。
机器之间两个进程的链接:传输层
三次握手与四次挥手:
第一次握手客户端->服务端:SYN=1,seq=x;服务端知道了客户端的发送能力,服务端的接收能力是正常的,此时客户端状态为SYN_SEND;
第二次握手服务端->客户端:SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y;客户端知道了服务端的接收、发送能力,客户端的接收、发送能力是正常的。此时服务端状态为SYN_REVD;服务端会把此种状态下请求连接放在半连接队列里面。
第三次握手客户端->服务端:ACK=1,确认号ack=y+1,序号seq=x+1;服务端知道服务端的发送和客户端的接受能力是正常的。此时双方状态都为ESTABLISHED;第三次握手可以携带数据。
第一次挥手客户端->服务端:FIN=1,序号seq=u;告诉服务端我报文已经传输完成了,不会再传了;此时客户端状态为FIN_WAIT1;
第二次挥手服务端->客户端:ACK=1,确认号ack=u+1,序号seq=v;告诉客户端,我不会再接受你的报文了。此时服务端状态为 CLOSE_WAIT,客户端收到报文后状态为FIN_WAIT2;
第三次挥手服务端->客户端:FIN=1,ACK=1,序号seq=w,确认号ack=u+1;告诉客户端,我的报文也传输完成了,也不会再传报文了。此时服务端状态为 LAST_ACK ;
第四次挥手客户端->服务端:ACK=1,seq=u+1,ack=w+1;告诉服务端,我不会再接受你的报文了。此时客户端状态为TIME_WAIT,服务端收到报文后状态为CLOSED。
注意当第四次挥手时,客户端会等待2MSL(报文在网络中存在的最长时间的两倍)之后才正式关闭连接,是为了防止最后一个ACK报文丢失,服务端重传FIN报文客户端收不到了。如果出现重传FIN报文,客户端会重新传输ACK报文,并重新计时,保证服务端收到ACK关闭连接后再关闭连接。
以上就是在机器通讯的基础之上,使用tcp报文(tcp报文首部有套接字端口)在传输层实现应用层之间可靠的信息交互。
应用层协议
HTTP超文本传输协议
超文本:包括文本,视频,语音,超链接等
传输:基于tcp/ip协议簇实现的互联网信息传输
协议:客户端和服务端进行数据传输的一种规则
HTTP请求:
HTTP响应:
消息报文头常用值:
HTTPS安全超文本传输协议
https就是在http的基础之上加上了ssl协议为了保证网络传输时数据的安全性。
https结合了对称加密、非对称加密两种加密方式进行加密:
1.客户端->服务端:发起https连接请求
2.服务端->客户端:返回服务端公钥
3.客户端->服务端:客户端生成自己的密钥并使用得到的服务端的公钥对密钥进行加密,发送给服务端。
4.服务端使用自己的密钥解密拿到客户端的私钥,此时服务端与客户端便有了共同的密钥,可以进行对称加密传输报文。
但是该种方法有个缺陷:
如果在服务端向客户端发送公钥的时候,公钥被第三方截取了。然后第三方将自己的公钥传输给客户端。之后在客户端使用第三方公钥加密自己的密钥传输给服务端的时候,第三方可以继续截取报文并用自己的密钥解密得到客户端的密钥,并再将其用第一次截获的公钥进行加密传输给服务端。这样第三方就能获取到客户端与服务端通讯时的密钥。
所以为了防止该种情况发生:
我们使用世界公认的第三方机构-CA机构签发的数字证书来解决。当客户端发起https连接请求时,服务端只需将自己申请的数字证书返回给客户端,并从数字证书中得到对应的持有者信息以及公钥信息等。但是使用数字证书也会有一个同样的问题,数字证书里面的数据有可能被篡改或者数字证书被替换。
数字证书又是如何防止的呢?
ca机构有自己的公钥和私钥,ca机构先对证书的明文计算hash值(为了提高加解密速度),再使用自己的私钥对hash值进行加密得到数字签名。而客户端得到数字证书后,可以使用ca机构的公钥对数字签名进行解密并对比明文信息校验是否一致。这样便能防止信息被篡改。而且由于明文信息里面包含服务端域名等信息,可以与客户端请求的服务端信息比对校验是否一致,这样便能防止证书被替换。
那么客户端是怎么得到ca机构的公钥的呢?
这就需要我们去下载ca机构的根证书并安装到客户端上,客户端便可以通过根证书得到ca机构的公钥。
对于同样的服务端,客户端每次请求时都需要重新生成密钥嘛?
服务端会为每个客户端维护一个session ID,在ssl握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了。但是session id应该有期限,一段时间没有请求之后,会重新通过ssl协议生成并传输密钥。
DNS域名解析协议
根据域名获取对应服务器ip地址:
1.查询浏览器缓存是否有解析后的数据
2.查询操作系统中配置的域名解析地址
3.根据网络配置的dns服务器,使用本地dns服务器解析地址
4.如果本地DNS服务器仍然没有命中,就直接到根DNS服务器请求解析。
5.根DNS服务器返回给本地DNS域名服务器一个顶级DNS服务器地址,它是国际顶级域名服务器,如.com、.cn、.org等。
6.本地DNS服务器再向上一步获得的顶级DNS服务器发送解析请求。