前端进阶之路

网络基础、TCP/IP 三次握手和四次挥手

2019-01-14  本文已影响13人  coolheadedY

网络知识点 OSI 开放式互联参考模型

七层协议

1物理层

2数据链路层

3网络层

4传输层

5 会话层

7 应用层

发送方发送的数据接收方是不知道他的字节数组和内容格式的

模型参考

处理数据

发送方解释数据,分段,分组成帧解释成比特流,通过电缆发送到目标方在向上解析传递。

TCP/IP 模型

OSI概念七层实现:TCP/IP 四层模型
TCP/IP 模型关注应用程序实现,OSI模型在协议开发之前设计的,具有通用性


TCP/IP 解释

  • OSI模型注重通信协议必要的功能是什么
  • TCP/IP模型更强调在计算机上实现协议应该开发哪种程序
    一层层包裹在一层层解套出来

TCP 三次握手

传输控制协议TCP

TCP 报文头

TCP Flage

三次握手

握手是为了建立连接,TCP 三次握手的流程


第一次握手

第二次握手

第三次握手

Wireshark 抓包理解 TCP 三次握手

win 参数为滑动窗口,进行流量控制

总结三次握手

在 TCP/IP 协议中, TCP 采用三次握手建立可靠的连接。

为什么要三次握手建立连接

SYN 超时隐患

首次握手出现

原因

目前,Linux下默认会进行5次重发SYN-ACK包,重试的间隔时间从1s开始,下次的重试间隔时间是前一次的双倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s, 总共31s, 称为指数退避,第5次发出后还要等32s才知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s, TCP才会把断开这个连接。由于,SYN超时需要63秒,那么就给攻击者一个攻击服务器的机会,攻击者在短时间内发送大量的SYN包给Server(俗称SYN flood攻击),用于耗尽Server的SYN队列。

恶意攻击 SYN Flood

发送SYN 而不回应,每次都等待63秒,让正常连接不能处理

最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。syn flood属于Dos攻击的一种。

如果恶意的向某个服务器端口发送大量的SYN包,则可以使服务器打开大量的半开连接,分配TCB(Transmission Control Block), 从而消耗大量的服务器资源,同时也使得正常的连接请求无法被相应。当开放了一个TCP端口后,该端口就处于Listening状态,不停地监视发到该端口的Syn报文,一 旦接收到Client发来的Syn报文,就需要为该请求分配一个TCB,通常一个TCB至少需要280个字节,在某些操作系统中TCB甚至需要1300个字节,并返回一个SYN ACK命令,立即转为SYN-RECEIVED即半开连接状态。系统会为此耗尽资源。

防护措施

建立后 client 出现故障

连接队列

在外部请求到达时,被服务程序最终感知到前,连接可能处于SYN_RCVD状态或是ESTABLISHED状态,但还未被应用程序接受。
对应地,服务器端也会维护两种队列,处于SYN_RCVD状态的半连接队列,而处于ESTABLISHED状态但仍未被应用程序accept的为全连接队列。如果这两个队列满了之后,就会出现各种丢包的情形。

sync queue (半连接队列)

accept queue (全连接队列)

参考1
参考2

TCP 四次挥手

为了终止连接, 要发送四个包


1挥手

2挥手

3挥手

4挥手

四次挥手总结

client TIME_WAIT 状态

等待 2MSL 时间

为什么要四次挥手才断开连接

双工是允许双向发送,发送方和接收方都需要 FIN 报文和 ACK 报文
各自需要2次挥手,但是一方是被动的,才看上去是4次挥手

服务端出现大量 CLOSE_WAIT

客户端一直请求,但是返回时异常的
当对方发送 FIN 报文后,应用没有返回 ACK
对方关闭 socket 连接,我方忙于读写,没有及时关闭
检查代码,释放资源代码
检查配置,处理请求的线程配置

上一篇 下一篇

猜你喜欢

热点阅读