SYN攻击
在三次握手的过程中,服务端发送了ack确认字段给客户端后,收到ack的客户端连接称之为半连接,如果这个时候客户端不返回确认包,那么服务端会重发直到超时,但是如果段时间内伪造大量的不存在的客户端ip发起连接请求,服务端等待客户端确认一直等待不到,所以短时间内大量无用的连接占用队列,导致正常的用户连接阻塞导致网络瘫痪,SYN攻击是最常见的DDoS攻击,所以有效的检测SYN攻击和防护很重要,防护方案常见如下:
1.过滤网关防护 2.加固TCP/IP协议线
为什么TCP/IP是三次握手,不是二次也不是四次?
三次握手是因为因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送
SYN+ACK 报文 。其中 ACK 报文是用来应答的,SYN 报文是用来同步的 。但是关闭连接时,
当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET(因为可能还有消息没处理
完),所以只能先回复一个 ACK 报文,告诉 Client 端,"你发的 FIN 报文我收到了" 。只有等到
我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送 。故需要四步
握手
为什么四次挥手以后还要等待2MSL才正式关闭?
网络是不可靠的,虽然收到服务端的确认以后,客户端发出确认以后已经可以close,但是,可能出现失败需要重试或者网络卡顿导致,客户端发出时间接近一次MSL时间,服务端返回也接近MSL时间,可能性都有,所以为了保险起见,等待到两个最大的时间后还收不到返回的消息,才可以认为是服务端关闭了
TCP的IO通信原理双工协议
TCP 是一个全双工协议,数据通信允许数据同时在两个方向上传输,因此全双工是两个单工
通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力,常见的协议如下:
协议概念单工协议数据传输只支持数据在一个方向传输半双工协议数据传输允许数据在两个方向传输,但是在某个时刻,只能在一个方向传输全双工协议允许数据同时在两个方向上传输,要求设备有独立的接收和发送的能力
IO通信过程
TCP、UDP 都是在基于Socket 概念上为某类应用场景而扩展出的传输协议,而socket 是一种
抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,把数据读写
到磁盘上一样 。使用 socket 可以把应用程序添加到网络中,并与处于同一个网络中的其他应
用程序进行通信 。不同类型的 Socket 与不同类型的底层协议簇有关联 。主要的 socket 类型
为流套接字(stream socket)和数据报文套接字(datagram socket) 。stream socket 把 TCP作为端对端协议(底层使用 IP 协议),提供一个可信赖的字节流服务 。数据报文套接字
(datagram socket)使用 UDP 协议(底层同样使用 IP 协议)提供了一种“尽力而为”的数据
报文服务,了解了Socket以后,我们来了解下tcp的io通信过程:
对于 TCP 通信来说,每个 TCP Socket 的内核中都有一个发送缓冲区和一个接收缓冲
区,TCP 的全双工的工作模式及 TCP 的滑动窗口就是依赖于这两个独立的 Buffer 和该 Buffer
的填充状态 。而接收缓冲区把数据缓存到内核,若应用程序一直不调用Socket的read方法读取,那么则该数据一直存在缓冲区中,而read方法就是把数据复制到应用层的buffer中 。而调用send方法的时候一般是把数据从应用层的buffer中,读取到Socket内核缓冲区,将数据返回,但是如果应用一直不读取,那么buffer满了以后,如果对端的窗口关闭,tcp缓存区的数据不会移除,这也证实了TC是可靠传输的 。如果传输的数据超过了窗口的大小,那么接收方会把剩下的数据丢弃

文章插图

文章插图
滑动窗口
早期的网络通信过程中,由于不会考虑到网络拥挤的情况导致数据丢失而直接发送数据,所以后来为了解决这个问题,就出了一个流量控制技术--滑动窗口协议,发送方和接收方都要维护一个数据帧的序列,这个序列称之为窗口
窗口尺寸:可以不等待应答而继续发送数据的最大的帧称之为窗口尺寸
发送窗口:可以不等待应答继续发送的窗口
接受窗口:接受发送来的数据,落在当前窗口中的帧,一定会被处理,但是落在窗口外的数据,允许被丢弃的窗口
推荐阅读
- 2种远程控制电脑开机方法,最后一个只需5秒
- IPv6学习笔记
- Spring Boot项目如何同时支持HTTP和HTTPS协议
- 「漏洞预警」PHP 远程代码执行漏洞
- 一图读懂 | 志翔科技“远程易”助力企业远程办公
- 淘宝网服务协议对免费责任(责任限制 淘宝网服务协议对免责事由是如何规定的?是如何规定的?)
- HTTP协议通信原理
- 远程桌面安全设置
- Mysql通讯协议分析
- 如何通过 SSH 在远程 Linux 系统上运行命令
