2msl等待状态
time_wait状态也称为2msl等待状态,每个具体tcp实现必须选择一个报文段最大生存的时间msl(maximum segment lifetime).它是任何报文段被丢弃前在网络内的最长时间。
msl为2分钟,然而,实现中的常用值是30秒,1分钟,或2分钟。
对一个具体实现所给定的msl值,处理的原则是:当tcp执行一个主动关闭,并发回最后一个ack,该链接必须在time_wait状态停留的时间为2倍的msl,这样可让tcp再次发送最后的ack以防这个ack丢失(另一端超时并重发最后的fin).这种2msl等待的另一个结果是这个tcp链接在2msl等待期间,定义这个链接的插口(客户的ip地址和端口号,服务器的ip地址和端口号)不能再被使用。这个连接只能在2msl结束后才能再被使用。
遗憾的是,大多数tcp实现(如伯克利版)强加了更为严格的限制,在2msl等待期间,插口中使用的本地端口在默认情况下不能再被使用。
在连接处于2ml等待时,任何迟到的报文段被丢弃,因为处于2msl等待的、由该插口对(socket pair)定义的连接在这段时间内不能被再用,因此当要建立一个有效的连接时,来自该链接的一个较早替身(incarnation)的迟到报文作为新连接的一部分不可能不被曲解。
平静时间的概念
对于来自某个连接的较早替身的迟到报文段,2msl等待可防止将它解释成使用相同插口对的新连接的一部分,但这只有在处于2msl等待连接中的主机处于正常工作状态时才有效。
如果使用处于2msl等待端口的主机出现故障,它会在msl秒内重新启动,并建立使用故障前仍处于2msl的插口对来建立一个新的连接吗,如果是这样,在故障前从这个连接发出而迟到的报文段会被错误地当做属于重启后新连接的报文段无论无核选择重启后新连接的初始序号,都会发生这种情况。
为了防止这种情况,rfc793指出tcp在重启动后的msl秒内不能建立任何连接,这就称为平静时间(quietime).
只有极少的实现版遵守这一原则,因为大多数主机重启动的时间都逼msl秒要长。
复位报文
rst比特是用来复位的。
一般来说,无论何时一个报文段发往基准的连接(referenced connection)出现错误。tcp都会发出一个复位报文段(这里提到的基准的连接,是指由目的ip地址和目的端口号以及源ip地址和源端口号指明的连接。这就是为什么rfc 793称之为插口。
异常终止一个链接
终止一个链接的正常方式是一方发送fin.有时这也称为有序释放(orderly release).
有可能发送一个复位报文段而不是fin来中途释放一个链接。有时称这为异常释放(abortive release).
异常终止一个链接对应用程序来说有两个优点:1.丢弃任何待发数据并立即发送复位报文段;2rst的接收方会区分另一端执行的是异常关闭还是正常关闭,应用程序使用的api必须提供产生异常关闭而不是正常关闭的手段。
同时打开
同时关闭
tcp选项
每个选项的开始是1字节kind字段,说明选项的类型,kind字段为0和1的选项仅占1个字节。其他的选项在kid字节后还有len字节。它说明长度是指总长度,包括kind字节和len字节<mss 512,nopwscale 0,nop,nop,timestamp 1466470>
mss选项设置为512,后面是nop,接着是窗口扩大选项,第一个nop用来将窗口扩大选项填充为4字节的边界。同样,10字节的时间戳选项放在两个nop后,占12字节,同时使两个4字节的时间戳满足4字节边界。
3.tcp的交互数据流
如果按照分组数据计算,约有一半的tcp报文段包含成块数据(如ftp、电子邮件和usenset新闻),另一半则包含交互数据(如telnet何rlogin).
如果按字节计算,则成块数据与交互数据的比例约为90%和10%
tcp需要同时处理这两类数据,但使用的处理算法则有所不同。
交互式输入
通常每一个交互按键都会产生一个数据分组
这样就会产生4个报文段:
1来自客户的交互按键
2.来自服务器的按键确认
3来自服务器的按键回显
4来自客户的按键回显确认。
经受时延的确认
通常tcp在接收到数据时并不立即发送ack,相反,它推迟发送,以便将ack与需要沿该方向发送的数据一起发送(优势称这种现象为数据捎带ack).绝大多数实现采用时延为200ms,也就是说,tcp将以最大200ms的时延等待是否数据一起发送。
nagle算法
该算法要求一个tcp链接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,tcp收集这些少量的分组,并在确认到来时以一个分组的方法发出去,该算法的优越之处在于它是自适应的。确认到达得越快,数据也就发送的越快,而在希望减少微小分组数目的低速广域网上,则会发送更少的分组
注意到从左到右待发数据的长度是不通的,分别为:1、1、2、1、2、2、3、1和3字节。这是因为客户只有收到前一个数据的确认后才发送已经收集的数据,通过使用nagle算法,为发送16个字节的数据客户只需要使用9个报文段,而不再是16个。
关闭nagle算法
有时我们也需要关闭nagle算法。一个典型的例子是x窗口系统服务器,小窗口(鼠标移动)必须无时延地发送,以便为进行某种操作的交互用户提供实时的反馈。
这里将举另外一个更容易说明的例子--在一个交互注册过程中键入终端的一个特殊功能键。这个功能键通常可以产生多个字符序列,经常从sacii码的转义(escape)字符开始。如果tcp每次得到一个字符,它很可能会发送序列中的第一个字符(ascii码的esc),然后缓存其他字符并等待对该字符的确认。但当服务器接收到该字符后,它并不发送确认,而是继续等待接收序列中的其他字符。这就会经常触发服务器的经受时延的确认算法,标示剩下的字符没有在200ms内发送,对交互用户而言,这将产生明显的时延。
标签:字节,报文,2msl,发送,介绍,tcp,连接 From: https://www.cnblogs.com/smoke520/p/18359994