为什么是三次握手和四次挥手

news/2024/11/24 11:44:03/

文章目录

    • 为什么是三次握手
    • 为什么是四次挥手
    • 什么是TIME_WAIT状态
    • 解决TIME_WAIT状态引起的bind失败的方法

为什么是三次握手

因为这是双方都有收发的最小次数

握手的目的:确认网络好着没,对方好着没

  1. 确认双方主机是否健康(双方)
  2. 验证双方是否具有全双工。

比如发送数据不是为了对方接受,而是为了证明自己能够发送数据。两次握手只能验证自己能收发,而不能验证对方能发,第三次的时候对方也才知道自己有收发能力了。而四五六七次是显得多余了,握手只是为了证明双方主机是否健康,三次是成本最低的方式

再者,一次握手受到攻击的可能性是很大的,因为每次建立链接成功就要产生结构体,那么别人就可以发大量的链接导致你的服务器资源消耗很大,二次握手同理,服务器的回复别人不用管,只要认为链接成功就能一直给你发链接。这叫做SYN洪水,相对而言三次握手的话对方也会建立链接,那么对方识别syn+ack的时候其实也就是正常的三次握手

为什么是四次挥手

断开链接是双方都应该知晓并且同意的过程,四次挥手是双方都能得知断开链接的最小次数。双方协商断开链接的最小次数,首先我申请断开,对方同意并且我得知。其次对方申请断开,我同意并且对方得知。这就是协商的最小次数

什么是TIME_WAIT状态

主动断开链接的一方,要进入一个timewait状态,这时候即使四次挥手完成,客户端也不会释放链接,因为最后一次ack并没有保证一定获取,这个状态是在客户端收到服务端发来的关闭请求,也就是第三次挥手的时候。然后发送最后一次挥手ack,然后经过两次报文的最大生存时间(MSL)后才进入closefd

g)

  • [FIN_WAIT_1 -> FIN_WAIT_2] 客户端收到服务器对结束报文段的确认, 则进入FIN_WAIT_2, 开始等待服务器的结束报文段;
  • [FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出LAST_ACK;
  • [TIME_WAIT -> CLOSED] 客户端要等待一个2MSL(Max Segment Life, 报文最大生存时间)的时间, 才会进入CLOSED状态.

TIME_WAIT状态的客户端主机程序无法监听同样的server端口,因为实际的链接并未断开,这也就是平时我们绑定端口的时候出现bind error的原因。

  • 为什么是TIME_WAIT的时间是2MSL?

MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);

同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)

解决TIME_WAIT状态引起的bind失败的方法

在server的TCP连接没有完全断开之前不允许重新监听, 某些情况下可能是不合理的

  • 服务器需要处理非常大量的客户端的连接(每个连接的生存时间可能很短, 但是每秒都有很大数量的客户端来请求).
  • 这个时候如果由服务器端主动关闭连接(比如某些客户端不活跃, 就需要被服务器端主动清理掉), 就会产生大量TIME_WAIT连接.
  • 由于我们的请求量很大, 就可能导致TIME_WAIT的连接数很多, 每个连接都会占用一个通信五元组(源ip,源端口, 目的ip, 目的端口, 协议). 其中服务器的ip和端口和协议是固定的. 如果新来的客户端连接的ip和端口号和TIME_WAIT占用的链接重复了, 就会出现问题

使用setsockopt()设置socket描述符的 选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个socket描述符

int opt = 1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEDDR,&opt,sizeof(opt));

http://www.ppmy.cn/news/59517.html

相关文章

Apollo 7.0——percception:rader源码剖析

入口 该模块的启动是通过融合模块的dag文件而启动的,在Apollo/modules/perception/production/launch中,并没有单独启动radar的launch文件或者单独启动的dag文件。其具体路径为:Apollo/modules/perception/production/dag/dag_streaming_per…

多城市门店店铺展示地图导航pc/h5系统开发

多城市门店店铺展示地图导航pc/h5系统开发 系统设置: 网站标题、网站副标题、Logo图、网站背景图、网站底部图、网站底部版权、网站ICP备案、腾讯地图Key。 店铺列表: 店铺名称、店铺图标、设备、电话、省市区、详细地址。 添加店铺: 店铺…

什么是存储程序(学废版)

目录 存储过程 一、无参存储过程: 1、无参存储过程的创建: 2、存储过程的调用call 3、查看存储过程的基本信息 4、存储过程的删除 5、存储过程的修改 二、带参存储过程 1、调用带参存储过程 2、带参存储过程的使用 3、运用带参存储过程查询数据…

代码随想录算法训练营第四十九天 |动态规划 part10

121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…

HTML购物车示例(勾选、删除、添加和结算功能)

以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID。 以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID以下…

​Prometheus集群编队开发套件升级上市

Prometheus集群编队开发套件是一个面向集群、多智能体相关研究方向的无人机二次开发平台,采用分布式集群算法。与传统无人机集群相比,分布式无人机集群更加灵活、可靠和高效,可应用于更加复杂及多样化的任务场景。 分布式集群科研平台&#x…

重新理解快速排序

QuickSort QuickSort 版本一 依据 QuickSort版本一其实是依据 ‘荷兰国旗问题 实现的。只不过这次划分时只有大于或者小于num的数。 思路 取数组最右的数作为num,划分为两个区域(大于、小于) 在两个区域里重复第一部操作 QuickSort 版本二 依据 QuickSort版…

2.基础篇

目录 一、描述软件测试的生命周期(软件测试的流程) 二、如何描述一个bug 三、bug的级别(粗略划分) 四、bug的生命周期 五、因为一个bug和开发人员产生争执怎么办 六、如何设置弱网? 一、描述软件测试的生命周期&a…