传输层
传输层(Transport Layer)是ISO OSI协议的第四层协议,实现端到端的数据传输。该层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。
传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控、分段/重组和差错控制。一些协议是面向链接的。这就意味着传输层能保持对分段的跟踪,并且重传那些失败的分段。
1.传输层作用
-
传输层实现应用进程间的端到端(end-to-end)通信
-
向应用层提供通信服务
2.多路分解与复用
-
多路复用:所有应用进程的数据通过传输层传输到IP层;
-
多路分解:传输层收到的数据交付给相应的应用进程。
3.用户数据报协议UDP
端到端的、尽力而为的、无连接的数据报传输服务 1.无连接的 2.尽最大努力交付,即不保证可靠交付 3.面向报文的(在IP的功能上简单扩展了端到端) 4.没有拥塞控制 5.支持一对一、一对多、多对一和多对多的交互通信(需要组播的通信都是建立在UDP之上)
2019-06-08_210153.png4.传输控制协议TCP
端到端的、可靠的、面向连接的字节流服务 a).面向连接:先建立逻辑连接,进行双向数据流传输,通信结束后撤销连接 b).面向字节流 c).点对点的全双工通信 d).可靠传输:对一个连接上传输的每个字节编号,通过接收确认和重传来保证可靠传输 c).流量控制:防止发送方发出的数据超出接收方的接收能力
2019-06-08_210420.png多路复用:源、目的端口 连接管理:序号、确认号、SYN、FIN 可靠传输:序号、确认号 流量控制:接收窗口 拥塞控制:未在TCP首部中体现(序号、确认号、接收窗口)
4.1.连接管理
-
每条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状态
2019-06-08_211004.png为什么A需要向B发送最后一个确认报文段:为了防止“已失效的连接请求报文段”突然又传到B发生错误,以至于B一直等待A发送数据,B的资源被浪费。
4)连接释放(四次挥手)
①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状态
2019-06-08_211029.pngA必须经过时间等待计时器设置的时间2MSL(默认2分钟)后,进入CLOSED状态:确保A发送的最后一个ACK报文段能够到达B;防止“已失效的连接请求报文段”出现在本连接中。
4.2可靠传输
-
发送方的TCP:维护一个发送缓冲区
-
维护3个指针:LastByteAcked、LastByteSent、LastByteWritten
-
发送窗口=min(通知窗口,拥塞窗口)
-
累积确认(Cumulative ACK) :对按序到达的最后一个报文段进行确认
-
选择确认(Selective ACK) :确认接收到的不连续的数据块的边界(使用首部的SACK选项,不影响确认号字段的使用)
4.3.流量控制
目的:为了防止发送方给慢接收方发数据造成接受崩溃,缓冲区溢出 原理:接收方通知发送方自己的接受窗口大小,发送方的发送窗口≤接收方的接受窗口
问题:
B向A发送了零窗口报文段后,B的接受缓存有了一些存储空间,于是B向A发送了rwnd=400的报文段,然而报文段在传送过程中丢失,这样A一直等待B发送的非零窗口通知,B一直等待A发送数据,从而形成死锁局面。
解决:
TCP为每一个连接设置一个持续计时器,只要TCP链接一方收到零窗口通知,就启动持续计时器,计时器到期,发送零窗口探测报文段,而对方就在确认这个探测报文段时给出现在的窗口值,①如果窗口仍然是零,那么重新设置持续计时器;②否则死锁的僵局就可以打破。
4.自适应重传
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最基本的重传机制,效率较低。
2019-06-08_212845.png超时的粗粒度实现方法导致连接在等待一个定时器超时时,很长一段时间连接无效。
基本思想: ①接收方:当报文段到达,立刻回复ACK,即使该序号已被确认过 ②发送方:收到一个重复ACK(同一个确认的再一次重传称为重复确认),就知道接收方必定收到乱序到达的报文段,表明其前面的分组可能丢失。收到3个重复ACK时,立刻触发重传。
2019-06-08_212923.png
5.拥塞控制
1)窗口大小
MaxWindow = min (cwnd, AdvertisedWindow) 拥塞窗口cwnd (Congestion Windows):拥塞控制算法决定,可以同时发出的最大字节数以防止造成网络拥塞 通知窗口 (AdvertisedWindow):接收方决定,可以同时发出的最大字节数以防止超出接收方的接收能力
2)拥塞控制算法
①慢启动 把初始拥塞窗口 cwnd 设置为不超过2至4个SMSS(最大报文段长度),在每收到一个对新的报文段的确认后,把cwnd增加1个 SMSS 的数值数(每经过一个传输轮次,cwnd就加倍) 设置一个慢开始门限ssthresh 当cwnd < ssthresh时,使用慢开始算法 当cwnd ≥ ssthresh时,使用拥塞避免算法
2019-06-08_213007.png②拥塞避免(加法增大):每经过一个往返时间RTT把发送方的cwnd加1,使得cwnd慢性增加 ③快重传(乘法减小):收到3个重复ACK立即触发重传 ④快恢复(在快重传之后)
-
ssthresh减小为当前cwnd的一半:ssthresh = cwnd / 2
-
新拥塞窗口 cwnd = 新的 ssthresh
-
执行拥塞避免 (AIMD),使cwnd缓慢线性增大
网友评论