从网络到分布式-01网络协议原理
一,网络协议定义
百度百科:网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。 例如,网络中一个微机用户和一个大型主机的操作员进行通信,由于这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识。为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。当然,对于不相容终端,除了需变换字符集字符外还需转换其他特性,如显示格式、行长、行数、屏幕滚动方式等也需作相应的变换。
网路协议三要素:
(1) 语义。语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
(2) 语法。语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。
(3) 时序。时序是对事件发生顺序的详细说明。(也可称为“同步”)。
人们形象地把这三个要素描述为:语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
通过三要素,我们可以更加深入的理解网络协议的作用。
二,OSI模型
1,定义
百度百科:开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。定义于ISO/IEC 7498-1。
由名字可以知道,OSI是一个通信的参考模型。模型即有一定规则的范本,所以,OSI我们可以理解为是:国际标准组织提出的一个网络通信的一个可以参考的范本,你可以参考我的模型,但你也可以自己搞一个。
二,OSI的七层模型
应用层:为应用程序提供服务; FTP(文件传输协议)、SMTP(电子邮件传输协议,建立在FTP协议上)、HTTP(超文本传输协议)、 DNS(域名系统协议)等
表示层:数据格式转换,数据加密; CSS、HTML、GIF
会话层:建立、维护和管理会话; HTTP、SSH、SMTP、FTP
传输层:建立、维护和管理端到端的连接,控制数据传输的方式; TCP/UDP
网络层:数据传输线路选择,IP地址及路由选择; IP/ICMP
数据链路层:提供介质访问和链路管理; ARP/RARP/MAC
物理层:以二进制形式在物理媒介上传输数据。 DSL
注意:从传输层开始,就是内核态的操作了。上面的都是在用户态进行的
五层模型:
1,协议的理解
协议,我的理解就是开放、友好的潜规则。即我们大家做一件事情,通过我们协商好的方式、途径,来实现信息的交换。
2,linux命令发送http请求理解协议
2.1 建立连接
1,cd /proc/$$/fd
2,exec 8<> /dev/tcp/www.baidu.com/80
执行完上述步骤,会建立一个socket连接(连接时间比较短,容易断开)
2.2 编写http协议请求头格式并发送请求
echo -e 'GET / HTTP/1.0\n' >& 8
2.3 查看相应数据
cat 0<& 8
这些就是协议,按照一定的方式进行数据的组装,就是协议的实现。
3,各层的介绍和作用
3.1 应用层
定义:应用层,即面向应用的层级,用户可直接操作的层级。可以通过浏览器按照一定的协议进行通信,用户可直接操作协议的内容,但不能改变格式。
主要协议:http协议,超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。
应用层主要的作用:为了应用想要的数据,创建符合协议的字符串,并发送给传输层。
3.2 传输层
定义:传输层是整个网络体系结构中的关键层次之一,主要负责向两个主机中进程之间的通信提供服务。由于一个主机同时运行多个进程,因此运输层具有复用和分用功能。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控制、分段/重组和差错控制来保证数据传输的可靠性。传输层的一些协议是面向链接的,这就意味着传输层能保持对分段的跟踪,并且重传那些失败的分段。
主要协议:TCP/UDP
3.2.1 TCP协议
定义:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
扩展:TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
理解:由于TCP不存在连接的概念,只存在请求和响应,请求和响应都是数据包,它们之间都是经过由TCP创建的一个从客户端发起,服务器接收的类似连接的通道,这个连接可以一直保持,http请求是在这个连接的基础上发送的;
在一个TCP连接上是可以发送多个http请求的,不同的版本这个模式不一样。
在HTTP/1.0中这个TCP连接是在http请求创建的时候同步创建的,http请求发送到服务器端,服务器端响应了之后,这个TCP连接就关闭了;
HTTP/1.1中可以以某种方式声明这个连接一直保持,一个请求传输完之后,另一个请求可以接着传输。这样的好处是:在创建一个TCP连接的过程中需要“三次握手”的消耗,“三次握手”代表有三次网络传输。
如果TCP连接保持,第二个请求发送就没有这“三次握手”的消耗。HTTP/2中同一个TCP连接里还可以并发地传输http请求。
三次握手,四次挥手:
作用:在服务器与服务器之间建立一次连接
三次握手的过程:
自我理解:
- 客户端发送一个请求的信息给到服务器;
- 服务端确认是否可以连接,并返回信息给服务端;
- 由于请求和响应是客户端和服务器相互发送信息,因此当客户端收到服务端确认的消息后,也需要告知服务端,我已经收到消息了。此时,就完成了双方的确认,可以建立连接了。
- 当建立连接之后,应用层拿到IO之后,才会进行线程和内存等资源的开辟。
四次挥手的过程:
自我理解:
- 客户端发送一个释放连接的请求到服务器;
- 服务器收到请求后,返回一个确认收到的信息,但此时还无法立刻释放所有资源;
- 当服务器释放该客户端的所有资源后,再发送一个资源释放完毕的信息给到客户端;
- 客户端收到资源释放完毕的请求后,发送一个信息收到的请求,到此,连接断开。
**精确解释,以下摘抄自AhuntSun博主,内容详细深刻:
三次握手:
其中比较重要的字段有:
(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。
需要注意的是:
不要将确认序号Ack与标志位中的ACK搞混了。确认方Ack=发起方Seq+1,两端配对。
所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。以下为客户端主动发起连接的图解:
握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”:
(1)首先客户端向服务器端发送一段TCP报文,其中:
- 标记位为SYN,表示“请求建立新连接”;序号为Seq=X(X一般为1);
- 随后客户端进入SYN-SENT阶段。
(2)服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段TCP报文,其中:
- 标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”(即告诉客户端,服务器收到了你的数据);
- 序号为Seq=y;
- 确认号为Ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值;
- 随后服务器端进入SYN-RCVD阶段。
(3)客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段。并返回最后一段TCP报文。其中:
- 标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了);
- 序号为Seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值;确认号为Ack=y+1,表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;
- 随后客户端进入ESTABLISHED阶段。服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。
- 结束SYN-SENT阶段,进入ESTABLISHED阶段。
在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。
此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。
为什么要进行第三次握手
为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
由于网络传输是有延时的(要通过网络光纤和各种中间代理服务器),在传输的过程中,比如客户端发起了SYN=1创建连接的请求(第一次握手)。
如果服务器端就直接创建了这个连接并返回包含SYN、ACK和Seq等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直没有接收到服务器返回的数据包。
客户端可能设置了一个超时时间,时间到了就关闭了连接创建的请求。再重新发出创建连接的请求,而服务器端是不知道的,如果没有第三次握手告诉服务器端客户端收的到服务器端传输的数据的话,
服务器端是不知道客户端有没有接收到服务器端返回的信息的。
这样没有给服务器端一个创建还是关闭连接端口的请求,服务器端的端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。那么服务器端上没有接收到请求数据的上一个端口就一直开着,长此以往,这样的端口多了,就会造成服务器端开销的严重浪费。
四次挥手
所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。以下为客户端主动发起释放连接的图解:
挥手之前主动释放连接的客户端结束ESTABLISHED阶段。随后开始“四次挥手”:
(1)首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:
- 标记位为FIN,表示“请求释放连接“;
- 序号为Seq=U;
- 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。
注意:这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文。
(2)服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,其中:
- 标记位为ACK,表示“接收到客户端发送的释放连接的请求”;
- 序号为Seq=V;
- 确认号为Ack=U+1,表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值;随后服务器端开始准备释放服务器端到客户端方向上的连接。客户端收到从服务器端发出的TCP报文之后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段
前"两次挥手"既让服务器端知道了客户端想要释放连接,也让客户端知道了服务器端了解了自己想要释放连接的请求。于是,可以确认关闭客户端到服务器端方向上的连接了
(3)服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文,其中:
- 标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。
- 序号为Seq=W;
- 确认号为Ack=U+1;表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值。
- 随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。
(4)客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文,其中:
- 标记位为ACK,表示“接收到服务器准备好释放连接的信号”。
- 序号为Seq=U+1;
- 表示是在收到了服务器端报文的基础上,将其确认号Ack值作为本段报文序号的值。
- 确认号为Ack=W+1;表示是在收到了服务器端报文的基础上,将其序号Seq值作为本段报文确认号的值。
- 随后客户端开始在TIME-WAIT阶段等待2MSL
为什么要客户端要等待2MSL呢?。
服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。
客户端等待完2MSL之后,结束TIME-WAIT阶段,进入CLOSED阶段,由此完成“四次挥手”。
后“两次挥手”既让客户端知道了服务器端准备好释放连接了,也让服务器端知道了客户端了解了自己准备好释放连接了。于是,可以确认关闭服务器端到客户端方向上的连接了,由此完成“四次挥手”。
与“三次挥手”一样,在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性,一旦出现某一方发出的TCP报文丢失,便无法继续"挥手",以此确保了"四次挥手"的顺利完成。
*引用完毕
需要注意:
1,在传输控制层,作用虽然是建立连接,但也只是在创建握手包,确认包这些包,并不能真正的建立连接,建立连接是物理层做的事情;也就是说三次握手和四次挥手都是有传输层和下面几层一起实现的。
2,三次握手>数据传输>四次分手,整个过程不可分割,是一个最小粒度;
偷懒策略:当三次握手最后一次确认时,客户端已经连同数据一起发送过来了,省了一次请求的过程。
3.3 网络层
网络层主要功能
网络层为建立网络连接和为上层提供服务,应具备以下主要功能.
1. 路由选择和中继.
2. 激活,终止网络连接.
3. 在一条数据链路上复用多条网络连接,多采取分时复用技术.
4. 差错检测
5. 排序,流量控制.
6. 服务选择.
7. 网络层管理.
8.分段和合段
9.流量控制
10.加速数据传送
11.复位
网络层在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向传输层提供最基本的端到端的数据传送服务。网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括路由选择、拥塞控制和网际互连等。
网络层四维度:IP 子网掩码 网关 域名解析器
IP:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP协议:IP协议是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。各个厂家生产的网络系统和设备,如以太网、分组交换网等,它们相互之间不能互通,不能互通的主要原因是因为它们所传送数据的基本单元(技术上称之为“帧”)的格式不同。IP协议实际上是一套由软件程序组成的协议软件,它把各种不同“帧”统一转换成“IP数据报”格式,这种转换是因特网的一个最重要的特点,使所有各种计算机都能在因特网上实现互通,即具有“开放性”的特点。正是因为有了IP协议,因特网才得以迅速发展成为世界上最大的、开放的计算机通信网络。因此,IP协议也可以叫做“因特网协议”。
子网掩码:子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
子网掩码和IP地址的计算:子网掩码一般是255.255.255.0,两者的计算就是两者的二进制进行与运算,如果子网掩码是255.255.255.0,IP的网络地址就是前三段,主机地址就是最后一段。
网关:网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同层--应用层。
大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway) [1] 就是一个网络连接到另一个网络的“关口”。也就是网络关卡。
网关(Gateway)又称网间连接器、协议转换器。默认网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。
【说明:由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP!】
在OSI中,网关有两种:一种是面向连接的网关,一种是无连接的网关。当两个子网之间有一定距离时,往往将一个网关分成两半,中间用一条链路连接起来,我们称之为半网关。
按照不同的分类标准,网关也有很多种。TCP/IP协议里的网关是最常用的,在这里我们所讲的“网关”均指TCP/IP协议下的网关。
那么网关到底是什么呢?网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)与主机的IP 地址作 “与” 运算的结果不同判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络A向网络B转发数据包的过程。
域名解析器:即把人类容易理解的网络地址,转换为数字IP地址。
3.4 网络层寻址过程
网络层有一个寻址机制-下一跳机制。现今针对于同一网段的电脑,内部都有这个网段所有电脑的IP地址的,但不会存储其他网段的IP地址。同一网段的IP地址可以通过交换机进行信息的发送,但如果是不同的网段,则需要下一跳机制进行寻址,电脑把IP地址发送给网关,网关进行IP路由,找到下一个网段;下一个网段中,通过交换机,就可以找到目的电脑,把数据发送过去。
下一跳如何选择
在linux服务器输入查看路由表的命令:
route -n;
通过上面的路由表如何实现找到百度的地址呢?
-
在ping百度域名后,得到访问的百度的IP地址;
-
拿着百度的IP地址与子网掩码进行计算,得到实际的网段和主机地址;
-
把计算后的网段与destination的网段匹配,按最大程度的规则进行匹配;
-
匹配上后,就知道需要通过哪个网关把这个请求给发送出去了。
至于请求发出去后,如何通过150.2找到相应的百度的IP就不是网络层要做的事了。
如上,只有最后一个可以匹配上,匹配上后,就知道实际发送出去的网关是192.168.150.2。而这个网关就是默认网关。
网关地址为0.0.0.0的含义:即目的地址是同网段的,不需要通过网关就可以找到目的地址。
为什么网关0.0.0.0匹配子网掩码是255.255.255.0?
因为任何一个IP地址和255.255.255.0这个子网掩码进行匹配后,一定至少是客户端服务器是同网段的(计算得来),既然是同网段的,那么就不需要网关的特别转发了。所以,网关网关0.0.0.0匹配子网掩码是255.255.255.0。
总结:tcp/ip协议是基于下一跳机制,ip地址是端点间的地址,mac地址是节点间的地址。网络的寻址,就是不断的变换mac地址,而不再变动目标地址和目标端口号。而这一层就是在链路层。
查看链路层下层地址:arp -a
路由器:只有三层模型(网络层-物理层)
交换机:只有二层模型(链路层-物理层)