Linux TCP ECN源代码
我在理解TCP的Linux源代码(net/ipv4/TCP_input.c)时遇到问题 在include/net/tcp.h中,它已经定义了tcp\u ECN\u OK=1,但真正的含义是什么Linux TCP ECN源代码,linux,tcp,linux-kernel,Linux,Tcp,Linux Kernel,我在理解TCP的Linux源代码(net/ipv4/TCP_input.c)时遇到问题 在include/net/tcp.h中,它已经定义了tcp\u ECN\u OK=1,但真正的含义是什么 tp->ecn_flags & TCP_ECN_OK 另外,请解释一下socket、sock、tcp_sock、sk_buff之间的区别 是否有更详细或更清晰的参考资料 多谢各位 更新: 内核的联网部分主要使用两种数据结构:一种用于保持名为sock的连接状态(用于“socket”),另一种
tp->ecn_flags & TCP_ECN_OK
另外,请解释一下socket、sock、tcp_sock、sk_buff之间的区别
是否有更详细或更清晰的参考资料
多谢各位
更新:
内核的联网部分主要使用两种数据结构:一种用于保持名为sock的连接状态(用于“socket”),另一种用于保持名为sk_buff的传入和传出数据包的数据和状态(用于“socket buff”)。本节将介绍这两种方法。我们还简要介绍了tcp_opt,它是sock结构的一部分,用于维护tcp连接状态。
(来自“Linux内核2.4.20中的网络代码映射”)
TCP\u ECN\u OK
是linuxkernel内部的位标志(fieldECN\u flags
)。其中有几个位标志(来自linux内核源):
表达式tp->ecn\u标志和TCP\u ecn\u OK
是逻辑测试,TCP\u ecn\u OK是否仍然设置
更新:我认为TCP\u ECN\u OK
位是在TCP套接字打开时设置的(如果sysctl的当前设置在Linux中启用了ECN支持),并且如果套接字的另一端也支持ECN,它将保持设置
正如维基百科所说
ECN是一个可选特性,只有当两个端点都支持并愿意使用它时才使用
。。。跳到Linux部分
Linux内核支持ECN for TCP的三种工作模式,由/proc/sys/net/ipv4/TCP_ECN变量的值通过sysctl接口配置:[11-]
- 0–禁用ECN,既不启动也不接受它
- 1–在传入连接请求时启用ECN,并在传出连接尝试时请求ECN
- 2–当传入连接请求时启用ECN,但不要在传出连接上请求ECN。//3.14中的违约//
tcp\u ecn
(“sysctl\u tcp\u ecn”标志为1
),我们在tcp头中设置ECE位并设置tcp\u ecn\u OK。第315行
稍后,如果连接的另一端不支持ECN或它被禁用,我们将取消设置TCP_ECN_OK标志。
第246行
对于传入连接,如果传入SYN中没有ECE TCP头标志,则取消设置TCP_ECN_OK(请阅读中有关标志和ECN的更多信息)
关于详细解释Linux网络源代码的一个很好的参考,可以在这里的中找到“请在socket、sock、tcp_sock、sk_buff之间进行解释”。问题的一部分-这太宽泛了,无法在单个答案中解释。请务必阅读一些关于linux网络子系统(例如)的书籍/文章,并询问一些比“太阳-地球和木星之间”更具体的问题。谢谢osgx,当然我理解运营商,我怀疑的是它的含义。可能TCP_ECN_OK表示ECN已启用。对不起,谢谢您提供的信息。我会通过搜索这个词的用法来寻找它的意义你真是个天才。非常感谢。你主修ECN,TCP拥塞控制吗?我只看了2个小时的ECN文档。谷歌(tcp ecn linux)的ecn逻辑在第24-25页的“6.5 ecn”部分。但是没有关于
TCP\u ECN\u OK
bit的确切信息,只有ECN逻辑的概述。
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
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 }
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 }
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 }