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

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. spyder错误合集

    SyntaxError: invalid syntax是非法语句的意思,检查语法是否出现错误,漏写等   SyntaxError: (unicode error) 'unicodeescape' co ...

  2. Python基础-day01-6

    算数运算符 计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备 目标 算术运算符的基本使用 01. 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理 ...

  3. Poco的介绍和入门教学

    版权声明:该文章为AirtestProject原创文章:允许转载,但转载必须注明“转载”并保留原链接 前言 前面我们已经介绍了基于图像识别的测试框架Airtest,通过图像识别,已经可以编写大部分的测 ...

  4. 3.Android-ADT之helloworld项目结构介绍

    1.helloworld项目结构如下图所示: src 放项目的源代码的.而MainActivity.java文件则对应helloworld界面代码,代码如下所示: gen BuildConfig.ja ...

  5. Gradle for Android ( 构建变体 )

    链接: http://77blogs.com/?p=38 https://www.cnblogs.com/tangZH/p/10999060.html 有时候我们一个app需要有不同的版本,不同的版本 ...

  6. Linux kernel中常见的宏整理

    0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...

  7. C/C++ 项目编译工具简介

    本文基于一个需要对 C 语言家族项目进行编译.生成解决方案的开发者的视角,对编译过程中所需要的各个工具进行简要的名词解释. GCC | LLVM 提供编译器 <-- GNU Make 根据配置文 ...

  8. 从一个OutOfMemoryError 学会了分析Java内存泄漏问题

    以前都是好好的,最近出现了 oom. 问题 开始是: java.lang.OutOfMemoryError: Java heap space -- :: --- [nio--exec-] c.e.p. ...

  9. STM32F407外部晶体改为25M后检测不到芯片的解决办法

    问题描述 分享一个之前遇到的STM32F4晶体频率问题,导致单片机死机的解决办法.使用一款新的F4开发板,直接使用的正点原子STM32F407工程模板代码,管脚配置正确,下载到外部晶体为25MHz的开 ...

  10. 精通awk系列(10):awk筛选行和处理字段的示例

    回到: Linux系列文章 Shell系列文章 Awk系列文章 awk数据筛选示例 筛选行 # 1.根据行号筛选 awk 'NR==2' a.txt # 筛选出第二行 awk 'NR>=2' a ...