题目描述

1.什么是三次握手,四次挥手?为什么分别要三次与四次?

2.tcp协议中,close_wait与time_wait状态分别代表什么含义,为什么要设计这两种状态,解决了什么问题?

3.time_wait为什么要等待2MSL

4.平时排查问题中遇见大量close_wait应该如何处理?

参考答案

1.首先要理解TCP协议的定位,从wikipedia上抄一下定义:传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流传输层通信协议,由IETFRFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。

并且TCP是一个双向全双工的传输协议,这个后面再详细解释。

然后再聊一下一下tcp的6个标志位:

  • SYN(synchronous) Synchronize sequence numbers to initiate a connection
  • ACK(acknowledgement) The ackowledgement number is valid
  • PSH(传送) The receiver should pass this data to the application as soon as possible
  • FIN(finish结束) The sender is finished sending data.
  • RST(reset重置) Reset the connection
  • URG(urgent) The URGENT POINTER field contains valid data

step1:client端尝试建立连接,发送了一个tcp报文,这个tcp报文header里的SYN标志位是1,同时会随机生成ISN(initial sequence number)作为sequence number塞到报文的header里,这时候client端进入SYN-SENT状态

step2:server端接受到client端发送的请求,返回报文表示已经收到建立连接的请求,并同时尝试建立server端到客户端的连接。所以这时候header里的SYN与ACK标志位同时被置为1,且server端生成自己的ISN作为sequence number,而ack number则为client端的seq number+1。

step3:client端收到报文,这是client->server端的连接已经被建立,意味着已经可以从client端向server端发送数据,但ciient端同时也要发送ack消息给server端,这时候ack标志位为1,ack number为server端的seq number+1,当server端接受到这条消息表示连接建立成功。

然后回答为什么需要三次握手:首先tcp协议是可靠的,所以通过ack机制保证发送方可以确认接收方是否接收到了消息。其次,我们前面提到了tcp是双向全双工的,这意味着什么?意味着一旦建立连接后,client和server都可以主动像对方主动发送消息,且发送数据的时候同时也能够接受数据。所以step1+step2其实是建议client->server端的连接,而step2+step3建立的是server->client的连接。其实到这里我们已经理解了,step2其实是出于效率方面的考虑把2步并为1步,在返回ack的时候同时合并了一个建立连接的报文,所以由4步并为了3步。

step1:client主动发送fin包给server,此时的seq number为u,client端进入fin_wait_1状态

step2:server端接受到消息,发送ack包给client,此时的seq number为v,server端进入close_wait状态(一般这个时候会通知应用层进行相关的操作),client此时进入fin_wait_2状态,client->server的连接已经被close

step3:在等待应用层完成相关操作后,server端也发送fin包,尝试关闭server->client的连接,此时server端进入last_ack状态(看到很多地方说这个时候会带上一个client端中断的ack,这个我理解没什么必要?不知道有没有人可以帮我解释一下)

step4:client端返回ack给server端,并进入time_wait状态,持续2msl

为什么要四次挥手:其实大致流程跟三次握手差不多,唯一的差别只是中间两步并没有并成一步,之所以没有并成一步应该是给应用层一点时间来做close的准备工作。

2.close_wait与time_wait在上面应该已经都说了,close_wait表示接受到了对方申请关闭连接的请求,但是这个时候可能你的应用层还有事情需要处理,否则这2步就可以合并成一步,直接进入last-ack状态了。而当完成step4之后,server端可能因为网络原因没有接受到ack,这个时候会重复step3,如果client端没有进入time_wait状态而是直接关闭,将会导致server端无法正常关闭。同时,由于网络中的消息传递是存在延时的,如果发送完ack之后立即进入closed状态,然后在相同的port上立即建立新的连接,则有可能接受到上一次连接的残存消息,可能会导各种不可预知的致异常出现。

3.考虑最坏的情况,step4client发送给server,这个时候消息丢了,这一步骤最长占用1msl,server端判断消息丢失后,重复step3重新发送fin给client,这一步最长占用1msl,所以加起来就是2msl。

4.其实这个问题问得不太好,我们先要了解大量close_wait有什么危害。因为linux分配给一个用户的文件句柄是有限的(一般是1024),如果time_wait或者colse_wait两种状态被一直保持,这些通道会被一直占有,很快就会报出too many open files in system(这个是os层面的报错),然后就gg了。所以首先有有意识大量的close_wait是有危险的,然后根据上面所说的,close_wait是由对象主动发起断开,而你一直没有返回ack,那么你就会一直维持在close_wait状态(一般来说都是client端与server端建立了连接,然后client端忘记close,server端开始主动断开连接,但是client端没有响应,然后就挂起在那了)。然后平时发生问题首先可以等到机器上netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}',看看连接的情况(不过有monitor的话一般这一步可以省略)。然后netstat -an,看一下都是哪些连接在time_wait状态,根据server端的ip理论上可以判断出来是哪个连接,再然后就是去看这一块的代码,有没有忘记释放连接的地方。

后记:现实场景中可能会更加复杂,比如消息的乱序,丢失等种种情况,上面只讨论了正向流程,想再深入的话可能还需要考虑更多的异常流程。

参考文献:

1.https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE

2.http://telescript.denayer.wenk.be/~hcr/cn/idoceo/tcp_header.html

tcp协议close_wait与time_wait状态含义的更多相关文章

  1. TCP协议的11种状态及其变化过程?传输的内容又是什么?

    在TCP的11种状态变迁中,我们需要用到TCP头部的三个标志位: 1.SYN,SYN=1表示这是一个连接请求报文或者连接接受报文 2.ACK,ACK=1,表示确认号生效 3.FIN,FIN=1表示发送 ...

  2. TCP协议中的TIME_WAIT详细说明

    文章目录 4.3设置TIME_WAIT状态的目的 4.3.1 实现TCP全双工连接的关闭 4.3.2 使过时的重复报文段失效 4.3.3 TIME_WAIT状态的自结束 4.3.4 TIME_WAIT ...

  3. TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ...

    了解TCP协议端口的连接状态,对排除和定位网络或系统故障会有很大帮助,因此了解一下是有必要的: 一.LISTENING  提供某种服务,侦听远方TCP端口的连接请求,当提供的服务没有被连接时,处于LI ...

  4. TCP协议详解7层和4层解析(美团,阿里) 尤其是三次握手,四次挥手 具体发送的报文和状态都要掌握

    如果想了解HTTP的协议结构,原理,post,get的区别(阿里面试题目),请参考:HTTP协议 结构,get post 区别(阿里面试) 这里有个大白话的解说,可以参考:TCP/IP协议三次握手和四 ...

  5. TCP的TIME_WAIT状态

    主动关闭的Socket端会进入TIME_WAIT状态,并且持续2MSL时间长度,MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时 ...

  6. 【转】TCP协议

    TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...

  7. TCP协议的三次握手和四次分手

    HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. ...

  8. TCP 协议简析

    TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接.它是个超级麻烦的协议, ...

  9. 通俗大白话来理解TCP协议的三次握手和四次断开

    from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...

随机推荐

  1. @submit.native.prevent作用

    <el-form :inline="true" :model="geCarManageData" class="demo-form-inline ...

  2. JVM探究之 —— Java内存区域

    1. 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”又是从事最基础工作的“劳动人民”——既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的 ...

  3. hive时间戳转换&UDF更新

    from_unixtime 时间戳转换,如果带毫秒数的,除以1000. # ) ,'yyyy/MM/dd HH:mm:ss') as dt; reload function 今天碰到udf发布后,有时 ...

  4. CentOS 7镜像下载

    官网下载链接:http://isoredirect.centos.org/centos/7/isos/x86_64/ step1: 进入下载页,选择阿里云站点进行下载 Actual  Country ...

  5. 十三、postman导出java代码

    导出成java的OkHttp代码 使用Junit进行接口自动化测试 使用fastJSON解析json字符串 创建个实体类 package com.netease.AcFunTest; public c ...

  6. asp.net core mvc 读取appsettings.config中文乱码问题

    asp.net core mvc 读取appsettings.config中文乱码问题的解决方法如下: 用记事本打开appsettings.config,另存为的时候,编码设置为 “UTF-8”,

  7. Spring cloud微服务安全实战-7-13章节总结

    日志信息可以放到kafka,像指标监控就可以从kafka里面拿出日志来,分析日志里面的东西,把日志里面的一些信息变成数字,比如某个关键字出现了多少次,这样的信息同样去做监控,做报警. 调用链监控也是和 ...

  8. 通过ssh登录到手机 Termux

    安装Termux Termux官网:https://termux.com/ 安装openssh 安装好Termux后,点击图标进入,依次输入以下命令. 申请读写权限 termux-setup-stor ...

  9. dbcp与c3p0的区别

    众所周知,无论现在是B/S或者是C/S应用中,都免不了要和数据库打交道.在与数据库交 互过程中,往往需要大量的连接.对于一个大型应用来说,往往需要应对数以千万级的用户连接请求,如果高效相应用户请求,对 ...

  10. 谷歌浏览器调试javascript方法

    谷歌浏览器调试javascript方法 1 ctrl + shift + f 全局文件搜索 然后加断点 也可以直接编辑js文件 保存后 就更新了 一般用在点击事件上 ps:如果加了断点 刷新浏览断点消 ...