一. “三路握手”建立连接

1.服务器(通常通过调用socket、bind、listen来完成——“被动连接”)必须准备接受外来的连接。;

    2.客户机(通过调用connect)发起“主动打开”。这将会导致客户TCP发送一个SYN(同步)分节——告诉服务器客户机将在该连接中发送的数据的初始序列号。

    3.服务器必须确认(ACK)客户机的SYN(同步),同时服务器自己也发送依个SYN(同步)分节——告诉客户机服务器将在同一连接中发送的数据的初始序列号。(服务器在单个分节中发送SYN和对客户的ACK)

    4.客户机也必须确认服务器的SYN。

SYN:同步序号,是TCP建立连接时使用的握手信号
 ACK:接收端给发送端的一种传输类控制字符,表示发来的数据已确认接收无误
 FIN:TCP终止时使用的挥手信号

1.  第一次握手

客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J)。

SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接

2.  第二次握手

服务器返回客户端 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J + 1来表示确认已收到客户端的 SYN段(Sequence number = J)。

ACK 是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包

3.  第三次握手

客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K + 1来表示确认已收到服务器的 SYN段(Sequence number = K)。

二. TCP选项

MSS选项(Maximum Segment Size,最大报文段大小):TCP发送端使用该选项告诉对方自己所能接受的最大段大小

窗口规模选项:主要指的是 滑动窗口中窗口的规模。TCP连接任何一端能够通告对端的最大窗口大小是65535,因为在TCP首部中相应的字段占16位。

时间戳选项:时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT。这个选项对高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据破坏。

三. TCP连接终止

  1.某个应用进程(通过调用close)发起“主动关闭”,同时该端的TCP会发送一个FIN(结束)分节——表示数据发送完毕。

   2.接收到该FIN的对端执行“被动关闭”,并发送ACK确认该FIN。——因为FIN的接收意味着接收端进程在相应连接上再无额外数据可接收,将作为一个文件结束符(EOF)放在已排队等候该应用进程接收的任何其他数据之后。

   3.一段时间后,接收到这个文件结束符(EOF——FIN)的进程将调用close关闭它的套接字,并同时也发送一个FIN。

   4.接收这个最终FIN的原发送端TCP(执行主动关闭的一端)确认(ACK)这个FIN。

在上述步骤B和C之间,从执行“主动关闭”一端到执行“被动关闭”一端流动数据是可能的(不发送数据了,并不是说也不接收了),这称为“半关闭”。

一个Unix进程无论自愿还是非自愿终止时,所有打开的描述符都被关闭,这就导致仍然打开的任何TCP连接上也发出一个FIN。

无论是客户机还是服务器,任何一端都可以执行主动关闭。(通常由客户机执行主动关闭)

四. TCP状态转换图

CLOSED:无连接是活动的或正在进行

LISTEN:服务器在等待进入呼叫

SYN_RECV:一个连接请求已经到达,等待确认

SYN_SENT:应用已经开始,打开一个连接

ESTABLISHED:正常数据传输状态

FIN_WAIT1:应用说它已经完成

FIN_WAIT2:另一边已同意释放

ITMED_WAIT:等待所有分组死掉

CLOSING:两边同时尝试关闭

TIME_WAIT:另一边已初始化一个释放

LAST_ACK:等待所有分组死掉

五. TIME_WAIT状态

执行主动关闭的那端经历TIME_WAIT这个状态,该端停留在这个状态的的持续时间是最长分节生命期的两倍,如上图的2MSL。(MSL是任何IP数据报能够给在因特网中存活的最长时间)

客户                                         服务器

TIME_WAIT状态存在的两个理由:

A.可靠地实现TCP全双工连接的终止;

如上图,如果TCP打算执行全双工关闭(彻底终止某个连接上两个方向的数据流),那么它必须正确处理终止序列4个分节的任何一个分节丢失的情况。现在我们假设最终的ACK丢失。则服务器将重新发送它的最终那个FIN,因此客户必须维护状态信息,以允许它重新发送最终那个ACK。要是客户不维护状态信息,它将响应一个RST(重置连接、复位连接),这将被服务器解释成一个错误。

因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。

B.允许老的(迷途的)重复分节在网络中消逝;

TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

参考:TCP三次握手详解-深入浅出(有图实例演示)_jun2016425的博客-CSDN博客_tcp三次握手

UNIX网络编程——TCP的连接建立与终止、基本TCP客户/服务器套接字函数_松狮-CSDN博客

TCP连接的建立与终止_程序人生-CSDN博客_tcp连接

#TCP/IP# TCP头部选项功能详解_潇汀-CSDN博客_tcp选项

TCP连接的建立与终止相关推荐

  1. 【TCP/IP详解 卷一:协议】第十八章 TCP连接 的建立与终止 (2)其余内容

    18.5 TCP的半关闭 牢记 TCP 是 全双工 的. 半关闭:TCP提供了连接的一端 在结束了它的发送后 还能接收来自另外一端数据的能力.但是只有很少的应用程序利用它. 为了实现这个特性,编程接口 ...

  2. TCP/IP传输层协议实现 - TCP连接的建立与终止(lwip)

    1.lwip tcp相关数据结构 1.1.tcp报文格式 <TCP-IP详解卷 1:协议>TCP包首部结构如下: 1.2.lwip tcp数据结构 tcp相关数据结构如下,tcp_pcb_ ...

  3. TCP连接的建立和终止

    一.三路握手 二.TCP连接关闭时的分组交换 三.TCP状态转换图 四.TCP连接的分组交换 转载于:https://www.cnblogs.com/soldierback/p/10624130.ht ...

  4. 网络学习笔记(一):TCP连接的建立与关闭

      五层网络模型分为:物理层.数据链路层.网络层.传输层.应用层.其中,传输层有两种主要协议:面向连接的TCP(Transmission Control Protocol 传输控制协议).无连接的UD ...

  5. TCP连接的建立和中止

    TCP连接的建立和中止 文章目录 TCP连接的建立和中止 TCP连接的建立 TCP连接的中止 TCP状态转换图 观察分组 TIME_WAIT状态 参考 理解TCP连接的建立和中止,有助于我们理解con ...

  6. TCP连接的建立与释放

    概述 TCP是一个面向连接的协议.无论哪一方向另一方发送数据前,都必须先在双方之间建立一条连接. 这种两端间连接的建立与无连接协议如UDP不同.一端使用UDP向另一端发送数据报时,无需任何预先的握手. ...

  7. TCP/IP详解--学习笔记(10)-TCP连接的建立与中止

    TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...

  8. s6-5 TCP 连接的建立

    TCP 连接的建立 采用三次握手建立连接 一方(server)被动地等待一个进来的连接请求 另一方(the client)通过发送连接请求,设置一些参数 服务器方回发确认应答 应答到达请求方,请求方最 ...

  9. TCP/IP之TCP连接的建立与中止状态分析

    TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手. 1.连接的建立: c端发起请求同步(用SYN段等于1的TCP报文),确认某个端口是否监听: s端应答(用ACK段等于1的TCP ...

最新文章

  1. spring Batch实现数据库大数据量读写
  2. Rsync和Sersync(企业实时同步方案)
  3. webpack4.x开发环境配置
  4. asp.net %% %#%%=%%@%%$%用法与区别
  5. linux 搭建github,github在linux上的环境搭建-Go语言中文社区
  6. 简明Vim练级攻略(转)
  7. 【codevs1282】约瑟夫问题,卡数据ing?
  8. 使C#代码现代化——第二部分:方法
  9. 符号级别(一)--基础概念
  10. 《算法图解》——数组和链表
  11. Ubuntu 安装arm-linux-gcc编译器
  12. php1008打印机驱动器,hp laserjet p1008打印机驱动
  13. C程序设计语言——基础概念
  14. 计算机丢失boost,Win7系统安装后出现无法开启readyboost怎么办?
  15. 短视频软件开发,抖音源码,美颜SDK,提供开放API接口
  16. Mac 安装谷歌浏览器驱动
  17. 佛蒙特州政府组建工作组以探索区块链技术
  18. dakai微信小程序 ios_【iOS】微信小程序打开APP到底是怎么回事?
  19. 【UE4 制作自己的载具】1-使用3dsmax制作载具
  20. Win11如何关闭自动更新?Win11更新服务关闭教程

热门文章

  1. 及时反馈,让员工尊重你,信任你
  2. AI智能视频分析平台EasyCVR视频直播弹框关闭后再次打开视频未能从起始时间播放的问题优化
  3. ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet:学习教程目录
  4. 机器学习中使用的神经网络(六) --第二课
  5. pdf工具类之添加页码
  6. 基于MATLAB的GMSK调制解调系统的设计仿真
  7. python阴阳师脚本_阴阳师肝不动了,试试Python吧
  8. 面试中关于MySQL十连问
  9. 借鉴-牛人开发的网络搜索工具
  10. 【TypeScript】必学基础