我在理解TCP的Linux源代码时遇到问题(net / ipv4 / tcp_input.c)在include / net / tcp.h中,它已经定义了TCP_ECN_OK = 1,但实际上意味着什么
tp-> ecn_flags& TCP_ECN_OK
另外,请…
详细解释Linux网络源代码的一个很好的参考资料可以在这里找到 Linux Kernel 2.4.20中的网络代码映射
TCP_ECN_OK 是来自linuxkernel内部的位标志 struct tcp_sock 如 (领域 ecn_flags )。它有几个位标志( include/net/tcp.h 文件 来自linux内核源码):
TCP_ECN_OK
struct tcp_sock
ecn_flags
include/net/tcp.h
398 #define TCP_ECN_OK 1 399 #define TCP_ECN_QUEUE_CWR 2 400 #define TCP_ECN_DEMAND_CWR 4 401 #define TCP_ECN_SEEN 8
表达 tp->ecn_flags & TCP_ECN_OK 是逻辑测试,是否仍然设置TCP_ECN_OK。
tp->ecn_flags & TCP_ECN_OK
更新:我想是的 TCP_ECN_OK 在tcp套接字打开时设置bit(如果sysctl的当前设置在Linux中启用了ECN支持),如果套接字的另一端也支持ECN,它将保持设置状态。
如维基百科所述 http://en.wikipedia.org/wiki/Explicit_Congestion_Notification
ECN是一项可选功能,仅在两个端点都支持并愿意使用它时使用。 ...跳到Linux部分 Linux内核通过sysctl接口支持TCP的ECN的三种工作模式,由/ proc / sys / net / ipv4 / tcp_ecn变量的值配置:[11 - tcp_ecn in Documentation/networking/ip-sysctl.txt ] 0 - 禁用ECN,既不启动也不接受它 1 - 在传入连接请求时启用ECN,并在传出连接尝试时请求ECN 2 - 在传入连接请求时启用ECN,但不在传出连接上请求ECN。 // 3.14中的DEFAULT // 默认值为2,这意味着默认情况下,ECN在传入连接请求时启用,但在传出连接上不会请求。无论如何,只有当TCP连接的两端都表明支持时,Linux内核才会使用ECN。[11]
ECN是一项可选功能,仅在两个端点都支持并愿意使用它时使用。
...跳到Linux部分
Linux内核通过sysctl接口支持TCP的ECN的三种工作模式,由/ proc / sys / net / ipv4 / tcp_ecn变量的值配置:[11 - tcp_ecn in Documentation/networking/ip-sysctl.txt ]
Documentation/networking/ip-sysctl.txt
默认值为2,这意味着默认情况下,ECN在传入连接请求时启用,但在传出连接上不会请求。无论如何,只有当TCP连接的两端都表明支持时,Linux内核才会使用ECN。[11]
例如,当我们在传出套接字连接和sysctl的开头发送SYN时 tcp_ecn 已启用传出连接(“sysctl_tcp_ecn”标志为 1 ),我们在tcp头中设置ECE位并设置TCP_ECN_OK。 净/的IPv4 / tcp_output.c 315号线
tcp_ecn
1
315 /* Packet ECN state for a SYN. */ 316 static inline void TCP_ECN_send_syn(struct sock *sk, struct sk_buff *skb) .... 320 tp->ecn_flags = 0; 321 if (sock_net(sk)->ipv4.sysctl_tcp_ecn == 1) { 322 TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_ECE | TCPHDR_CWR; 323 tp->ecn_flags = TCP_ECN_OK; 324 }
稍后,如果连接的另一端不支持ECN或禁用,我们将取消设置TCP_ECN_OK标志。 净/的IPv4 / tcp_input.c 246行
246 static inline void TCP_ECN_rcv_synack(struct tcp_sock *tp, const struct tcphdr *th) 247 { 248 if ((tp->ecn_flags & TCP_ECN_OK) && (!th->ece || th->cwr)) 249 tp->ecn_flags &= ~TCP_ECN_OK; 250 }
对于传入连接,我们取消设置TCP_ECN_OK,如果在传入SYN中没有ECE tcp头标志(请阅读有关标志和ECN的更多信息) RFC3168“ 向IP添加显式拥塞通知(ECN) “ )
252 static inline void TCP_ECN_rcv_syn(struct tcp_sock *tp, const struct tcphdr *th) 253 { 254 if ((tp->ecn_flags & TCP_ECN_OK) && (!th->ece || !th->cwr)) 255 tp->ecn_flags &= ~TCP_ECN_OK; 256 }