RFC:
Specification
RFC1323 (Perf. Extensions)
RFC2018 (SACK)
RFC2140 (Ctrlblock sharing)
RFC2581 (Congestion control)
RFC2582 (NewReno)
RFC2861 (Cwnd validation)
RFC2883 (D-SACK)
RFC2988 (RTO)
RFC3042 (Lim. xmit)
RFC3168 (ECN)
Google BBR:
TCP传输遇到的问题锦集:
2. Socket Buffer
发生方发送数据,接收方接受数据,那么双方必须存在一个保存数据的buffer,称为Socket Buffer,TCP/IP的实现都是放在kernel中的,所以Socket Buffer也是在kernel中的。Socket Buffer的大小配置对网络的性能有很大的影响,相关参数如下:
1)/proc/sys/net/ipv4/tcp_mem: 这是一个系统全局参数,表示所有TCP的buffer配置。有三个值,单位为内存页(通常为4K),第一个值buffer值的下限,第二个值表示内存压力模式开始对buffer应于压力的上限;第三个值内存使用的上限,超过时,可能会丢弃报文。
2)/proc/sys/net/ipv4/tcp_rmem: r 表示receive,也有三个值,第一个值为TCP接收buffer的最少字节数;第二个是默认值(该值会覆盖rmem_default);第三个值TCP接收buffer的最大字节数(该值会被rmem_max覆盖);
3)/proc/sys/net/ipv4/tcp_wmem: w表示write,也就是send。也有三个值,第一个值为TCP发送buffer的最少字节数;第二个是默认值(该值会覆盖wmem_default);第三个值TCP发送buffer的最大字节数(该值会被wmem_max覆盖);
4)/proc/sys/net/core/wmem_default: TCP数据发送窗口默认字节数;
5)/proc/sys/net/core/wmem_max: TCP数据发送窗口最大字节数;
6)/proc/sys/net/core/rmem_default: TCP数据接收窗口默认字节数;
7)/proc/sys/net/core/rmem_max: TCP数据接收窗口最大字节数;
注意:除了tcp_mem单位为内存页之外,其它几个单位都是字节;而且tcp_mem是全局配置,其它几个都是针对每一个TCP连接的配置参数。
http://aosp.opersys.com/xref/android-11.0.0_r33/xref/frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
1026 /**
1027 * TCP buffer size config based on the ril technology. There are 6 parameters
1028 * read_min, read_default, read_max, write_min, write_default, write_max in the TCP buffer
1029 * config string and they are separated by a comma. The unit of these parameters is byte.
1030 */
1031 private static final String TCP_BUFFER_SIZES_GPRS = "4092,8760,48000,4096,8760,48000";
1032 private static final String TCP_BUFFER_SIZES_EDGE = "4093,26280,70800,4096,16384,70800";
1033 private static final String TCP_BUFFER_SIZES_UMTS = "58254,349525,1048576,58254,349525,1048576";
1034 private static final String TCP_BUFFER_SIZES_1XRTT = "16384,32768,131072,4096,16384,102400";
1035 private static final String TCP_BUFFER_SIZES_EVDO = "4094,87380,262144,4096,16384,262144";
1036 private static final String TCP_BUFFER_SIZES_EHRPD = "131072,262144,1048576,4096,16384,524288";
1037 private static final String TCP_BUFFER_SIZES_HSDPA = "61167,367002,1101005,8738,52429,262114";
1038 private static final String TCP_BUFFER_SIZES_HSPA = "40778,244668,734003,16777,100663,301990";
1039 private static final String TCP_BUFFER_SIZES_LTE =
1040 "524288,1048576,2097152,262144,524288,1048576";
1041 private static final String TCP_BUFFER_SIZES_HSPAP =
1042 "122334,734003,2202010,32040,192239,576717";
1043 private static final String TCP_BUFFER_SIZES_NR =
1044 "2097152,6291456,16777216,512000,2097152,8388608";
1045 private static final String TCP_BUFFER_SIZES_LTE_CA =
1046 "4096,6291456,12582912,4096,1048576,2097152";
在不使用SO_SNDBUF、SO_RCVBUF套接字选项情况下,系统将使用上面的默认缓存大小,对于tcp而言,默认的缓存大小会被tcp_rmem[1]和tcp_wmem[1]覆盖。
sk->sk_sndbuf = sysctl_tcp_wmem[1];
sk->sk_rcvbuf = sysctl_tcp_rmem[1];
TCP在发送大量的数据时,倾向于尽可能多的进行发送直到检测到丢包。这将导致发送设备或者Qdisc流控队列(例如pfifo_fast)中填充大量数据包,势必增大其它流量的延迟时间。tcp_limit_output_bytes参数限制了Qdisc队列或者设备队列中的数据量,以缓解此状况,达到减低队列的内存膨胀bufferbloat和由其所导致的异常RTT时间的作用。
默认值为262144。参见PROC文件tcp_limit_output_bytes的值,以及在初始化函数tcp_sk_init中的赋值。