1. 三次握手:

  服务器一定处于Listen状态,否则客户端发过来的连接会被拒绝。注:服务器和客户端的角色是相对的。

  客户端发送第一次握手(客户端发送连接请求(SYNC包)到服务器)之后由Closed状态转为Sync-Send状态;

  服务器收到第一次握手的客户端SYNC包,然后发送第二次握手(服务器发送SYNC+ACK(客户端SYNC包的确认)包给客户端)之后服务器由Listen状态转为Sync-Recv状态;

  客户端收到第二次握手的服务器SYNC+ACK包,然后发送第三次握手(客户端对“服务器的SYNC+ACK包“的ACK包给给服务器)之后客户端就转为ESTABLISHED状态;

  服务器收到第三次握手的客户端ACK包之后也进入了ESTABLISHED。

2. 四次挥手:

  服务器与客户端都处于ESTABLISHED状态,且有一方主动发起了关闭,另外一方会被动关闭。被动关闭的一方需要处理socket的资源回收等,被动关闭的一方需要及时关闭,所以说被动关闭的一方出现大量CLOSE_WAIT状态通常都是因为程序代码问题。

  主动关闭的一方(可能是服务器也可能是客户端)的状态迁移:FIN-WAIT1->FIN-WAIT2->TIME_WAIT-CLOSED

  被动关闭的一方的状态迁移:CLOSE_WAIT->LAST_ACK->CLOSED

  同时关闭:双方状态一致: FIN_WAIT1->CLOSING->TIME_WAIT

  假设客户端主动关闭连接,以下说明客户端和服务器如何迁移:

  客户端发送第一次挥手(客户端第一个FIN包给服务器)之后由ESTABLISHED状态转为FIN_WAIT1状态;

  服务器收到客户端的第一次挥手(客户端第一个FIN包给服务器)之后,发送第二次挥手(对客户端FIN的ACK确认包)给服务器,服务器进入CLOSE_WAIT状态,等待服务器自身的socket关闭等处理(等待IO,业务处理,资源回收等等);

  客户端收到服务器的第二次挥手(对客户端FIN的ACK确认包),进入FIN_WAIT2状态,等待服务器关闭(服务器调用close函数发送服务器的FIN包);

  服务器发送第三次挥手(在处理完自己的事情,调用close函数之后,发送服务器的FIN包),进入LAST_ACK状态;

  客户端收到第三次挥手(服务器的FIN包),发送第四次挥手(客户端第二个FIN包+ACK(对服务器FIN包的确认)),客户端进入TIME_WAIT状态;

  服务器收到第四次挥手(客户端第二个FIN包+ACK(对服务器FIN包的确认)),进入CLOSED状态;

  客户端等待2MSL时间,进入CLOSED状态

  注:FIN_WAIT2状态等待时间是有限的,系统可配:tcp_fin_timeout 这个参数可以控制改状态存活的时间

    FIN_WAIT1和CLOSE_WAIT是比较危险的状态,一般服务器网络鼓掌首先要查看这俩个状态是否正常:CLOSE_WAIT在上面说过,如果服务器代码有问题(忘记close等),服务器会一直有需要的CLOSE_WAIT状态的socket,造成服务器不可连接;FIN_WAIT1会在发出来FIN而没有手到ACK会重新发送FIN,重发次数由系统参数配置:tcp_orphan_retries;如果系统负载过重,减少tcp_orphan_retries值可能有作用。

    一般来说FIN_WAIT1几乎不可见,因为服务器之间的ACK速度非常快;

    FIN_WAIT1 的DDos攻击举例说明:http://huoding.com/2014/11/06/383

参考:http://coolshell.cn/articles/1484.html

TCP共有11个网路状态,其中涉及到关闭的状态有5个。

在我们编写网络相关程序的时候,这5个状态经常出现。因为这5个状态相互关联,相互纠缠,而且状态变化触发都是由应用触发,但是又涉及操作系统和网络,所以正确的理解TCP 在关闭时网络状态变化情况,为我们诊断网络中各种问题,快速定位故障有着非常重要的作用和意义。

下是是根据W.Richard Stevens的《TCP/IP详解》一书的TCP状态转换图。

【笔记】关于TCP三次握手和四次挥手的理解的更多相关文章

  1. 谈谈你对 TCP 三次握手和四次挥手的理解

    TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...

  2. 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题

    重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...

  3. TCP三次握手及四次挥手详细图解

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

  4. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制

    关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...

  5. 【HTTP协议】---TCP三次握手和四次挥手

    TCP三次握手和四次挥手 首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上 通过上面这张图我们能够知道.     在Http工作之前,Web浏览器通过网络和W ...

  6. 网络通信 --> TCP三次握手和四次挥手

    TCP三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 一.TCP报文格式 如下图: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发 ...

  7. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

  8. TCP‘三次握手’和‘四次挥手’(通俗易懂)

      概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通 ...

  9. 【转】TCP三次握手和四次挥手全过程及为什么要三次握手解答

    TCP三次握手和四次挥手的全过程   TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ...

随机推荐

  1. 微信小程序、微信公众号、H5之间相互跳转

    转自慕课网 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 图片有点小,我把文字打出来吧: 可关联已有的小程序或快速创建小程序.已关联的小程序可被使用在自定义菜单和模版消息 ...

  2. C# 数据库增加新表怎么更新ef

    找到dbmx文件,打开,右键,更新模型 也可以 右键从模型中删除 重新更新过来,感觉说了句废话 哈哈

  3. 面向对象(基础oop)之垃圾回收与静态成员

    大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...

  4. importnew:Map大家族的那点事儿

    Map大家族的那点事儿(1) :Map Map大家族的那点事儿(2) :AbstractMap Map大家族的那点事儿(3) :TreeMap Map大家族的那点事儿(4) :HashMap Map ...

  5. tr,td高度不生效

    功能:表格内容较长,但是页面高度有限,超出显示滚动条 阻碍:给tr或者td加高度都不生效,不显示滚动条 解决方案:td中加div,设置高度和内容溢出时的样式 <table border='1' ...

  6. vue-router 路由懒加载

    webpack打包会将所有资源文件合并压缩成一个文件,导致最终的文件非常大,甚至超过几M,以致页面首次加载会比较慢,如下图: 其中红色标出的是在浏览器中加载的js文件,gzip压缩前已经达到500多K ...

  7. Vue 框架-07-循环指令 v-for,和模板的使用

    Vue 框架-07-循环指令 v-for,和模板的使用 本章主要是写一些小实例,记录代码,想要更详细的话,请查看 官方文档:https://cn.vuejs.org/v2/guide/#%E6%9D% ...

  8. idea appliction context not configured for this file

    File --> Project Structure

  9. C++ 随机数字以及随机数字加字母生成

    #include <time.h>#include <sys/timeb.h>void MainWindow::slot_clicked(){ QString strRand; ...

  10. spring boot(17)-@Async异步

    验证码的异步机制 上一篇讲过可以用邮件发验证码,通常我们在某网站发验证码时,首先会提示验证码已发送,请检查邮箱或者短信,这就是图中的1和3.然而此时查看邮箱或短信可能并没有收到验证码,往往要过几秒种才 ...