题目描述

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. OpenFOAM——同心环中的自然对流

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL009: Natural Convection in a Concentric A ...

  2. layui如何隐藏弹出层关闭的按钮

    layui默认弹出层是带有关闭按钮的,但是在某些场景我们不需要layui的关闭按钮,这时只需添加closeBtn :0即可 效果图如下: 示例代码如下: layui.use('layer', func ...

  3. 用DLL方式封装MDI子窗体

    用DLL方式封装MDI子窗体是一种常用的软件研发技术,他的长处: 研发人员能够负责某一个模块的编写包括(界面+逻辑),能够互不干扰,模块研发完成后,主程式统一调用. 易于程式升级,当程式升级时,不用编 ...

  4. 2019软工实践_Alpha(5/6)

    队名:955 组长博客:https://www.cnblogs.com/cclong/p/11898112.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...

  5. Unity内存优化之视频讲解

    视频为中文讲解,mp4格式,大小3.05GB 目录   扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  6. Unity3d客户端与Photon服务器数据通信

    今天先介绍一下Photon服务器是什么,可以做什么,为什么要使用它? Photon:开发多人联网游戏最轻松的方案!可以迅速简单实现多人实时在线网络游戏(pvp). Photon:透过位于各地的Phot ...

  7. java算法 -- 基数排序

    基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排 ...

  8. [LeetCode] 123. Best Time to Buy and Sell Stock III 买卖股票的最佳时间 III

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  9. bugclose使用—bug管理工具

    1.前言 bugclose管理的是BUG,而不仅仅是bug.BUG概念是bugclose的创造,代表团队工作的对象,包括缺陷,任务和需求. 2.bugclose访问地址 访问地址:https://ww ...

  10. django:下拉框二级联动实现

    注意:只列举核心部分代码 前台模板: 第一级下拉菜单: <div class="col-sm-4"> <select data-placeholder=" ...