tcp_metric的相关内容

1. tcp_metric的结构

enum tcp_metric_index {
	TCP_METRIC_RTT,		/* in ms units */
	TCP_METRIC_RTTVAR,	/* in ms units */
	TCP_METRIC_SSTHRESH,
	TCP_METRIC_CWND,
	TCP_METRIC_REORDERING,

	TCP_METRIC_RTT_US,	/* in usec units */
	TCP_METRIC_RTTVAR_US,	/* in usec units */

	/* Always last.  */
	__TCP_METRIC_MAX,
};
#define TCP_METRIC_MAX	(__TCP_METRIC_MAX - 1)
#define TCP_METRIC_MAX_KERNEL (TCP_METRIC_MAX - 2)

struct tcp_fastopen_metrics {
	u16	mss;
	u16	syn_loss:10,		/* Recurring Fast Open SYN losses */
		try_exp:2;			/* Request w/ exp. option (once) */
	unsigned long	last_syn_loss;	/* Last Fast Open SYN loss */
	struct	tcp_fastopen_cookie	cookie;
};

struct tcp_metrics_block {
	struct tcp_metrics_block __rcu	*tcpm_next;
	possible_net_t				tcpm_net;
	struct inetpeer_addr		tcpm_saddr;
	struct inetpeer_addr		tcpm_daddr;
	unsigned long			tcpm_stamp;
	u32				tcpm_lock;
	u32				tcpm_vals[TCP_METRIC_MAX_KERNEL + 1];
	struct tcp_fastopen_metrics	tcpm_fastopen;

	struct rcu_head			rcu_head;
};

从上面的数据结构,可知tcp_metrics_block存储的是两端交互的相关信息,我们主要关注tcp_metrics_block.tcpm_vals,这个结构保存的是两端的网络状况。

2、tcp_metric结构的初始化

其结构创建的调用链如下:

tcp_rcv_synsent_state_process --> tcp_finish_connect --> tcp_init_metrics --> tcp_get_metrics --> tcpm_new(optional)

tcpm_new函数仅在第一次链接建立的时候调用,后续新建的tcp链接都可以使用曾经创建的tcp_metric,即说tcp_metric没有删除的机制(当然可以通过命令删除某个tcp_metric)。

3、tcp_metric结构更新。

结构的更新在函数tcp_update_metrics
在内核注释里头,tcp_update_metrics有以下这段话

/* Save metrics learned by this TCP session.  This function is called
 * only, when TCP finishes successfully i.e. when it enters TIME-WAIT
 * or goes from LAST-ACK to CLOSE.
 */

。其实想想也知道,tcp_metric主要关注的是拥塞控制相关的内容。拥塞控制的相关信息的更新以下在tcp_sock的结构进行更新,不需要再这里进行更新了。更新的操作发生在链接关闭的时候,保存信息,便于下一次的参考使用。

因为tcp_metric没有超市机制,因此会一直存在。

4、关于tcp_metric的相关内容以及ip tcp_metric命令

root@ubuntu:/home/xxxx# ip tcp_metric show
91.189.95.83 age 940.892sec cwnd 10 rtt 396871us rttvar 396871us source 192.168.1.202
220.181.38.149 age 3213.152sec cwnd 10 rtt 52244us rttvar 52244us source 192.168.1.202
54.182.0.34 age 931.024sec cwnd 2 rtt 1813495us rttvar 1813495us source 192.168.1.202
192.168.1.104 age 20.244sec source 192.168.1.202
91.189.91.23 age 931.032sec cwnd 10 rtt 247837us rttvar 190861us source 192.168.1.202
91.189.95.15 age 11.780sec cwnd 10 rtt 397025us rttvar 397025us source 192.168.1.202
root@ubuntu:/home/xxxx# ip tcp_metric delete 220.181.38.149
root@ubuntu:/home/xxxx# ip tcp_metric show
91.189.95.83 age 966.892sec cwnd 10 rtt 396871us rttvar 396871us source 192.168.1.202
54.182.0.34 age 957.024sec cwnd 2 rtt 1813495us rttvar 1813495us source 192.168.1.202
192.168.1.104 age 46.244sec source 192.168.1.202
91.189.91.23 age 957.032sec cwnd 10 rtt 247837us rttvar 190861us source 192.168.1.202
91.189.95.15 age 37.780sec cwnd 10 rtt 397025us rttvar 397025us source 192.168.1.202
root@ubuntu:/home/xxxx# ip tcp_metric flush
root@ubuntu:/home/xxxx# ip tcp_metric show 
root@ubuntu:/home/xxxx# 

备注:

TFO: TCP fast open

三次握手的过程中,当用户首次访问server时,发送syn包,server根据用户IP生成cookie,并与syn+ack一同发回client;client再次访问server时,在syn包携带TCP cookie;如果server校验合法,则在用户回复ack前就可以直接发送数据;否则按照正常三次握手进行。TFO提高性能的关键是省去了热请求的三次握手,这在充斥着小对象的移动应用场景中能够极大提升性能。

你可能感兴趣的:(linux_network)