5、TCP协议.md 11 KB

[TOC]

1、TCP 历史及其设计哲学

1.1、TCP/IP 的前身 ARPA:NCP 协议

image-20220819103419076

1.2、TCP/IP 协议发展

image-20220819103534060

1.3、TCPv4 协议分层后的互联网世界

image-20220819103643226

1.4、TCP/IP 的七个设计理念

image-20220819103731990

2、TCP 解决了哪些问题?

2.1、TCP 的作用

image-20220819103925515

2.2、TCP协议的分层

image-20220819104250668

2.3、报文头部

image-20220819104444880

image-20220819104539556

2.4、TCP 协议特点

image-20220819104557349

3、TCP 报文格式

3.1、消息传输的核心要素

image-20220819104907273

3.2、IP头部

image-20220819105028413

image-20220819105414479

3.3、UDP 头部

image-20220819105049681

image-20220819105434419

3.4、TCP 协议的任务

image-20220819105137234

3.5、如何标识一个连接?

image-20220819105206106

3.6、TCP Segment 报文段

image-20220819105254952

image-20220819105355131

  • options选项

image-20220819105532495

4、三次握手建立连接

4.1、握手的目标

image-20220819105816744

4.2、三次握手

image-20220819110855076

4.3、报文格式

image-20220819110950677

image-20220819111000165

image-20220819111006994

5、三次握手状态变迁

5.1、三次握手流程

image-20220819112615675

5.3、netstat 命令查看TCP 状态

image-20220819112843131

5.2、两端同时发送SYN:双方使用固定源端口且同时建连接

image-20220819112853238

6、三次握手中的性能优化与安全问题

6.1、服务器三次握手流程示例

image-20220819121223337

6.2、超时时间与缓冲队列(调整SYN队列大小)

image-20220819121317717

6.3、Fast Open 降低时延

image-20220819121417253

image-20220819121444425

6.4、如何应对 SYN 攻击?

image-20220819121503161

image-20220819121549058

6.5、TCP_DEFER_ACCEPT

  • 直到收到data分组再激活nginx功能

image-20220819121648544

7、数据传输与MSS 分段

7.1、TCP 应用层编程示例

image-20220819121947777

7.2、TCP 流的操作

image-20220819122002481

image-20220819122008552

  • IP层分层损耗过大

7.3、MSS:Max Segment Size(不包含头部大小)

image-20220819122137556

7.4、TCP 握手常用选项

image-20220819122235037

8、重传与确认

8.1、报文有可能丢失

image-20220819122533560

8.2、解决方法

image-20220819122540118

  • 串行执行
  • 效率低下

image-20220819122605119

  • 限制发送

8.3、存在问题(针对每一个字节)

image-20220819122719074

image-20220819122725584

8.4、序列号复用

image-20220819123023018

image-20220819123042085

  • 解决方法:采用时间戳

8.5、BDP 网络中的问题

image-20220819123223221

9、RTO 重传定时器的计算

9.1、如何测量 RTT?

image-20220819135413904

image-20220819135432532

9.2、TCB

Socket包含两部分,一个是IP地址,一个是端口号。同一个设备可以对应一个IP地址,但不同的管道用不同的端口号区分,于是同一个设备发送给其他不同设备的信息就不会产生混乱。在同一时刻,设备可能会产生多种数据需要分发给不同的设备,为了确保数据能够正确分发,TCP协议用一种叫做TCB(Transmission Control Block,传输控制块)的数据结构把发给不同设备的数据封装起来。

9.3、RTO( Retransmission TimeOut )应当设多大?

image-20220819140107392

9.4、RTO 应当更平滑

image-20220819140155305

9.5、追踪 RTT 方差(linux实际方案)

image-20220819140302454

10、滑动窗口:发送窗口与接收窗口

10.1、滑动窗口:发送窗口快照

image-20220819140426261

10.2、可用窗口

image-20220819140538028

image-20220819140622055

image-20220819140633201

10.3、发送窗口

image-20220819140708300

10.4、接受窗口

image-20220819140804930

11、窗口的滑动与流量控制

11.1、示例

image-20220819141127964

11.2、客户端消息的发送

image-20220819142823430

11.3、服务器消息的发送

image-20220819142838668

12、操作系统缓冲区与滑动窗口的关系

12.1、窗口与缓存

image-20220819143103155

12.2、收缩窗口导致的丢包

image-20220819143813603

12.3、合适的窗口大小

image-20220819144026237

12.4、Linux下调整接收窗口与应用缓存

image-20220819144051325

image-20220819144058827

13、如何减少小报文提高网络效率?

13.1、SWS(Silly Window syndrome)糊涂窗口综合症

image-20220819144154909

13.2、SWS 避免算法

image-20220819144329292

  • nagle算法等待ACK时候累计小报文
  • 如果报文超过MSS,则不论是否收到ACK,必须立即发送

13.3、TCP delayed acknowledgment 延迟确认

image-20220819144456771

13.4、Nagle VS delayed ACK

image-20220819144632429

14、拥塞控制(1):慢启动

14.1、全局思考:拥塞控制

image-20220819145021860

14.2、定义

image-20220819145141426

  • 通告窗口:实际上就是接受窗口

14.3、慢启动的初始窗口

image-20220819145257235

15、拥塞控制(2):拥塞避免

15.1、定义

image-20220819145620822

15.2、慢启动与拥塞控制

image-20220819145739606

16、拥塞控制(3):快速重传与快速恢复

16.1、为何会接收到一个失序数据段?

image-20220819150016060

16.2、快速重传(RFC2581)

image-20220819150139111

16.3、注意事项、

image-20220819150425355

image-20220819150410274

16.4、快速恢复(RFC2581)

image-20220819150522131

17、SACK 与选择性重传算法

17.1、仅重传丢失段

image-20220819151255001

17.2、重传所有段

image-20220819151447238

17.3、SACK:TCP Selective Acknowledgment

image-20220819151508048

image-20220819151521134

18、四次握手关闭连接

18.1、关闭连接

image-20220819151812534

18.2、两端同时关闭连接

image-20220819152208472

18.3、TCP 状态机

image-20220819152233264

19、优化关闭连接时的TIME-WAIT状态

19.1、TIME-WAIT状态过短或者不存在会怎么样?

image-20220819152436497

19.2、linux下TIME_WAIT优化:tcp_tw_reuse

image-20220819152636177

19.3、TIME_WAIT 优化

image-20220819152700842

19.4、RST 复位报文(直接关闭连接)

image-20220819152744767

20、keepalive 、校验和及带外数据

20.1、TCP 的 Keep-Alive 功能

image-20220819152850211

20.2、违反分层原则的校验和

image-20220819152902603

20.3、应用调整 TCP 发送数据的时机

image-20220819152927259

image-20220819152935358

21、面向字节流的TCP 连接如何多路复用?

21.1、Multiplexing 多路复用

image-20220819153123437

21.2、HTTP2:TCP 连接之上的多路复用

image-20220819153227180

21.3、非阻塞 socket:同时处理多个TCP连接

image-20220819153239936

21.4、epoll

image-20220819153258192

image-20220819153350185

image-20220819153403993

22、四层负载均衡可以做什么?

image-20220819153549110

image-20220819153556558

image-20220819153605829

image-20220819153619358

image-20220819153626455