【计算机网络】第三章 传输层(3)

五.滑动窗口协议

1. 流水线机制:提高资源利用率

1)允许发送方在收到ACK之前连续发送多个分组

2)需要更大的序列号范围

3)发送方/接收方需要更大的存储空间以缓存分组

2. 滑动窗口协议(Sliding-window protocol

1)窗口:允许使用的序列号问题

2)滑动窗口:随着协议的运行,窗口在序列号空间内向前滑动

3)滑动窗口协议:GBNSR

3. Go-Back-N协议

1)发送方

  ·分组头部包含k-bit序列号

  ·窗口尺寸为N,表示最多有N个等待确认的消息

  ·ACKn):确认到序列号n的分组均已被正确接收

  ·为空中的分组设置计时器

  ·超时事件:重传序列号大于等于n,还未收到ACK的全部分组

  ·发送方扩展FSM

2)接收方

  ·ACK机制:发送拥有最高序列号的、已被正确接收的分组的ACK

  ·乱序到达的分组:直接丢弃,重新确认序列号最大的、按序到达的分组

4. Selective Repeat协议

(1)GBN的缺陷:网络中产生许多重复分组,导致效率降低

(2)解决办法

  ·接收方对每个分组单独确认,设置缓存机制,接收乱序到达的分组

  ·发送方只重传那些没收到ACK的分组,为每个分组设置定时器

  ·发送方窗口使用N个连续序列号,限制已发送且未确认的分组

(3)困境:无法区分相同序列号是后续分组还是重传

(4)若序列号位数为k,窗口尺寸需满足Ns + Nr <= 2^k

 

六.TCP协议

1. 概述

1)点对点,可靠,按序

2)流水线机制:TCP拥塞控制和流量控制机制设置窗口尺寸

3)全双工:同一连接中传输双向数据流

4)面向连接

  ·通信双方在发送数据之前必须建立连接

  ·连接状态只在连接的两端中维护,在沿途节点不维护

  ·TCP连接包括:两台主机上的缓存、连接状态变量、socket

2. TCP段结构

 

(1)序列号:segment中第一个字节的编号,建立TCP连接时,双方随机选择

(2)ACK编号:希望接收到的下一个字节的序列号,累计确认

(3)对乱序到达的segment,无规范规定,由TCP实现者决策

3. TCP可靠数据传输

(1)概述

  ·单一重传定时器

  ·触发重传的事件:超时、收到重复ACK

  ·渐进式:暂不考虑重复ACK、流量控制和拥塞控制

(2)RTT和超时

  ·定时器的超时时间:大于RTT

  ·RTT的估计:测量从段发出去到收到ACK的时间,即SampleRTT,测量多个SampleRTT求平均值,形成RTT估计值EstimatedRTT

  ·指数加权移动平均:EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT (α通常为0.125

(3)定时器超过时间的设置:EstimatedRTT + 安全边界

  ·RTT变化值:DevRTT = (1 - β) * DevRTT + β * |SampleRTT - EstimatedRTT| (β通常为0.25

  ·TimeoutInterval = EstimatedRTT + 4 * DevRTT

4. TCP发送方事件

(1)从应用层收到数据

  ·创建Segment,序列号是第一个字节的编号

  ·开启计时器,设置超时时间

(2)超时:重传引起超时的Segment,重启定时器

(3)收到ACK:如果确认此前未确认的Segment,更新SendBase,若窗口中还有未被确认的分组,重新启动定时器

5. TCP接收方事件

(1)ACK生成:RFC 1122RFC 2581

  ·到达按序段,在此段前所有segment都已确认:等待500ms后无后续段,确认

  ·到达按序段,在此段前有一个segment等待确认:立刻发送ACK,确认两个段

  ·到达乱序段:立刻发送重复ACK

(2)快速重传机制

  ·TCP实现中,发生超时后,时间间隔会重新设置,等于加倍,重发分组要等待许久

  ·通过重复ACK检测分组丢失:发送方背靠背地发送多个分组,收到同一数据的三个ACK则假定该数据之后的段已丢失

6. TCP流量控制

(1)接收方为TCP连接分配buffer:由于上层应用可能处理数据较慢,发送方不会发送太快或太多

(2)假定TCP receiver丢弃乱序的segmentsBuffer中的可用空间为:RcvWindow = RcvBuffer - |LastByteRcvd - LastByteRead|

(3)接收方通过segment得头部字段将RcvWindow告诉发送方,即使RcvWindow0,也可以再发送一个极小段

7. TCP连接管理

(1)建立连接

  ·初始化TCP变量:Seq#Buffer和流量控制信息

  ·Client:连接发起者

  ·Server:等待客户连接请求

(2)三次握手

  ·客户端发送SYN段:表示建立连接,无数据,初始化seq#

  ·服务器接收SYN,回复SYNACK,分配缓存,选择序列号,告知客户端

  ·客户端收到SYNACK,答复ACK,确认已收到同意连接的报文段

(3)关闭连接:clientSocket.close()

  ·客户端向服务器发送TCP FIN控制段

  ·服务器收到FIN,回复ACK,关闭连接,发送FIN

  ·客户端收到FIN,回复ACK,进入等待(通常30s),如果收到FIN,重新发送ACK

  ·服务器收到ACK,连接关闭

posted @ 2018-10-16 08:57  长安蒹葭  阅读(354)  评论(0编辑  收藏  举报