转载自  深入理解TCP/IP协议-TCP建立与终止连接

一、引言

  TCP 是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。连接创建与终止的状态变化图如下:

二、三次握手建立连接

过程如下:

  • 客户端发送一个 SYN 数据包指明客户端打算连接服务器的端口,初始化序号(ISN)为 m。

  • 服务器发回包含服务器的 ISN 作为应答(值为 n)。同时,将确认序号设置成客户端 ISN+1(m+1)来作为对客户端 SYN 的确认。

  • 客户端发送一个 ACK 数据包,ack=n+1, 作为对服务器的 SYN 的确认。

1. 为什么是三次握手,而不是两次

  网络是不可靠的,数据包是可能丢失的。假设没有第三次确认,客户端向服务端发送了 SYN,请求建立连接。由于延迟,服务端没有及时收到这个包。于是客户端重新发送一个 SYN 包。回忆一下介绍 TCP 首部时提到的序列号,这两个包的序列号显然是相同的。假设服务端接收到了第二个 SYN 包,建立了通信,一段时间后通信结束,连接被关闭。这时候最初被发送的 SYN 包刚刚抵达服务端,服务端又会发送一次 ACK 确认。由于两次握手就建立了连接,此时的服务端就会建立一个新的连接,然而客户端觉得自己并没有请求建立连接,所以就不会向服务端发送数据。从而导致服务端建立了一个空的连接,白白浪费资源。
  TCP是双通道,需要双向确定。只有两次握手,客户端知道了服务器收到了,服务器不知道客户端收到了,联想打电话。通讯系统中的占拜庭将军问题。

2. 最大报文段长度

  最大报文段长度(MSS)表示 TCP 传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的 MSS。在三次握手的时候 SYN 的 TCP 首部中的可选字段确定。以太网的默认长度为 1460。

三、四次握手关闭连接(正常状态)

  建立一个连接需要三次握手,而终止一个连接要经过 4 次握手。这由 TCP 的半关闭 (half-close) 造成的。一个 TCP 连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。

  • 主动方想要关闭连接,发送 FIN 包给被动方,序号为 m

  • 被动方接收到主动方发送的 FIN 包,知道了对方要关闭连接,发送 ACK 确认包,序号 m+1。主动方连接关闭。

  • 等待片刻(处于半关闭状态),在此期间(finwait2,closewait)。被动方发送最后的数据,主动方接收最后的数据。

  • 被动方确认要关闭连接,发送 FIN 包。序号 n。

  • 主动方等待片刻(接收网络中,还未到达的数据包),发送 ACK 确认包。序号 n+1。到此连接关闭。

1.TCP 的半关闭状态

  TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。如主动方处于 fin_wait2 状态。

2.TIME_WAIT 状态

  TIMEWAIT 状态也称为 2MSL 等待状态。每个具体 TCP 实现必须选择一个报文段最大生存时间 MSL( Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。因为 TCP 报文段以 IP 数据报在网络内传输,而 IP 数据报则有限制其生存时间的 TTL 字段。在实际应用中,对 I P 数据报 TTL 的限制是基于跳数,而不是定时器。   在处于 2MSL 等待状态的 socket(客户端 IP 与端口,服务器 IP 与端口) 不能再被使用。但在实际的使用中,允许一个新的连接请求到达仍处于 timewait 状态的连接,只要新的序号大于该连接的前一个连接的最后序号。

四、正常状态抓包

下面是一次完整的 tcp 建立连接,发送数据,关闭连接过程

该过程为,3 次握手建立连接,一次数据发送,4 次握手关闭连接

五、异常情况

出现异常的时候,服务器通常通过复位报文来通告,复位报文为 tcp 数据包类型设置为 rst。

1. 连接超时或到达不存在的端口 / 服务器

当服务器端没有开或网络问题,会出现连接超时的情况。抓包如下:

客户端尝试 3 三次来连接,有时候服务器端会发送 rst 数据包。

2. 异常终止一个连接

  在 TCP 通讯中。如果通讯双方应为某种原因(如突然断电等)关闭连接时候一方(如 A)没有发送 fin 数据包。另一端 (如 B) 不知道对方已经关闭了连接。再次发送数据的时候,异常关闭的一方,可能会返回一个 rst 数据包。通知异常关闭。如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的 TCP 连接称为半打开 (Half Open) 的。

3. 同时打开

  两个应用程序同时彼此执行主动打开的情况是可能的。每一方必须发送一个 SYN,且这些 SYN 必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。同时打开的状态迁移图不同于正常状态的三次握手,该情况下需要进行 4 次握手。如图:

4. 同时关闭

  我们在以前讨论过一方(通常但不总是客户方)发送第一个 FIN 执行主动关闭。双方都执行主动关闭也是可能的,TCP 协议也允许这样的同时关闭(simultaneous close)。在同时关闭的时候,双方都进入 time_wait 状态,如图:

六. TCP 服务器设计

  大多数的 TCP 服务器进程是并发的。当一个新的连接请求到达服务器时,服务器接受这个请求,并调用一个新进程来处理这个新的客户请求。

1. 接入连接请求队列

  一个并发服务器调用一个新的进程来处理每个客户请求,因此处于被动连接请求的服务器应该始终准备处理下一个呼入的连接请求。那正是使用并发服务器的根本原因。但仍有可能出现当服务器在创建一个新的进程时,或操作系统正忙于处理优先级更高的进程时,到达多个连接请求。当服务器正处于忙时,TCP 是如何处理这些呼入的连接请求?TCP 有这样一个队列来临时存放这些连接 - 接入连接请求队列。处理方式如下:

  • 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被 TCP 接受(即三次握手已经完成),但还没有被应用层所接受。注意区分 TCP 接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列中移出。

  • 应用层将指明该队列的最大长度,这个值通常称为积压值 (backlog)。

  • 当一个连接请求(SYN)到达时, TCP 使用一个算法,根据当前连接队列中的连接数来确定是否接收这个连接。积压值说明的是 TCP 监听的端口已被 TCP 接受而等待应用层接受的最大连接数。

  • 如果对于新的连接请求,该 TCP 监听的端口的连接队列中还有空间,TCP 模块将对 SYN 进行确认并完成连接的建立。此时,应用层不一定知道该新的连接,如果对方发送数据,这些数据将放入缓冲队列中。

  • 如果对于新的连接请求,连接队列中已没有空间,TCP 将不理会收到的 SYN。也不发回任何报文段(即不发回 RST)。如果应用层不能及时接受已被 TCP 接受的连接,这些连接可能占满整个连接队列,客户的主动打开最终将超时。

深入理解TCP/IP协议-TCP建立与终止连接相关推荐

  1. TCP/IP协议 TCP包深入理解

    详细解释TCP/IP标志位 TCP报格式 继续使用TCP/IP协议 TCP浅析中抓到的包进行分析. no Time Source Destination protocal Length info 3 ...

  2. TCP/IP协议——TCP协议

    今天算是对了TCP协议有个肤浅的理解了! 尽管TCP和UDP都是一样的网络层IP,但是TCP却和UDP实现着不一样的服务,TCP是一个面向连接的,可靠地字节流服务! 面向连接是指:两个使用TCP的程序 ...

  3. TCP/IP协议——TCP/IP协议栈及框架

    TCP/IP协议同ISO/OSI模型一样,也可以安排成栈形式.但这个栈不同于ISO/OSI版本,比ISO/OSI栈少,所以又称之为短栈.另外,需要知道的是:TCP/IP协议栈只是许多支持ISO/OSI ...

  4. 打印服务器通常不采用tcp ip协议,TCP/IP 卷Ⅰ协议-绪论

    TCP/IP 概述 简介:本系列文章,主要对TCP/IP协议族进行概述,其实对于整个计算机网络来说,TCP/IP只是属于其中的一个或者两个层级里面的内容: 1.1 分层 网络协议通常分不同的层次进行开 ...

  5. 【转】TCP/IP协议--TCP的超时和重传

    TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...

  6. TCP/IP协议模型和OSI协议模型的概念

    什么是网络协议? 网络协议是网络上所有设备(网络服务器.计算机及交换机.路由器.防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式和这些格式的意义.大多数网络都采用分层的体系结构,每一层都 ...

  7. 【计算机网络】TCP/IP协议(DNS协议、IP协议、TCP协议、UDP协议、三次握手、四次挥手)

    TCP/IP协议 TCP/IP协议 TCP/IP各层作用与常见协议 各种协议与HTTP协议的关系 TCP/IP协议 本文参考<图解HTTP>--上野宣 TCP/IP是Internet上所有 ...

  8. TCP/IP协议,HTTP协议,get和post请求的关联与区别

    TCP/IP协议 TCP/IP (Transmission Control Protocol/Internet Protocol),传输控制协议/网际协议,它是在网络使用中最基本的通信协议,TCP/I ...

  9. TCP/IP协议四层模型知识

    OSI七层和TCP/IP四层的关系 OSI七层模型是理论上的分层方式,而四层模型是实践过程中的分层模型. OSI七层模型ISO(国际标准化组织)提出的一套理论性的网络标准化协议,可以把它看成一本教科书 ...

最新文章

  1. 庖丁解“学生信息管理系统”
  2. dedecms后台左侧菜单500错误怎么处理
  3. 「架构技术专题」如何构建网站高可用架构(详细分析篇)?(6)
  4. MapReduce多个job同时使用的方式(从网上找到的案例,原始博文:http://www.cnblogs.com/yjmyzz/p/4540469.html)
  5. 华为笔记本软件商店_华为应用市场 PC 端体验:干净好用 - 华为
  6. 8 FI配置-财务会计-把总账科目组的字段状态变式分配给公司代码
  7. 三星首款5nm A78旗舰芯Exynos 1080即将亮相
  8. Android 单元测试cmd 命令集
  9. Redis实战(十二)Redis实现分布式锁
  10. JLOI2015 城池攻占
  11. PHP调用shell命令
  12. 视频文件损坏怎么修复
  13. 应用程序错误电脑黑屏_werfault应用程序错误黑屏|Win7解决werfault.exe应用程序错误方法...
  14. switch更新找不到服务器,任天堂Switch最新系统更新 修复数字商店bug
  15. PCB相关知识总结-(1)PCB工艺
  16. 【阿里云原生架构】二、云原生架构的原则和模式
  17. 微信小程序版本更新后提示用户更新
  18. SMPL源码实现及相关问题
  19. 电商erp是什么软件
  20. Oracle - 回滚段

热门文章

  1. 135. 分发糖果002(贪心算法+思路+详解)
  2. 过去3个多月的1200个小时里,我收获了什么?| 2021年年中总结
  3. [RabbitMQ]RabbitMQ概念_四大核心概念
  4. C++实现各种排序以及复杂度,稳定性分析
  5. [Java基础]获取Class类的对象
  6. 高等数学下-赵立军-北京大学出版社-题解-练习9.4
  7. [召集令]-Dijkstra的单源最短路径算法
  8. 对象的多数组表示(不一样的链表-多数组表示链表)
  9. gpio 树莓派3a+_树莓派4上市:性能飙升起售价依然是35美元
  10. 基于matlab的回波,基于MATLAB回波信号产生与消除.doc