socket 建立连接与三次握手的对应关系

本文探讨了Socket与TCP协议的关系,特别是在三次握手过程中如何防止SYN Flood攻击。通过实验测试,展示了在accept()函数执行前已完成三次握手,从而减少攻击风险。并提供了模拟socket连接的代码分析。
摘要由CSDN通过智能技术生成

Socket 与 TCP 协议

socket 用于网络编程,通过 TCP/UDP 协议建立通信。而面试中也常常问及 Socket 和三次握手的对应关系。一般人都认为是这样的关系。(最初也是这样设计的)

这里写图片描述

connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

SYN Flood 攻击

但是实际上,出于安全考虑,为了避免太过容易的 SYN Flood 攻击 ,客户端仅仅发出大量的 socket 连接请求,而服务器需要分配太多的 socket ,导致资源耗尽 。
实际上在 accept() 函数之前,已经完成了三次握手过程,这在一定程度上可以减少 SYN Flood 攻击。

实验测试

通过模拟 socket 建立连接的代码(代码在文末),模拟了简单的 socket 连接过程,同时启动 wireshark ,进行抓包,设置过滤规则 tcp.port = 7000 。
这里先在服务器端的 accept () 函数之前,增加了 while(1){}; 死循环,即不执行 accept() 函数。
在启动服务器和客户端后,抓取到的报文如下,可以看到,已经完成了三次握手。

这里写图片描述

在关闭客户端 socket 之后,仅仅进行了两次握手,因为服务端并没有执行 accept 函数分配 socket.

这里写图片描述

socket 通信代码

//服务器端代码
#include <sys/types.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值