Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux TCP ECN源代码_Linux_Tcp_Linux Kernel - Fatal编程技术网

Linux TCP ECN源代码

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”),另一种

我在理解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”),另一种用于保持名为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中的违约//
默认值为2,这意味着默认情况下,传入连接请求时启用ECN,但传出连接不请求ECN。无论如何,只有当TCP连接的两端都表示支持ECN时,Linux内核才会使用ECN。[11]

例如,当我们在传出套接字连接开始时发送SYN,并且为传出连接启用了sysctl
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 }