Android TCP

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传输遇到的问题锦集:

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中的赋值。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值