目录
一、概述:
1.运输层和应用层的关系:
2.因特网运输层的概述:
3.运输层提供的服务:
3.1 UDP:
3.2 TCP:
4.多路复用和多路分解:
4.1无连接的多路复用和多路分解:
4.2面向连接的多路复用与多路分解:
二、无连接传输——UDP:
1.UDP的报文结构:
2.UDP的校验和:
三、可靠数据传输原理:
1.构造可靠数据传输协议:
1.1经完全可靠信道的可靠数据传输:rdt1. 0 :
1.2经具有比特差错信道的可靠数据传输:rdt2. 0 :
1.3经具有比特差错的丢包信道的可靠数据传输:rdt3. 0 :
2.流水线可靠数据传输协议:
3.回退N步:
4.选择重传:
四、TCP:
1.TCP报文段格式:
2.TCP机制:
运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。
运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信功能。应用进程使用运输层提供的逻辑通信功能彼此发送报文,而无须考虑承载这些报文的物理基础设施的细节。
在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组,用因特网术语来讲该分组称为运输层报文段(segment)。
在协议栈中,运输层刚好位于网络层之上。网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。以送信举例,小李和小胡是A家的孩子,小刘和小齐是B家的孩子。这两家相互写信,邮递员把信从A家送到B家的过程就可以看做是网络层的逻辑通信,而当邮递员把小李的信交给小刘时,九可以看做是运输层的逻辑通信。
因特网为应用层提供了两种截然不同的可用运输层协议:UDP(用户数据报协议),它为调用它的应用程序提供了一种不可靠、无连接的服务。另一种是 TCP(传输控制协议),它为调用它的应用程序提供了一种可靠的、面向连接的服务。
为了简化术语,我们将运输层分组称为报文段(segment)。也将TCP的运输层分组称为报文段,而常将UDP的分组称为数据报。
UDP和TCP最基本的责任是,将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程之间的交付服务。将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解。
因特网网络层协议有一个名字叫IP即网际协议。IP为主机之间提供了逻辑通信。IP的服务模型是尽力而为交付服务。这意味着IP尽它“最大的努力”在通信的主机之间交付报文段,但它并不做任何确确保。IP被称为不可靠服务。
进程到进程的数据交付蹉错检查是两种最低限度的运输层服务,也是UDP所能提供的仅有的两种服务。
与IP一样,UDP也是一种不可靠的服务,即不能保证一个进程所发送的数据能够完整无缺地(或全部!)到达目的进程。
TCP为应用程序提供了几种附加服务。
在接收端,运输层检查这些字段,标识出接收套接字,进而将报文段定向到该套接字。将运输层报文段中的数据交付到正确的套接字的工将运输层报文段中的数据交付到正确的套接字的工作称为多路分解 。
在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(这将在以后用于分解)从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用。
通过上述讨论,我们知道运输层多路复用要求:①套接字有唯一标识符:②每个报文段有特殊字段来指示该报文段所要交付到的套接字。
一个 UDP套接字是由一个二元组全面标识的,该二元组包含一个目的IP地址和一个目的端口号。因此,如果两个UDP报文段有不同的源IP地址和/或源端口号,但具有相同的目的P地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程。
TCP套接字是由一个四元组(源P地址,源端口号,目的P地址,目的端口号)来标识的。因此,当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。特别与UDP 不同的是,两个具有不同源P地址或源端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。
UDP检验和提供了差错检测功能。发送方的UDP对报文段中的所有16比特字的和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文段中的检验和字段。
比如有三个16比特的数字,0110011001100000,0101010101010101,1000111100001100.
前两个数之和为1011101110110101,三数之和为0100101011000010,并且第二步加时会有溢出,会进行回卷。反码运算就是将所有的0换成1,所有的1转换成0。因此,该和0100101011000010的反码运算结果是1011010100111101,这就变为了检验和。在接收方,全部的4个16比特字(包括检验和)加在一起,如果没有引入差错,接收方处该和将是1111111111111111。
首先,我们考虑最简单的情况,即底层信道是完全可靠的。我们称该协议为rdt1.0,该协议本身是简单的。
发送方和接收方的FSM(发送方和接收方的有限状态机)每个都只有一个状态。
引起变迁的事件显示在表示变迁的横线上方,事件发生时所采取的动作显示在横线下方。
rdt的发送端只通过rdt_send( data)事件接受来自较高层的数据,产生一个包含该数据的分组(经由 make_pkt(data)动作),并将分组发送到信道中。实际上rdt_send ( data)事件是由较高层应用的过程调用产生的(例如.rdt send() ).
在接收端,rdt通过rdt_rev( packet)事件从底层信道接收一个分组,从分组中取出数据(经由extract ( packet,data)动作),并将数据上传给较高层(通过deliver_data( data)动作)。实际上,rdt_rev( packet)事件是由较低层协议的过程调用产生的(例如,rdt_rev())。
底层信道更为实际的模型是分组中的比特可能受损的模型。在计算机网络环境中,基于解决问题的重传机制的可靠数据传输协议称为自动重传请求(ARQ)协议。
ARQ协议中还需要另外三种协议功能来处理存在比特差错的情况:
- 差错检测。首先,需要一种机制以使接收方检测到何时出现了比特差错。
- 接收方反馈。因为发送方和接收方通常在不同端系统上执行,可能相隔数千英里,发送方要了解接收方情况(此时为分组是否被正确接收)的唯一途径就是让接收方提供明确的反馈信息给发送方。如肯定应答(ACK)和否定应答(NAK)。
- 重传。接收方收到有差错的分组时,发送方将重传该分组文。
当rdt_send(data)事件出现时,发送方将产生一个包含待发送数据的分组(sndp-kt),带有检验和,然后经由udt_send( sndpkt)操作发送该分组。在最右边的状态中,发送方协议等待来自接收方的ACK或NAK分组。如果收到一个 ACK分组,则发送方知道最近发送的分组已被正确接收,因此协议返回到等待来自上层的数据的状态。如果收到一个NAK分组,该协议重传上一个分组并等待接收方为响应重传分组而回送的ACK和 NAK。
rdt2.0接收方的FSM仍然只有单一状态。当分组到达时,接收方要么回答一个ACK,要么回答一个NAK,这取决于收到的分组是否受损。
rdt2.0协议看起来似乎可以运行了,但遗憾的是,它存在一个致命的缺陷。尤其是我门没有考虑到ACK或NAK分组受损的可能性!
所以引入简单加入分组序号形成rdt2.1。在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号放在该字段。于是,接收方只需要检查序号即可确定收到的分组是否一次重传。
rdt2.1和rdt2.2之间的细微变化在于,接收方此时必须包括由一个ACK报文所确认的分组序号,发送方此时必须检查接收到的ACK报文中被确认的分组序号。
现在假定除了比特受损外,底层信道还会丢包,这在今天的计算机网络(包括因特网)中并不罕见。协议现在必须处理另外两个关注的问题:怎样检测丢包以及发生丢包后该做些什么(重传)。
发送方需要等待多久才能确定已丢失了某些东西呢?
很明显发送方至少需要等待这样长的时间:即发送方与接收方之间的一个往返时延(可能会包括在中间路由器的缓冲时延)加上接收方处理一个分组所需的时间。在很多网络中,最坏情况下的最大时延是很难估算的,确定的因素非常少。
实践中采取的方法是发送方明智地选择一个时间值,以判定可能发生了丢包(尽管不能确保)。如果在这个时间内没有收到ACK,则重传该分组。注意到如果一个分组经历了一个特别大的时延,发送方可能会重传该分组,即使该数据分组及其ACK都没有丢失。这就在发送方到接收方的信道中引人了冗余数据分组的可能性。幸运的是.rdt2.2协议已经有足够的功能(即序号)来处理冗余分组情况
不以停等方式运行,允许发送方发送多个分组而无须等待确认.
因为许多从发送方向接收方输送的分组可以被看成是填充到一条流水线中,故这种技术被称为流水线技术。
流水线技术对可靠数据传输协议可带来如下影响:
- 必须增加序号范围,因为每个输送中的分组(不计算重传的)必须有一个唯一的序号,而且也许有多个在输送中的未确认报文。
- 协议的发送方和接收方两端也许不得不缓存多个分组。发送方最低限度应当能缓冲那些已发送但没有确认的分组。如下面讨论的那样,接收方或许也需要缓存那些已正确接收的分组。
- 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏及延时过大的分组。解决流水线的差错恢复有两种基本方法是:回退N步和选择重传。
在回退N步(GBN)协议中,允许发送方发送多个分组(当有多个分组可用时)而不需等待确认,但它也受限于在流水线中未确认的分组数不能超过某个最大允许数N。
那些已被发送但还未被确认的分组的许可序号范围可以被看成是一个在序号范围内长度为N的窗口。随着协议的运行,该窗口在序号空间向前滑动。因此,N常被称为窗口长度(window size ),GBN 协议也常被称为滑动窗口协议sliding-window protocol)。
顾名思义,选择重传(SR)协议通过让发送方仅重传那些它怀疑在接收方出错(即丢失或受损)的分组而避免了不必要的重传。这种个别的、按需的重传要求接收方逐个地确认正确接收的分组。再次用窗口长度N来限制流水线中未完成、未被确认的分组数。
- 首部包括源端口号和目的端口号,它被用于多路复用/分解来自或送到上层应用的数据。
- 32比特的序号字段和32比特的确认号字段。这些字段被TCP发送方和接收方用来实现可靠数据传输服务,讨论见后。
- 16比特的接收窗口字段,该字段用于流量控制。
- 4比特的首部长度字段,该字段指示了以32比特的字为单位的TCP首部长度。由于TCP选项字段的原因,TCP首部的长度是可变的。(通常,选项字段为空,所以 TCP 首部的典型长度是20字节。)
- 可选与变长的选项字段,该字段用于发送方与接收方协商最大报文段长度(MSS)时,或在高速网络环境下用作窗口调节因子时使用。
- 6比特的标志字段。ACK比特用于指示确认字段中的值是有效的,即该报文段包括一个对已被成功接收报文段的确认。RST、SYN和FIN 比特用于连接建立和拆除。
然后就是TCP的一些机制,这些在另一篇博客有所详解:
https://blog.csdn.net/weixin_57133901/article/details/124359284?spm=1001.2014.3001.5502