前言
- 作为一个日日夜夜工作新生代程序员,我依旧是感觉自己的知识储备虽然可以满足现在的工作所需,但依旧还是十分不足,人无完人,金无足赤。
- 在最近一段时间的工作中,我常常遇到各种各种的物联网设备,并且需要搭配使用不同的网络协议进行通信,现在我们公司的项目中,大部分都集成了一些设备监控联网模块,很多核心的业务指标也是实时监测而来的。
- 基于这段时间使用集成模块的工作经验,我决定好好的将以往关于网络协议的知识都回顾下,加油,想成为CTO的任同学!
计算机通信协议
-
接下来我将基于计算机网络五层模型,对常见的协议做以总结,并且将我以往关于网络协议内的博客总结到此篇中
-
首先通俗的来讲,网络协议是计算机之间进行通信的规则,这些规则分别隶属于不同的网络通信层次,本篇以计算机网络五层模型为例详细的介绍这些网络协议
-
计算机网络五层模型参考图如下:
- 应用层:为用户的应用进程提供网络通信服务,常见的协议有DNS协议,HTTP协议,HTTPS协议
- 传输层:负责两台主机之间的数据传输,将数据从发送端传输到接收端,常见协议有TCP协议,UDP协议
- 网络层:负责传输的地址管理和路由选择,在众多复杂的网络环境中确定一条合适的路径,常见的协议IP协议
- 数据链路层:负责设备之间数据帧的传送和识别,将网络层传递的数据报封装成帧,在处于同一个数据数据链路节点的两个设备之间传输,常见协议有ARP协议,MTU协议
- 物理层:负责光电信号的传递方式,实现相邻计算机节点之间比特流的透明传输
-
网络为什么要分层? 最直接的回答就是为了简化网络设计的复杂性,通信协议采用分层结构,各层之间既相互独立又相互协调工作,如此以来便达到的高效的目的
-
网络分层的最本质就是每一层独立的完成一个任务而不必考虑自己任务之外的实现,而因为不同的任务因此就有了每一层所对应的不同设备,实例到应用就是,物理层只需要关系0和1的光电信号如何传输,而对它所表达的内容毫不关心;再往上数据链路层只需要关心封装好的数据帧如何准确的送到对应的MAC地址的目的主机中,而不必关心数据报的具体内容和具体会通过何种方式光纤还是局域网…同理往上对于所有层)
应用层协议
- 应用层协议主要负责各个程序间的通信,发生网络传输一个数据时,先由应用层对数据按照对应的协议封装,然后交给下一层传输层,当经过一系列网络传输,数据达到接收端时,一层层的分用,最后一层再由应用层分用,最终得到数据。
DNS协议
- DNS协议是一个应用层协议,建立在TCP和UDP的基础之上,使用默认端口为53,其默认通过UDP协议通信,但如果报文过大是则会切换成TCP协议。
- 域名系统 (DNS) 的作用是将人类可读的域名 (如,www.baidu.com) 转换为机器可读的 IP 地址 (如,192.0.2.44),本质是通过DNS域名和IP地址的对应关系转换,而这种对应关系则保存在DNS服务器中
- 域名的解析过程:
- 第一步客户端向本地DNS服务器发起一个DNS请求报文,报文里携带需要查询的域名
- 第二步本地DNS服务器向本机回应一个DNS响应报文,报文里携带查询域名所对应的IP地址
- DNS域名解析的具体流程:
- 在本地缓存中查询,如果有则返回对应IP,如果没有将请求发给DNS服务器
- 当本地DNS服务器接收到查询后,先在服务器管理区域记录中查询,若没有再在服务器本地缓存中查询,如果没有将请求发送到根域名服务器
- 根域名服务器负责解析请求的根域部分,然后将包含下一级域名信息的DNS服务地址返回给本地DNS服务器
- 本地DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域的DNS服务器地址
- 按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应的IP地址信息本地DNS服务器将最终查询到的IP返回给客户端,让客户端访问对应主机
HTTP 协议
- HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
- HTTP协议是一个简单的请求——响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应
- HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准传输控制协议(简称TCP),客户端又称为用户代理程序,应答服务器端存储着数据,被称为源服务器.
- 通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。
- HTTP是传输协议:在客户端和服务器端通信时,规范了传输数据的格式,是万维网的数据通信的基础。
- HTTP必须先有请求,才会有响应,并且HTTP协议可以在任何互联网协议上,或其他网络上实现数据的传输通信
HTTP协议工作流程
- 客户端连接到Web服务器:
从客户端(浏览器)与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如:http://www.baidu.com。 - 发送HTTP请求:
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,请求报文由请求行、请求头部、空行和请求数据等4部分组成。 - 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。 - 释放TCP连接:客户端与服务器关闭连接
服务器在完成了数据请求的响应后,关闭与客户端的连接,为下一次响应客户端的请求做准备. - 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。然后浏览器对响应头以HTML语法进行格式化解析,并在浏览器窗口中显示.
HTTP协议有两种报文格式
- 请求报文:由客户端向服务器端发出的报文。
- 响应报文:从服务端到客户端的报文。
HTTP请求报文
-
HTTP请求报文格式:包含请求行、请求头、空行、请求体 四个部分
-
请求行:
- 请求行格式:请求方式 资源路径 协议/版本,例如:POST /web01/login.html HTTP/1.1。请求行必须在HTTP请求格式的第一行。
- 请求方式:协议规定7种,常用两种:GET和POST
- GET请求:将请求参数追加在URL后面,不安全。例如:login.htmlusername=tom&password=1234,URL长度限制GET请求方式的数据大小。GET请求没有请求体
- POST请求:请求参数显示请求体处,较安全。请求数据大小没有限制。只有表单设置为method=”post”才是post请求.其他的都是get请求。常见GET请求:地址栏直接访问、
<a href=””>、<img src=””> 等
-
请求头
- 请求头: 描述了客户端向服务器发送请求时使用的http协议类型,所使用的编码,以及发送内容的长度,referer,等等。
- 请求头也是用的键值对key:value
-
请求体
- 通常情况下,只有post请求方式才会使用到请求体,请求体中都是用户表单提交的数据,每一项数据都使用键值对key=value,多组值使用&相连。例如;username=tom&password=1234
HTTP响应报文
-
响应报文:从服务端到客户端的报文。
-
HTTP响应报文格式:响应行、响应头、空行、响应体 四个部分
-
响应行 :响应行包括HTTP协议/版本,状态码,状态码描述
-
响应头:响应头: 用来描述服务器回给客户端浏览器的content的一些描述,例如:返回的服务器地址,编码格式,响应内容,并且响应头也是用的键值对 key:value
- 响应体:响应体,就是服务器发送给浏览器的正文。
HTTP响应状态码
-
HTTP状态码即浏览器端发起HTTP请求后,服务器端对请求的响应状态
-
HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
-
1xx消息——请求已被服务器接收,继续处理
-
2xx成功——请求已成功被服务器接收、理解、并接受
-
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.1 200 OK 格式:协议/版本 状态码 状态码描述 状态码:服务器与浏览器用于确定状态的固定数字号码 200 :请求成功。 302 :请求重定向。 304 :请求资源没有改变,访问本地缓存。 404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。 500 :服务器内部错误。通常程序抛异常。
HTTP协议的特点
- 基于请求/响应模型的协议。 请求和响应必须成对;
- 先有请求后有响应。传输较快速,客户端向服务器发送请求,只需要传输请求方法和路径
- 灵活,HTTP允许传输任意类型的数据对象
- 无连接,每次连接只能处理一个请求,服务器处理完客户端请求,客户端收到响应后就断开连接
- 无状态,协议本身对事务处理没有记忆能力,如果后序连接需要之前发送的信息时就需要重传
- HTTP协议默认的端口:80 例如: http://www.baidu.com:80
- HTTP协议是无状态协议,多次请求之间相互独立,不能交互数据
HTTP1.0和HTTP1.1的区别:
- 长连接:HTTP1.0只支持浏览器与服务器的短连接,即每次请求都要重新建立连接,服务器无法记录每个历史请求,HTTP1.1支持长连接即在一次连接下,浏览器可以向服务器发送多次请求
- 增加Host字段:HTTP1.0中认为每个服务器都绑定这唯一一个IP,所有发送的请求头URL中没有host信息,而HTTP1.1在请求和响应中都支持了host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
- 缓存:HTTP1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)
- 错误提示:HTTP1.0中定义了16个状态码,对错误或警告的提示不够具体。HTTP1.1引入了一个Warning头域,增加对错误或警告信息的描述,并且还新增了24个状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
HTTP1.X和HTTP2.0的区别
- 增加二进制格式解析:HTTP1.X解析基于文本,而文本格式本身就具有多样性,很多场景下不方便,而引入二进制后,只有0和1组合,使解析更加方便也增强了健壮性
- 多路复用:即每个request都是是用作连接共享机制的,每个request都对应一个id,使一个连接可以有多个请求,再根据id将request归属到不同的服务端请求里
- header压缩:HTTP1.X中,每次传输都要写点header头,占用了大量数据,因此HTTP2.0在客户端和服务端各保存了一份header fields表,每次传输时只需传输header的更新信息,将header fields表更新即可实现header传输
- 服务端推送: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机构申请一个数字证书,证书中可以存放公钥、数据等信息,由此以来,服务端就可以通过证书来向客户端证明正确的公钥是哪一个,以此保证安全,而对于证书,还有一些自己的放篡改机制,防止第三方获取到使用
传输层协议
- 传输层的主要功能是为了实现“端口到端口”的通信,以确保一条数据发送到主机上后,能够正确的传递到对应的端口上
UDP协议
- UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法,但是UDP也有自己的缺陷,一旦进行通信,就不知道对方是否接收到数据了,很有可能会造成传输数据的丢包问题
- UDP协议的特点:
- 无连接:只需要知道目的ip和端口号就可以发送数据,无需建立连接
- 不可靠:没有一系列机制来应对传输数据时的丢包问题
- 面向数据报发送:应用层交给UDP什么样的报文,UDP就会发送什么样的,不会进行拆分,合并
- UDP一次传输的数据大小有限,最大64k
- UDP的传输流程
- UDP的适用范围:由于UDP不属于连接型协议,所以具有资源消耗小。处理速度优的特点,因此经常使用与视频、音频通话传输中,因为发送的数据较多,偶尔丢包一两个不会产生太大影响
TCP 协议
-
上述讲到UDP的传输是不可靠的,经常会导致连接错误、数据丢包问题,针对这些问题规定了另一个传输层协议——TCP协议,TCP是一种面向连接、可靠的、基于字节流的传输层协议
-
TCP协议的特点:
- 面向连接:在传输数据是,要先建立起客户端与服务端的连接,才能进行数据传输
- 可靠的通信:TCP输出数据中,会基于内部的各种机制保证数据传输到目的端口
- 基于字节流:TCP传输数据是基于字节传输的,易于对数据的拆分与合并发送
- TCP的头部比UDP的开销要打,因为要存放更多的信息
-
TCP与UDP的区别:
- UDP是无连接的,TCP是有连接的
- UDP是不可靠的,TCP是可靠的
- UDP面向数据报,TCP面向字节流
- UDP比TCP的传输消耗小,速度更快
-
形象的理解TCP和UDP的区别
网络层
- 网络层是基于数据链路层和传输层之间的第三层协议,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向传输层提供最基本的端到端的数据传送服务
- 网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。
IP协议
- IP协议是TCP/IP网络模型中的核心部分,他提供了一种分层的、无关硬件的寻址方式,可以在复杂的路由式网络中传递数据所需的服务
- IP协议可以将多个交换网络连接起来,在源地址和目的地址之间传输数据包,同时它还能提供数据的组装功能,以适应不同网络对数据包大小的要求
IP地址
- IP地址是互联网协议特有的一种地址,它是IP协议提供的一种统一的地址格式,IP地址为互联网的每个网络和每台主机分配了一个逻辑地址,以此来屏蔽物理地址的差异
- IP地址为32位地址,被分为4个部分,如192.168.3.253,
- IP地址又被划分为两个部分
- 网络号:前三部分用于标识网段,保证相互连接的两个网段有不同标识
- 主机号:由最后一部分组成,用于标识主机,保证处于同一网段的两台主机有不同的主机号通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同
- IP地址又被划分为两个部分
MAC地址
- MAC地址:物理地址,是用来标识网络中每个设备的,MAC地址是设备出厂之后就写死的
- 引入IP地址的目的:
- 在单个局域网网段中,计算机与计算机之间可以使用数据链路层提供的MAC地址进行通信。
- 如果在路由式网络中,计算机之间就不能用MAC地址实现通信,主要是因为在路由式网络中,数据只是经过一次简单的利用两个计算机之间的MAC地址建立通信,而是需要进行多次的通信,每次跳转都会体目的主机更近一步,经历都次跳转,最终找到目的主机实现通信,而这个过程中,要知道每次向哪跳转才能更接近目的主机,必须使用一种逻辑化、层次化的寻址方案对网络进行组织,这就是 IP 地址
IP协议数据报格式
IP协议的工作方式
- 网络分为同网段和不同网段,所以会分成两种方式:
- 同网段:
- 如果源地址主机和目的地址主机处于同一网段,则目的IP地址被 ARP协议 解析为MAC地址后,源主机会根据目的MAC地址直接将数据包发送给目的主机
- 不同网段:如果源地址主机和目的地址主机不处于同一网段,则数据包会经历多个过程最终发送给目的主机
1. 网关(一般为路由器)的 IP地址 被 ARP协议 解析为 MAC地址,根据该 MAC地址 源主机会将数据包发送到网关
2. 网关根据数据包中的网段ID找到目标网络,如果找到,将数据包发送给目标网路,如果没有则重复第一步发送到更高一级网关
3. 数据包经过网关发送到正确的网段后,目标IP被 ARP协议 解析为MAC地址,在根据该 MAC地址 将数据包发送给目标地址的主机
ICMP协议
- ICMP协议又叫控制报文协议,ICMP协议用于在IP 和 路由器之间传递控制消息,描述网络是否通畅、主机是否可达、路由器是否可用等网络状态,ICMP本身并不传输数据,但对于用户间数据的传递起着重要的作用
ICMP协议的作用:
- 在数据包从源主机传输到目的主机的过程中,会经历一个或多个路由器,而数据包在经过这些路由器传输过程中,可能会遇到很多问题,最终导致数据包没有成功传递给目的主机。
- 为了了解数据包在传输过程中在哪个环节出了问题,就需要用到ICMP协议,它可以跟踪数据包,并把消息返回给源主机
数据链路层
- 数据链路层是TCP/IP网络模型的第二层,基于物理层和网络层之间,数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自物理层来的数据可靠地传输到相邻节点的目标机网络层。
ARP协议
-
ARP协议是数据进行网络传输过程中,通过IP地址向MAC地址的转换,解决网络层和物理层衔接问题
-
引入ARP协议的目的:由于 IP 地址和 MAC 地址定位方式不同,ARP 协议成为数据传输的必备协议。主机发送信息前,必须通过 ARP 协议获取目标 IP 地址对应的 MAC 地址,才能正确地发送数据包。
-
ARP的工作流程:
- 如图展示的是同一网段下的两台主机,ARP的工作流程
- 主机A以广播的形式向该网段内的所有主机发送ARP请求,请求中包含了目的主机的IP地址
- 主机B接收到请求,通过请求中的目的IP地址发现自己是主机A要找的,返回响应,响应包括主机B的 MAC地址
ARP缓存:
- 在请求目标主机的 MAC 地址时,每次获取目标主机 MAC 地址都需要发送一次 ARP 请求,然后根据响应获取到 MAC 地址。
- 为了避免重复发送 ARP 请求,每台主机都有一个 ARP 高速缓存。当主机得到 ARP 响应后,将目标主机的 IP 地址和物理地址存入本机 ARP 缓存中,并保留一定时间。
- 只要在这个时间范围内,下次请求 MAC 地址时,直接查询 ARP 缓存,而无须再发送 ARP 请求,从而节约了网络资源
物理层
- 物理层,顾名思义就是用物理手段将两个要通信的电脑连接起来,主要用来传输0、1光电信号
域名补充
- 用于 TCP/IP 地址的名字被称为域名。w3school.com.cn 就是一个域名。
- 当你键入一个像 http://www.w3school.com.cn 这样的域名,域名会被一种 DNS 程序翻译为数字。
- 在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。
- 当一个新的域名连同其 TCP/IP 地址一同注册后,全世界的 DNS 服务器都会对此信息进行更新。
DNS域名解析
实例:在浏览器地址栏键入URL,就是当访问一个网页时,发送请求后会经历以下流程:
- 主机A:发送http://www.baidu.com网络数据报
-
DNS解析:将域名转换成对应IP地址(本机DNS缓存栈开始找—>逐级向上查找,如果根域服务器找不到,表示公网上没有该域名主机)
-
找到IP后:通过目的IP找到对应的目的MAC地址
-
根据目的IP计算目的主机是否和主机A处于同一网段
-
如在同网段:接通过ARP协议解析出对应的目的MAC,跳转到底9步
-
如不在同一网段:发送数据报到网关,现在ARP缓存表查找,通过网关IP查找MAC地址,找不到发送查询MAC广播数据报,最终返回网关自己的MAC
-
交换机转发:在MAC地址转换表中找到对应MAC交换机接口
-
路由器接收:分用数据报
-
途中的设备:与第7步同样操作如目的IP对应的MAC地址不是当前设备则继续重复该操作继续往更接近目的IP的路由发送
-
找到目的主机B,主机B的服务器开始接受分用请求,解析,最终组织响应
-
同上述操作一样,由主机B向主机A发送数据
-
最终主机A接受到数据报,经过分用,解析,最终得到响应
-