33. 传输层TCP协议十大主要特性(3) —— 连接管理(三次握手四次挥手)
连接管理
连接管理是分为两大块的: 1.建立连接:三次握手的过程 2.断开连接:四次挥手的过程
为什么要建立连接?
1.为了更好的保证可靠性,建立连接的过程就是让通信双方都确认验证一下各自的发送和接受能力是否能够正常 2.协商一些重要参数
建立连接:三次握手
假设我们现在在打电话,那么通信双方刚接通电话的时候就会有这样的情景:
在TCP的实际连接过程中,是需要经历一下过程的:
三次握手中几个重要的状态: LISTEN:相当于手机打开了,有信号了,可以随时有人打电话进来 SYN_SEND/SYN_RCND:建立简介过程期间,如果建立连接顺利,这两个状态都是一瞬间就会消失的 ESTABLISHED:表示建立连接完成,可以开始正是通信了
断开连接:四次挥手
用两人分手的例子再来向大家做一些解释:
在TCP的实际连接过程中,是需要经历一下过程的:
对于CLOSE_WAIT的解释: 一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态, 原因就是服务器没有正确的关闭 socket, 导致四次挥手没有正确完成. 这是一个 BUG. 只需要加上对应的 close 即可解决问题。(文件泄露问题)(一些文件出现相关异常也可能会导致跳过了close方法)
对于TIME_WAIT的解释: 谁主动断开连接,谁就进入了TIME_WAIT状态,到这一步的时候该主机已经完成了四次挥手的过程,但是仍然不能立刻释放资源,而是要以TIME_WAIT状态来保持一段时间的连接后在彻底释放资源(为了处理ACK丢包之后自动重传的问题,TIME_WAIT的时间是2MSL)
提问:
将三次握手改成两次行不行? 【不行,主机A还要给主机B应答,这样才能保证双方都能确认连接】 将三次握手改成四次行不行? 【行,但是没必要,因为ACK和SYN都在内核中,是同一时间发送的,把两个包合并成一个比较高效】 将四次握手改成三次行不行? 【ACK实在内核中的,FIN是需要处理完一些数据之后才会发送,ACK和FIN发送的时期不同,如果出发了延时应答机制(让ACK晚一会发送),就可以】
相关文章
- (20211206更新)ubuntu18.04 安装Python3.8.3、jupyter notebook远程连接配置、虚拟环境搭建。及torch、tensorflow成功下载[通俗易懂]
- 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。[通俗易懂]
- SQLServer 错误 11001 在建立与服务器的连接时出错。 在连接到 SQL Server 时,在默认的设置下 SQL Server 不允许远程连接可能会导致此失败。 (提供程序:TCP 提供程序,错误:0 – 无法识别主机。)(.Net SqlClient 数据提供程序) 故障 处理 修复 支持远程
- 解决sqoop从postgresql拉数据,报错TCP/IP连接的问题
- Linux 测试 TCP: 探索极限可靠性(linux测试tcp)
- Linux查看TCP连接数的命令行技巧(linux查看tcp连接数)
- /ipOracle数据库系统的TCP/IP连接指南(oracletcp)
- 端口揭示Linux系统监听TCP端口的真相(linux监听tcp)
- 服务端利用Linux开发多线程TCP服务端实现网络通信(linux多线程tcp)
- 报文:Linux网络层TCP报文转发实现(linux转发tcp)
- Linux无法连接:排查网络故障的步骤与方法(linux无法连接)
- SQL Server连接技术——增强数据库连接能力(sqlserver连接量)
- Linux命令大全:如何查看TCP连接?(linux查看tcp)
- Linux 下NC命令TCP连接实例(linux nc tcp)
- Nutz框架连接Oracle数据库实现快速开发(nutz连接oracle)
- 使用TCP协议探测Redis连接状态(tcp查看redis连接)
- TCP结合Redis构建高性能应用的实践(tcp redis)
- Oracle中使用右外连接的方法示例(oracle中右外连接)
- 简单易用利用TCP连接Redis服务器(redis连接使用tcp)
- asp连接mssql2005的代码