1 计算机网络与协议
1.1 网络基础
1.1.1 计算机通信网的组成
计算机网络由通信子网 和资源子网组成。
**通信子网:**负责数据的无差错和有序传递,其处理功能包括差错控制、流量控制、路由选择、网络互连等。
**资源子网:**是计算机通信的本地系统环境,包括主机、终端和应用程序等, 资源子网的主要功能是用户资源配置、数据的处理和管理、软件和硬件共享以及负载 均衡等。
计算机通信网就是一个由通信子网承载的、传输和共享资源子网的各类信息的系统
网络边缘 :位于互联网边缘与互联网相连的计算机和其他设备,如桌面计算机、移动计算机、服务器、其他智能终端设备
网络核心 :由互联端系统的分组交换设备和通信链路构成的网状网络
如:分组交换路由器、链路层交换机、通信链路(光纤、铜缆、无线电、激光链路)
1.1.2 网络分类
①个域网PAN( Personal Area Network )
- 能在便携式消费电器与通信设备之间进行短距离通信的网络
- 覆盖范围一般在10米半径以内,如蓝牙耳机等
②局域网LAN(Local Area Network)
- 局部地区形成的区域网络,如企业网络
- 分布地区范围有限,可大可小,大到一栋建筑、小到办公室内的组网
- 电脑WLAN接入,打印机共享等等
③城域网MAN(Metropolitan Area Network )
范围覆盖一个城市的网络
④广域网WAN(Wide Area Network)
覆盖很大地理区域,乃至覆盖地区和国家
1.1.3 接入网
骨干网络到用户终端之间的所有设备
用途:
- 接入网的用途是将主机连接到边缘路由器上
- 边缘路由器是端系统Host去往任何其他远程端系统的路径上的第一台路由器
1.1.4 网络核心的两大功能
①路由
确定数据分组从源到目标所使用的路径(全局操作)
②转发
路由器或交换机将接收到的数据分组转发出去(即移动到该设备的某个输出接口)(本地操作)
1.1.5 通信协议
为了完成计算机之间有序的信息交换,提出了通信协议的概念,其定义是相互通信的双方(或多方)对如何进行信息交换所必须遵守的一整套规则。
协议涉及到三个要素,分别为:
- 语法:语法是用户数据与控制信息的结构与格式,以及数据出现顺序的意义
- 语义:用于解释比特流的每一部分的意义
- 时序:事件实现顺序的详细说明
1.1.6 OSI七层模型
OSI(Open System Interconnection)共分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层七层,其具体的功能如下。
① 物理层
OSI参考模型中,物理层是参考模型的最低层,也是OSI模型的第一层。物理层的主要功能是:
- 提供建立、维护和释放物理链路所需的机械、电气功能和规程等特性
- 通过传输介质进行数据流(比特流)的物理传输、故障监测和物理层管理
- 从数据链路层接收帧,将比特流转换成底层物理介质上的信号
**利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。**物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异,使其上面的数据链路层不必考虑网络的具体传输介质是什么。
②数据链路层
数据链路层(Data Link Layer)是OSI模型的第二层,负责建立和管理节点间的链路。在计算机网络中由于各种干扰的存在,导致物理链路是不可靠的。因此这一层的主要功能是:
在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
③网络层
网络层(Network Layer)是OSI模型的第三层,它是OSI参考模型中最复杂的一层,也是通信子网的最高一层,它在下两层的基础上向资源子网提供服务。其主要功能是:
在数据链路层提供的两个相邻端点之间的数据帧的传送功能上 ,进一步管理网络中的数据通信,控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接,将数据设法从源端经过若干个中间节点传送到目的端(点到点),从而向传输层提供最基本的端到端的数据传输服务。
具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。数据链路层和网络层的区别为:数据链路层的目的是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。
④传输层
OSI下3层的任务是数据通信,上3层的任务是数据处理。而传输层(Transport Layer)是OSI模型的第4层。
该层提供建立、维护和拆除传输连接的功能,起到承上启下的作用。该层的主要功能是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输,同时向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。
⑤会话层
会话层是OSI模型的第5层,是用户应用程序和网络之间的接口,该层的主要功能是:组织和协调两个会话进程之间的通信 ,并对数据交换进行管理。当建立会话时,用户必须提供他们想要连接的远程地址。而这些地址与MAC地址或网络层的逻辑地址不同,它们是为用户专门设计的,更便于用户记忆。域名就是一种网络上使用的远程地址。会话层的具体功能如下:
会话管理: 允许用户在两个实体设备之间建立、维持和终止会话,并支持它们之间的数据交换。
会话流量控制: 提供会话流量控制和交叉会话功能。
寻址: 使用远程地址建立会话连接。
**出错控制:**从逻辑上讲会话层主要负责数据交换的建立、保持和终止,但实际的工作却是接收来自传输层的数据,并负责纠正错误。
⑥表示层
表示层是OSI模型的第六层,它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。该层的主要功能是:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。表示层的具体功能如下:
数据格式处理: 协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。
数据的编码: 处理字符集和数字的转换。
压缩和解压缩: 为了减少数据的传输量,这一层还负责数据的压缩与恢复。**数据的加密和解密:**可以提高网络的安全性。
⑦应用层
应用层是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,该层的主要功能是:直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外该层还负责协调各个应用程序间的工作。应用层的具体功能如下:
用户接口: 应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。
**实现各种服务:**该层具有的各种应用程序可以完成和实现用户请求的各种服务。
summary:
**应用层:**产生网络流量的程序
**表示层:**传输之前是否进行加密或者压缩处理
**会话层:**查看会话,查木马 netstat-n
**传输层:**可靠传输、流量控制、不可靠传输
**网络层:**负责选择最佳路径、规划ip地址
**数据链路层:**帧的开始和结束、透明传输、差错校验
**物理层:**接口标准、电器标准、如何更快传输数据
**低三层模型属于通信子网,**涉及为用户间提供透明连接,操作主要以每条链路( hop-by-hop)为基础,在节点间的各条数据链路上进行通信。由网络层来控制各条链路上的通信,但要依赖于其他节点的协调操作。
**高三层属于资源子网,**主要涉及保证信息以正确可理解形式传送。
**传输层是高三层和低三层之间的接口,**它是第一个端到端的层次,保证透明的端到端连接,满足用户的服务质量(QoS)要求,并向高三层提供合适的信息形式。
1.2 网络协议总结
应用层:为用户为用户的应用进程提供网络通信服务
协议------DNS协议、HTTP协议、HTTPS协议
传输层:负责两台主机之间的数据传输,将数据从发送端传输到接收端协议------TCP协议、UDP协议
网络层:负责传输的地址管理和路由选择,在众多复杂的网络环境中确定一条合适的路径协议------IP协议
数据链路层:负责设备之间数据帧的传送和识别,将网络层传递的数据报封装成帧,在处于同一个数据数据链路节点的两个设备之间传输协议------ARP协议、MTU协议
物理层:负责光电信号的传递方式,实现相邻计算机节点之间比特流的透明传输
1.2.1 应用层协议
应用层协议主要负责各个程序间的通信,发生网络传输一个数据时,先由应用层对数据按照对应的协议封装,然后交给下一层传输层,当经过一系列网络传输,数据达到接收端时,一层层的分用,最后一层再由应用层分用,最终得到数据。
①DNS协议
DNS协议是一个应用层协议,建立在TCP和UDP的基础之上,使用默认端口为53,其默认通过UDP协议通信,但如果报文过大是则会切换成TCP协议。
域名系统 (DNS) 的作用是将人类可读的域名 (如,www.baidu.com) 转换为机器可读的 IP 地址 (如,192.0.2.44),本质是通过DNS域名和IP地址的对应关系转换,而这种对应关系则保存在DNS服务器中
域名的解析过程:
域名的解析工作大体上可以分为两个步骤:
第一步客户端向本地DNS服务器发起一个DNS请求报文,报文里携带需要查询的域名。
第二步本地DNS服务器向本机回应一个DNS响应报文,报文里携带查询域名所对应的IP地址。
1.在本地缓存中查询,如果有则返回对应IP,如果没有将请求发给DNS服务器
2.当本地DNS服务器接收到查询后,先在服务器管理区域记录中查询,若没有再在服务器本地缓存中查询,如果没有将请求发送到根域名服务器
3.根域名服务器负责解析请求的根域部分,然后将包含下一级域名信息的DNS服务地址返回给本地DNS服务器
4.本地DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域的DNS服务器地址
5.按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应的IP地址信息
6.本地DNS服务器将最终查询到的IP返回给客户端,让客户端访问对应主机
②HTTP协议
HTTP协议是一个简单的请求------响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP进行通信的HTTP的实现程序。
HTTP是基于TCP协议,且面向连接的。典型的HTTP事务处理有如下的过程:
1.客户端与服务器建立连接;
2.客户端向服务器提出请求;
3.服务器接受请求,并根据请求返回相应的数据作为应答响应;
4.客户端与服务器关闭连接。
HTTP协议报文格式
HTTP报文由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Respone)构成
请求:由请求行 ,请求头 ,请求体组成
请求行: 包含请求方法、路径、版本号,请求头为多个key-value数据,请求正文包含一些请求的数据
响应: 响应行,响应头,响应体组成
响应行 中包含状态码,状态码描述,版本号,响应头 为多个key-value数据,响应正文包含一些响应的数据
常见HTTP响应状态码汇总
200 OK :客户端请求成功
3XX系列
301 Moved Permanently : 请求的资源以被永久的移动到新URL中,返回的Response中包含一个Location,浏览器会自动重定向到新URL,以后请求都会被新的URL替代
302 Found : 与301类似,但请求的资源只是临时的被移动到新的URL中,下次请求客户端继续使用原URL
**307 Temporary Redirect :**临时重定向,类似于302,使用GET请求重定向
4XX系列
400 Bad Request : 客户端请求语法错误,服务器无法理解(在 ajax 请求后台数据时比较常见)
401 Unauthorized : 请求要求用户的身份认证
403 Forbidden : 服务器理解客户端请求,但是拒绝执行(一般用于用户级别为达到要求等等不支持访问)
404 Not Found : 服务器无法根据客户端请求找到对应资源
**405 Method Not Allowed :**服务器不支持该方法
5XX系列
500 Internal Server Error : 服务器内部错误,无法完成请求
**503 Service Unavailable :**由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
HTTP协议的特点
1.支持服务器/客户端模式
2.传输较快速,客户端向服务器发送请求,只需要传输请求方法和路径
3.灵活,HTTP允许传输任意类型的数据对象
4.无连接,每次连接只能处理一个请求,服务器处理完客户端请求,客户端收到响应后就断开连接
5.无状态,协议本身对事务处理没有记忆能力,如果后序连接需要之前发送的信息时就需要重传
HTTP1.0和HTTP1.1和HTTP2.0的区别:
HTTP1.0和HTTP1.1的区别:
1.长连接: HTTP1.0只支持浏览器与服务器的短连接,即每次请求都要重新建立连接,服务器无法记录每个历史请求,HTTP1.1支持长连接即在一次连接下,浏览器可以向服务器发送多次请求
2.增加Host字段: HTTP1.0中认为每个服务器都绑定这唯一一个IP,所有发送的请求头URL中没有host信息,而HTTP1.1在请求和响应中都支持了host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
3.缓存: HTTP1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。
**4.错误提示:**HTTP1.0中定义了16个状态码,对错误或警告的提示不够具体。HTTP1.1引入了一个Warning头域,增加对错误或警告信息的描述,并且还新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
HTTP1.X和HTTP2.0的区别
1.增加二进制格式解析: HTTP1.X解析基于文本,而文本格式本身就具有多样性,很多场景下不方便,而引入二进制后,只有0和1组合,使解析更加方便也增强了健壮性
2.多路复用: 即每个request都是是用作连接共享机制的,每个request都对应一个id,使一个连接可以有多个请求,再根据id将request归属到不同的服务端请求里
3.header压缩: HTTP1.X中,每次传输都要写点header头,占用了大量数据,因此HTTP2.0在客户端和服务端各保存了一份header fields表,每次传输时只需传输header的更新信息,将header fields表更新即可实现header传输
**4.服务端推送:**HTTP2.0也添加了server push功能
HTTPS协议
HTTPS同样作为应用层协议,可以说它是HTTP的升级版,增加了传输数据的安全性,HTTPS协议是在HTTP的基础上增加了一个SSL外壳,HTTPS运行在SSL上,SSL运行在TCP上,对数据的加密工作就是在SSL上完成的。
其保证安全性的做法是通过证书验证和对信息混合加密的方式
混合加密技术:
结合对称加密与非对称加密
服务端生成私钥,再通过私钥生成公钥,然后将公钥放在证书中颁发给客户端
使用公钥和私钥以非对称方式加密生成密钥
客户端接下来的传输数据中,都会用密钥以对称方式对信息加密,再传输给服务端
上述提到的公钥和私钥,我们规定用公钥加密的内容必须用私钥才能解开 ,同样,私钥加密的内容只有公钥能解开。
所以HTTPS传输数据是用被密钥加密的密文和用公钥加密的私钥来保证数据安全的。
问:HTTPS加密,只用对称加密可以吗?
不行!无法保证安全性,因为只用对称加密即只用密钥对数据加密传输的话,如果传输途中,信息被第三方劫持,获取到密钥,那接下来的传输,第三方都可以通过密钥对数据解密从而得到原始数据
问:HTTPS加密,只用非对称加密可以吗?两次呢?
同样不行,如果只用非对称加密。客户端每次传输数据用公钥加密,服务端再用私钥解密这一方向看似安全,但当服务端发送数据用私钥加密,客户端收到用公钥解密时,第三方劫持到信息,但可能在此之前就获得公钥,因为首次服务端向客户端发送公钥是明文传输的。
而换个角度如果使用两次非对称加密,即两组公钥,两组私钥,客户端服务端各持一组,理论上可以达到安全,但实际HTTPS并未采用,因为非对称加密耗时十分大
证书:
单有混合加密技术,看似已经保证了传输的安全性,实则还是有漏洞,问题就在于服务器根本无法识别发送过来的公钥是否是自己的,如此以来在第三方劫持到数据后,自行再定义一个公钥B,并将公钥B传回给客服端,此时客户端就会利用该公钥B重新加密数据然后发送,此时第三方就可以通过自己的公钥B解密得到原始数据了。
证书就解决了这一问题,指定颁发的为CA机构,当网站使用HTTPS时,会向CA机构申请一个数字证书,证书中可以存放公钥、数据等信息 ,由此以来,服务端就可以通过证书来向客户端证明正确的公钥是哪一个,以此保证安全。
而对于证书,还有一些自己的放篡改机制,防止第三方获取到使用。
1.2.2 传输层协议
传输层的主要功能是为了实现"端口到端口"的通信,以确保一条数据发送到主机上后,能够正确的传递到对应的端口上
①UDP协议
UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法,但是UDP也有自己的缺陷,一旦进行通信,就不知道对方是否接收到数据了,很有可能会造成传输数据的丢包问题。
UDP的特点:
- 无连接:只需要知道目的ip和端口号就可以发送数据,无需建立连接
- 不可靠:没有一系列机制来应对传输数据时的丢包问题
- 面向数据报发送:应用层交给UDP什么样的报文,UDP就会发送什么样的,不会进行拆分,合并
- UDP一次传输的数据大小有限,最大64k
UDP的传输流程
UDP的适用范围:
由于UDP不属于连接型协议,所以具有资源消耗小。处理速度优的特点,因此经常使用与视频、音频通话传输中,因为发送的数据较多,偶尔丢包一两个不会产生太大影响
② TCP
因为上述讲到UDP的传输是不可靠的,经常会导致连接错误、数据丢包问题,针对这些问题规定了另一个传输层协议------TCP协议,TCP是一种面向连接、可靠的、基于字节流的传输层协议.
TCP的特点:
面向连接: 在传输数据是,要先建立起客户端与服务端的连接,才能进行数据传输
可靠的通信: TCP输出数据中,会基于内部的各种机制保证数据传输到目的端口
基于字节流: TCP传输数据是基于字节传输的,易于对数据的拆分与合并发送TCP的头部比UDP的开销要打,因为要存放更多的信息
源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60
6位标志位:
URG: 紧急指针是否有效
ACK: 确认号是否有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分
TCP如何保证数据传输的可靠性?
通过协议中的校验和序列号
确认应答机制: 发送数据报携带序号,响应的数据报携带确认序列号,发送端通过响应回的序列号就能得知,上一次数据报是否成功发送
超时重传机制: 如果主机A在一定时间内(单次传输的最大时间*2),没有收到主机B发来的确认数据报,就会触发超时重传,重新发送数据报
连接管理机制: 正常情况下,TCP经过三次握手才能建立连接,建立连接后才能发送数据,通过四次挥手才能断开连接
流量控制: 数据的发送较数据的接收来说非常快,当数据过多,接收端缓存区已满时,就会产生丢包,因此接收端在每次确定应答时,会将自己缓冲区的接收能力放在"窗口大小"中,由发送端控制发送数据的速度
**阻塞控制:**发送端在首次不清楚网络情况等影响数据接收速度时,不会之间将一个很大的数据发给接收端,而是先发送一小块数据,通过响应回的ACK确定传输情况,再决定传输的速度
TCP如何提高数据传输的性能?
**滑动窗口:**上面说确认应答时讲到,每一个发送的数据报,都要响应回一个ACK确认应答,发送端收到后再发送下一个数据报,这种机制性能就会很差,而滑动窗口就是无需等待应答可以一次发送多条数据
接收端响应 : 响应回ACK的下一个序号是多少,取决于成功接收到的连续数据报的最大序号,也决定了发送端下次数据报要发送的内容,正因为这种确认应答机制,保证了多条数据传输时的安全性
发送端 : 滑动窗口下滑传输下一份数据的依赖条件是接收到的ACK数据报,ACK数据报中下一个序号的最大值作为下一个窗口的起始位置
**滑动窗口也是一种实现流量控制的机制 ,**滑动窗口的大小(即每次发送数据的多少)由接收端的缓冲区决定,由此实现流量控制接收端响应 : 响应回ACK的下一个序号是多少,取决于成功接收到的连续数据报的最大序号,也决定了发送端下次数据报要发送的内容,正因为这种确认应答机制,保证了多条数据传输时的安全性
发送端 : 滑动窗口下滑传输下一份数据的依赖条件是接收到的ACK数据报,ACK数据报中下一个序号的最大值作为下一个窗口的起始位置
**滑动窗口也是一种实现流量控制的机制 :**滑动窗口的大小(即每次发送数据的多少)由接收端的缓冲区决定,由此实现流量控制
三次握手和四次挥手
三次握手