tcp tw_cycle和tcp_timestamp


 在TCP可选项字段中为TCP预留有时间戳功能
1 TCP可选项格式
kind(1字节) length(1字节) info  
    tcp 选项格式

1 tcp报文格式:由tcp 首部和tcp数据组成
2 tcp首部:由20字节的固定长度和可变长字段组成
3 tcp首部总长度:由tcp头中的数据偏移字段决定,该字段占4bit,取最大的1111时,
也就是十进制15,tcp首部的偏移单位为4byte,那么tcp的首部长度最长为15*4 = 60字节。

4 选项和填充的长度 = TCP首部总长度 - 20 字节固定长度,那么选项和填充字段的长度最大为40字节。

可选格式
kind(1字节) length(1字节) info

二 TCP时间戳字段存放的内容注解
发送方在发送报文段时把当前时钟时间值放入时间戳字段,接收方在确认该报文时把时间戳字段复制到时间戳回送回答字段,
因此,发送方在收到确认报文后,可以精确计算出RTT。

假设A主机和b主机之间通信,a主机向b主机发送一个报文段,那么:
1) timestamp字段中存放的内容,a主机向b主机发送报文s1,在s1报文中timestamp存储的是a主机发送s1的时间
2) timestamp echo字段中存放的内容,b主机收到s1包文件,并向a主机发送含有确认ack的报文s2,在s2报文中
,timestamp为b主机此时的时间。
这些时间具体的作用,

syn                       ack

timestamp(a_timestamp)     timestamp(b_timestamp)  echo(a_timestamp)            
   
3 TCP时间戳选项的功能
1) 计算返回时延RTT
当a主机接收到b主机发送过来的确认ack报文s2时,a主机此时时刻为ta2,
a主机从s2报文的timestamp echo选项中解析出该ack的报文发出的时刻
那么RTT=接收ack报文的时刻 - 发送报文的时刻 = ta2 - ta1

 防止回绕的序号
tcp报文的序列号只有32位,假设我们有一条高速网络,通信的主机双方有足够大的带宽涌来快速的传输数据。例如1Gb/s的速率发送报文,则不到35秒报文的序号就会重复。这样对TCP传输带来混乱的情况。
而采用时间戳选项,可以很容易的分辨出相同序列号的数据报,哪个是最近发送,哪个是以前发送的。


分析
根据现象上述问题明显和tcp timestmap有关;查看linux 2.6.32内核源码,发现tcp_tw_recycle/tcp_timestamps都开启的条件下,60s(timewai时间)内同一源ip主机的socket connect请求中的timestamp必须是递增的。

大多都写开启net.ipv4.tcp_tw_recycle这个开关,可以快速回收处于TIME_WAIT状态的socket(针对Server端而言)。

TIME_WAIT是对端发过来FIN,或者TCP连接失败的时候,这种情况下,一般需要自己作为客户端主动处理,close 连接,发出去FIN,
不能通过tw_cycle 回收。

另外tw_cycle开启还需要tcp_timestamp 也开启,这样就会导致另一个问题,同一个nat下的客户端可能会连接本服务失败
由于客户端的系统时间不一致,tcp_timestamp开启的时候,tcp会拒绝60s内时间戳翻转的连接。
总结:服务端一般还是不要开tw_cycle和tcp_timestamp
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值