网络协议杂谈(一)
前言
本篇笔记记录各种网络协议的原理以及一些逻辑问题,同时也会对网络协议特征的记忆方法进行整理,其中包括使用各种网络协议时会遇到的各种问题及原理,实际操作和解决办法会在下一篇笔记中记录。
PS:本篇笔记的记录风格以及详细程度与其他笔记不同,完全依照某个人的思维喜好,不喜欢看的出门右拐,别来喷!
文章目录
网络协议概述
本节讲述计算机网络的相关概念,属于基础知识中的基础概念,这一部分在其他笔记中有过描述,所以不做赘述。较为详细的说明,文章链接如下:
网络层次概述
上一节中我们简单介绍了网络以及网络协议的含义,我们暂且可以这样理解。在说明技术的笔记中会说明更深层次的含义。
我们都知道网络在逻辑上被分为七层,并称之为OSI模型。然而这只是人为划分的一个不存在的模型。该模型依旧是TCP/IP四层协议。即:应用层、传输层、Internet层、网络接口层。
我们现在来对网络协议进行分层。
【注】:在上图中我们可以看到,网络一共被分为七层。在这七层中有很多网络协议,其实我们主要应用且研究的协议都在网络接口层、传输层中,应用层在服务器之间的数据传输会涉及到一些,Internet层中的协议理解即可。
接下来开始说明各层的主要功能。
各层网络的功能(TCP/IP)
本篇笔记中所说的各层是将网络层次按照TCP/IP四层协议进行分层,在TCP/IP四层协议说明完毕后才会说明OSI七层模型的相关概念。
网络接口层
根据上图中可以看出,该图中主要是计算机硬件中的分层。之前我们有说明过,数据在各个节点之间通过网络传输是以二进制格式传输的,有过基础的同学会知道,二进制(0与1)在计算机中是通过电路中的高低电平来表示,所以我们的数据在网络中通过媒介(网线?光纤?都可以)传递的时候其实是一种信号(电信号/光信号)。
网络接口层就是用来接收并简单处理这些二进制数据的层次。这一层将负责接收传递过来的数据并加以分组处理,等待上层的进一步处理。
Internet层
我们在JavaSE进阶(五)——网络编程概述中关于IP地址在国际上的分配问题,我们知道我们的IP地址随之公民日益增长的网络设备需求而逐渐的不够用,所以我们选择了使用公网IP与内网IP的方式来使IP地址利用率最大化。即通过这一层来判断两个计算机设备是否属于同一个子网。这套地址就是所谓的IP地址。
该层在使用的时候,需要通过公网IP找到对应的子网,并在子网中找到对应的计算机,并将数据包传递过来。
传输层
该层的作用很简单,主要是我们的计算机接收或者将要发送的数据是哪个应用程序(线程)来使用,也就是我们究竟使用哪个端口来操作该数据。
其实,该层的功能简单来说就是建立端口到端口的通信。对比Internet层与传输层我们可以发现,前者完成的是设备到设备的通信,后者完成的是端口到端口的通信(即线程与线程之间的通信)。我们的程序在执行的过程中就是通过一个一个线程来操作计算机中的数据。所以我们所谓的端口到端口的通信指的就是程序与程序之间数据的相互传输。
该层在数据传输的过程中,除了需要Internet层的相关操作参数以外,还需要端口号作为参数来操作数据包。
应用层
该层完成的是更加复杂的功能,我们的程序与程序之间的连接、断开以及连接的时长都由该层完成;同时还会对接收或者发送的数据进行对应格式的转换,具体请参考JavaSE进阶(五)——网络编程概述中对于MIME类型的描述,我们的二进制数据可能是音频、图片、甚至是视频,我们将对应的数据从设备固有格式转换为数据的对应格式。
补充说明,MIME类型的诞生源于互联网的发展。最早的互联网只被用来发送邮件,而没有发送现在这么多种类型数据包的功能,但是互联网已经建立完成,我们无法更改互联网的架构,所以我们在计算机中加入了一些规则。任何数据都会被转换为二进制进行传输,所以在传输过程中不会出现问题,那么我们就在数据包的解析中做一套规则,按照规则进行封装以及解析,这样就完成复杂媒体数据包的传输问题。
在这一层中,我们会了解到很多网络协议,这些网络协议经常出现在面试题中,这些理论为了更深刻理解网络以及应对以后的面试。
PS:记住,大部分互联网公司已经没有懂得专业技术的人来做面试官了,他们的面试题都配着一套标准答案,技术只有核心特性以及规则或规范,除此之外哪有标准答案。
OSI网络协议各层介绍
OSI网络协议中对于网络的分层在实际中是不存在的,它的出现源自于TCP/IP四层协议并不能满足我们现有的程序的支持,所以我们便认为规定了一个机遇TCP/IP四层协议的规则。
接下来根据TCP/IP四层协议的分层来具体说明一下OSI七层协议的各层功能。
网络接口层
上文说过,网络接口层是属于计算机网络硬件中的层次。在OSI协议中,网络接口层中细分为两个层次:物理层以及数据链路层。
物理层
该层主要完成的是将计算机网络中的计算机等设备通过物理手段(硬件)连接起来,连接方式一般通过光缆、电缆、无线电波、双绞线(电话线,现在的电话线其实也是光纤)。将计算机等设备连接后,通过连接的媒介来传递数据(数据包)。官方解释:物理层负责将设备连接并规定了电气特性。说白了就是通过某种物理手段将设备连接并通过该手段传递以二进制(01)为格式的数据包、
数据链路层
作为同属于物理接口层中的一个理论层次,它的功能与硬件层次没有什么太大的区别。由于单纯的二进制数据不具备任何意义,所以我们在将数据封装为二进制数据包的时候,就人为定义了一些规则,规定二进制数据中的一些位置的数据具有一些特殊的含义。而数据链路层就是按照这个人为定义的规则来对二进制数据进行分组,并对二进制数据中具有特殊含义的电信号进行相应处理。
简单来说,数据链路层就是对于二进制数据的分组,使其成为有意义的数据。
Internet层
网络层
由于网络层仅仅是对IP地址的操作,与TCP/IP一样(也没办法进行细分了,如果IPV6与IPV4之间的关系出现一些其他问题可能会有其他的分层)。故该层在此不做赘述。
传输层
传输层
该层也是单纯的端口对端口的通信,如果民用普及的计算机没有大变革(比如打破了冯·诺依曼结构)就不会有什么大变化。
【注】:计算机有两种结构,一种为冯·诺依曼(也成普林斯顿结构),另一种是哈佛结构(其实还有一种改进型哈佛结构)。这二者之间的区别主要体现在数据存储与地址空间是否分开,前者放在一起,后者分开。
详细说明一下(不说过深的知识点),哈佛结构将程序与存储在计算机中的数据分开存放、处理。其认为,如果程序与数据放在一起,首先是安全性以及系统稳定性可能会受到影响,如果我们尝试修改系统程序很有可能会造成系统崩溃,普通民用计算机可能会选择重装系统来将系统恢复到可以正常使用的状态,代价是可能会出现数据丢失等问题(没遇到丢失学习资料的别杠,没遇到并不代表不存在!),如果是有特殊用途的计算机出现这种情况,很可能是毁灭性的问题。
冯·诺依曼结构认为程序也是一种数据,我在JavaSE进阶(十)——I/O流中对文件、数据等概念进行过说明:万物皆文件,我们的程序也是被编码成一个一个文件存放在电脑中,所有数据存储的方式都是二进制的方式持久化在外存中。所以,该结构的计算机将程序与数据放在一起。
总结一下,哈佛结构其实也没有完全打破冯·诺依曼结构,所以我们还是认为当前计算机基于冯·诺依曼结构。可能有些版本资料认为当今计算机已经不是冯·诺依曼结构,只能说仁者见仁,智者见智。大家没必要为了这种问题而喷,学术讨论就好。
应用层
会话层
在该层中提供的是数据通信的最基本操作,包括:建立连接、断开连接等相关的管控。比如我们使用JavaI/O流时,读取文件放入缓存中,然后将读取的数据写入外存中,这就是一个连接的过程。在此过程中,我们通过流(通道)的方法将数据在两个端口中传输,这个时候便开始建立两个端口之间的连接;当传输结束后,我们便将流(通道)关掉,至此两个端口之间的连接便断开了。
需要注意的是,建立连接是为了通信,原则上通信过程中不会断开连接(可以手动断开);当通信结束后,该链接如果没有人为规定或系统定义的其他操作,那么该连接会断开。
表示层
我们可以可以通过名字来思考问题。表示,顾名思义,我们将某种东西方法表面,展示给他人看。说到这里可能会有一些迷惑。这样说,我们把表示层对应的角色明确一下。直观观测表示层的是各种软件,比如视频播放器、图片浏览器、音乐播放器等,这些软件是按照一定的规范将数据解析。
也就是说该层的处理流程对用户是透明的,它仅仅是将数据包进行解析,把这些通过数据链路层中分组处理的数据再次按照规则处理。
应用层
这层是我们现今计算机网络(基础)最高的一层,这一层次它主要做的是嘴原本的网络通信行为。之前说明过,互联网最早的时候仅仅是为了发送邮件的,随着我们的需求日益增长,我们出现了越来越多的专门面向各种业务的网络协议,在这一层中我们包括HTTP、SSH、FTP等协议。HTTP协议一帮是在建立连接的时候使用;SSH协议在一些远程连接以及安全认证的时候会用到该协议;FTP协议在基本网络协议中对于文件传输来说还是比较强大的。
网络协议的相关概念
对于计算机网络协议中的众多协议,我仅仅会对一些现在依旧在使用或者具有代表意义的协议进行说明。
Internet层
IP协议
在这里我们将对IPV4以及IPV6协议进行解释说明。在解释说明之前需要注意几个要点。
首先,IP协议是一种无连接协议,与UDP有相似的地方;
其次,IP协议中包含一定补充长度的无意义数据(其特征可以理解为,固定了存储空间大小,但是没存满的数组一样存在默认值);
最后,IP地址中有些也并不是很重要(复杂且对于现阶段来说没有研究意义)的部分,对于这部分会说明它是什么,但是不会有详细解释。
接下来开始详细说明:
【注】:上图为自己手绘,文字较为潦草,凑合看。
图中我们将IPV4数据报分为了七行,仅为了方便理解,其物理存储与我们之前讲过的多维数组一样,实际是连续的地址空间(就那么一长条)。
IPV4数据报共分为两部分,分别为首部以及数据部分。其中数据部分存储的就是IP协议传送的数据。首部中包含多个部分,接下来我们来说一下数据报中首部的各个部分的含义及格式:
-
版本:即版本号,占四位二进制数据,我们通过IPV4进行通信的时候,发送方与接收方的IP协议版本必须一致,比如IPV4的的版本号即为4(0100);
-
首部长度:代表着数据包首部的长度,同样占四位;四位四进制数表示的最大值为15(1111);因为首部长度的最小单位长度为32位,即4字节,所以首部长度的最小值为5(0101);通过上图我们可以发现,首部数据长度一定是4字节(32位)的倍数,如果存在无法满足该倍数要求的数据长度则需要后续无意义数据填充,使其符合这个规则;
-
区分服务:区分服务可以不去管它,该块占用8为,即1字节;
-
总长度:代表该IPV4数据报的首部加数据部分的长度,该部分占16位,其表示长度最大为65535,如果IPV4数据报超出这个长度将会采用分片方式来传输。
-
标识:占16位,他的功能就是在IP数据报中有一个存储器,当我们发送一个数据报的时候,便将标识位的数据+1,用以区分数据报是否重复发送;当然,它还有一个功能,就是当我们对数据报进行分片时,标识位的数据就会赋值给所有当前数据报的分片,用以表示这些数据包应该拼接起来使用;
-
标志:注意,这一部分的名字与标识要区分开;标志占3位,其功能为确定当前数据报是否为分片数据报以及判断这个数据报是否为最后一个数据报,其中:
- 最低位(MF):为1时,表示后面还有若干个数据报;为0时,表示是最后一个数据报;
- 中间位(DF):与MF一样表示布尔值,为0时表示进行分片操作;
-
片偏移:表示分片的数据报在原数据报中的相对位置。前文说过,IP协议为无连接协议,那么我们发送的数据包顺序是否正确是无法保证的,所以我们会在数据报中将顺序表示好,等分片的数据报传送完毕后进行拼接复原;
-
生存周期:占8位,该部分规定了数据报在网络中的声明周期,其本质为跳数(即可以通过多少个路由器的转发);
-
协议:占8位,表明该数据报携带了哪种协议;
-
首部校验和:这一块占有16位,其校验方式比我们熟知的奇偶、海明、循环等校验简单的多。在发送端将数据首部数据全部取反求和放入校验位中,接收方将所有首部数据与校验和取反求和,如果结果为0,则表示数据报没有损坏;如果结果不为0,则丢弃该数据报;
-
IP源地址:占32位,表示该数据报的发送源地址;
-
目的地址:占32位;
-
可变部分:
- 可选字段:可以增强IP数据报的功能,比如携带一些人为规定的参数;
- 填充:前文说过,如果总体长度不足规定,则通过填充部分填充一些无意义的数据来保障符合规定。
传输层
TCP协议
对于TCP协议中,大家最熟悉的就是三次握手,四次挥手;其具体的连接方式在另一篇笔记中有过描述:链接如下:
接下来说明一下TCP协议的组成:
TCP数据格式在大体上与与IPV4协议没有特别大的区别,那么区别就出现在内部:
-
源端口:这一部分占16位,其目的代表着发送端的地址;
-
目的端口:与源端口异曲同工,代表接收端的地址;
-
序列号:表示该TCP数据报的相对位置,供接收端对数据进行排序和组合;
-
确认号:前文说过TCP的三次握手,其中接收到数据并返回一个ACK信号表示接收数据成功的部分由确认号来完成;
-
头部长度:占有4位,表示TCP头部有多少个32位(4字节);TCP协议报与IPV4数据报的最小单位一致,都是4字节的倍数;
-
保留位:保留位包括保留+CWR+ECE,一共6位,暂时没有意义;
-
六个标志位:
- SYN(建立联机):与ACK信号配合使用;请求连接表示为SYN=1,ACK=0;服务端相应时SYN=1,ACK=1;最后客户端再以ACK响应连接请求,至此三次握手完成;
- ACK:ACK是在数据报中的标志,与SYN配合使用,表示布尔值;
- PSH:表示推送,当数据包被接收端接收后,立即传送给应用程序处理,不放在缓存区中;这个意义就是与IPV4分片的意义差不多;
- FIN:表示当前的数据包都传送完毕了,但是端口依旧被连接,等待后续数据包传送;
- RST:如果FIN标志传递到目标端口后,返回了一个RST标志,表示该计算机此端口没开放或不可用;如果没有返回RST端口,则表示该计算机的此端口可以使用;该标志也可以用来断开连接或拒绝错误包或非法包;
- URG:此标志表示激活紧急指针域(或紧急指针域有效),用以通知线程尽快处理数据报并保持TCP连接不要中断;
- MSS:表示TCP数据报的最大值,只出现在SYN报文段中,如果超过了MSS规定的最大值就需要分片传送(MSS规定的值在不需要分片的时候越大越好);
-
窗口大小:表示源主机最大能接受多少字节的数据报;
-
TCP校验和:与IPV4的校验相同,由发送端发送并存储,接收端进行校验;
-
紧急指针:就当做是发送紧急数据或防止数据丢失的行为;
-
TCP选项:表示数据报文中时间戳、最大报文长度等选项的表示,最少存在一个字节;
UDP协议
UDP协议与IP协议一样都是无连接协议,但是UDP与IP协议有很大的不同。UDP是一个公认的流氓协议。
UDP在传送数据的时候不需要建立连接,就像我们用手机发送短信,发送方只需要将数据发送出去,不需要接收端实际接收到消息。其主要特点是效率高,数据长度在64k(65536字节),数据传输不安全,容易丢包;
举一个具体的例子:一个同学在前一天晚上吼了大半夜的***NB,所以第二天迟到了,并且在课堂上昏昏欲睡。这趟课上老师一直在讲课,结果老师说了三句话只听到了两句话,并且由于精神状态不好,这两句话中有一句半听错了……这就是UDP协议。
接下来说一下UDP协议数据报的结构:
- 源端口:表示发送端的地址;
- 目的端口:接收端的地址;
- 总长度:表示UDP数据报的总体长度,最小为8字节(64位);
- 检验和:检验数据报是否有错,有错就会被丢弃;
- 数据部分:可以有也可以不存在。
会话层
DNS
DNS就是一个解析设备地址的服务器。地址的表现形式有什么呢?一个是域名,另一个是IP地址,域名和IP地址是相互绑定的,也可以理解为域名是IP地址的一个名字,记住域名比记住IP地址要容易的多。
比如我们访问CSDN可以在地址栏上输入:https://www.csdn.net。这样就会将这个域名通过DNS解析找到对应的地址来访问我们的CSDN。
在具体解释DNS之前需要先了解几个概念:
域名等级
域名分为顶级域名(一级域名)、二级域名、三级域名等;在这里需要注意的是,www是我们主机名字,有些时候我们成www也是域名,或者称之为万维网,这些我都不想解释。
域名是按照 . ** 来划分的,比如百度baidu.com**,在这个域名中,我们的baidu就是一个二级域名,我们的其他服务,比如tieba.baidu.com ,表示的就是tieba隶属于baidu这个域名的统一管理。说到这里我们发现后面还有一个com,那么那么我们可以理解,baidu等域名都是隶属于com管理的,和com同等级别的还有**.net,.edu,.cn**等,这些域名同属于根域名管理,根域名由 . 表示,所以完整的域名输入中,最后需要加上根域名的表示符,但是一般来说我们是忽略掉的。
表示层
FTP
FTP协议是基于TCP协议的一种文件传输协议,共包含两个端口,一般默认为20端口(数据端口)与21端口(控制端口),FTP协议其分为两种模式:主动模式与被动模式;
-
在主动模式中,我们使用Socket来控制21端口连接服务器并传送一个端口给服务器,客户端此时在指定端口监听,服务器连接到我们客户端的指定端口,然后传输数据;
-
被动模式中,我们使用Socket控制21端口与服务器连接,服务器会给我们返回一个端口,我们的数据是与返回的端口对接。
HTTP
该协议为超文本传输协议,该协议基于请求与响应、无状态的应用层协议,通常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议。设计HTTP的初衷是提供一种发布和HTML页面的方法。
上面的DNS服务的说明中,我们得知DNS会将我们的域名通过查找的方式来相应的IP地址,最终我们是通过IP地址来找到目标副武器的。
HTTP协议是应用层的主要协议。在文章开篇就解释过,网络自始至终都是TCP/IP四层结构,OSI只是一个逻辑概念,所以这四层中的应用层在很久之前只有HTTP协议。
至于接下来需要解释的HTTPS协议则是基于安全考虑出现的衍生品。
HTTPS
是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。SSL 协议位于TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。
SSL协议分为两层,分别为:SSL记录协议以及SSL握手协议;SSL记录协议建立在TCP协议之上,为数据提供封装、压缩、加密等基本安全操作;SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
HTTPS协议特点:
- 数据保密性:保证数据内容在传输的过程中不会被第三方查看。就像快递员传递包裹一样,都进行了封装,别人无法获知里面装了什么 。
- 数据完整性:及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收 。
- 身份校验安全性:保证数据到达用户期望的目的地。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方,通过身份校验来确保送对了地方 。
HTTPS协议的安全主要基于上述三个特点,这就像特点中举的例子。数据包就像是邮包,我们通过邮寄双方的信息来标注源地址以及目标地址;同时重要文件上还有封条,如果封条破损我们可以知道邮包的真实性。
SSL协议
SSL协议最主要的是SSL记录协议和SSL握手协议,SSL协议基于TCP协议之上,应用层协议之下。具体结构如下:
HTTP与HTTPS的区别
- HTTPS需要CA证书,现在没有CA证书的HTTP链接在浏览器中会被标注为不安全;CA证书免费的较少,多数需要支付一笔费用;
- HTTP协议是明文传输数据;HTTPS是通过SSL加密传输;
- HTTP连接是一种无状态的连接,而HTTPS的连接是SSL + HTTP够贱的需要安全认证及数据加密的传输。
应用层
本小节会将SMTP协议与POP3协议放在一起说明,这两个协议正巧是在相互配合,SMTP负责发邮件,而POP3负责收邮件。
SMTP
官名:简单邮件传输协议;该协议是一种可靠、高校的传输邮件协议,基于C/S架构,如果在计算机中使用的话需要安装相关的支持软件(现在基于浏览器的邮件发送协议不属于SMTP);该协议默认端口为25。
SMTP协议也是基于TCP协议的,所以在连接过程中,会经过三次握手后再进行连接。三次握手之后将会进行正文的发送。
POP3
POP3协议是邮局协议版本,是用来接收邮件的协议。其本质是将存储在邮件服务器上的邮件离线下载到本地;同样基于C/S架构,默认端口为110。
该协议返回消息只有两种,+OK为正响应;-ERR为负响应
总结
本篇笔记记录了一些基本网络协议的概念和结构,其中有许多协议并没有涉及,并不是不重要,而是有些没有必要说,因为它的本质可能不需要了解,下一篇笔记的记录要点将是通过技术来实现一些网络连接。