作者:故事我忘了¢
个人微信公众号:程序猿的月光宝盒

1.1 说一说TCP的四次挥手

​ "挥手",即终止TCP连接,断开一个TCP连接池.

​ 需要客户端和服务端总共发出四个包,以确认连接断开,流程如图:

​

​ (假设客户端主动关闭,也可以是被动的)

​ 第一次:seq=u,u(是前面ESTAB状态下,数据最后一次发送的时候,已经传送过来的数据最后一个字节的序号,再加上1),TCP规定,即使第一次不携带数据,也要消耗掉一个序号(回执是u+1)

​ 第二次:服务器发出确认报文(ACK=1),ack也携带自己的seq=v.CLOSE-WAIT(半关闭状态,即客户端已经没有数据要发送了,但是服务器要是发送数据,客户端还是可以接收)

​ 第三次: 由于在半关闭的状态,服务器很可能又发送了数据,假设此时的序号(seq=w),服务器进入LAST-ACK状态(最后确认)

​ 第四次:客户端在收到服务器的连接释放报文后,必须发出确认,即ACK=1,ack = 服务器发送的seq的w+1,回发回去,自己的序号(seq)假定为u,那就是u(第一次的seq)+1,客户端进TIME-WAIT,再经过2*MSL时间进入close,MSL即最长报文段生命(Linux中是30s)

总结:

​ TCP采用4次挥手释放连接,

​ 第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态;

​ 第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务器进入CLOSE_WAIT状态

​ 第三次挥手:服务器发送一个FIN数据包,用来关闭服务器到客户端的数据传送,服务器进入LAST_ACK状态

​ 第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT_2状态,接着发送一个ACK给服务器,确认序号为收到序号+1,服务器进入SLOSED状态,客户端在等待2*MSL(超时设置)后进入SLOSED,完成4次挥手.

1.2 为什么会有TIME_WAIT状态

原因:

​ 1.确保有足够的时间让对方收到ACK包,如果被动关闭的那方没有收到ACK就会触发重发FIN包一来一去刚好2MSL

​ 2.有足够的时间让这个链接不会和后面的链接混在一起,避免有些路由器会缓存IP数据包,如果连接混淆,就会跟新连接混在一起

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

因为TCP是全双工,(同时传送数据),所以发送方和接收方都需要FIN报文和ACK报文,也就是说发送和接受方各自需要2次挥手,只是有一方是被动的,所以看上去就成了四次挥手

1.4 服务器出现大量CLOSE_WAIT的原因

原因:

​ 对方关闭连接后,我方忙于读写,没有及时关闭连接

解决方案:

​ 1.检查代码,特别是释放资源的代码

​ 2.检查配置,特别处理请求的线程配置

Java每日一面(Part1:计算机网络)[19/10/14]的更多相关文章

  1. Java每日一面(Part1:计算机网络)[19/10/21]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.UDP简介 1.1UDP报文结构: ​ Source Port:源端口 Destination Port:目标端口 Length:数据包长度 C ...

  2. Java每日一面(Part1:计算机网络)[19/10/13]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.说说TCP三次握手 1.0 在此之前,什么是TCP? ​ TCP(传输控制协议) ​ 1.面向连接的,可靠的,基于字节流的传输层通信协议 ​ 2. ...

  3. Java每日一面(Part1:计算机网络)[19/11/25]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[2] 1.1Get请求和Post请求的区别 从三个层面来回答: 1.1.1 从HTTP报文层面: ​ Get请求将请求信息放在UR ...

  4. Java每日一面(Part1:计算机网络)[19/11/13]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[1] 1.1 HTTP简介 ​ HTTP协议,即超文本传输协议,属于应用层的协议,他是基于请求和响应模式的无状态的 应用层协议. ...

  5. Java每日一面(Part1:计算机网络)[19/11/02]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.TCP的滑动窗口 1.1 RTT和RTO的区别 ​ RTT:发送一个数据包到收到对应的ACK,所花费的时间 ​ RTO:重传时间间隔,TCP在发 ...

  6. Java每日一面(Part2数据库)[19/11/28]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.如何设计一个关系型数据库 如上图,首先划分成两大部分: ​ 1.存储部分:类似一个文件系统,把数据存储到一个持久化设备中,如机械硬盘,固态等 ​ ...

  7. Java Web学习总结(19)——web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  8. 程序员的 Ubuntu 19.10 配置与优化指南

    原文地址:程序员的 Ubuntu 19.10 配置与优化指南 0x00 环境 CPU: Intel Core i9-9900k GPU: GeForce RTX 2070 SUPER RAM: DDR ...

  9. 【Java每日一题】20161214

    package Dec2016; import java.util.ArrayList; import java.util.List; public class Ques1214 { public s ...

随机推荐

  1. 【玩转SpringBoot】让错误处理重新由web服务器接管

    其实web服务器是会处理错误的 在web.xml还是随处可见的年代时(确实有点老黄历了),下面的这些配置应该都不陌生. 根据错误代码处理错误,如下图01: 根据异常类型处理错误,如下图02: 不过我们 ...

  2. Linux下监控用户操作轨迹

    在实际工作当中,都会碰到误删除.误修改配置文件等事件.如果没有堡垒机,要在linux系统上查看到底谁对配置文件做了误操作,特别是遇到删库跑路的事件,当然可以通过history来查看历史命令记录,但如果 ...

  3. Fuchsia文章汇总

    今日,windows时代的十年已经过去,android/ios时代的十年也行将结束,下一个十年是谁的十年? 操作系统做为软件的基石,做为基础服务的基础,因为各层应用框架的层层封装,正在变的越来越透明, ...

  4. [ASP.NET Core 3框架揭秘] 依赖注入[4]:一个Mini版的依赖注入框架

    在前面的章节中,我们从纯理论的角度对依赖注入进行了深入论述,我们接下来会对.NET Core依赖注入框架进行单独介绍.为了让读者朋友能够更好地理解.NET Core依赖注入框架的设计与实现,我们按照类 ...

  5. MS14-068(CVE-2014-6324)域控提权利用及原理解析

    漏洞利用 0x01 漏洞利用前提 1.域控没有打MS14-068的补丁(KB3011780) 2.拿下一台加入域的计算机 3.有这台域内计算机的域用户密码和Sid 0x02 工具下载 Ms14-068 ...

  6. 使用 SQL 服务器时,"评估期已过期"错误消息

    当打开sql server2008企业管理器的时候,出现报错“评估期已过.有关如何升级的测试版软件的信息.....” 修改注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microso ...

  7. Centos7脚本一键优化

    我把优化centos7的脚本分享给大家,建议刚安装完服务器的朋友执行如下优化脚本 [root@test2 yum.repos.d]# cat centos7.sh #!/bin/bash #autho ...

  8. mongodb-API

    mongodb-API 连接mongo(该操作一般在初始化时就执行) 出现 由于目标计算机积极拒绝,无法连接的错误时 查看是否进行虚拟机的端口转发 将 /etc/ 目录下的mongodb.conf 文 ...

  9. JVM调优之服务内存超过阈值报警

    今早收到一条短信,具体报警信息如下: [UMP JVM监控内存报警]应用名:发券worker(jdos_couponwkr);KEY[coupon.send.worker.jvm],主机名:[host ...

  10. 【转载】记一次因 Redis 使用不当导致应用卡死 bug 的排查及解决!

    说明:此篇文章 作者分析问题的思路很好,值得学习记录,原文转载自公众号. 首先说下问题现象:内网sandbox环境API持续1周出现应用卡死,所有api无响应现象 刚开始当测试抱怨环境响应慢的时候 , ...