计算机网路-传输层详解

一、传输层的服务基本原理

1.多路复用和解复用(分路)技术

复用是指:发送方的不同的应用进程都可以使用同一个传输层协议传送数据;

分路技术是指:接收方的传输层剥去报文首部之后能把这些数据正确的传输到正确的应用进程上。

2.可靠数据传输


3.流量控制和拥塞控制

二、传输层提供的服务

2.1传输层寻址和端口

传输层主要是提供不同主机上的进程之间的逻辑通信(端到端的通信),即使在不可靠的网络层(主机之间的逻辑通信)传输下,传输层也能提供可靠的传输。(所谓的逻辑通信就是指:传输层之间看似是在水平方向传送数据,但是事实上这两个传输层之间并没有水平方向上的物理连接

传输层的寻址最重要的就是进程的端口号了。那么什么是端口和端口号呢?

端口简言之就是为其临近层的应用层的各个应用进程的数据通过这个“门”向下传递给传输层,反过来呢就是让传输层知道接受到的报文数据如何正确传递交付到对应的应用层上的进程上。

端口号就是用来标识应用进程的数字标识。其端口号的长度为16Bit;也就是能够标识2^16个不同的端口号。另外端口号根据端口范围分为2类。

1.服务端使用的端口号:1、熟知端口号:0-1023范围。由IANA(互联网地址指派机构分配给TCP/IP最重要的一些应用进程,为固定格式)。2、登记端口号:1024-49151为没有熟知端口号的应用程序使用的,需要给IANA注册登记,防止重复。

常见的熟知端口号:

应用进程 FTP TELNET SMTP DNS TFTP HTTP SNMP
端口号 21  23 25 53 69 80 161

2.客户端使用的端口号:数值范围为49152-65535.也叫作短暂端口号。是在客户端进程运行成功后动态选择的。

另外需要注意 是端口号只具有本地意义,即端口号只是标志本地计算机应用层的各进程。在因特网中,不同的计算机的相同端口号是没有联系的。

补充:套接字(socket)。我们知道在网络中通过Ip来唯一标识一个主机。而通过端口号来标识一台主机中的不同应用进程。所以在网络连接中就出现了Socket套接字来标识一个主机上的某进程。其实际是一个通信端点。

套接字(Socket) = (Host IP , port)

2.2无连接服务和面向连接服务

面向连接和无连接服务的区别在于在通信双方通信之前,是否需要先建立连接。换句话说就是,通信双方之间的数据传输是否基于双方需要建立连接。那么,面向连接就是在双方通信之前,必须建立连接,在通信过程中,整个连接的过程一直被监控和管理,在通信结束之后,则释放这个连接。相反,无连接服务是。两个实体之间的通信不需要建立好连接,需要通信时,直接将信息发送到“网络”上,让该信息在网上尽力传输到目的方。

在TCP/IP协议簇中,在IP层中使用了这两种协议服务。其中TCP提供面向连接的可靠的传输服务,它不提供广播和组播机制,包括了确认-重传机制、流量控制、计时定时器、连接管理等等。这一方面使得TCP连接适用在可靠性高的传输场合,如HTTP何FTP、TELNET等 。但是,另一方面呢就是也因此增加了开销。例如数据报的报头增大。

UDP协议是非连接的不可靠传输机制。它在Ip之上仅提供了多路复用和数据差错检查服务。由于UDP服务不需要建立连接,执行速度快,实时性好,只要用于小文件的传输协议*(DNS,SNMP,RTP,TFTP)

补充:

1.IP数据报和UDP数据报的区别:IP数据报在网络层要经过路由的存储转发;而UDP数据报是在传输层的端到端的逻辑信道中传输,而封装成IP数据报在网络传输中,UDP数据报对于路由是不可见的。

2.TCP和网络层的虚电路的区别:TCP报文段在传输层抽象的逻辑信道中传输,对路由器不可见;虚电路所经过的交换节点都必须保存虚电路状态信息。在网络层若采用虚电路方式,则无法提供无连接服务;而传输层采用TCP协议不影响网络层提供无连接服务。

三、UDP协议

3.1UDP的首部格式

UDP数据报有两个部分组成,分为UDP首部和用户数据。首部部分有8个字节,4个2字节的字段组成,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中。其UDP数据报组成图解如下:计算机网路-传输层详解_第1张图片

其中checkSum校验和表示简单的校验和来进行差错检测。有错就丢弃。该字段是可选的。

计算机网路-传输层详解_第2张图片


以下是UDP数据报首部和伪首部(12位,为了计算检验和)和IP数据报的图解

计算机网路-传输层详解_第3张图片

伪首部仅仅是为了计算校验和,而不进行传送和递交服务。这样的校验和,既检查了UDP数据报,

又同时对IP数据报的源IP地址和目的IP地址进行了校验。


四、TCP协议

TCP协议只要解决传输的可靠、有序、无丢失和不重复的问题,它主要特点是:

1.是面向连接的传输层协议。

2.是端对端的,只能是一对一连接。

3.可靠的交付服务。无差错、无重复、且有序。

4.面向字节流

4.1、TCP报文报

同样的,TCP数据报分为数据首部和TCP数据两部分。其首部格式图解:

计算机网路-传输层详解_第4张图片

字段解释:

  • 来源连接端口(16位长)-辨识发送连接端口
  • 目的连接端口(16位长)-辨识接收连接端口
  • 序列号(seq,32位长)
  • 确认号(ack,32位长) —期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1。 
    • 如果含有同步化旗标(SYN),则此为最初的序列号;第一个数据比特的序列码为本序列号加一。
    • 如果没有同步化旗标(SYN),则此为第一个数据比特的序列码。
  • 报头长度 —以4字节(如果不这样根本不够)为单位计算出的数据段开始地址的偏移值。
  • 保留 —须置0
  • 标志符 
    • URG —为1表示高优先级数据包,紧急指针字段有效。
    • ACK —为1表示确认号字段有效
    • PSH —为1表示是带有 PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满(很少使用)
    • RST —为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。
    • SYN —为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
    • FIN —为1表示发送方没有数据要传输了,要求释放连接。
  • 窗口(WIN) —表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。用于流量控制
  • 校验和 —对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得。这是一个强制性的字段。
  • 紧急指针 —本报文段中的紧急数据的最后一个字节的序号。
  • 选项字段 —最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。

序列号:

  • 序列号指的是Segment中第一个字节的编号,而不是Segment的编号
  • 建立TCP连接时,双方随机选择序列号

ACKs:

  • 希望收到的下一个字节的序列号
  • 累积确认:该序列号之前的所有字节均已被正确接收到

五、可靠数据传输的基本原理:

计算机网路-传输层详解_第5张图片

可靠数据传输的基本结构-接口

计算机网路-传输层详解_第6张图片

3.可靠传输协议Rdt版本

3.1、rdt1.0

基本特性:

  • 底层信道完全可靠
  • 不会丢弃分组
有限状态机Finite State Machine互相独立
计算机网路-传输层详解_第7张图片

3.2、Rdt2.0(引入差错控制-接收发送反馈-重传机制)


计算机网路-传输层详解_第8张图片

下面是Rdt2.0下的有限状态机的简图表示:采用停等协议

计算机网路-传输层详解_第9张图片

我们再看看当通信中无错误存在下的有限状态机FSM的简图

计算机网路-传输层详解_第10张图片




下面是有错误存在的FSM简图

计算机网路-传输层详解_第11张图片

总结:在rdt2.0中我们很好的引入了检验和来检验差错,同时引入ACK和NAK进行反馈给发送方,告知接收是否成功,如果不成功发送NAK给sender,sender重传。但是我们考虑:如果反馈信息ACK和NAK存在错误呢?那么发送方收到的反馈就是错误的或者接收不到呢?所以引入rdt2.1

计算机网路-传输层详解_第12张图片

Rdt2.1的sender和rev方对Rdt2.1的有限状态机表示:
计算机网路-传输层详解_第13张图片

Sender

计算机网路-传输层详解_第14张图片

Receiver2.1

总体来说Rdt2.1相比,具有以下改进:

计算机网路-传输层详解_第15张图片

我们可以发现在Rdt2.1中,我们只是针对ACK进行了检验,加入了序列号解决分组重传重复问题,那么NAK就不需要了,所以Rdt2.2的做法就是不采用NAK。

我们再考虑到如果传输信道极可能发生错误吗,也可能发生分组丢失,那么Rdt2.2上采用的“序号+检验和+ACK+重传机制就不能实际解决问题了。那么也就出现了Rdt3.0,引入定时器”

计算机网路-传输层详解_第16张图片

rdt3.0举例:

计算机网路-传输层详解_第17张图片

六、TCP连接管理:

TCP是面向连接的,所以每一个TCP都会有三个阶段状态:连接建立、数据传送、连接拆除。连接管理就是使运输连接的建立和释放都正常运行。

6.1、TCP的连接建立

典型的“三次握手”:

第一次握手

当客户端向服务器发起连接请求时,客户端会发送同步序列标号SYN到服务器,在这里我们设SYN为m,等待服务器确认,这时客户端的状态为SYN_SENT。

第二次握手

当服务器收到客户端发送的SYN后,服务器要做的是确认客户端发送过来的SYN,在这里服务器发送确认包ACK,这里的ACK为m+1,意思是说“我收到了你发送的SYN了”,同时,服务器也会向客户端发送一个SYN包,这里我们设SYN为n。这时服务器的状态为SYN_RECV。在此时,服务器为该TCP连接分配TCP缓存和变量。服务器资源在此时分配(而客户端在第三次完成时才分配资源)。记录了客户端的请求信息,如果没有收到来自客户端的第三次回话,就会在一段时间内缓存TCP信息,这也是黑客攻击服务器的SYN洪泛攻击

一句话,服务器端发送SYNACK两个包。

第三次握手

客户端收到服务器发送的SYNACK包后,需向服务器发送确认包ACK,“我也收到你发送的SYN了,我这就给你发个确认过去,然后我们即能合体了”,这里的ACK为n+1,发送完毕后,客户端和服务器的状态为ESTABLISH,即TCP连接成功。

在三次握手中,客户端和服务器端都发送两个包SYNACK,只不过服务器端的两个包是一次性发过来的,客户端的两个包是分两次发送的

图解三次握手:

计算机网路-传输层详解_第18张图片


6.2、TCP连接的释放

典型“四次挥手”

四次挥手

当A端和B端要断开连接时,需要四次握手,这里称为四次挥手。

断开连接请求可以由客户端发出,也可以由服务器端发出,在这里我们称A端向B端请求断开连接。

第一次挥手

A端向B端请求断开连接时会向B端发送一个带有FIN标记的报文段,这里的FINFINish的意思。

第二次挥手

B端收到A发送的FIN后,B段现在可能现在还有数据没有传完,所以B端并不会马上向A端发送FIN,而是先发送一个确认序号ACK,意思是说“你发的断开连接请求我收到了,但是我现在还有数据没有发完,请稍等一下呗”。

第三次挥手

当B端的事情忙完了,那么此时B端就可以断开连接了,此时B端向A端发送FIN序号,意思是这次可以断开连接了。

第四次挥手

A端收到B端发送的FIN后,会向B端发送确认ACK,然后经过两个MSL时长后断开连接。

MSL是Maximum Segment Lifetime,最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。
四次挥手图解

计算机网路-传输层详解_第19张图片


TCP连接管理总结:

1、连接建立

  1. 客户端:syn= 1,seq=x;
  2. 服务端:syn = 1,ACK = 1,seq = y, ack = x+1;
  3. 客户端:ACK = 1,seq = x+1,ack = y+1;

2、连接释放

  1. 客户端:FIN = 1,seq = u;
  2. 服务端:ACK = 1, seq = v,ack = u+1;
  3. 服务端:FIN= 1,ACK = 1,seq  =w,ack = u+1;
  4. 客户端:ACK= 1,seq = u+1,ack = w+1;

七、TCP的可靠传输
TCP提供的可靠传输就是要保证接收方从缓存中读取的字节流和发送方发出点的字节流是完全一致的。TCP使用了校验和、=序号、确认、重传机制来得到结果目的。
7.1、序号
TCP首部的序号存在的价值在于让数据能够有序的交付给应用层。TCP把数据看成是无结构但是有序的字节流。序号是建立在字节流上的。TCP中的每个数据流的字节都附加上一个序号。序号字段的值是该发送数据的第一个字节的序号。如图:假设A-B之间建立了一条TCP连接,A的发送缓存区有0-9的十个字节。第一个报文为 0-2;则该报文段的序号为0; 第二报文段序号为3.


0 1 2 3 4 5 6 7 8 9
7.2、确认号
TCP首部的确认号是期望对方下一次报文段的数据的第一个字节的序号。如上图所示,如果B成功接收了0-2的第一报文段,则B发送给A的报文中确认号为3.发送方会继续存储那些已经发送,但是未收到确认的报文段,以便需要的时候进行重传。
TCP你、默认使用的是累计确认。即TCP中只确认数据流中至第一个丢失字节为止的字节。比如,B收到A发送的包含字节0-2和6-7的报文段。由于某种原因,没有收到3-5的报文段。此时B仍然在等待字节3和后面的字节。因此,B到A的下一个报文段将确认号置为3。

7.3、重传
导致重传的事件: 超时和冗余ACK.
7.3.1、超时
TCP每发送一个报文段的同时就会启动该报文段的计时器。只要计时器设置的重传时间到期但还没有收到确认时,就重传该报文段。
TCP采用自适应的算法确认时间RTT(Round-Trip-Time),计算公式为:
新的RTTs = (1-a)*(旧的RTTs)+a*(新的RTT样本)          a 的典型取值为0.125
计时器设置的超时重传时间RTO(Retransmission Time-Out)时间的取值应该大于加权平均RTT,取值为RTO  = RTTs +4*RTTd
RTTd是RTT的偏差加权平均值。RTTd = (1-B)*(旧的RTTd)+B*[RTTs-新的RTT样本]  B = 0.25

7.3.2、冗余ACK
快速重传’ 算法:就是在收到对同一个报文段的三次ACK时, 就会迅速的重传相应的报文段。


八、流量控制
防止发送方使接收方缓存区溢出的可能性。换句话说就是流量控制是一个速度匹配服务(匹配发送方的发送速率和接收方的读取速率)
流量控制是通过滑动窗口协议的控制原理的,在通信过程中,接收方根据自己的缓存区大小,动态的调整发送方的发送窗口大小,这就是接受窗口rwnd。也就是调整TCP报文段的首部的“窗口”字段值。来限制发送方网络注入报文的速率。同时,发送方根据当前网络拥塞程序情况而确定窗口值,成为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关。其实,在发送端的窗口大小是取rwnd和cwnd中的最小值。
利用滑动窗口进行流量控制的图解:

计算机网路-传输层详解_第20张图片


如上图所示A向B发送数据。在连接建立时,B告诉A接收窗口rwndreceiver window= 400,单位字节,因此发送方A的发送窗口不能400

(可以看出,B向A发送的三个报文段都设置了 ACK = 1以保证字段有效,后面的rwnd值就是接收方对发送方的三次流量控制。)

第一次把窗口设置为300 ,第二次100 ,最后一次为 0,即不允许发送方再发送数据的状态。

但是当某个ACK报文丢失了,就会出现A等待B确认,并且B等待A发送数据的死锁状态。为了解决这种问题,TCP引入了持续计时器(Persistence timer,当A收到rwnd=0时,就启用该计时器,时间到了则发送一个1字节的探测报文,询问B是很忙还是上个ACK丢失了,然后B回应自身的接收窗口大小,返回仍为0(A重设持续计时器继续等待)或者会重发rwnd=x。


九、TCP拥塞控制
所谓的拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致于过载。网络中的链路容量、交换结点中的缓存、处理机等等都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。
拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。
因特网建议标准定义了四种算法来进行拥塞控制:慢启动、拥塞避免、快重传和快恢复
9.1慢启动算法
在刚开始启动TCP连接时,先令拥塞窗口cwnd=1,即最大的报文段长度MSS,每收到一个对新的报文段的确认后,将cwnd加1.用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入网络的效率更高。成指数型增长,直到达到一个阈值后再改用拥塞控制算法

9.2、拥塞避免算法
拥塞控制的做法是:发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小。而不是加倍。使cwnd呈现线性增长(即加法增大),而当出现一次超时(网络拥塞),则让慢启动的门限阈值减少为当前cwnd的一半(乘法减小)。

慢开始算法是指开始发送数据时,并不清楚网络的负荷情况,会先发送一个1字节的试探报文,当收到确认后,就发送2个字节的报文,继而4个,8个以此指数类推。

需要注意的是,慢开始的“慢”并不是指拥塞窗口的增长速率慢,而是指在TCP开始发送报文时先设置拥塞窗口=1

拥塞避免算法是让拥塞窗口缓慢地增大,即cwnd加1,而不是如慢开始算法一样加倍。



两种拥塞处理的实例:
计算机网路-传输层详解_第21张图片

根据上图的实例进行分析,一开始的慢开始算法的指数增长是很恐怖的,所以为了防止拥塞窗口cwnd增长过快需要设置一个门限ssthresh,这里是16

(1)当 cwnd < ssthresh 时,使用上述的慢开始算法。

(2)当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

(3)当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。(通常做法)

无论在慢开始阶段还是在拥塞避免阶段,只要发送方没有收到确认,就认为这时候拥塞了,就要把慢开始门限ssthresh设置为此时发送方窗口值的一半(上例中是把发送方窗口值24修改为12)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法

这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。


在慢开始和拥塞避免算法中,使用了“乘法减小”和“加法增大”方法。

其中”乘法减小“是指不论在慢开始还是拥塞避免阶段,只要出现一次超时(很有可能出现了拥塞),就把慢启动的初始阈值调整为当前拥塞窗口的一半值。当网络中频繁出现拥塞时,初始阈值就会下降的很快。以大大减少注入网络中的分组数。

”加法增大“是指在执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个RTT),就把拥塞窗口cwnd增加一个MSS大小,使得拥塞窗口缓慢增大,以避免网络的过早出现拥塞。


9.3 快恢复和快重传

快重传是指,如果发送端接收到3个以上的重复ACK,不需要等到重传定时器溢出就重新传递,所以叫做快速重传,而快速重传以后,因为走的不是慢启动而是拥塞避免算法,所以这又叫做快速恢复算法。

如果没有快速重传和快速恢复,TCP将会使用定时器来要求传输暂停。在暂停这段时间内,没有新的数据包被发送。所以快速重传和快速恢复旨在快速恢复丢失的数据包

快重传图解

计算机网路-传输层详解_第22张图片


快恢复是配合快重传的

计算机网路-传输层详解_第23张图片

有以下两个要点:

①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。

②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。
















你可能感兴趣的:(网络笔记)