TCP/IP卷一:83---TCP数据流与窗口管理之(紧急机制(URG字段))

一、紧急机制概述

URG字段

  • 我们在前面已经提到,TCP头部有一个位字段URG用来指示“紧急数据”

发送端行为

  • 应用在执行写操作时,可通过设置Berkeley套接字API (MSG_OOB)的特殊选项将数据标记为紧急,但[RFC6093]不再推荐设置紧急数据
  • 当发送端TCP收到这类写操作要求时,会进入称为紧急模式的特殊状态。它记录紧急数据的最后一个字节用于设置紧急指针字段,随后发送端生成的每个TCP头部都包含该字段,直到应用停止紧急数据写操作,并且所有序列号大于紧急指针的数据都经接收端确认
  • 根据[RFC6093],紧急指针指示的是紧急数据之后的一个字节。大量的RFC文档中对紧急指针的阐述都存在语义上的模糊和二义性。对于使用IPv6的超长数据报而言,紧急指针值需设为65535,用于指示紧急数据的末端位于TCP数据域的最后[RFC2675],如果使用传统的16位紧急指针字段就不能表示64kB的偏移

接收端行为

  • 当收到UGR置位的报文段时,TCP接收端就会进入紧急模式
  • 接收端应用可以调用标准套接字API(select())来判断是否进入紧急模式
  • 紧急机制会带来操作上的混淆,因为Berkeley套接字API和文档中用到了术语:带外(Out-Of-Band,OOB)数据。而实际上TCP并没有实现任何OOB功能。相反,差不多所有TCP实现在将紧急数据的最后一个字节传输给上层应用时,在接收端使用了一个截然不同的API参数。接收端必须要设置MSG_OOB选项检索该字节,或者设置MSG_OOBINLINE使该字节保持在正常数据流传输(在使用紧急机制情况下,需要用到该方法)

二、附加

三、演示案例

  • 为更好地理解紧急机制,我们通过一个例子来具体观察紧急模式的行为,包括在零窗口事件期间发生的状况。这里使用Mac OS X发送端和Linux接收端。为获得零窗口,我们首先在接收端限制接收窗口自动调优:

  • 第一个命令确保接收窗口的自动调整幅度不超过4kB,这样就可以清楚地看到窗口关闭时发生的情形。第二个命令使服务器在读数据前等待10s,并在每次读操作间等待1s。在客户端我们执行如下命令:

  • 该命令使得客户端每隔1s执行一次写操作,共7次,每次1024字节,且在最后一次写之前写了1个字节的紧急数据。客户端缓存设置为8129字节,由于在TCP发送数据前所有数据都暂时存储在发送端,因此缓存已足够大,该应用可立即得到执行
  • 如下图所示,接收端初始通告窗口右边界为2800,并很快增至51210在1.0s时刻,应用执行了一次写操作,窗口右边界前进至61450之后由于自动调优限制了约4192字节且接收应用没有执行读操作,窗口没有继续增长。直到10.,0s时刻,发送端执行了窗口探测,但依旧没有获得窗口增长。最终在10.0s时刻之后,接收端开始继续读取数据,窗口打开,发送端继续发送直至完成传输

  • 包交换情况如下图所示

  • 紧急模式的“出口点”定义为TCP报文段中序列号字段与紧急指针字段之和。每个TCP连接只维护一个紧急“点” (序列号偏移),因此紧急指针字段为空的包会导致前面的紧急指针包含的信息丢失。报文段16为第一个紧急指针为空的报文段,使得序列号6146到达出口点。注意到该序列号可能并不在指示的报文段中,而可能在之后的报文段中。例如报文段17就是这种情况,它没有包含任何数据,只有紧急指针(值为1)
  • 如前所述,有个问题一直存在争议,即出口点指示的是紧急数据的最后一个字节还是非紧急数据的第一个字节。 [RFCl122]认为指针指示的是紧急数据的最后一个字节。然而,基 本上所有的TCP实现都没有遵循该规定,因此[RFC6093]认识到了这一问题,并修改规范 让指针指向非紧急数据的第一个字节。在本例中,序列号为6145的字节包含了由sock客户端产生的1字节紧急数据,但在所有的报文段中,紧急指针的值为1,序列号为6145。因 此,可以看出该TCP实现中(大多数TCP实现都如此),出口点为非紧急数据的第一个字节的序列号
  • 从这个例子可以看到,TCP将紧急数据携带在数据流中传输(而非“带外传输”)。如果某个应用确实需要独立的信号通道,可以简单采用另一个TCP连接。 (某些传输层协议确实提供大多数人认为的OOB数据,即像通常数据链路那样使用同一个连接,但有独立的逻辑数据路径。TCP并不提供该功能)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董哥的黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值