计算机网络3——传输层(下)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaocong1993/article/details/83352364

目录

六、面向连接传输协议TCP

        1、TCP可靠数据传输        2、TCP流量控制        3、TCP连接管理

七、拥塞控制原理

        1、拥塞的成因和代价        2、拥塞控制的方法

八、TCP拥塞控制

        1、TCP拥塞控制        2、TCP性能分析

六、面向连接传输协议TCP

TCP(RFCs-793, 1122, 1323, 2018, 2581)的特点:点对点,一个发送方,一个接收方。可靠的、按序的字节流。流水线机制,TCP拥塞控制和流量控制机制动态设置窗口尺寸。发送方/接收方缓存。面向连接,通信双方在发送数据之前必须建立连接;连接状态只在连接的两端中维护,在沿途节点中并不维护状态;TCP连接包括两台主机上的缓存、连接状态变量、socket等;全双工(full-duplex),同一连接中能够传输双向数据流。

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

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

接收方如何处理乱序到达的Segment,TCP规范中没有规定,由TCP的实现者做出决策。

1、TCP可靠数据传输

TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务,流水线机制、累积确认、使用单一重传定时器。触发重传的事件超时或收到重复ACK。暂不考虑重复ACK、流量控制和拥塞控制。

(1)超时时间

超时时间过短,不必要的重传;过长,对段丢失时间反应慢。设置定时器的超时时间,大于RTT但RTT是变化的,如何估计RTT?SampleRTT,测量从段发出去到收到ACK的时间,忽略重传。测量多个SampleRTT,求平均值,形成RTT的估计值EstimatedRTT。指数加权移动平均,典型值0.125。

                                EstimatedRTT = (1-α)*EstimatedRTT +α*SampleRTT

定时器超时时间的设置,EstimatedRTT+“安全边界”,EstimatedRTT变化大则设置较大的边界(与网络状况有关)。测量RTT的变化值,SampleRTT与EstimatedRTT的差值。

                                DevRTT = (1-β)*DevRTT + β*|SampleRTT-EstimatedRTT| (typically,β= 0.25)

                                TimeoutInterval = EstimatedRTT + 4*DevRTT

(2)TCP发送方

从应用层收到数据,创建Segment,序列号是Segment第一个字节的编号。开启计时器, 设置超时时间TimeOutInterval。

超时,重传引起超时的Segment,重启定时器。

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

// TCP发送端程序
NextSeqNum = InitialSeqNum
SendBase = InitialSeqNum
loop (forever) {
  switch(event)
    event: data received from application above
      create TCP segment with sequence number NextSeqNum
      if (timer currently not running)
        start timer
      pass segment to IP
      NextSeqNum = NextSeqNum + length(data)
    event: timer timeout
      retransmit not-yet-acknowledged segment with
        smallest sequence number
      start timer
    event: ACK received, with ACK field value of y
      if (y > SendBase) {
        SendBase = y
        if (there are currently not-yet-acknowledged segments)
          start timer
      }
} /* end of loop forever */

(3)TCP接收方(RFC1122, 2581)

(4)快速重传机制

TCP的实现中,如果发生超时,超时时间间隔将重新设置,将超时时间间隔加倍,导致其很大,重发丢失的分组之前要等待很长时间。Sender会背靠背地发送多个分组,如果某个分组丢失,可能会引发多个重复的ACK,通过重复ACK检测分组丢失。

如果Sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失。快速重传,即在定时器超时之前进行重传。

// 快速重传算法
event: ACK received, with ACK field value of y
  if (y > SendBase) {
    SendBase = y
    if (there are currently not-yet-acknowledged segments)
      start timer
  } else { // a duplicate ACK for already ACKed segment
    increment count of dup ACKs received for y
    if (count of dup ACKs received for y = 3) {
      resend segment with sequence number y // fast retransmit
    }
  }

2、TCP流量控制

接收方为TCP连接分配buffer,上层应用可能处理buffer中数据的速度较慢。流量控制(flow control)指发送方不会传输的太多、太快以至于淹没接收方,导致buffer溢出,是一种速度匹配机制。

假定TCP receiver丢弃乱序的segments,Buffer中的可用空间(spare room)   RcvWindow= RcvBuffer-[LastByteRcvd - LastByteRead]。Receiver通过在Segment的头部字段将RcvWindow告诉Sender,Sender限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲RcvWindow尺寸。

Receiver告知Sender RcvWindow=0,发送方仍可以发送一个很小的段,得到新的RcvWindow信息,避免RcvWindow为0时即使之后有空闲发送方也不知道。

3、TCP连接管理

TCP sender和receiver在传输数据前需要建立连接,初始化TCP变量(Seq.#、Buffer和流量控制信息)。通常连接发起者是Client,Server等待客户连接请求。

            Socket clientSocket = new Socket("hostname","port number");

            Socket connectionSocket = welcomeSocket.accept();

TCP连接建立过程中采用“三次握手机制(Three way handshake)”。Step 1: client host sends TCP SYN segment to server, specifies initial seq #, no data(SYN标志位置为1表示要建立连接、初始序列号). Step 2: server host receives SYN, replies with SYNACK segment. server allocates buffers, specifies server initial seq. #(分配缓存、选择初始序列号告知客户端、ACK).Step 3: client receives SYNACK, replies with ACK segment, which may contain data(与服务器确认收到了同意建立连接的报文段).

在握手的第二步,服务器分配资源,假如第三次握手的ACK没有发送至服务器,服务器的资源会保留一段时间再释放。网络攻击。

TCP连接的关闭Closing a connection,一般由客户机发起关闭的请求clientSocket.close();。client向server发送TCP FIN控制segment;server收到FIN,回复ACK关闭连接,发送FIN;client收到FIN,回复ACK,进入“等待”,如果重复收到FIN,会重新发送ACK;server收到ACK,连接关闭。

    

 

七、拥塞控制原理

拥塞(Congestion),非正式定义“太多发送主机发送了太多数据或者发送速度太快,以至于网络无法处理”,表现为分组丢失(路由器缓存溢出)或分组延迟过大(在路由器缓存中排队)。A top-10 problem。拥塞控制(网络)vs.流量控制(发送方和接收方)。

1、拥塞的成因和代价

场景一:两个senders,两个receivers,A->C,B->D,共享一个路由器。假定链路带宽C,路由器有无限缓存,分组不会丢失没有重传。λin发送数据的速率,λout接收数据的速率。

   

场景二:一个路由器,有限缓存,Sender重传分组。λ’in原始需要发送的数据加重传数据,比λin大。

情况a:假设Sender能够通过某种机制获知路由器buffer信息,有空闲才发,不会丢包。λin=λ’inout(goodput)。

情况b:丢失后才重发,λ’inout

情况c:分组丢失和定时器超时后都重发,λ’in变得更大。

拥塞的代价:对给定的“goodput”,要做更多的工作(重传),造成资源的浪费。

场景三:四个发送方,四个接收方,A->C,C->A,B->D,D->B,四个路由器。多跳,超时/重传。

拥塞的另一个代价:多跳网络中,当分组被drop时,任何用于该分组的“上游”传输能力全都被浪费掉。

2、拥塞控制的方法

端到端拥塞控制:网络层不需要显式的提供支持,端系统通过观察loss、delay等网络行为判断是否发生拥塞。TCP采取这种方法。

网络辅助的拥塞控制:路由器向发送方显式地反馈网络拥塞信息,简单的拥塞指示(1bit)SNA, DECbit, TCP/IP ECN, ATM,指示发送方应该采取何种速率。

案例ATM ABR拥塞控制:提供ABR(available bit rate)“弹性服务”,如果发送方路径负载低(underloaded),使用可用带宽,如果发送方路径拥塞,将发送速率降到最低保障速率。发送方发送若干Data cells发一个RM(resource management)cells,网络设备交换机设置RM cell位(网络辅助),NI bit rate不许增长,CI bit拥塞指示,RM cells由接收方返回给发送方。

在RM cell中有显式的速率(ER)字段,两个字节,拥塞的交换机可以将ER置为更低的值(定量),发送方获知路径所能支持的最小速率。

数据cell中的EFCI位,拥塞的交换机将其设为1,如果RM cell前面的data cell的EFCI位被设为1,那么发送方在返回的RM cell中置CI位。

八、TCP拥塞控制

1、TCP拥塞控制

Sender限制发送速率LastByteSent-LastByteAcked <= CongWin(拥塞窗口)。CongWin根据所感知到的网络拥塞,动态调整以改变发送速率,限定已发送但未确认的数据的量。

                                                  rate ≈ CongWin/RTT(Bytes/sec)

感知网络拥塞:Loss事件(timeout或3个重复ACK),发生Loss事件后,发送方降低速率。

(1)合理地调整发送速率:

加性增-乘性减(AIMD),拥塞避免。逐渐增加发送速率,谨慎探测可用带宽,直到发生Loss。Additive Increase,每个RTT将CongWin增大一个MSS(最大段长度),拥塞避免;Multiplicative Decrease,发生Loss后将CongWin减半。

慢启动(SS)。TCP连接建立时,CongWin=1,例MSS=500byte,RTT=200msec,初始速率=20k bps,可用带宽可能远远高于初始,希望速率快速增长。当连接开始时,指数型增长,每个RTT收到每个ACK将CongWin翻倍。

// Slowstart algorithm
initialize:Congwin=1
for (each segment ACKed)
  Congwin++
until (loss event OR CongWin>threshold)

    

Threshold变量。当CongWin达到Loss事件前值的1/2时,将指数型增长切换为线性增长(拥塞避免)。Loss事件发生时,变量Threshold被设为Loss事件前CongWin值的1/2。

3个重复ACKs,CongWin切到一半,然后线性增长。Timeout事件,CongWin直接设为1个MSS,然后指数增长,达到threshold后再线性增长。3个重复ACKs表示网络还能够传输一些 segments,timeout事件表明拥塞更为严重。

(2)总结

When CongWin is below Threshold, sender in slow-start phase, window grows exponentially. When CongWin is above Threshold, sender is in congestion-avoidance phase, window grows linearly.

When a triple duplicate ACK occurs, Threshold set to CongWin/2 and  CongWin set to Threshold. When timeout occurs, Threshold set to CongWin/2 and CongWin is set to 1 MSS.

(3)TCP拥塞控制算法

Th = ? // 设置一个合适的值
CongWin = 1 MSS
/* slow start  or exponential increase */
While (No Packet Loss and CongWin < Th) {
  send CongWin TCP segments
  for each ACK increase CongWin by 1
}
/* congestion avoidance or linear increase */
While (No Packet Loss) {
  send CongWin TCP segments
  for CongWin ACKs, increase CongWin by 1
}
Th = CongWin/2
If (3 Dup ACKs) CongWin = Th;
If (timeout)    CongWin=1;

(4)例题

一个TCP连接总是以1 KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为16 KB时发生了超时,如果接下来的4个RTT(往返时间)时间内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口大小是多少?

解:threshold=16/2=8 KB,CongWin=1 KB,1个RTT后,CongWin=2 KB,2个RTT后, CongWin=4 KB,3个RTT后,CongWin=8 KB,Slowstart is over;4个RTT后,CongWin=9 KB。

2、TCP性能分析

(1)TCP throughput(吞吐率)

给定拥塞窗口大小和RTT,忽略Slow start,TCP的平均吞吐率是多少?假定发生超时时CongWin的大小为W,吞吐率是W/RTT;超时后,CongWin=W/2,吞吐率是W/2RTT。

平均吞吐率为0.75W/RTT。

(2)未来的TCP

假设每个Segment有1500个byte,RTT是100ms,希望获得10Gbps的吞吐率。throughput = W*MSS*8/RTT, 则W=throughput*RTT/(MSS*8)=83,333。窗口大小为83,333。

吞吐率与丢包率(loss rate, L)的关系:CongWin从W/2增加至W时出现第一个丢包,那么一共发送的分组数为W/2+(W/2+1)+(W/2+2)+….+W=3W2/8+3W/4W很大时,3W2/8>>3W/4,因此L≈8/(3W2)=2·10-10。

高速网络下需要设计新的TCP。

(3)TCP的公平性

公平性指如果K个TCP Session共享相同的瓶颈带宽R,那么每个Session的平均速率为R/K。TCP具有公平性。

    

公平性与UDP:多媒体应用通常不使用TCP,以免被拥塞控制机制限制速率。使用UDP以恒定速率发送,能够容忍丢失,产生了不公平。研究TCP friendly。

公平性与并发TCP连接:某些应用(如Web浏览器)会打开多个并发连接,产生公平性问题。如链路速率为R,已有9个连接,新来的应用请求1个TCP,获得R/10的速率,新来的应用请求11个TCP,获得R/2的速率。

猜你喜欢

转载自blog.csdn.net/yaocong1993/article/details/83352364