TCP时间戳选项Timestamp
时间戳选项发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT(我们必须说“每一个收到的ACK”而不是“每一个收到的报文段”,是因为TCP通常用一个ACK来确认多个报文段)。我们提到过目前很多实现为每个窗口值计算一个RTT,对于包含8个报文段的窗口而言这是正确的。然而,较大的窗口大小则需要进行更好的RTT计算;
时间戳是一个单调递增的值。由于接收方只需要回显收到的内容,因此不需要关注时间戳单元是什么。这个选项不需要再两个主机之间进行任何形式的时钟同步。RFC1323推荐在1毫秒和1秒之间将时间戳的值增加1;
在连接建立阶段,对于这个选项的规定与扩大窗口选项类似。主动发起连接的一方在它的SYN选项中指定选项。只有在从另一方的SYN中收到这个选项后,该选项才会在以后的报文段中进行设置;
接收方TCP不需要对每个包含数据的报文段进行确认,许多实现每两个报文段发送一个ACK。如果接收方发送了一个确认了两个报文段的ACK,那么哪一个收到的时间戳应当放入回显应答字段中发回去呢?
为了减少任异端所维持的状态数量,对于每个连接只保持一个时间戳的数值,选择何时更新这个数值的算法非常简单:
(1) TCP跟踪下一个ACK中将要发送的时间戳值(tsrecent变量)以及最后发送的ACK中的确认序号(lastack变量)。这个序号就是接收方期望的序号;
(2) 当一个包含字节号lastack的报文段到达时,该报文段中的时间戳被保存在tsrecent中。
(3) 无论何时发送一个时间戳选项,tsrecent就作为时间戳回显应答字段被发送,而序号字段被保存在lastack中;
这个算法能够处理下面两种情况:
(1) 如果ACK被接收方延迟,则作为回显值的时间戳值应该对应于最早被确认的报文段。
例如:如果两个包含1-1024和1025-2048的的报文段到达,每一个都带有一个时间戳选项,接收方产生一个ACK2049来对它们进行确认。此时,ACK中的时间戳应该是包含字节1-1024的第一个报文段的时间戳。这种处理是正确的,因为发送方在进行重传超时时间的计算时,必须将延迟的ACK也考虑在内;
(2) 如果一个收到的报文段虽然在窗口范围内但同时又是失序,这就表明前面的报文段已经丢失。那个丢失的报文段到达时,它的时间戳(而不是失序的报文段的时间戳)将被回显。
例如:假定有3个各包含1024字节的报文段,按如下顺序接收:1-1024的报文段1,2049-3072的报文段2,1025-2048的报文段2。返回ACK应该是带有报文段1时间戳的ACK1025(一个正常期望的对数据的ACK),带有报文段1的时间戳的ACK1025(一个重复的,响应位于窗口内但却是失序的报文段的ACK),然后是带有报文段2的时间戳的ACK3037(不是报文段3中的时间戳)。这与当报文段丢失时的对RTT估算过高具有同样的效果,但这比估计过低要好些。而且,如果最后的ACK含有来自报文段3的时间戳,它可以包括重复的ACK返回和报文段2被重传所需的时间,或者可以包括发送方的报文段2的重传定时器到期时间。无论哪一种情况下,回显报文段3的时间戳都将引起发送方的RTT计算出现偏差;
时间戳除了能够更好的计算RTT,还为发送发提供了一种方法,以避免接收到旧的报文段,错误的以为它们是现在数据的一部分;
文章来自: <TCP/IP详解>
TCP时间戳选项Timestamp的更多相关文章
- TCP/IP详解--TCP首部选项中时间戳选项
一.简介 TCP时间戳选项会在TCP包头增加12个字节,以一种比重发超时更精确的方法来启用对RTT 的计算. 二.作用 ) TCP时间戳位于TCP选项中,kind=:lenth=:data由tim ...
- TCP系列08—连接管理—7、TCP 常见选项(option)
一.TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后.下表汇总了一些tcp选项 其中我标记为红色的部分是 ...
- js 取得 Unix时间戳(Unix timestamp)
js 取得 Unix时间戳 Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间19 ...
- 如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)
Java time JavaScript Math.round(new Date().getTime()/1000)getTime()返回数值的单位是毫秒 Microsoft .NET / C# ep ...
- Unix时间戳(Unix timestamp)转换工具
http://tool.chinaz.com/Tools/unixtime.aspx 现在的Unix时间戳(Unix timestamp)是 1440732364 Unix时间戳( ...
- 如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?
Java time JavaScript Math.round(new Date().getTime()/1000) 之所以除以1000是因为getTime()返回数值的单位是毫秒 Microsoft ...
- MySQL 时间戳(Timestamp)函数
1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp() mysql> select current_timestamp, curren ...
- [转]js 取得 Unix时间戳(Unix timestamp)
本文转自:https://blog.csdn.net/o0snow/article/details/6858829 js 取得 Unix时间戳 Unix时间戳(Unix timestamp),或称Un ...
- tcp keepalive选项
之前一直对tcp keepalive选项理解有误, 以为通过setsockopt函数设置SO_KEEPALIVE和相关参数后该socket则使用设置的keepalive相关参数 否则使用系统默认的:k ...
随机推荐
- python爬虫redis-ip代理池搭建几十万的ip数据--可以使用
from bs4 import BeautifulSoupimport requests,os,sys,time,random,redisfrom lxml import etreeconn = re ...
- 页面加载时调用js函数方法
方法一:在html的body中加入onload=""事件 <body onload='queryServer()'> </body> 方法二:jquery ...
- Delphi TIdUDPServer组件
- Delphi DLL文件的动态调用
樊伟胜
- ubuntu版本信息查看
1.cat /etc/issue 2.cat /etc/lsb-release 3.uname -a 4.cat /proc/version 5.lsb_release -a 显卡信息1.lspci ...
- deep_learning_凹凸函数
什么是凸函数及如何判断一个函数是否是凸函数 t元j 一.什么是凸函数 对于一元函数f(xf(x),如果对于任意tϵ[0,1]tϵ[0,1]均满足:f(tx1+(1−t)x2)≤tf(x1)+(1−t) ...
- SeekBar 滚动条
原seek_thumb样式----------------------------------------------------------------------↑↑↑↑↑ android:thu ...
- ELK对nginx日志进行流量监控
ELK对nginx日志进行流量监控 一.前言 线上有一套ELK单机版,版本为5.2.1.现在想把nginx访问日志接入到elk里,进行各个域名使用流量带宽的统计分析.要把nginx日志传输到elk上, ...
- DBSCAN算法及sklearn实现
基本概念:(Density-Based Spatial Clustering of Application with Noiso) 1.核心对象: 若某个点的密度达到算法设定的阈值则其为核心点.(即r ...
- 51Nod 1714 1位数SG异或打表
SG[i]表示一个数二进制下有i个1的SG值 SG[0]=0 打表: #include<bits/stdc++.h> using namespace std; ]; ]; , x; int ...