TCP

三次握手

  1. 客户端向服务端发送标记位为SYN,序列号seq = x,发起连接

  2. 服务端向客户端响应,发送SYNACK的标记位,seq = y, ack = x + 1的序列号

  3. 客户端向服务端响应,发送ACK为标记位,ack = y + 1的序列号

四次挥手

  1. 客户端向服务端发起断开连接的请求,FIN作为标记位,seq = p作为序列号

  2. 服务端响应客户端,ACK作为标志位,ack = p + 1

  3. 服务端向客户端发起可以关闭的请求,FIN ACK作为标记位,seq = q,ack = p + 1

  4. 客户端响应服务端的关闭请求,ACK作为标记位,ack = q + 1,服务端关闭

  5. 客户端等待两个MSL后关闭

DoS/DDoS

发送请求连接的握手之后,会进入半连接状态,进入半连接队列。

原理:DDoS就是伪造客户端,疯狂发请求导致服务器资源耗尽

解决方案:响应后不分配资源,设置Cookie,客户端第三次握手的时候带上这个Cookie给服务端做校验

流量控制

滑动窗口

本质就是双指针,两个队列,一个发送窗口,一个接收窗口

发送窗口有以下几个

  • 已发送已响应
  • 已发送未响应
  • 未发送已响应
  • 未发送未响应

接收窗口有以下几个

  • 已接收已响应
  • 已接收未响应

流量控制逻辑:

  1. 假设两个队列默认窗口200
  2. 客户端发了200个字节,服务端处理了前100个之后,后面只能处理40个
  3. 服务端可用窗口缩小60个,还剩140,因为还有60没处理
  4. 服务端ack报文告诉客户端处理情况,客户端缩小为140,因为还有60个待发

拥塞控制

拥塞窗口

拥塞窗口可以理解为发送窗口的限制,发送窗口的实际大小为Min{拥塞窗口, 接收窗口}

慢启动

拥塞窗口大小随着收到的ack的增加而增加,每次+1

选择性重传

发了1-7个包,丢了第5个,那么会通过left edgeright edge告知发送端已经收到了哪些区间的数据报,第5个包没到就重传这个包,叫选择性重传