从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供了主机之间的逻辑通信。显然,即使当网络层协议是不可靠的,也就是即使网络层协议会使分组丢失、混乱和重复,传输层同样也能为应用程序提供可靠的服务。
传输层为相互通信的的进程提供逻辑通信
传输层的功能
1、传输层提供应用进程之间的逻辑通信 (即端到端的通信)。与网络层的区别是,网络层提供的是主机之间的逻辑通信。
2、复用和分用。
3、传输层对收到的报文进行差错检测 (首部和数据部分)。而网络层只检查IP数据报的首部,不检验数据部分是否出错。
4、提供两种不同的传输协议,即面向连接的TCP和无连接的UDP。而网络层无法同时实现两种协议。
当传输层采用面向连接的TCP时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于是一条全双工的可靠信道。但当传输层采用无连接的UDP时,这种逻辑通信信道仍然是一条不可靠信道。
端口的作用
端口号
应用进程通过端口号进行标识,端口号长度为16bit,能够表示65536
(216)个不同的端口号。端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程,不同计算机的相同 端口号是没有联系的。
根据端口号范围可将端口分为两类
套接字
概述
面向连接服务:是在通信双方进行通信之前,必须先建立连接,在通信过程中,整个连接的情况一直被实时地监控和管理。当通信结束后 ,则应该释放这个连接。
无连接服务:两个实体之间的通信不需要先建立好连接,需要通信的时候,直接将信息发送到“网络”中,让该信息的传递在网上尽力而为地往目的地传送。
TCP/IP 协议族在IP层之上使用了两个传输协议 :
IP数据报和UDP数据报的区别
TCP和网络层虚电路的区别
概述
[RFC 768]定义的UDP只是做了传输协议能够做的最少工作,只在IP的数据报服务之上增加了两个最基本的服务:复用和分用以及差错检测。
特点
UDP是无连接的,减少开销和发送数据之前的时延。
UDP使用最大努力交付,即不保证可靠交付。
UDP是面向报文的,适合一次性传输少量数据的网络应用。
UDP无拥塞控制,适合很多实时应用 。
UDP首部开销小,8B,TCP20B。
UDP优点:
UDP常用于一次性传输比较少量数据的网络应用,如 DNS、SNMP等,也常用于多媒体应用如IP电话、实时视频会议、流媒体等。
UDP提供尽最大努力的交付, 即不保证可靠交付,但这并不意味着应用对数据的要求是不可靠的,因此所有维护传输可靠性的工作需要用户在应用层来完成。应用实体可以根据应用的需求来灵活设计自己的可靠性机制。
UDP是面向报文的。报文不可分割,是UDP数据报处理的最小单位。
UDP的首部格式
UDP数据报包含两个部分:UDP首部和用户数据,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中。UDP首部有8个字节,由4个字段组成,每个字段的长度都是两个字节。
各字段意义:
源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
目的端口:目的端口号。这在终点交付报文时必须要使用到。
长度:UDP数据报的长度(包括首部和数据),其最小值是8(仅有首部)。
校验和:检测UDP数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段为全0。
概述
UDP校验和计算过程
UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反。但不同的是:IP数据报的校验和只检验IP数据报的首部,但UDP的校验和是把首部和数据部分一起都检验。
在发送端:
在接收端:
注意
这种简单的差错检验方法的检错能力并不强,但它的好处是简单,处理速度快。
概述
TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、 无丢失和不重复的问题。
特点
概述
TCP传送的数据单元称为报文段。一个TCP报文段分为TCP首部和TCP数据两部分,整个TCP段作为IP数据报的数据部分封装在IP数据报中。其首部的前20字节是固定的。TCP报文段的首部最短为20字节,后面有4N宇节是根据需要而增加的选项,通常长度为4字节的整数倍。
TCP报文段既可以用来运载数据,也可以用来建立连接、释放连接和应答。
TCP报文段首部
各字段意义:
1、源端口和目的端口字段:各占2字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
2、序号字段:占4字节,TCP是面向字节流的,所以TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
3、确认号字段:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 若确认号=N,则表明到序号N-1为止的所有数据都己正确收到。
4、数据偏移字段: (表示首部长度) 占4位 ,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,单位是32位 (以4字节为计算单位)。因此当此字段的值为15时, 达到TCP首部的最大长度60字节。
5、保留字段:占6位,保留为今后使用,但目前应置为0,该字段可以忽略不计。
6、6个控制位
7、窗口字段:占2字节。它指出了现在允许对方发送的数据量,接收方的数据缓存空间是有限的,故用窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节。
8、检验和字段:占2字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,和UDP一样,要在TCP报文段的前面加上 12字节的伪首部。
9、紧急指针字段:占 16 位,指出在本报文段中紧急数据共有多少个字节 (紧急数据放在本报文段数据的最前面)。
10、选项字段:长度可变。TCP最初只规定了一种选项,即最大报文段长度。MSS是TCP报文段中的数据字段的最大长度。
11、填充字段:为了使整个首部长度是4字节的整数倍。
概述
TCP是面向连接的协议。因此每一个TCP连接都有三个阶段:连接建立、数据传送和连接释放。TCP连接的管理就是使运输连接的建立和释放都能正常进行。
TCP连接的建立采用客户/服务器方式。 主动发起连接建立的应用进程叫做客户机(Client),而被动等待连接建立的应用进程叫做服务器( Server)。
TCP的连接的建立
连接的建立经历以下 3 个步骤,通常称为“三次握手:
阶段1:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为 1。另外,客户机会随机选择一个起始序号 seq=x (连接请求报文不携带数据,但要消耗掉一个序号) 。
阶段2:服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序号 seq=y (确认报文不携带数据,但也要消耗掉一个 序号)。确认报文段同样不包含应用层数据。
阶段3:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量 。这个报文段的 ACK 标志位被置1,序号宇段为x+1,确认号字段 ack=y+1。该报文段可以携带数据,如果不携带数据则不消耗序号。
注意:
SYN洪泛攻击
SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送 TCP SYN, SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
TCP连接的释放
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。TCP连接释放的过程通常称为“四次挥手”。
阶段1:客户机打算关闭连接,就向其TCP发送一个连接释放报文段,并停止再发送数据, 主动关闭TCP连接,该报文段FIN标志位被置1, seq=u,它等于前面己传送过的数据的最后一个字节的序号加1 (FIN报文段即使不携带数据,也要消耗掉一个序号)。
阶段2:服务器收到连接释放报文段后即发出确认,确认号是 ack=u+1,而这个报文段自己的序号是v,等于它前面己传送过的数据的最后 一个字节的序号加1。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。
阶段3:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出FIN=1的连接释放报文段。
阶段4:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认号ack=w+1, 序号 seq=u+1。此时 TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后, A才进入到连接关闭状态。
概述
TCP的任务是在IP层的不可靠的、尽力而为服务 的基础上建立一种可靠数据传输服务。TCP提供的可靠数据传输服务就是要保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。TCP使用了校验、序号、确认和重传等机制来达到这个目的。
序号
TCP首部的序号宇段用来保证数据能有序提交给应用层,TCP把数据看成一个无结构但是有序的字节流,而序号是建立在传送的字节流之上,而不是建立在报文段之上。
TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
假设A和B之间建立了一条TCP连接,A的发送缓存区中总共有10个字节,序号从0开始标号,第一个报文包含第0~2个字节,则该TCP报文段的序号是0;第二个报文段的序号是3。
确认
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。发送方缓存区会继续存储那些已经发送但未收到确认的报文段,以便在需要的时候重传。
TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节。
重传
有两种事件会导致TCP对报文段进行重传:超时和冗余ACK。
1、超时
TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到期但还没有收到确认,就要重传这一报文段。
由于TCP的下层是一个互联网环境,IP数据报所选择的路由变化很大。因而传输层的往返时延的方差也很大。为了计算超时计时器的重传时间,TCP采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差叫做报文段的往返时间(Round-Trip Time,RTT)。
TCP保留了RTT的一个加权平均往返时间RTTs,当第一次测量RTT样本时,RTTs值就为所测量到的RTT样本的值,但以后每测量一个新的 RTT样本,就重新计算一次RTTs。
公式: 新 的 R T T S = ( 1 − α ) ∗ ( 旧 的 R T T S ) + α ∗ ( 新 的 R T T 样 本 ) 新的RTT_S=(1-\alpha)*(旧的RTT_S)+\alpha*(新的RTT样本) 新的RTTS=(1−α)∗(旧的RTTS)+α∗(新的RTT样本)
参数: 0 ≤ α ≤ 1 0\leq\alpha\leq1 0≤α≤1 ,若α很接近于零,表示新的RTTs值和旧的RTTs值相比变化不大,而受新的RTT样本影响不大 (RTT 值更新较慢)。若选择α接近于1,则表示新的RTTs值受新的RTT样本的影响较大 (RTT值更新较快)。
超时计时器设置的超时重传时间 ( Retransmission Time-Out, RTO) 应略大于加权平均往返时间RTTs:
公式: R T O = R T T S + 4 ∗ R T T D RTO=RTT_S+4*RTT_D RTO=RTTS+4∗RTTD
参数: R T T D RTT_D RTTD 是RTT的偏差的加权平均值,它与 R T T S RTT_S RTTS和新的RTT样本之差有关。当第一次测量时, R T T D RTT_D RTTD 取为测量到的RTT样本值的一半。
公式: 新 的 R T T D = ( 1 − β ) ∗ ( 旧 的 R T T D ) + β ∗ ∣ R T T S − 新 的 R T T 样 本 ∣ 新的 RTT_D=(1-\beta)*(旧的RTT_D)+\beta*|RTT_S-新的RTT样本| 新的RTTD=(1−β)∗(旧的RTTD)+β∗∣RTTS−新的RTT样本∣
参数: β \beta β是个小于1的系数,它的推荐值是0.25。
2、冗余ACK (冗余确认)
每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。 冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认。
TCP规定每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。
TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。
发送方己发送1, 2, 3, 4, 5报文段
接收方收到1,返回给1的确认(确认号为2的第个字节)
接收方收到3,仍返回给1的确认(确认号为2的第一个字节)
接收方收到4,仍返回给1的确认(确认号为2的第一个字节)
接收方收到5,仍返回给1的确认(确认号为2的第一个字节)
发送方收到3个对于报文段1的冗余ACK - 认为2报文段丢失,重传2号报文段(快速重传)
概述
TCP提供了流量控制服务以消除发送方使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。TCP利用滑动窗口机制实现流量控制。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这就是接收窗口rwnd,即调整TCP报文段首部中的“窗口”宇段值,来限制发送方向网络注入报文的速率。
同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口值,称为拥塞窗口 cwnd,其大小与网络的带宽和时延密切相关。发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
示例
A向B发送数据,连接建立时,B告诉A:“我的rwnd=400(字节)",假设每一个报文段100B,报文段序号初始值为1。
问题:当响应主机B的滑动窗口值为0时,主机A会一直等待B的确认,进而形成一个死锁局面。
解决:
注意
传输层 & 数据链路层流量控制的区别:传输层定义了端到端用户之间的流量控制,数据链路层定义了两个中间的相邻结点的流量控制。另外,数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层则可以动态变化。
概述
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。当出现拥塞时,端点并不能了解到拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。当然拥塞控制和流量控制也有相似的地方,都是通过控制发送方发送数据的速率来达到效果的。
出现拥塞的条件
本质:对资源需求的总和>可用资源
网络中有许多资源同时呈现供应不足 -> 网络性能变坏 -> 网络吞吐量将随输入负荷增大而下降
拥塞控制 & 流量控制区别
拥塞控制:是让网络能够承受现有的网络负荷,它是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
流量控制:往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
拥塞控制算法
为了更好地对传输层进行拥塞控制,因特网建议标准定义了以下四种算法 : 慢开始、拥塞避免、快重传、快恢复。
发送方在确定发送报文段的速率时,既要根据接收方的接收能力,又要从全局考虑不要使网络发生拥塞。因此,TCP协议要求发送方维护以下两个窗口:
接收窗口rwnd:接收方根据目前接收缓存大小所许诺的最新的窗口值,反映了接收方的容量。由接收方根据其放在TCP报文的首部的窗口字段通知发送方。
拥塞窗口cwnd:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映了网络的当前容量。只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的分组数。
发送窗口的上限值取接收窗口rwnd和拥塞窗口cwnd中较小的一个: 发 送 窗 口 上 限 值 = M i n [ 接 收 窗 口 r w n d , 拥 塞 窗 口 c w n d ] 发送窗口上限值=Min[接收窗口rwnd,拥塞窗口cwnd] 发送窗口上限值=Min[接收窗口rwnd,拥塞窗口cwnd]
慢开始和拥塞避免
慢开始算法:在 TCP刚刚连接好,开始发送TCP报文段时,先令拥塞窗口cwnd=1, 即一个最大报文段长度MSS。而在每收到一个对新的报文段的确认后,将cwnd加1,即增大一个MSS。用这样的方第法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
拥塞避免算法:发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小,而不是加倍,使cwnd按线性规律缓慢增长 (即加法增大), 而当出现一次超时(网络拥塞)时, 则令慢开始门限 ssthresh等于当前cwnd的一半(即乘法减小)。
根据 cwnd 的大小执行不同的算法,可归纳如下:
网络拥塞的处理:当网络出现拥塞时,无论在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(没有按时收到确认,重传计时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送方cwnd值的一半(但不能小于2)。 然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞,并非完全能避免拥塞。
慢开始和拥塞避免算法的实现举例
快重传和快恢复
快重传和快恢复算法是对慢开始和拥塞避免算法的改进。
实际上,慢开始、拥塞避免算法、快重传和快恢复几种算法应该是同时应用在拥塞控制机制之中的,当发送方检测到超时的时候就采用慢开始和拥塞避免, 当发送方接收到冗余ACK的时候就采用快重传和快恢复。
知识架构
因篇幅问题不能全部显示,请点此查看更多更全内容