[TOC]
1、TCP 历史及其设计哲学
1.1、TCP/IP 的前身 ARPA:NCP 协议
1.2、TCP/IP 协议发展
1.3、TCPv4 协议分层后的互联网世界
1.4、TCP/IP 的七个设计理念
2、TCP 解决了哪些问题?
2.1、TCP 的作用
2.2、TCP协议的分层
2.3、报文头部
2.4、TCP 协议特点
3、TCP 报文格式
3.1、消息传输的核心要素
3.2、IP头部
3.3、UDP 头部
3.4、TCP 协议的任务
3.5、如何标识一个连接?
3.6、TCP Segment 报文段
4、三次握手建立连接
4.1、握手的目标
4.2、三次握手
4.3、报文格式
5、三次握手状态变迁
5.1、三次握手流程
5.3、netstat 命令查看TCP 状态
5.2、两端同时发送SYN:双方使用固定源端口且同时建连接
6、三次握手中的性能优化与安全问题
6.1、服务器三次握手流程示例
6.2、超时时间与缓冲队列(调整SYN队列大小)
6.3、Fast Open 降低时延
6.4、如何应对 SYN 攻击?
6.5、TCP_DEFER_ACCEPT
7、数据传输与MSS 分段
7.1、TCP 应用层编程示例
7.2、TCP 流的操作
7.3、MSS:Max Segment Size(不包含头部大小)
7.4、TCP 握手常用选项
8、重传与确认
8.1、报文有可能丢失
8.2、解决方法
8.3、存在问题(针对每一个字节)
8.4、序列号复用
8.5、BDP 网络中的问题
9、RTO 重传定时器的计算
9.1、如何测量 RTT?
9.2、TCB
Socket包含两部分,一个是IP地址,一个是端口号。同一个设备可以对应一个IP地址,但不同的管道用不同的端口号区分,于是同一个设备发送给其他不同设备的信息就不会产生混乱。在同一时刻,设备可能会产生多种数据需要分发给不同的设备,为了确保数据能够正确分发,TCP协议用一种叫做TCB(Transmission Control Block,传输控制块)的数据结构把发给不同设备的数据封装起来。
9.3、RTO( Retransmission TimeOut )应当设多大?
9.4、RTO 应当更平滑
9.5、追踪 RTT 方差(linux实际方案)
10、滑动窗口:发送窗口与接收窗口
10.1、滑动窗口:发送窗口快照
10.2、可用窗口
10.3、发送窗口
10.4、接受窗口
11、窗口的滑动与流量控制
11.1、示例
11.2、客户端消息的发送
11.3、服务器消息的发送
12、操作系统缓冲区与滑动窗口的关系
12.1、窗口与缓存
12.2、收缩窗口导致的丢包
12.3、合适的窗口大小
12.4、Linux下调整接收窗口与应用缓存
13、如何减少小报文提高网络效率?
13.1、SWS(Silly Window syndrome)糊涂窗口综合症
13.2、SWS 避免算法
- nagle算法等待ACK时候累计小报文
- 如果报文超过MSS,则不论是否收到ACK,必须立即发送
13.3、TCP delayed acknowledgment 延迟确认
13.4、Nagle VS delayed ACK
14、拥塞控制(1):慢启动
14.1、全局思考:拥塞控制
14.2、定义
14.3、慢启动的初始窗口
15、拥塞控制(2):拥塞避免
15.1、定义
15.2、慢启动与拥塞控制
16、拥塞控制(3):快速重传与快速恢复
16.1、为何会接收到一个失序数据段?
16.2、快速重传(RFC2581)
16.3、注意事项、
16.4、快速恢复(RFC2581)
17、SACK 与选择性重传算法
17.1、仅重传丢失段
17.2、重传所有段
17.3、SACK:TCP Selective Acknowledgment
18、四次握手关闭连接
18.1、关闭连接
18.2、两端同时关闭连接
18.3、TCP 状态机
19、优化关闭连接时的TIME-WAIT状态
19.1、TIME-WAIT状态过短或者不存在会怎么样?
19.2、linux下TIME_WAIT优化:tcp_tw_reuse
19.3、TIME_WAIT 优化
19.4、RST 复位报文(直接关闭连接)
20、keepalive 、校验和及带外数据
20.1、TCP 的 Keep-Alive 功能
20.2、违反分层原则的校验和
20.3、应用调整 TCP 发送数据的时机
21、面向字节流的TCP 连接如何多路复用?
21.1、Multiplexing 多路复用
21.2、HTTP2:TCP 连接之上的多路复用
21.3、非阻塞 socket:同时处理多个TCP连接
21.4、epoll
22、四层负载均衡可以做什么?