Android TCP

RFC:

  • RFC 793 - Transmission Control Protocol
  • RFC 896 - Congestion Control in IP/TCP Internetworks
  • RFC 1122 - Requirements for Internet Hosts - Communication Layers

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)

  • 四种以太网帧格式
  • 互联网的网络地址分类
  • TCP报文格式详解
  • TCP报文格式
  • 使用wireshark分析TCP/IP协议中TCP包头的格式
  • TCP报文详解
  • 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
  • TCP 的那些事儿(上)(即[通俗易懂]深入理解TCP协议(上):理论基础)
  • TCP 的那些事儿(下)(即[通俗易懂]深入理解TCP协议(下):RTT、滑动窗口、拥塞处理)
  • UDP(百度百科)
  • 理解UDP协议的首部校验和校验和
  • UDP校验和计算
  • IP数据报(百度百科)
  • 什么是MTU?为什么MTU值普遍都是1500?
  • HTTP中的TCP三次握手-详细解析(TCP Connection、TCP的三次握手介绍、为什么创建TCP三次握手)​​​​​​​
  • 理论经典:TCP协议的3次握手与4次挥手过程详解
  • TCP连接的建立和终止
  • TCP交互数据流:Delay ACK详解
  • TCP delay ack机制和实现
  • 计算机网络与通信-2.3利用wireshark分析TCP/传输介质与通信方式(视频)
  • 《TCP/IP详解 卷1:协议 (中文版)第2版》TCP连接的建立与终止
  • TCP协议详解(详细阐述TCP协议在Linux内核中的实现 source code)
  • TCP的流量控制
  • 计算机网络微课堂第068讲 TCP的流量控制(有字幕有背景音乐版)
  • 拥塞控制算法
  • TCP拥塞控制算法(Tahoe/Reno/Newreno)
  • 浅谈TCP拥塞控制算法(各种算法对比)
  • 浅谈 TCP 拥塞控制算法
  • TCP的拥塞控制(详解)
  • TCP拥塞控制(维基百科)
  • TCP拥塞状态机(Linux source code)
  • TCP协议疑难杂症全景解析
  • 多核心Linux内核路径优化的不二法门之-多核心平台TCP优化
  • Linux TCP队列相关参数的总结
  • TCP 的那些事 | SACK
  • TCP选项之SACK选项概述

Google BBR:

  • Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?
  • TCP_BBR 算法笔记
  • TCP BBR拥塞控制算法解析
  • BBR算法及其收敛性
  • 一文解释清楚Google BBR拥塞控制算法原理
  • Google BBR拥塞控制算法背后的数学解释
  • 来自Google的TCP BBR拥塞控制算法解析
  • Google's BBR拥塞控制算法模型解析
  • Google's BBR TCP拥塞控制算法的四个变速引擎
  • Google's BBR拥塞控制算法如何对抗丢包
  • 在Ubuntu 16.04系统中开启TCP BBR的方法

TCP传输遇到的问题锦集:

  • tcp 重传超时次数
  • wireshark抓包常见错误提示含义解析
  • 使用wireshark分析TCP报文tcp dup ack 、tcp Out-of-Order
  • Wireshark中常见的TCP Info
  • TCP的TSQ限值tcp_limit_output_bytes
  • tcp retransmission原因
  • 使用wireshark出现很多TCP Retransmission信息
  • TCP Window Scale 与 接收窗口
  • TCP 协议中的 Window Size与吞吐量
  • 通过/proc/net/dev和/proc/net/snmp分析网络包量|流量|错包|丢包以及各网络协议的工作状况
  • netstat -s输出解析(一)

TCP相关参数

  • TCP参数设置
  • TCP/IP及内核参数优化调优
  • MySQL 调优基础(五) Linux网络

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";
  • TCP缓存设置及自调节

在不使用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的TSQ限值tcp_limit_output_bytes

TCP在发送大量的数据时,倾向于尽可能多的进行发送直到检测到丢包。这将导致发送设备或者Qdisc流控队列(例如pfifo_fast)中填充大量数据包,势必增大其它流量的延迟时间。tcp_limit_output_bytes参数限制了Qdisc队列或者设备队列中的数据量,以缓解此状况,达到减低队列的内存膨胀bufferbloat和由其所导致的异常RTT时间的作用。
默认值为262144。参见PROC文件tcp_limit_output_bytes的值,以及在初始化函数tcp_sk_init中的赋值。

  • TCP主动打开 之 第一次握手-发送SYN
  • TCP主动打开 之 第二次握手-接收SYN+ACK
  • TCP被动打开 之 第一次握手-接收SYN
  • TCP被动打开 之 第二次握手-发送SYN+ACK
  • TCP被动打开 之 第三次握手-接收ACK
  • TCP连接建立 之 同时打开

你可能感兴趣的:(网络协议,linux,网络协议)