TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事情不用我们操心;其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上。接下来,我们就来探索一下这个过程。

TCP/IP概念

【0】物理介质

物理介质就是把电脑连接起来的物理手段,常见的有光纤、双绞线,以及无线电波,它决定了电信号(0和1)的传输方式,物理介质的不同决定了电信号的传输带宽、速率、传输距离以及抗干扰性等等。TCP/IP协议栈分为四层,每一层都由特定的协议与对方进行通信,而协议之间的通信最终都要转化为 0 和 1 的电信号,通过物理介质进行传输才能到达对方的电脑,因此物理介质是网络通信的基石。

下面我们先通过一张图先来大概了解一下TCP/IP协议的基本框架以及数据的处理流程:

img

当通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。

网络通信就好比送快递,商品外面的一层层包裹就是各种协议,协议包含了商品信息、收货地址、收件人、联系方式等,然后还需要配送车、配送站、快递员,商品才能最终到达用户手中。

一般情况下,快递是不能直达的,需要先转发到对应的配送站,然后由配送站再进行派件。

配送车就是物理介质,配送站就是网关, 快递员就是路由器,收货地址就是IP地址,联系方式就是MAC地址。

快递员负责把包裹转发到各个配送站,配送站根据收获地址里的省市区,确认是否需要继续转发到其他配送站,当包裹到达了目标配送站以后,配送站再根据联系方式找到收件人进行派件。

有了整体概念以后,下面我们详细了解一下各层的分工。

【1】链路层

网络通信就是把有特定意义的数据通过物理介质传送给对方,单纯的发送 0 和 1 是没有意义的,要传输有意义的数据,就需要以字节为单位对 0 和 1 进行分组,并且要标识好每一组电信号的信息特征,然后按照分组的顺序依次发送。以太网规定一组电信号就是一个数据包,一个数据包被称为一帧,制定这个规则的协议就是以太网协议。一个完整的以太网数据包如下图所示:

img

整个数据帧由首部、数据和尾部三部分组成,首部固定为14个字节,包含了目标MAC地址、源MAC地址和类型;数据最短为46个字节,最长为1500个字节,如果需要传输的数据很长,就必须分割成多个帧进行发送;尾部固定为4个字节,表示数据帧校验序列,用于确定数据包在传输过程中是否损坏。因此,以太网协议通过对电信号进行分组并形成数据帧,然后通过物理介质把数据帧发送给接收方。那么以太网如何来识接收方的身份呢?

以太网规协议定,接入网络的设备都必须安装网络适配器,即网卡, 数据包必须是从一块网卡传送到另一块网卡。而网卡地址就是数据包的发送地址和接收地址,也就是帧首部所包含的MAC地址,MAC地址是每块网卡的身份标识,就如同我们身份证上的身份证号码,具有全球唯一性。

有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。

所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。

【2】网络层

对于上面的过程,肯定会产生下面几个疑问:

1.发送者如何知道接收者的MAC地址?
2.发送者如何知道接收者和自己同属一个子网?
3.如果接收者和自己不在同一个子网,数据包如何发给对方?

为了解决这些问题,网络层引入了三个协议,分别是IP协议、ARP协议、路由协议。IP协议制定了IP地址来判断俩个主机是否属于同一个子网。ARP协议根据IP地址获取MAC地址。路由协议根据信道情况,选择并设定路由,以最佳路径来转发数据包。

(1)IP协议

通过前面的介绍我们知道,MAC地址只与厂商有关,与所处的网络无关,所以无法通过MAC地址来判断两台主机是否属于同一个子网。

因此,网络层引入了IP协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。

IP地址目前有两个版本,分别是IPv4和IPv6,IPv4是一个32位的地址,常采用4个十进制数字表示。IP协议将这个32位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。由于各类地址的分法不尽相同,以C类地址192.168.24.1为例,其中前24位就是网络地址,后8位就是主机地址。因此, 如果两个IP地址在同一个子网内,则网络地址一定相同。为了判断IP地址中的网络地址,IP协议还引入了子网掩码, IP地址和子网掩码通过按位与运算后就可以得到网络地址。

由于发送者和接收者的IP地址是已知的(应用层的协议会传入), 因此我们只要通过子网掩码对两个IP地址进行AND运算后就能够判断双方是否在同一个子网了。

(2)ARP协议

即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。其工作原理如下:

ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。cmd输入 arp -a 就可以查询本机缓存的ARP数据。

(3)路由协议

通过ARP协议的工作原理可以发现,ARP的MAC寻址还是局限在同一个子网中,因此网络层引入了路由协议,首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。

而完成这个路由协议的物理设备就是路由器,在错综复杂的网络世界里,路由器扮演者交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。

(4)IP数据包

在网络层被包装的数据包就叫IP数据包,IPv4数据包的结构如下图所示:

img

P数据包由首部和数据两部分组成,首部长度为20个字节,主要包含了目标IP地址和源IP地址,目标IP地址是网关路由的线索和依据;数据部分的最大长度为65515字节,理论上一个IP数据包的总长度可以达到65535个字节,而以太网数据包的最大长度是1500个字符,如果超过这个大小,就需要对IP数据包进行分割,分成多帧发送。

所以,网络层的主要工作是定义网络地址,区分网段,子网内MAC寻址,对于不同子网的数据包进行路由。

【3】传输层

链路层定义了主机的身份,即MAC地址, 而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序(进程)接收。而每台电脑都有可能同时运行着很多个应用程序(进程),所以当数据包被发送到主机上以后,是无法确定哪个应用程序(进程)要接收这个包。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。

因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份,UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息。这样,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP定义的数据包就叫做UDP数据包,结构如下所示:

img

UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。

UDP协议比较简单,实现容易,但它没有确认机制, 数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了,TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。

为了保证传输的可靠性,TCP 协议在 UDP 基础之上建立了三次对话的确认机制,也就是说,在正式收发数据前,必须和对方建立可靠的连接。由于建立过程较为复杂,我们在这里做一个形象的描述:

主机A:我想发数据给你,可以么?
主机B:可以,你什么时候发?
主机A:我马上发,你接着!

经过三次对话之后,主机A才会向主机B发送正式数据,而UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发过去了。所以 TCP 能够保证数据包在传输过程中不被丢失,但美好的事物必然是要付出代价的,相比 UDP,TCP 实现过程复杂,消耗连接资源多,传输速度慢。

TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过IP数据包的长度,以确保单个 TCP 数据包不必再分割。

总结一下,传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。

【4】应用层

理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等。HTTP 是一种比较常用的应用层协议,主要用于B/S架构之间的数据通信,其报文格式如下:

img

在 Resquest Headers 中,Accept 表示客户端期望接收的数据格式,而 ContentType 则表示客户端发送的数据格式;在 Response Headers 中,ContentType 表示服务端响应的数据格式,这里定义的格式,一般是和 Resquest Headers 中 Accept 定义的格式是一致的。

有了这个规范以后,服务端收到请求以后,就能正确的解析客户端发来的数据,当请求处理完以后,再按照客户端要求的格式返回,客户端收到结果后,按照服务端返回的格式进行解析。

所以应用层的主要工作就是定义数据格式并按照对应的格式解读数据。

总结:四层协议整体流程

链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据;网络层:定义IP地址,确认主机所在的网络位置,并通过IP进行MAC寻址,对外网数据包进行路由转发;传输层:定义端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序;应用层:定义数据格式,并按照对应的格式解读数据

用一句话来概括就是:

当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。

TCP/IP协议栈

OSI模型分为七层,自下而上为 物理层(Physical Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表达层(Presentation Layer)、应用层(Application Layer)

物理层

利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。物理层关系的是信号,接口和传输介质。

物理层功能:

在两个网络设备之间提供透明的比特(Bit)流传输,物理层处于整个标准的最底下一层,它与数据链路层一样,工作在单条线路上,只负责线路两端的通信维护。

物理层工作原理

场景:用户A和用户B用网线互联在一起,A给B发数据:

用户A通过应用程序发出数据,这个数据经过上层一层层的封装,到达了数据链路层,在第二层数据链路层做了Framing(成帧)处理之后,物理层会将这个数据帧转换成二进制信号(bit流);

接下来用户A就要将这些bit信号流从自己的“网卡”里传出去了,传出去之后需要经过“网络介质(网线)”传输到对端设备用户B;

用户B从网线里收到了这些bit流,这些bit流进入了B的网卡,B就成功收到了这些bit流;

但是B还不能识别这个bit流是数据,所以B会对这些bit流基于自己的网卡驱动进行数据帧的转换,并交给第二层数据链路层;

如果B的网卡与A的网卡是同一种标准,比如以太网,那么就会成功转化成以太网数据帧;

如果B的网卡与A的网卡不是相同的标准,那么B是无法将这些bit流转换成数据链路层能识别的数据帧格式,接下来数据链路层等上层就会基于各层的特性执行对应的操作。

OSI物理层功能作用

物理层关键组件,在上述的案例中,关键点有三个

网络连接器:比如电脑上的网卡、网络设备上的接口
传输介质:比如网线、无线
bit流:传输的数据
  • 网络连接器:比如电脑上的网卡、网络设备上的接口
  • 传输介质:比如网线、无线
  • bit流:传输的数据

为了让数据能够正常的在线路两端传输,OSI等通信标准需要对物理层的这三个组件制定统一的标准,这样才能保证线路两端的数据传输一切正常。

如果线路两端用了不一样标准的连接器或网线,比如一边用以太网卡,一边用T1的网卡,这两种网络接口的数据链路层驱动和封装是不一样的,这种情况下数据就无法正常传输了。

简单说:物理层的作用就是组网,把一个个电脑用光缆、电缆、双绞线、无线电波等方式连接起来。它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。

数据链路层

  • 物理层和数据链路层的本质作用都是用来构建网络通信、访问通道,但它们所建立的通信通道是不一样的。首先要说明的一点是,在物理层上构建的是物理链路,在数据链路层上构建的是逻辑链路或者数据链路。
  • 物理链路是指在物理层设备(包括传输介质、物理接口和收发器等)和相应物理层通信规程作用下形成的物理线路,是永久存在的,且是不可删除的(除非物理拆除);逻辑链路则是通信双方在需要进行数据通信时,在数据链路层设备和相应的通信规程作用下建立的逻辑链路,可以是永远存在的(如局域网中的以太网链路),也可以不是永久存在的(如广域网中的链路),是否永久存在要视具体的数据链路层服务类型而定。

(1)数据链路层功能

数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源机网络层来的数据可靠地传输到相邻节点的目标机网络层。

功能主要有:

  1. 如何将数据组合成数据块(帧头+数据(分组)+帧尾),在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;
  2. 如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;
  3. 以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

(2)为网络层提供的服务设计目标就是为网络层提供各种需要的服务。

实际的服务随系统的不同而不同,但是一般情况下,数据链路层会向网络层提供以下三种类型的服务:

  1. 无确认的无连接服务
  2. 有确认的无连接服务
  3. 有确认的面向连接服

在OSI参考模型中,数据链路层向网络层提供服务如下:

  • 定义操作连接的程序;
  • 封装数据包为数据帧;
  • 数据链路建立、维护与释放的链路管理工作;
  • 数据链路层服务数据单元帧的传输;
  • 差错检测与控制;
  • 数据流量控制;
  • 在多点连接或多条数据链路连接的情况下,提供数据链路端口标识的识别,支持网络层实体之间建立网络连接;
  • 帧接收顺序控制。

(3)成帧

为了使传输中发生差错后只将有错的有限数据进行重发,数据链路层将比特流组合成以帧为单位传送。每个帧除了要传送的数据外,还包括校验码,以使接收方能发现传输中的差错,帧的组织结构必须设计成使接收方能够明确地从物理层收到的比特流中对其进行识别,也即能从比特流中区分出帧的起始与终止,这就是帧同步要解决的问题。

由于网络传输中很难保证计时的正确和一致,所以不可采用依靠时间间隔关系来确定一帧的起始与终止的方法。

常用四中方法:

  1. 字节计数法,此方法是在帧头部中使用一个字符计数字段来标明帧内字符数。接收端根据这个计数值来确定该帧的结束位置和下一帧的开始位置。
  2. 含字节填充的分界符法,此方法是使用特殊字符作伪帧的起始和结束(数据中出现特殊字符需要转义,如0xFF->0xFE+0x01 0xFE->0xFE+0x00)。
  3. 含位填充的分界标志法,此方法是帧首尾标志法用一个特殊的位模式“01111110”(6个1)作为帧的开始和结束标志。当发送方在数据部分遇到 5 个连续的“1”时,就自动在其后插入一个“0”,即所谓的“逢五个 1 插 0”。当接收方遇到 5 个连续的“1”之后是一个“0”时,就删除该“0”,即所谓的“逢五个 1 删 0”。这样就保证了在帧的数据部分不会出现“01111110”位串,从而使接收方能准确地判断出帧边界。
  4. 物理层编码违例法,该法在物理层采用特定的比特编码方法时采用。例如,一种被称作曼彻斯特编码的方法,是将数据比特“1”编码成“高-低”电平对,而将数据比特“0”编码成“低-高”电平对。而“高-高”电平对和“低-低”电平对在数据比特中是违法的。可以借用这些违法编码序列来定界帧的起始与终止。

(4)差错控制

数据链路层的一个重要工作就是如何管理好定时器和序列号,从而保证每一帧最终都恰好一次的被传递到目的机网络层。

  1. 差错编码:对差错编码(如奇偶校验码,检查和或CRC)的检查,可以判定一帧在传输过程中是否发生了错误。一旦发现错误,一般可以采用反馈重发的方法来纠正这就要求接收方收完一帧后,向发送方反馈一个接收是否正确的信息,使发送方所在此作出是不需要重新发送的决定,也即发送方仅当收到接收方已正确接收的反馈信号后才能认为该帧已经正确发送完毕,否则需重直至正确为止。
  2. 定时器:计时器(Timer)来限定接收方发回反馈信息的时间间隔,当发送方发送一帧的同时也启动计时器,若在限定时间间隔内未能收到接收方的反馈信息,即计时器超时(Tineout),则可认为传的帧已出错或丢失,继而要重新发送。
  3. 序列号:同一帧数据可能被重复发送多次,就可能引起接收方多次收到同一帧并将其递交给网络层的危险。为了防止发生这种危险,可以采用对发送的帧编号的方法,即赋予每帧一个序号,从而使接收方能从该序号来区分是新发送来的帧还是已经接收但又重新发送来的帧,以此来确定要不要将接收到的帧递交给网络层。数据链路层通过使用计数器和序号来保证每帧最终都被正确地递交给目标网络层一次。

(5)流量控制

流量控制并不是数据链路层所特有的功能,许多高层协议中也提供流时控功能,只不过流量控制的对象不同而已。

对于数据链路层来说,控制的是相邻两节点之间数据链路上的流量,而对于运输层来说,控制的则是从源到最终目的之间端的流量。

收发双方各自使用的设备工作速率和缓冲存储的空间的差异,可能出现发送方发送能力大于接收方接收能力的现象,如若此时不对发送方的发送速率(也即链路上的信息流量)作适当的限制,前面来不及接收的帧将被后面不断发送来的帧“淹没”,从而造成帧的丢失而出错。

常用办法有两种:

  • 1.基于反馈的流控制:接收方给发送发发现偶那个回的消息,允许它发送更多的数据,或者至少也要告诉发送方它的情况怎么样
  • 2.基于速率的流控制:使用这种方法的协议有一种内置的机制,它限制发送发传输的速率而无需利用接收方的反馈信息。

(6)链路管理

链路管理功能主要用于面向连接的服务,当链路两端的节点要进行通信前,必须首先确认对方已处于就绪状态,并交换一些必要的信息以对帧序号初始化,然后才能建立连接,在传输过程中则要能维持该连接。

如果出现差错,需要重新初始化,重新自动建立连接,传输完毕后则要释放连接,数据连路层连接的建立维持和释放就称作链路管理。在多个站点共享同一物理信道的情况下(例如在LAN中)如何在要求通信的站点间分配和管理信道也属于数据链路层管理的范畴。

(7)差错控制

用以使发送方确定接收方是否正确收到了由它发送的数据信息的方法称为反馈差错控制。

反馈检测法:

这是一种无须使用任何特殊代码的错误检测法,双方进行数据传输时,接收方将接收到的数据(可以是一个字符,也可以是一帧)重新发回发送方,由发送方检查是否与原始数据完全相符。
若不相符,则发送方发送一个控制字符(如DEL)通知接收方删去出错的数据,并重新发送该数据;
若相符,则发送不一个数据。反馈检测法原理简单、实现容易,也有较高的可靠性,但是,每个数据均被传输两次,信道利用率很低。
一般,在面向字符的异步传输中,信道效率并不是主要的,所以这种差错控制方法仍被广泛使用。

自动重发请求法(ARQ法):

实用的差错控制方法,应该既要传输可靠性高,又要信道利用率高。
为此让发送方将要发送的数据帧附加一定的冗余检错码一并发送,接收方则根据检错码对数据帧进行错误检测,
若发现错误,就返回请求重发的答,发送方收到请求重发的应答后,便重新传送该数据帧。
这种差错控制方法就称为自动请求法(Automatic Repeat reQuest),简称ARQ法。
ARQ法仅返回很少的控制信息,便可有效地确认所发数据帧是否被正确接收。
ARQ法有若干种实现方案,如空闲重发请求(Idle RQ)和连续重请求(Continuous RQ)是其中最基本的两种方案。

空闲重发请求,也称停等(stop-and -wait)法:

该方案规定发送方每发送一帧后就要停下等待接收方的确认返回,仅当接收方确认正确接收后再继续发送下一帧。
空闲重发请求方案的实现过程如下:发送方每次仅将当前信息帧作为待确认帧保留在缓冲存储器中。
当发送方开始发送信息帧时,随即启动计时器。
当接收方检测到一个含有差错的信息帧时,便舍弃该帧。
当接收方收到无差错的信息帧后,即向发送方返回一个确认帧。
若发送方在规定时间内未能收到确认帧(即计时器超时),则应重发存于缓冲器中待确认信息帧。
若发送方在规定时间内收到确认帧,即将计时器清零,继而开始下一帧的发送。

连续重发请求:

连续重发请求方案是指发送方可以连续发送一系列信息帧,即不用等前一帧被确认便可发送下一帧。
发送方连续发送信息帧而不必等待确认帧的返回。发送方在重发表中保存所发送的每个帧的拷贝。
重发表按先进先出(FIFO)队列规则操作。接收方对每一个正确收到的信息帧返回一个确认帧。
每一个确认帧包含一个唯一的序号,随相应的确认帧返回。接收方保存一个接收次序表,它包含最后正确收到的信息帧的序号。
当发送方收到相应信息帧的确认帧后,从重发表中删除该信息帧。
当发送方检测出失序的确认帧(即第n号信息帧和第n+2号信息帧的确认帧已返回,而n+1号的确认帧未返回)后,便重发未被确认的信息帧。

错误处理的两种方法:

Go-back-N(退回N)法:当接收方检测出失序的信息帧后,要求发送方重发最后一个正确接收的信息帧之后的所有未被确认的帧,或者当发送方发送了n帧后,若发现该n帧的前一帧在计时器超时后仍未返回其确认信息,则该帧被判定为出错或丢失。对接收方来说,因为这一帧出错,就不能以正确的序号向它的高层递交数据,对其后发送来的n帧也可能都不能接收而丢弃,因此,发送方发现这种情况,就不得不重新发送该出错帧及其后的n帧。

选择重发:当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧,一旦收到重新传来的帧后,就可与原已存于缓冲区中的其余帧一并按正确的顺序递交高层。

(8)滑动窗口协议

捎带确认:

数据在通道上传输,在多数实际的情况下,需要双向传输数据。一种可获得双工数据传输的方法是使用两条独立的信道,每一信道分别用作单工数据传输(传输方向不同)。如果这样做,就有了两条独立的物理电路,每条都有“正向”信道(用于传输数据),和一个“反向”信道(用于确认)。在这两种情况下,反向信道的带宽基本上都给浪费了。
较好的想法是使用同一条线路进行数据的双向传输。在同一线路上先后发送数据帧和控制帧,是对两条独立的数据通道进行了改进。当然,这样仍还有进一步改进可能。当一个主机1发送的数据帧到达主机2后,主机2的接收过程不是立即发送一个独立的控制帧进行应答,而是维持等待,直到向主机1传送下一个分组时,才将控制帧(确认信息)附加到即将发送的数据帧上。也就是说,确认是由下一个发送的数据帧上捎带传输的。这种暂时延迟待发确认,以便附加在下一个将发送的数据帧的技术叫做捎带。
主要优点在于:能较好地利用有效的信道带宽。然而,捎带也带来了单独确认所没有的复杂性。需要等待多长时间,才能把捎带确认的TPDU发送出去呢?如果数据等待时间超过了发送方的时间间隔,那么就会被重发,违背了进行确认的原意。

  • 滑动窗口:需要发送方和接收方通过确认来保存可靠通信的协议方式常被称为滑动窗口协议,要遵循下述要求:协议必须要按分组传送顺序,把这些分组递交给目的机器,即协议必须按发送的顺序传输所有的TPDU。
  • 发送窗口:发送方都维持了一个连续的允许发送的帧的序号。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
  • 接收窗口:接收方也维持了一个连续的允许接收的帧的序号。

位滑动窗口协议:

当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议(stop-and-wait)。
该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。
由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。
由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用一比特来编号就够了。

使用后退N帧技术的协议

停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退n协议。

发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍没有收到确认帧,就要重发相应的数据帧。

后退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。

使用选择性重传的协议

在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪费。

一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层(网络层)。

(9)数据链路层协议

【1】面向字符的链路层协议

  1. ISO的IS1745,基本型传输控制规程及其扩充部分(BM和XBM)
  2. IBM的二进制同步通信规程(BSC)
  3. DEC的数字数据通信报文协议(DDCMP)
  4. PPP点到点协议(Point-to-Point Portocol)

PPP三大成就:

  • 明确地划分出一帧的尾部和下一帧的头部的成帧方式。这种帧格式也处理错误检测工作。
  • 当线路不再需要时,挑出这些线路,测试它们,商议选择,并仔细地再次释放链路控制协议。这个协议被称为链路控制协议LCP(link control protocol)。
  • 用独立于所使用的网络层协议的方法来商议使用网络层的哪些选项。对于每个所支持的网络层来说,所选择的方法有不同的网络控制协议NCP(network control protocol)。

PPP帧不仅能通过拨号电话线发送出去,而且还能通过SONET或真正面向位的HDLC线路(即路由器与路由器相连)发送出去。

帧格式:PPP帧格式和HDLC帧格式相似,二者主要区别:PPP是面向字符的,而HDLC是面向位的。

帧头(01111110)+地址字段(111111)+控制字段(00000011)+协议字段(代表信息字段类型)+信息字段+校验和(16位CRC)+帧尾(01111110)

其中:协议字段不同,后面的信息字段类型就不同。如:

0x0021——信息字段是IP数据报
0xC021——信息字段是链路控制数据LCP
0x8021——信息字段是网络控制数据NCP
0xC023——信息字段是安全性认证PAP
0xC025——信息字段是LQR
0xC223——信息字段是安全性认证CHAP

注意,帧头不能采用HDLC所使用的零比特插入法,而是使用一种特殊的字符填充(转义),用户拨号接入ISP时,路由器的调制解调器对拨号做出应答,并建立一条物理连接。这时PC机向路由器发送一系列的LCP分组(封装成多个PPP帧)。这些分组及其响应选择了将要使用的一些PPP参数。

一旦双发对PPP参数达成一致后,再发送一序列NCP分组(用于配置网络层),接着就进行网络层培植,NCP给新接入的PC机分配一个临时的IP地址,这样PC机就成为Internet上一个主机了。

当用户通信完毕时,NCP释放网络层连接,收回原来分配出去的IP地址。接着LCP释放数据链路层连接,最后释放的是物理层的连接。

【2】面向比特的链路层协议

  1. IBM的SNA使用的数据链路协议SDLC同步数据链路控制(Synchronous Data Link Control protocol);
  2. ANSI修改SDLC,提出ADCCP高级数据通讯控制规程(Advanced Data Communication Control Procedure);
  3. ISO修改SDLC,提出HDLC高级数据链路控制(High-level Data Link Control)
  4. CCITT修改HDLC,提出LAP链路访问规程(Link Access Procedure)作为X.25网络接口标准的一部分,后来改为LAPB。

特点:协议不依赖于任何一种字符编码集;数据报文可透明传输,用于实现透明传输的“0比特插入法”易于硬件实现;全双工通信,不必等待确认便可连续发送数据,有较高的数据链路传输效率;所有帧均采用CRC校验,对信息帧进行编号,可防止漏收或重份,传输可靠性高;传输控制功能与处理功能分离,具有较大灵活性和较完善的控制功能。

帧格式:帧头(01111110)+地址字段+控制字段(序列号,确认及其它用途)+信息字段+校验和(16位CRC)+帧尾(01111110).

课后练习:

1. 数据链路层传输和处理数据的单位是( D )
A. 报文段  B. 比特流   C. 数据报   D. 帧
分析:数据链路层以帧为单位传输和处理数据。
2. 下列不属于数据链路层功能的是( D )
A. 封装成帧   B. 差错检测  C. 可靠传输   D. 拥塞控制
分析:数据链路层功能有封装成帧、差错检测、可靠传输。
3. 共享式以太网的媒体接入控制协议和802.11局域网的媒体接入控制协议分别是 ( A )
A. CSMA/CD, CSMA/CA   B. CSMA/CD, CDMA
C. CSMA/CA, CDMA   D. CSMA/CA, Wi-Fi
分析:共享式以太网的媒体接入控制协议为CSMA/CD,也就是载波监听多点接入/碰撞检测。802.11局域网的媒体接入控制协议为CSMA/CA,也就是载波监听多点接入/碰撞避免。
4. 下列属于数据链路层的互连设备是( B )
A. 集线器  B. 网桥和交换机   C. 路由器   D. 网关
分析:数据链路层的互连设备网桥和交换机。

网络层

网络层是OSI七层模型中的第三层也是TCP/IP模型中最重要的一层。网络层的基本功能是:

  • 用IP地址编址
  • 将来自传输层的数据段加上网络层PDU后封装成数据包
  • 规划数据传输的路由,选择传输目的的网络
  • 将来自第二层的帧解封装

网络层协议中,最为通用的是目前的IPv4,将来会有越来越多的IPv6。后者不区分内外网,全网的机器都暴露在公网上。

(1)IPv4协议

IPv4有以下特征:

  • \1. 无连接,进行通信的双方不进行事先或者传输时的连接
  • \2. 尽力传输,不保证数据到达的完整性。这减少了路由器的处理时间和负担,节省了带宽。相应的这部分工作交给了传输层的TCP协议来做。
  • \3. 介质无关,协议工作在有线(双绞线,光纤)、无线等各种环境中

介质这一条不完全准确,因为不同的传输介质有不同的MTU(最大传输单元),MTU由链路层决定,所以这一要求也势必影响到了网络层。在不同介质上,IPv4协议可能会为了适应物理介质的MTU而将数据包进一步分片。

IPv4的PDU——报头含有下面这些内容:

  • IP源地址
  • IP目的地址
  • 生存时间(TTL):每经过一跳减去1,直到这个包的TTL减小到0后包会被丢弃
  • 服务类型:指出数据类型的优先级别
  • 上层协议
  • 标志和分片偏移量:如果数据包被分片,接收端将据此部分信息重组数据包
  • 版本:指出是v4还是v6
  • 报头长度
  • 数据包长度
  • 标识:有源主机发出,帮助重组分片
  • 报头校验和
  • 选项
  • 空白填充

(2)路由

网络层的动态,最重要的就是路由这个概念了。

网关:连接本地网络的路由器接口,通常是指一张网卡或者一个IP地址。现在一般路由器可能有好多个LAN口和一个WAN口,一般有路由地址 = LAN口IP地址 = 网关地址。另外顺便一提,因为连接到外网去时不一定只连一台路由器,可能会连好几层级的路由器,所以本地路由器的WAN口IP也不一定就是我们上网时用的IP。

路由表:路由表是路由器或主机中维护的一张用来指出路由的信息表,有很多条路由组成。路由表中的一条路由包含了三个十分重要的信息。分别是目的网络,下一跳和度量。目的网络维护了目的地址和子网掩码等信息,作用相当于是确定一个网络。下一跳指出去相应网络的下一步应该把数据包传送到什么地址的什么网络。度量则说明,假如有不同路径可以到达目的地的话,通过一些算法得到这条路由的长短,复杂度等信息。

路由器根据路由表来选择发送或丢弃一个数据包,一般情况下路由器会设置默认路由,即当一个目的地址在路由器中没有维护的数据包到来,路由器不知道往哪发送的时候,就按照默认路由发送数据包。路由表可以存在主机中,称为主机路由表。主机路由表通常用于记录和直连网络以及直连路由器的路由信息,一张典型的主机路由表可能含有以下字段:目的网络;子网掩码;网关(对于主机来说就是下一跳);接口(发出的源地址);度量。路由器中的路由表通常还分成本地路由表(维护该路由器统领下网络的路由信息)和远程路由表(记录了进行远程网际通信时的路由信息)。

  • 当目的网络是0.0.0.0时,其意思是让本数据包走默认路由
  • 当网关和接口字段内容一样时,八成是指做一个本地loop,不需要通过LAN网关
  • 目的网络是127.0.0.0或者本机IP的情况,其度量肯定是1,因为是进行本地环回的地址

路由过程:当路由器拿到数据包,匹配路由表中的目的地址,其匹配的优先级遵循“从具体到普遍”的原则。比如要前往10.1.1.55的包,路由器依次查找路由表中目的网络是10.1.1.0,10.1.0.0,10.0.0.0 , 0.0.0.0。如果最终都没有匹配到(0.0.0.0是默认路由,没有匹配到应该是指没有设置默认路由的情况),那么就丢弃这个包。如果匹配到了某一条路由,那么就按照这条路由所指出的下一跳发送数据包。

每一个收到数据包的网络中间路由器都会check数据包的目的网络地址与自身的路由器从而确定是丢弃这个包还是继续转发,转发到哪里。如果目的网络对路由器来说是直连网络的话,那么路由器就把这个包发到相应的本地LAN口,接着由链路层中的信息来确定把包发往哪台主机。另一方面,如果路由器决定丢弃某个包了,它不用强制性地返回源地址任何错误信息。但是它也可以选择通过ICMP这个应用层的协议发回比如超时,主机未找到,网络未找到等等错误。网络测通工具ping用到的就是ICMP协议。

综合其七层模型来看的话,其实在网络传输过程中,中间的路由器只需要把收到的物理数据逐层解析解析到网络层即可,更加上层的应用层和传输层等等对路由器而言没有意义。

路由配置方法: 如何在路由表中配置路由,有两种主要方法。一种是静态路由,即路由写死在路由表中,最开始就需要手工进行配置并且还需要人工进行后续性的维护管理工作。另一种方法是动态路由,同一个网络中的路由器可以从其他路由器中动态地学习路由信息,无需人工干预。实现动态路由学习需要有相关的路由协议。在协议规定中,当有一个路由器,它自己充当网关的那个网络或者它与其他路由器的链路结构发生变化时,它就会把这种变化的信息传递给同一个网络中的其他路由器,促使它们更新路由表。常用的路由协议有RIP,EIGRP,OSPF等等

动态路由虽然节省了人力,但是增加了网络开销和路由器计算资源的消耗,在实际情况中,我们通常采用动静态路由相互结合的方式来配置路由。

(3)IPv4通信方式

现在最常用的IP仍然是四个255以内的数字用点连接起来的IPv4协议的IP地址。在基于IPv4构建的网络中,主机可以选择的通信方式有多种,包括单播(由一台主机对另一台主机发送数据包的过程),广播(由一台主机向该网络内所有其他主机发送数据包的过程)以及多播(由一台主机向多台主机发送数据包的过程)。

单播十分简单,只要指出对方主机的IP地址就可以了。

广播进一步分成两种,分别是定向广播和有限广播

定向广播的目的地址是某个网段主机号在二进制表达时全是1的那个地址,比如要向172.16.4.0/24网段发送广播的话其目的地址应该是172.16.4.255。一般情况下定向广播的数据包不会被作为网关的路由器转发,但是也可以配置其转发。

有限广播的目的地址是255.255.255.255,数据包发送同网络中的所有主机,路由器不转发此包。因为这种有限广播通常只出现在LAN中,所以IPv4的一个网络也被称为一个广播域,路由器则是广播域的边界。

显然广播的数据包占用网络资源十分巨大,因此广播通信应该被加以控制,比如多加几个路由器进一步划分子网(子广播域)。

多播的地址是224.0.0.0-239.255.255.255,这段地址特意留出来用作多播地址。当一台主机具有多播地址后,它既要处理发给它的单播包又要处理多播包。

(4)IPv4地址分类

同样的一段IP,如果子网掩码不一样那么所代表的含义就不一样。比如某个IP的末尾是.48(00110000),当子网掩码是/28的时候,前四位属于网络号部分,后四位才是主机号。除去这个网络的地址和其广播地址,剩下14个IP是可供分配的IP。但是如果子网掩码是/27的话,那么就有30个可以分配的IP了,相应的网络号少了一位。

10.0.0.0/8
172.16.0.0/12
192.168.0.0/1

这三个网络规定是私有网络,这些网段中的IP不允许直接访问因特网,为了让其可以顺利访问公网,就要在其LAN的边界(路由器)上进行公网访问的地址转换,即NAT服务。NAT服务把某个内网IP的请求换装成网关所在路由器WAN口的地址,并且向公网发出请求,从而实现私有网络访问公网。在这三种私有网络中可以看出来,10.0.0.0/8能提供的IP数最多(主机号有24位),适合大型局域网的假设。相对的最下面的192.168.0.0/16能提供的IP数目最少,适合用于小型局域网络的假设。

除了以上三类地址之外,还有一些地址比较特殊不能用于公网中普通的设备:

224.0.0.0-239.255.255.255  为多播地址段
240.0.0.0-255.255.255.254  为保留实验地址段
0.0.0.0-255.0.0.0          为默认路由段
127.0.0.0-127.255.255.255  为本地环回地址段
164.254.0.0-164.254.255.255 为链路本地地址,常给那些没有可用IP配置的环境或者没有从DHCP那里得到IP的主机使用
192.0.2.0-192.0.2.255      为Test-Net地址

除去以上这些网段的IP,其他IP都可以被作为公网IP使用。传统上,把基于IPv4地址分成A,B,C三类。

A类地址的范围是 1.0.0.0/8 - 126.0.0.0/8,即提供了126个网络,但这些网络每个都很大,可以容纳上一亿多台机器。从二进制的角度看,A类地址的网络号最高位一定是0,后面7位可以随便发挥

B类地址的范围是 128.0.0.0/16-191.255.0.0/16,提供了16382个网络,每个网络可以容纳6万多台主机。B类地址的网络号最高位一定是10

C类地址的范围是 192.0.0.0/24-223.255.255.0/24,C类一共提供了209万余个网络,但是每个网络最多只能容纳254个主机。C类地址的网络号最高三位一定是110

(5)网络层测试工具

ping工具的原理是基于ICMP(Internet Control Message Protocol)协议的。ping从一台主机发出ICMP回应请求并等待回应,分析回应结果。ping主要用于测试网络的联通性或对方主机是否存活.

tracert用于观察主机间的通信路由,会生成沿途成功到达的每一跳的列表。tracert中有两个较为重要的指标,RTT(响应往返时间)以及TTL(包生存长度)。tracert也是利用了ICMP协议,只不过它的用法更加高级一点。首先它发出三个TTL为1的包,当这三个包到达路由中的第一跳,并且返回到达通知,tracert就知道了三个包到达花的RTT。然后tracert又发出三个TTL=2的包,检测到第二跳所花的RTT……以此类推,每得到一跳的返回信息后统计返回时间并且发出一个TTL++的包测试下一跳,最终到达目标地址,得到了一个完整的路由表。如果某个包的响应时间是的话,就代表这个包丢失或者对方主机没有响应。通过查看每一跳的IP,我们就可以知道这次请求的路由了:

img

上述两个工具都用到了ICMP协议但是这个协议并不是网络层必须的,这也从侧面说明网络层的信息传输并不是可靠传输。在ICMP协议回报的数据中可能含有以下几种信息:

  • \1. 主机确认:主机向另一台设备发出ICMP请求,被请求方用ICMP协议作出应答
  • \2. 目的网络or主机不可达:不可达代码,0代表网络不可达,1代表主机不可达,2代表协议不可达,3代表端口不可达。
  • \3. 超时提示:当TTL减小到0,当前设备就会用ICMP协议通知发出请求的主机此包已经被丢弃,这个通知就是超时提示
  • \4. 路由重定向:通知网络中有更好的路由
  • \5. 源抑制:通知源主机暂时停止发送包(如路由器无足够的buffer等情况),原主机收到通知后会通过在传输层进行流量控制来实现源抑制

传输层

传输层(Transport Layer)是ISO OSI协议的第四层协议,实现端到端的数据传输。该层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。
传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控、分段/重组和差错控制。一些协议是面向链接的。这就意味着传输层能保持对分段的跟踪,并且重传那些失败的分段。

(1)传输层作用

  • 传输层实现应用进程间的端到端(end-to-end)通信
  • 向应用层提供通信服务

(2)多路分解与复用

  • 多路复用:所有应用进程的数据通过传输层传输到IP层;
  • 多路分解:传输层收到的数据交付给相应的应用进程。

(3)用户数据报协议UDP

端到端的、尽力而为的、无连接的数据报传输服务 1.无连接的 2.尽最大努力交付,即不保证可靠交付 3.面向报文的(在IP的功能上简单扩展了端到端) 4.没有拥塞控制 5.支持一对一、一对多、多对一和多对多的交互通信(需要组播的通信都是建立在UDP之上)

img

(4)传输控制协议TCP

端到端的、可靠的、面向连接的字节流服务 a).面向连接:先建立逻辑连接,进行双向数据流传输,通信结束后撤销连接 b).面向字节流 c).点对点的全双工通信 d).可靠传输:对一个连接上传输的每个字节编号,通过接收确认和重传来保证可靠传输 c).流量控制:防止发送方发出的数据超出接收方的接收能力.

img

多路复用:源、目的端口 连接管理:序号、确认号、SYN、FIN 可靠传输:序号、确认号 流量控制:接收窗口 拥塞控制:未在TCP首部中体现(序号、确认号、接收窗口)

连接管理

  • 每条TCP连接是一对点到点的字节流
  • 每条TCP连接者两个端点,即套接字(sokect)={IP : port}
  • 每条TCP连接由两个端点唯一标识,TCP连接={socket1, socket2} = {{IP1 : port1}, {IP2 : port2}}
  • TCP连接有3个阶段:连接建立、数据传输、连接释放

1)TCP连接建立的目的

  • ①使通信双方确知对方的存在
  • ②双方确定自己的初始序列号,并通知对方
  • ③允许双方协商一些参数(最大报文长度、窗口大小等)
  • ④对传输实体资源进行分配

2)TCP连接建立的方式

采用客户端服务器方式(C/S),主动发起连接建立的应用进程叫做客户端,被动等待连接建立的叫服务器端。

3)连接建立(三次握手)

  • ①服务器进程B被动打开连接,进入LISTEN(收听)状态,等待客户端发出请求
  • ②客户进程A主动打开连接,向B发送连接请求报文段(报文段不挟带数据),SYN=1,序号=x,进入SYN-SENT(同步已发送)状态
  • ③服务器进程B收到请求后,向A发送确认报文段(报文段不挟带数据),SYN=1,ACK=1,确认号=x+1,序号=y,进入SYN-RCVD(同步收到)状态
  • ④客户进程A收到确认后,向B发送确认报文段(报文段可以携带数据,不携带数据时不消耗序号,下一个序号依然是x+1),ACK=1,确认号=y+1,序号=x+1,进入ESTABLISHED(已建立连接)状态,B收到确认后,也进入ESTABLISHED状态

img

为什么A需要向B发送最后一个确认报文段:为了防止“已失效的连接请求报文段”突然又传到B发生错误,以至于B一直等待A发送数据,B的资源被浪费。

连接释放(四次挥手)

  • ①A,B都处于ESTABLISHED状态;
  • ②客户进程A主动关闭连接,向B发送连接释放请求报文段(报文段不挟带数据),FIN=1,序列号=u,进入FIN-WAIT-1(终止等待1)状态;
  • ③B收到A的连接释放报文段后,应答确认,ACK=1,确认号=u+1,序号=v,进入CLOSE-WAIT (关闭等待)状态,B仍然可以向A发送数据,A进入FIN-WAIT-2(终止等待2)状态;
  • ④若B已经没有向A的数据,其应用进程通知TCP连接释放,B向A发送连接释放报文段,FIN=1,ACK=1,确认号=u+1,序号=w,进入LAST-ACK(最后确认)状态;
  • ⑤A收到B的链接释放报文段后,应答确认,ACK=1,确认号=w+1,序号=u+1,进入TIME-TIME-WAIT(时间等待)状态,B收到A的确认后,进入CLOSED状态

img

A必须经过时间等待计时器设置的时间2MSL(默认2分钟)后,进入CLOSED状态:确保A发送的最后一个ACK报文段能够到达B;防止“已失效的连接请求报文段”出现在本连接中。

可靠传输

  • 发送方的TCP:维护一个发送缓冲区
  • 维护3个指针:LastByteAcked、LastByteSent、LastByteWritten
  • 发送窗口=min(通知窗口,拥塞窗口)
  • 累积确认(Cumulative ACK) :对按序到达的最后一个报文段进行确认
  • 选择确认(Selective ACK) :确认接收到的不连续的数据块的边界(使用首部的SACK选项,不影响确认号字段的使用)

img

流量控制

目的:为了防止发送方给慢接收方发数据造成接受崩溃,缓冲区溢出 原理:接收方通知发送方自己的接受窗口大小,发送方的发送窗口≤接收方的接受窗口

问题:B向A发送了零窗口报文段后,B的接受缓存有了一些存储空间,于是B向A发送了rwnd=400的报文段,然而报文段在传送过程中丢失,这样A一直等待B发送的非零窗口通知,B一直等待A发送数据,从而形成死锁局面。

解决:TCP为每一个连接设置一个持续计时器,只要TCP链接一方收到零窗口通知,就启动持续计时器,计时器到期,发送零窗口探测报文段,而对方就在确认这个探测报文段时给出现在的窗口值,①如果窗口仍然是零,那么重新设置持续计时器;②否则死锁的僵局就可以打破。

(5)自适应重传

1)超时重传

报文段的往返时间:RTT 加权平均往返时间:RTTS RTT的偏差加权平均值:RTTD 超时重传时间:RTO RTTS = (1 - α) * RTTS + α * 新的RTT样本值 (α一般为1/8) RTTD = (1 - β) * RTTD + β * | RTTS - 新的RTT样本值 | (β一般为1/4) RTO = RTTS + 4 * RTTD

Karn算法:①每次超时重传一个报文段时,停止计算新RTT样本值 ②每次超时重传一个报文段时,就把超时重传时间RTO增大y倍(一般为2倍) ③当不发生报文段重传时,才计算RTTS和超时重传时间RTO

2)快速重传

原因:超时重传作为TCP最基本的重传机制,效率较低。

img

超时的粗粒度实现方法导致连接在等待一个定时器超时时,很长一段时间连接无效。

基本思想:①接收方:当报文段到达,立刻回复ACK,即使该序号已被确认过 ②发送方:收到一个重复ACK(同一个确认的再一次重传称为重复确认),就知道接收方必定收到乱序到达的报文段,表明其前面的分组可能丢失。收到3个重复ACK时,立刻触发重传。

img

(6)拥塞控制

1)窗口大小

MaxWindow = min (cwnd, AdvertisedWindow) 拥塞窗口cwnd (Congestion Windows):拥塞控制算法决定,可以同时发出的最大字节数以防止造成网络拥塞 通知窗口 (AdvertisedWindow):接收方决定,可以同时发出的最大字节数以防止超出接收方的接收能力。

2)拥塞控制算法

①慢启动 把初始拥塞窗口 cwnd 设置为不超过2至4个SMSS(最大报文段长度),在每收到一个对新的报文段的确认后,把cwnd增加1个 SMSS 的数值数(每经过一个传输轮次,cwnd就加倍) 设置一个慢开始门限ssthresh 当cwnd < ssthresh时,使用慢开始算法 当cwnd ≥ ssthresh时,使用拥塞避免算法。

img

②拥塞避免(加法增大):每经过一个往返时间RTT把发送方的cwnd加1,使得cwnd慢性增加 ③快重传(乘法减小):收到3个重复ACK立即触发重传 ④快恢复(在快重传之后)

  1. ssthresh减小为当前cwnd的一半:ssthresh = cwnd / 2
  2. 新拥塞窗口 cwnd = 新的 ssthresh
  3. 执行拥塞避免 (AIMD),使cwnd缓慢线性增大

会话层

会话层(Session Layer),是在发送方和接收方之间进行通信时创建、维持、之后终止或断开连接的地方,与电话通话有点相似。

会话层定义了一种机制,允许发送方和接收方启动或停止请求会话,以及当双方发生拥塞时仍然能保持对话。

img

传输层和表示层之间的数据传递

会话层包含了一种称为检查点(Checkpoint)的机制来维持可靠会话。检查点定义了一个最接近成功通信的点,并且定义了当发生内容丢失或损坏时需要回滚以便恢复丢失或损坏数据的点,即断点下载的原理。
会话层还定义了当会话出现不同步时,需要重新同步化的机制。

会话层的主要任务是负责两个网络参与者之间进行的通信,这两个网络参与者在通信过程中通常交换一系列的消息或PDU(协议数据单元)。例如:用户登录到数据库上(建立阶段),输入一连串的查询(数据交换阶段),完成任务后退出登录(断开阶段)。

会话层的PDU有各种各样的类型(OSI协议族可以识别超过30种不同的PDU),该层PDU通常称为会话PDU(Session PDU),即SPDU。

表达层

表示层(Presentation Layer),管理到网络上(数据流从其往下到协议栈)和到特定机器或是应用程序上(数据流从其往上到协议栈)的数据的表示方式。

表示层处理一般的、面向网络形式表示的数据到更专用的、面向平台形式表示的数据变换,以及完成相反方向的变换。表示层的这一功能使得完全不同类型的计算机(可能是用不同的方式表示数值和字符)能够跨网络进行相互通信。

一般而言,有一种特殊的操作系统驱动程序驻留在表示层。这种驱动程序,微软术语是叫作重定向器(Redirector),UNIX术语称之为网络外壳(Network Shell,Novell Netware)。

这种特殊的驱动程序,任务就是把对网络资源的请求与对本地资源的请求区分开来,并把这样的请求重定向到恰当的本地子系统或远程子系统上。如此,计算机就无需辨别要访问资源的类型,只使用单个子系统访问各种资源,而不用去管这些资源驻留在本地子系统还是驻留在跨网络的远程计算机上。

对于开发人员而言,表示层可以让开发人员很容易地构建能够随意访问本地或远程资源的应用程序;对于用户而言,表示层能够让用户简单地请求他们所需要的资源,并让重定向器去解决如何满足用户请求这样的难题。
表示层能够为应用程序提供特殊的数据处理功能。协议变换,当应用程序使用的协议不同于网络通信所用协议时,表示层会进行协议的变换,比如在电子商务、数据库或其他面向事务服务的情况下,或者是数据加密(对于出站消息)、数据解密(对于入站消息)、数据压缩(对于出站消息)、数据解压缩(对于入站消息)。

img

对于协议变换的服务,无论发送方的表示层做了什么,接收方的表示层都必须予以复原,从而使连接的双方在某个时刻分享相似的数据视图。

表示层的PDU有各种各样的类型,被叫做表示PDU。

应用层

应用层(Application Layer),首先确认一点,应用层定义的是应用程序用于请求网络服务的接口,而不是指应用程序本身。

应用层主要定义了应用程序能够从网络上请求使用哪种类型的服务,并且规定了在从应用程序接收消息或向应用程序发送消息时,数据所必须采用的格式。

概括而言,应用层定义了一组对网络的访问控制,该层决定了应用程序能够请求网络完成什么类型的事情,或是网络支持什么类型的活动。例如,应用层规定了对特定文件或服务的访问权限,以及允许哪些用户对特定数据执行什么类型的动作。

应用层的PDU通常被叫做应用PDU。

这里给大家推荐零声教育全网独家的【Linux C/C++全栈开发】课程体系,通过原理技术+源码分析+案例分析+项目实战,全面解析存储全栈,5个专题详解,20+存储领域必备技术点,5个手写实现项目,全面解析:

手写TCP/IP用户态协议栈(纯C语言)

DPDK基础知识

  • 1、dpdk环境搭建与多队列网卡
  • 2、dpdk网卡绑定与arp
  • 3、dpdk发送过程的实现
  • 4、dpdk发送过程调试
  • 5、dpdk-arp实现
  • 6、arp 调试流程
  • 7、dpdk-icmp实现
  • 8、dpdk-icmp流程 调试与checksum实现
  • 9、arp-table的实现

协议栈之udp/tcp的实现

  • 1、arp request实现
  • 2、arp调试流程
  • 3、协议栈架构设计优化
  • 4、udp实现之udp系统api的设计
  • 5、udp实现之sbuf与rbuf的环形队列
  • 6、udp实现之发送流程与并发解耦
  • 7、udp实现之架构设计与调试
  • 8、tcp 三次握手实现之dpdk tcp流程架构设计
  • 9、tcp三次握手实现之dpdk tcp11个状态实现
  • 10、tcp三次握手实现之dpdk代码调试

协议栈之tcp的实现

  • 1、tcp数据传输之ack与seqnum的确认代码实现以及滑动窗口
  • 2、tcp数据传输之ack与seqnum代码实现以及滑动窗口
  • 3、tcp协议api实 现之bind, listen的实现
  • 4、tcp协议api实现之accept的实现
  • 5、tcp协议api实现之send, recv的实现
  • 6、tcp协议api实 现之close的实现
  • 7、tcp协议栈调试之段错误与逻辑流程
  • 8、tcp协议栈调试之ringbuffer内存错误.
  • 9、dpdk kni的原理与kni启动
  • 10、重构网络协议分发的流程

协议栈的组件功能

  • 1、kni抓包调试tcpdump
  • 2、dpdk kni mempool错误与内存泄漏
  • 3、基于熵的ddos检测的数学理论
  • 4、dpdk ddos熵计算代码实现
  • 5、dpdkddosattach检测准确度调试
  • 6、ddos attack测试工具hping3
  • 7、dpdk布谷鸟hash原理与使用

协议栈之tcp并发实现

  • 1、tcp并发连接的设计
  • 2、tcp并发epoll的实现
  • 3、tcp并 发协议栈与epoll的回调与并发测试
  • 4、bpf与bpftrace系统,网络挂载实现
  • 5、bpf与 bpftrace应用程序ntyco的挂载监控

DPDK网络基础组件

  • 1、mempool与mbuf的源码分析讲解
  • 2、dpdk-ringbuffer源码分 析
  • 3、dpdk-igb_ uio源码分 析
  • 4、dpdk-kni源码分析
  • 5、rcu的实现与互斥锁,自旋锁,读写锁

黑客/网络安全学习路线

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

网络安全学习资源分享:

下面给大家分享一份2025最新版的网络安全学习路线资料,帮助新人小白更系统、更快速的学习黑客技术!

一、2025最新网络安全学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

在这里插入图片描述

L1级别:网络安全的基础入门

L1阶段:我们会去了解计算机网络的基础知识,以及网络安全在行业的应用和分析;学习理解安全基础的核心原理,关键技术,以及PHP编程基础;通过证书考试,可以获得NISP/CISP。可就业安全运维工程师、等保测评工程师。

在这里插入图片描述

L2级别:网络安全的技术进阶

L2阶段我们会去学习渗透测试:包括情报收集、弱口令与口令爆破以及各大类型漏洞,还有漏洞挖掘和安全检查项目,可参加CISP-PTE证书考试。

在这里插入图片描述

L3级别:网络安全的高阶提升

L3阶段:我们会去学习反序列漏洞、RCE漏洞,也会学习到内网渗透实战、靶场实战和技术提取技术,系统学习Python编程和实战。参加CISP-PTE考试。

在这里插入图片描述

L4级别:网络安全的项目实战

L4阶段:我们会更加深入进行实战训练,包括代码审计、应急响应、红蓝对抗以及SRC的挖掘技术。并学习CTF夺旗赛的要点和刷题

在这里插入图片描述

整个网络安全学习路线L1主要是对计算机网络安全的理论基础的一个学习掌握;而L3 L4更多的是通过项目实战来掌握核心技术,针对以上网安的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、技术文档和经典PDF书籍

书籍和学习文档资料是学习网络安全过程中必不可少的,我自己整理技术文档,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,(书籍含电子版PDF)

在这里插入图片描述

三、网络安全视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的网安视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

四、网络安全护网行动/CTF比赛

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

五、网络安全工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。在这里插入图片描述

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了技术之后,就需要开始准备面试,我们将提供精心整理的网安面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

img

**读者福利 |** CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐