tcp 协议介绍

tcp 协议处于数据链路层. 其主要特征是:

  • 基于流的数据发送, 需要进行三次握手建立连接, 保证数据可靠性
  • 通过tcp协议可以实现数据包重发, 乱序处理, 数据校验和等功能, 保证数据可靠传输
  • 流量控制功能, 通过发送窗口接收窗口控制双方的发送速率, 保证网络不至于大面积拥塞
  • 多路复用, 一个tcp连接可以接收成千上万的tcp客户端连接. 通过分配不同的socket套接字区分不同的tcp客户端连接
  • 可以发送带外数据进行部分数据优先发送, 实现紧急消息通知

tcp 协议头, 最多60个字节(20字节固定 + 40字节可选)

  • 源端口和目标端口, 范围在0-65535之间
  • 数据序号: 该报文携带的数据在发送数据中的偏移位置
  • 确认号: 希望接收的偏移位置, 同时是对确认号之前偏移位置数据的确认接收
  • 偏移: 用户数据距离tcp协议头的偏移 = 偏移 x 4
  • 6bit的保留字段: 用于扩展
  • 控制位:
    • URG: 紧急位, 发送带外数据时置1
    • ACK: 置1时, 确认号有效
    • PUSH: 置1时, 接收到的数据尽快提交到应用层
    • RST: tcp连接发生错误时, 置1告诉对方连接被重置
    • SYN: 置1表明在三次握手同步阶段
    • FIN: 置1表明对方断开连接, 进行四次挥手阶段需要设置
  • 窗口字段: 接收窗口大小, 用于调整发送方的发送窗口大小
  • 校验和: 伪首部 + tcp首部 + 数据
  • 紧急指针: 在本报文的数据段中带外数据最后一个字节的偏移
  • 可选字段: 最多40个字节. 存放额外信息. 包括: kind + length + info 字段. kind == 0, 可选字段结束标志; kind == 1, 空操作; kind == 2时, 主机双方协商数据段长度, 通常设置为: MCU – 40(ip头+tcp头), 保证在ip层数据不会分片; length字段为当前可选字段的长度; info字段存放一些自定义信息.

tcp 连接状态转移, 包括: 三次握手和四次挥手

  • CLOSED: 连接没有建立
  • LISTEN: 处于接收连接的状态
  • SYN SENT: 发送完SYN等待对方发送ACK
  • SYN RCVD: 接收到SYN, 并发送ACK
  • ESTAB: 完成三次握手, tcp连接已经建立成功
  • FIN WAIT-1: 主动关闭连接, 发送FIN, 就进入到该状态, 并等待ACK
  • FIN WAIT-2: 接收到ACK, 进入该状态. 等待对方的FIN
  • TIME WAIT: 接收到对方的FIN, 并发送ACK, 就进入到该状态. 等待2MSL时间, 确保对方能够接收到自己发送出去的ACK
  • CLOSE WAIT: 接收到FIN WAIT-1的FIN, 就进入到该状态, 并发送自己的FIN给对方的FIN WAIT-2状态
  • LAST-ACK: 等待对方发送ACK
  • CLOSED: 连接完成关闭
  • CLOSING: 双方同时关闭连接时, 双方才会进入到该状态

三次握手

为什么要采用三次握手的方式呢?

  • 在互相都不了解对方状态的情况下, 三次握手是最低成本的保证. 理论上, 三次握手也无法保证双方都进入到 ESTAB 状态. 因为第三次握手的数据可能已经丢失. 导致 TCP B 没有进入到 ESTAB 状态.
  • 三次握手能够一定程度上避免无效连接, 下图中的编号 3 就是无效连接的数据, 在编号 5 时被确认为无效连接, 发送 RSTTCP B 重置连接, 避免浪费资源.

四次挥手

  • 为什么是四次挥手呢?
    因为都需要主动告诉对方我已经关闭连接了. 如果是三次或更少次挥手, 必定有一方的关闭连接请求得不到确认.
  • 等待 2MSL 的作用?
    确认在足够长的时间里, 对方能够收到 FIN 请求的 ACK, 如果数据包丢失, 没有在 2MSL 时间内重传, 对方只会一直等待, 浪费资源.

tcp 流量控制

  • 为什么要有流量控制呢?
    为了避免网络被大量来不及处理的数据占据, 通过接收窗口的大小, 控制发送方的发送速率.
  • 流量控制受哪些因素影响:
    • 接收方的接收窗口
    • 发送方的发送窗口
  • 发送方的发送窗口受那些因素影响:
    • 接收方的接收窗口
    • 应用层程序递交数据的速率和数据量
    • 拥塞窗口大小

tcp 拥塞控制处理的是大量的数据涌入到网络中时, 发送主机应该如何进行处理. 而流量控制处理的是主机双方的处理数据的能力. 有以下几种方法避免网络拥塞:

  • 慢开始
    慢开始的是说, 起始的拥塞窗口设置为1, 接着对网络情况进行试探, 通过判断RTT时间的长短, 确定是否翻倍拥塞窗口的值. 当拥塞窗口到达设置的门限值, 拥塞窗口就以线性的速率递增, 每次加1(拥塞避免算法).
  • 拥塞避免算法
    经过慢开始算法到达设置的门限值后, 开始使用拥塞避免算法. 每次RTT后, 拥塞窗口加1. 直到某一次RTT检测到网络拥塞, 进行拥塞避免, 门限值=拥塞窗口/2, 拥塞窗口重新设置为1, 重新开始慢开始算法.
  • 快速重传
    要求接收到一个时序报文后, 立即发出重复确认, 而不要等到自己发送的数据时才进行捎带确认. 快速重传的好处是, 不必要等待发送方超时重传, 提高传输的性能.
  • 快速恢复
    当接收到3个快速重传请求数据包后, 拥塞窗口 = 当前的拥塞窗口/2. 这样做的理由是, 既然能接收到3个快速重传报文, 说明网络并没有非常拥挤, 不需要使用慢开始算法这种极端方式避免拥塞, 于是就有了快速恢复算法.

何时发送RST

  • 处于CLOSE状态, 收到的所有数据包都回复RST
  • 处于非同步状态(ESTAB之前的状态), 收到无效的ACK数据包, 回复RST
  • 处于同步状态, 收到无效数据包, 回复RST

什么是DOS攻击?
通过大量的客户端连接, 使服务器进入到SYN RCVD状态, 而客户端不建立连接. 导致服务器大量的资源被占用, 最终使服务器无法对外提供服务.

如何防御DOS攻击?

  • 减少SYN超时时长
  • 增大半连接数
  • 通过网关规则过滤特定ip
  • SYN cookies技术

资源

如果觉得有帮助,可以扫描右边的微信打赏码支持一下.