协议簇:TCP 解析: 连接断开

简介

接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的”四次挥手“的具体流程.

系列文章

协议簇:TCP 解析:基础
协议簇:TCP 解析:建立连接
协议簇:TCP 解析:连接断开
协议簇:TCP 解析:Sequence Number
协议簇:TCP 解析:数据传输

断开连接

通常情况

Normal Close Sequence
MSL: Maximum Segment Lifetime.

这里,我们假定 A 端为关闭连接的发起方.

  1. 初始状态下,通信双方均处于连接状态.
  2. 某一时刻,A 端发起断开连接请求(上层客户通过调用 TCP 的 Close 接口). 发起断开连接请求时A端发送 FIN 包, 之后A端的TCP 连接状态切换为 FIN-WAIT-1, 等待对方回应对应的 ACK。
    从此刻此,A 端发送的任何数据包都会被 B端拒绝,但是,与此同时 A 端可以正常接收 B端发送的数据
    处在这个状态的 A 端会重传FIN以及之前的数据包,直到接收到对方的 ACK.
  3. B端在收到 FIN 包后回复 ACK 确认收到 A 端发送的 FIN包,并把连接状态切换为 CLOSE-WAIT。 A 端收到对应的 ACK 之后状态切换为 FIN-WAIT-2.
    B 端在收到 A 端的 ACK 之后,不会立马发送 FIN 包. 只有当上层用户调用 TCP Close 接口时才会发送 FIN 包到 A 端.
  4. B 端收到 A 端的 FIN 包之后可以继续发送数据,知道某一时刻关闭 TCP。同A端一样,发送 FIN 包给 A端,然后等待 A 端回复 ACK。状态切换为 LAST-ACK。
  5. A 端收到 B 端发送的 FIN 后状态切换为 TIME-WAIT,并回复响应的 ACK。B 端收到 ACK 之后状态切换为 CLOSED
  6. 等待 2 MSL 时间hou,A端状态变为 CLOSED。c 此时,当前 TCP 已经完全关闭.

我们再使用 wireshark 抓包看看这个流程
在这里插入图片描述
上图中的四条记录便对应于上面流程中的 2-5 项. 至于数据包中各个字段的值,这里我们不关注.

双发同时发起关闭连接

Simultaneous Close Sequence

  1. 初始状态下,通信双方均处于连接状态.
  2. 某一时刻,双发均发起断开连接请求.
    假设,A 端发送了 FIN,且还未收到 B 端发送的 FIN。 B端也发送了 FIN,且还未收到 A端发送的FIN.
    发送完FIN之后,双方的状态均切换为 FIN-WAIT-1
    稍后,双发均收到了对方发送的 FIN, 需要回复对应的 ACK 给对方
    收到对方的 ACK 之后,双方状态切换为 CLOSING 状态.
  3. 此时,双发的 FIN 已经交换完成,只需要回复响应的 ACK,告知对方对方对方发送的 ACK(对应于之前发送的 FIN)己方已经收到便可.
  4. 稍后,双方均进入 TIME-WAIT 状态. 在经过 2 MSL 时间后,双方均进入 CLOSED状态。c 此时,当前 TCP 已经完全关闭.

END!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协议簇:TCP 解析: Sequence Number

简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下。这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对应于一个序列号. 由于每个字节都有自己的序列号&a…

协议簇:TCP 解析:TCP 数据传输

简介 前面,我们分别介绍了 TCP 基础知识以及连接的建立和关闭,以及最重要的 Sequence Number 的概念. 本篇文章,我们来介绍一下 TCP 如何传输数据. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析&…

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启,状态为 active 如果未开启,状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里,我…

Go Concurrency Patterns: Context

Go Concurrency Patterns: Context 原文地址:https://blog.golang.org/context Introduction 在 Go 语言实现的服务器上,我们总是使用 goroutine 来处理与客户端建立的连接, 给每个连接分配一个独立的 goroutine. 在请求的 handler 中也通常…

Go Concurrency Patterns: Timing out, moving on

原文地址:https://blog.golang.org/concurrency-timeouts 并发变成有它自己的风格. 一个非常好的例子就是 timeout. 虽然 go 的 channel 没有直接支持 timeout 机制,但是要实现它非常容易. 比如说,我们想从一个 channel ch 中接收数据&#…

Go Concurrency Patterns: Pipelines and cancellation

原文地址: https://blog.golang.org/pipelines 简介 Go 语言提供的并发原语使得可以很方便的构建数据流 pipeline,使用这样的 pipeline 可以高效的利用 I/O 和多 cpu 的优势. 这篇文章我们将展示如何构建并使用 pipeline. 什么是 pipeline ? 在 go 语…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候,我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题: 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候,发现连接速度非常慢(肉眼可见的慢&#x…

WinSock I/O 模型 -- Select 模型

简介 Select 模型是 WinSock 中最常见的 I/O 模型,这篇文章我们就来看看如何使用 Select api 来实现一个简单的 TCP 服务器. API 基础 Select 模型依赖 WinSock API Select 来检查当前 Socket 是否可写或者可读。 使用这个 API 的优点是我们不需要使用阻塞的 So…

WinSock I/O 模型 -- WSAEventSelect 模型

简介 WSAEventSelect 模型也是 WinSock 中最常见的异步 I/O 模型。 这篇文章我们就来看看如何使用 WSAEventSelect api 来实现一个简单的 TCP 服务器. API 基础 WSAEventSelect WSAEventSelect 用来把一个 SOCKET 对象和一个 WSAEVENT 对象关联起来。 lNetworkEvents 表示…

WinSock I/O 模型 -- WSAAsyncSelect 模型

简介 WSAAsyncSelect 模型也是 WinSock 中常见的异步 I/O 模型。 使用这个模型,网络应用程序通过接收以 Windows 消息为基础的网络事件通知来处理网络请求。 这篇文章我们就来看看如何使用 WSAAsyncSelect api 来实现一个简单的 TCP 服务器. API 基础 要使用 W…

WinSock I/O 模型 -- OVERLAPPED I/O 模型

简介 OVERLAPPED I/O 模型也是 WinSock 中常见的异步 I/O 模型,相比于我们之前提到的 Select 模型,WSAAsyncSelect 模型 和 WSAEventSelect 模型有更好的性能. 为了方便描述,下文我们将称 Overlapped I/O 模型为 “重叠模型”. 重叠模型的…

WinSock I/O 模型 -- IOCP 模型

前言 IOCP 全称 Input/Ouput Completion Ports,中文中翻译一般为“完成端口”,本文中我们使用 IOCP 简写. IOCP 模型是迄今为止最为复杂的一种 I/O 模型,但是同时通过使用 IOCP 我们往往可以达到最佳的系统性能. 当你的网络应用程序需要管理…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​

证书体系: CSR 解析

原文同时发布于本人个人博客: https//kutank.com/blog/cert-csr/ 简介 CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识,重点集中在 CSR 所包含的信息,及其意义。 CSR 的作用: CSR 通常由想要获…

胡思乱想

学了一段时间的OGRE,才知道什么才称得上"建筑师",而我们只不过是"砌墙匠" 他们在算法算法,我们在Coding Coding,怎样才能有所改观呢~~~想当初还不如选数学专业再来学计算机可能好些, 但是既然选择了先学计算机这条路,那就先Coding,边Coding边提高数学能力…

关于数据库备份的问题

首先我们来看数据库帮助上面的sql语句: BACKUP DATABASE Northwind TO DISK c:/Northwind.bakRESTORE FILELISTONLY FROM DISK c:/Northwind.bakRESTORE DATABASE TestDB FROM DISK c:/Northwind.bak WITH MOVE Northwind TO c:/test/testdb.mdf, MOVE N…

关于函数指针调用C++非静态成员

当在类里面定义函数指针,而函数指针会指向类里面的成员的时候,这个时候成员需要定义为静态成员。实例代码如下: //.h#define SCMD_REGISTER 0class CCallFuctionList{public:CCallFuctionList();virtual ~CCallFuctionList(void);typedef…

重构心得

重构入手: 1. 找到牵连最广模块。 2. 找到上述模块中需要重构的相关的子类。 3. 原来代码不删除,保证编译运行。 4. 陆续重构其他模块 再列出我觉得可以借鉴的重构方法。【摘自代码大全】 1.保存初始代码。用你的版本控制系统保存一个初始版本&#x…

跨模块中的分配内存问题

现在有dll模块A,dll模块B以及静态库C, C中有个全局Create()函数负责创建对象M,当第二次调用Create()的时候会增加引用计数,并返回原来创建的对象M。Relase()会减少引用计数。当引用计数为0时,销毁对象M。现在在模块A中创建的初始化对象M,模块…