TCP
三次握手
客户端向服务端发送标记位为
SYN
,序列号seq = x
,发起连接服务端向客户端响应,发送
SYN
和ACK
的标记位,seq = y, ack = x + 1
的序列号客户端向服务端响应,发送
ACK
为标记位,ack = y + 1
的序列号
四次挥手
客户端向服务端发起断开连接的请求,
FIN
作为标记位,seq = p
作为序列号服务端响应客户端,
ACK
作为标志位,ack = p + 1
服务端向客户端发起可以关闭的请求,
FIN ACK
作为标记位,seq = q,ack = p + 1
客户端响应服务端的关闭请求,
ACK
作为标记位,ack = q + 1
,服务端关闭客户端等待两个
MSL
后关闭
DoS/DDoS
发送请求连接的握手之后,会进入半连接状态,进入半连接队列。
原理:DDoS
就是伪造客户端,疯狂发请求导致服务器资源耗尽
解决方案:响应后不分配资源,设置Cookie
,客户端第三次握手的时候带上这个Cookie
给服务端做校验
流量控制
滑动窗口
本质就是双指针,两个队列,一个发送窗口,一个接收窗口
发送窗口有以下几个
- 已发送已响应
- 已发送未响应
- 未发送已响应
- 未发送未响应
接收窗口有以下几个
- 已接收已响应
- 已接收未响应
流量控制逻辑:
- 假设两个队列默认窗口200
- 客户端发了200个字节,服务端处理了前100个之后,后面只能处理40个
- 服务端可用窗口缩小60个,还剩140,因为还有60没处理
- 服务端ack报文告诉客户端处理情况,客户端缩小为140,因为还有60个待发
拥塞控制
拥塞窗口
拥塞窗口可以理解为发送窗口的限制,发送窗口的实际大小为Min{拥塞窗口, 接收窗口}
慢启动
拥塞窗口大小随着收到的ack
的增加而增加,每次+1
选择性重传
发了1-7个包,丢了第5个,那么会通过left edge
和right edge
告知发送端已经收到了哪些区间的数据报,第5个包没到就重传这个包,叫选择性重传