网络那些事【上】

2,340 阅读26分钟

今天的内容可能枯燥,但都是整理出来的干货【都把大学的计算机网络课本拿出来啦-哈哈哈】,在提高能力的路上从不会一帆风顺,Go for it!!!

为了更好地促进互联网络的研究和发展,国际标准化组织ISO制定了网络互连的七层框架的一个参考模型,称为开放系统互连参考模型,简称OSI/RM(Open System Internetwork Reference Model)。OSI参考模型是一个具有七层结构的体系模型。发送和接收信息所涉及的内容和相应的设备称为实体。OSI的每一层都包含多个实体,处于同一层的实体称为对等实体。同样也有机构分为TCP/IP的体系结构以及经常被念叨的五层结构如下:

  • OSI的七层协议体系结构的概念更清楚,也比较完整,但是因为复杂又不太使用
  • TCP/IP是四层体系结构,应用层,运输层,网际层以及网络接口层,但是网络接口层并没有太多的实际内容
  • 所以在我们使用总采取折中的办法,综合了OSI和TCP/IP的优点,采用一种五层协议的体系结构

一、OSI各层的主要功能

1.1 物理层【Physical Layer】

在OSI的参考模型中,物理层参考模型的最底层。

物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。数据单元是比特

物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化。它负责在计算机之间传递数据位,为在物理媒体上传输比特流创建规则。该层定义电缆如何连接到网卡上。概括来说还有一个功能:提供为建立、维护和释放物理连接所需要的机械、电气、功能与规程的特性。

物理接口标准定义了物理层与物理传输介质之间的边界与接口。物理接口的四个特性是:机械特别、电气特性、功能特性与规程特性。

  • 机械特性:物理层的机械特性规定了物理连接时所使用可插连接器的形状和尺寸,连接器中引脚的数量与排列情况等。

  • 电气特性:规定了在物理连接上传输二进制比特流时线路上信号水平的高低、阻抗及阻抗匹配、传输速率与距离限制。

  • 功能特性:规定物理接口上各条信号线的功能分配和确切定义。物理接口信号线一般分为:数据线、控制线、定时线和地线。

  • 规程特性:定义了信号线进行二进制比特流传输时的一组操作过程,包括各信号线的工作规则和时序。

1.2 数据链路层

在OSI的参考模型中,数据链路层参考模型的第二层。

数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。

数据链路层主要有两个功能:帧编码和误差纠正控制。帧编码意味着定义一个包含信息频率、位同步、源地址、目标地址以及其他控制信息的数据包。

数据链路层的最基本的功能是向该层用户提供透明的和可靠的数据基本服务。透明性是指该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义;可靠的传输使用户免去对丢失信息、干扰信息及顺序不正确等的担心。在物理层中这些情况都可能发生,在数据链路层中必须用纠错码来检错与纠错。数据链路层是对物理层传输原始比特流的功能的加强,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一无差错的线路。

1.3 网络层 

网络层上层为传输层,下层为数据链路层,它通过路由选择算法,为IP分组从源主机到目的主机选择一条合适的传输路径,为传输层端-端数据传输提供服务。

网络层是负责相邻计算机之间的通信。其功能是:

  • 处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。

  • 处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。

  • 处理路径、流控、拥塞等问题。

网络层中的网络协议是IP,IP协议的分类有IPv4和IPv6

IP协议的特点:

  • IP协议是一种无连接,不可靠的分组传送服务协议,因此提供的是一种尽力而为的服务无连接:IP协议不维护IP分组发送后的任何状态信息。
  • 不可靠:IP协议不能保证每个IP分组都能正确的,不丢失和顺序低到达目的主机。
  • 点对点的网络层通信协议
  • IP协议是针对源主机-路由器、路由器-路由器、路由器-目的主机之间的数据传输的点---点的网络通信协议,它为两台通信主机寻找一种路径,通常由多个路由器,点点线路组成的IP协议屏蔽了互联网在数据链路层、物理层协议与实际技术上的差异。

下面就以目前广泛IPV6来分析:

IPv6的结构【大家可以拿出笔,手写一下IPv6的报文结构】

  • 版本:表示协议版本:IPv6值为6

  • 流量等级:主要是Qos

  • 流标签:用来标识同一个流里面的报文

  • 载荷长度:表明该IPv6包头部后包含的字节数,包含扩展头部

  • 下一报头:该字段用来指明报头后接的报文头部的类型,若存在扩展头,表示第一个扩展头的类型,否则表示其上层协议的类型,它是IPv6各种功能的核心实现方法

  • 跳数限制:该字段类似于IPv4中的TTL,每次转发跳数减一,该字段达到0时包将会被丢弃

  • 源地址:标识该报文的来源地址

  • 目的地址:标识该报文的目的地址

1.4 传输层

传输层下面会着重讲解,在这不做讲述。

1.5 会话层

它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。

功能:负责建立和断开通信连接(数据流动的逻辑通路),记忆数据的分隔等数据传输相关的管理

1.6 表示层

将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式;主要负责数据格式的转换,确保一个系统的应用层信息可被另一个系统应用层读取

具体来说,就是将设备固有的数据格式转换为网络标准传输格式,不同设备对同一比特流解释的结果可能会不同;因此,主要负责使它们保持一致

1.7 应用层

为应用程序提供服务并规定应用程序中通信相关的细节;包括的协议如下:

  • **超文本传输协议HTTP:**这是一种最基本的客户机/服务器的访问协议;浏览器向服务器发送请求,而服务器回应相应的网页

  • 文件传送协议FTP:提供交互式的访问,基于客户服务器模式,面向连接 使用TCP可靠的运输服务。主要功能:减少/消除不同操作系统下文件的不兼容性 

  • **远程登录协议TELNET:**客户服务器模式,能适应许多计算机和操作系统的差异,网络虚拟终端NVT的意义

  • 简单邮件传送协议SMTP:Client/Server模式,面向连接 ,基本功能:写信、传送、报告传送情况、显示信件、接收方处理信件

  • **DNS域名解析协议:**DNS是一种用以将域名转换为IP地址的Internet服务

  • **简单文件传送协议TFTP:**客户服务器模式,使用UDP数据报,只支持文件传输,不支持交互,TFTP代码占内存小

  • **简单网络管理协议(SNMP):**SNMP模型的4个组件:被管理结点、管理站、管理信息、管理协议

二、传输层-TCP

TCP/IP意味着TCP和IP一起协同工作。TCP负责应用软件与网络软件之间的通信。IP负责计算机之间的通信。另外TCP负责将数据分割并装入IP包,然后在它们到达的时候重新组合它们。IP负责将包发送至接受者。

2.1 TCP报文结构

  • 源端口:用来标识同一台计算机的不同的应用进程
  • 目的端口:端口指明接收方计算机上的应用程序接口

【TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。】

  • 序列号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。举例:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

  • 数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

  • 保留:为将来定义新的用途保留,现在一般置0。

  • 控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。

  1. URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

  2. ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

  3. PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

  4. RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

  5. SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

  6. FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

  • 窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。

  • 校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

  • 紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

  • 选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

  • 数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。数据部分也就是真实有效数据

2.2 TCP可靠性研究

经常说TCP是可靠性传输,但是为什么TCP具有可靠性传输?几种方式保证了可靠性传输?

  • 确认应答机制 

  • 超时重传机制 

  • 流量控制 

  • 拥塞窗口

2.2.1 确认应答机制

在TCP中,TCP将每个字节的数据都进行了编号,即为序列号(对每一个数据的编号)。 

从上面图分析:

当主机1给主机2发送11000数据时,主机2如果收到了会给主机1应答【ACK报文段,每一个ACK都带有对应的确认序列号】,表示11000的数据已经全部收到了,下次你再给我发就给我从1001数据开始发(下次从哪里开始发)。那么主机1收到应答之后就知道对方已经收到了1~1000的全部数据,所以再一次发送数据的时候他就会从1001开始发,后面都是依此类推的情况。

当然了,当我们的主机1给主机2发送了数据之后,经过一端时间主机1并没有收到主机2的应答的情况也是有的,所以这个时候为了确保数据的准确到达,TCP就有了超时重传机制。 

2.2.2 超时重传机制

主机1没有收到主机2的确认应答有以下两种情况: 

  1. 数据根本就没有传送到达主机2,因此主机2就不会回传一个确认应答的报文。

 由图分析:主机1给主机2发送了数据,可能因为其他的原因数据无法到达主机2.(比如网络拥堵)。这个时候主机1等待了一个特定的时间间隔之后发现主机2还没有确认应答,于是就再一次将上一次的数据重新发送过去。

2.  主机2收到了数据,也回传了确认应答报文,但是该报文丢失了。

由图分析:主机2收到了主机1发来的数据,但是发给主机1的确认应答并没有准时到达主机1,所以主机1也会因为没有收到确认应答而再次重新将数据发送过去。但实际情况却是我们的主机2第一次就已经收到了主机1的数据。但是主机1依旧会重发数据已确保主机2已经收到数据,从而进行下一次的数据转发。可想而知主机2就会收到很多的重复数据,但是重复的数据显然是不需要的,那么TCP协议就需要能够识别那些重复的数据并且要将冲符的数据丢弃掉,这个时候序列号就发挥他的一项作用了——去重。每一个数据都有自己的序列号,如果主机2收到重复的数据那么必然机会产生多个序列号相同的数据,那么序列号相同的数据就必然是重复的数据。

2.2.3 流量控制

接收端处理数据的速度是优先的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送就会造成丢包,继而引起丢包重传等一系列连锁反应。因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制就叫做流量控制。

接收端将自己可以接受的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK段通知发送端; 
窗口大小字段越大,说明网络的吞吐量越高 
接收端一旦发现自己的缓冲区快满了就会将窗口大小设置成一个更小的值通知发送端。 
发送端接收到窗口大小以后,就会减慢自己的发送速度。 
如果接收缓冲区满了,就会将窗口置为0,这时发送方不再发送数据。 
但是需要定期的发送一个试探窗口,,目的是为了取探测数据段,是接收端把窗口大小告诉发送端。

接收端是如何把窗口大小告诉发送端的呢?在上面TCP报文结构中,TCP的首部中有一个16位的窗口大小的字段,就是存放的窗口大小的信息。另外在TCP的首部中的40字节选项中还包含了一个窗口扩大因子M,实际的窗口大小是窗口字段的值左移M位。

2.2.4 拥塞窗口

拥塞控制与流量控制的区别
拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。
流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。

拥塞控制的机制

  • 慢开始

慢开始不是指cwnd的增长速度慢(指数增长),而是指TCP开始发送设置cwnd=1。
思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。

为了防止cwnd增长过大引起网络拥塞,设置一个慢开始门限(ssthresh状态变量)
当cnwd<ssthresh,使用慢开始算法
当cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法
当cnwd>ssthresh,使用拥塞避免算法

  • 拥塞控制

拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞控制窗口加一。

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。 

  • 快重传

快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

  • 快恢复(与快重传配合使用)

  • 1.采用快恢复算法时,慢开始只在TCP连接建立时和网络出现超时时才使用。
    2.当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
    3.考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

2.3 TCP连接与释放

TCP连接

  1. TCP建立连接的过程叫做握手。
  2. 握手是需要客户和服务器之间交换三个TCP报文段,称为三报文握手。
  3. 采用三次握手主要是为了防止已经失效的连接请求报文段突然又开始工作啦,因而发生错误,为了保证可靠性传输。

下面连接TCP的三次握手的示意图,并加以解释,建议大家拿出一张纸,画出这个结构。

TCP释放

  1. 数据传输结束后,通信的双方都可以把连接进行释放。
  2. TCP连接的释放需要四报文握手,也就是四次握手

下面连接TCP的四次握手的示意图,并加以解释,建议大家拿出一张纸,画出这个结构。

上面讲述TCP的三次握手与四次挥手过程,大家一定要拿出笔画一下

2.4 懂这些嘛?

2.4.1 TCP建立连接为什么是三次握手,关闭连接是四次握手?

因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

2.4.2 三次握手过程中可以携带数据吗?

其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据

为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。

2.4.3 为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

四个报文都发送完毕,就可以直接进入CLOSE状态了,但是可能网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

三、传输层-UDP

1. 常识

每个 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2 字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。

UDP 报文格式如图所示。

UDP 报文中每个字段的含义如下:

  • 源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。这样,接收端的应用程序就不能发送响应了。
  • 目的端口:接收端计算机上 UDP 软件使用的端口,占据 16 位。
  • 长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
  • 校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。

特点:

  • UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。 在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、 计算机的能力和传输带宽的限制; 在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

  • 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等, 因此一台服务机可同时向多个客户机传输相同的消息。

  • UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。

  • 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、 源端和终端主机性能的限制。

  • UDP使用尽最大努力交付,即不保证可靠交付, 因此主机不需要维持复杂的链接状态表(这里面有许多参数)。

  • UDP是面向报文的。发送方的UDP对应用程序交下来的报文, 在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界, 因此,应用程序需要选择合适的报文大小。

2. TCP与UDP区别

1. 对比

2. 总结

  • TCP向上层提供面向连接的可靠服务 ,UDP向上层提供无连接不可靠服务。
  • 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为
  • 对数据准确性要求高,速度可以相对较慢的,可以选用TCP

此篇讲述OSI的底六层【物理层、数据链路层、网络层、传输层、会话层、表示层】,今天大部分都是理论性的文章,也大部分都是干货【大约花费了10个小时走大学课程以及借助了其他博客的一些图片,感谢感谢】下一篇将着重讲解HTTP与HTTPS的演变过程。

已经凌晨啦,明天的这个时候就是国庆和中秋双节日啦!祝福大家 阖家欢乐,幸福安康!!!

机会❤️❤️❤️🌹🌹🌹

如果想和我一起共建抖音,成为一名bytedancer,Come on。期待你的加入!!!

截屏2022-06-08 下午6.09.11.png