|
@@ -0,0 +1,437 @@
|
|
|
+> [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 报文段
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+* options选项
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 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
|
|
|
+
|
|
|
+* 直到收到data分组再激活nginx功能
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 7、数据传输与MSS 分段
|
|
|
+
|
|
|
+## 7.1、TCP 应用层编程示例
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+## 7.2、TCP 流的操作
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+* IP层分层损耗过大
|
|
|
+
|
|
|
+## 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、四层负载均衡可以做什么?
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|