首页 > 其他分享 >TCP连接的建立与关闭

TCP连接的建立与关闭

时间:2024-04-01 16:00:16浏览次数:25  
标签:seq 报文 TCP 关闭 连接 服务端 客户端

TCP是一种面向连接的单播(在计算机网络的传输中,目的地址为单一目标的一种传输方式)协议,在TCP中并不存在多播、广播这种行为,因为TCP报文中能明确发送方和接收方的IP地址。在发送数据之前,通信双方需要建立连接,发送完毕后,通信双方需要断开连接。

TCP 连接的建立和终止
TCP的基本元素有四个:即发送方的 IP 地址、发送方的端口号、接收方的 IP 地址、接收方的端口号。而且每一方的IP + 端口号都可以看作一个套接字,套接字能够被唯一标识。套接字相当于门,出了这个门,就要进行数据传输了。

TCP的连接建立 -> 一共三个阶段

下图是一个非常典型的TCP连接的建立和关闭过程,其中不包括数据传输的部分

  1. 服务端进程准备好接收来自外部的 TCP 连接,一般情况下是调用 bind、listen、socket 三个函数完成。这种打开方式被认为是 被动打开。然后服务端进程处于 LISTEN 状态,等待客户端连接请求。
  2. 客户端通过 connect 发起主动打开(active open),向服务器发出连接请求,请求中首部同步位 SYN = 1,同时选择一个初始序号 sequence ,简写 seq = x。SYN 报文段不允许携带数据,只消耗一个序号。此时,客户端进入 SYN-SEND 状态。
  3. 服务器收到客户端连接后,,需要确认客户端的报文段。在确认报文段中,把 SYN 和 ACK 位都置为 1 。确认号是 ack = x + 1,同时也为自己选择一个初始序号 seq = y。这个报文段也不能携带数据,但同样要消耗掉一个序号。此时,TCP 服务器进入 SYN-RECEIVED(同步收到) 状态。
  4. 客户端在收到服务器发出的响应后,还需要给出确认连接。确认连接中的 ACK 置为 1 ,序号为 seq = x + 1,确认号为 ack = y + 1。TCP 规定,这个报文段可以携带数据也可以不携带数据,如果不携带数据,那么下一个数据报文段的序号仍是 seq = x + 1。这时,客户端进入 ESTABLISHED (已连接) 状态。
  5. 服务器收到客户的确认后,也进入 ESTABLISHED 状态。

这是一个典型的三次握手过程,通过上面 3 个报文段就能够完成一个 TCP 连接的建立。三次握手的的目的不仅仅在于让通信双方知晓正在建立一个连接,也在于利用数据包中的选项字段来交换一些特殊信息,交换初始序列号。


TCP 断开连接需要历经的过程如下

客户端应用程序发出释放连接的报文段,并停止发送数据,主动关闭 TCP 连接。客户端主机发送释放连接的报文段,报文段中首部 FIN 位置为 1 ,不包含数据,序列号位 seq = u,此时客户端主机进入 FIN-WAIT-1(终止等待 1) 阶段。

服务器主机接受到客户端发出的报文段后,即发出确认应答报文,确认应答报文中 ACK = 1,生成自己的序号位 seq = v,ack = u + 1,然后服务器主机就进入 CLOSE-WAIT(关闭等待) 状态。

客户端主机收到服务端主机的确认应答后,即进入 FIN-WAIT-2(终止等待2) 的状态。等待客户端发出连接释放的报文段。

这时服务端主机会发出断开连接的报文段,报文段中 ACK = 1,序列号 seq = v,ack = u + 1,在发送完断开请求的报文后,服务端主机就进入了 LAST-ACK(最后确认)的阶段。

客户端收到服务端的断开连接请求后,客户端需要作出响应,客户端发出断开连接的报文段,在报文段中,ACK = 1, 序列号 seq = u + 1,因为客户端从连接开始断开后就没有再发送数据,ack = v + 1,然后进入到 TIME-WAIT(时间等待) 状态,请注意,这个时候 TCP 连接还没有释放。必须经过时间等待的设置,也就是 2MSL 后,客户端才会进入 CLOSED 状态,时间 MSL 叫做最长报文段寿命(Maximum Segment Lifetime)。

服务端主要收到了客户端的断开连接确认后,就会进入 CLOSED 状态。因为服务端结束 TCP 连接时间要比客户端早,而整个连接断开过程需要发送四个报文段,因此释放连接的过程也被称为四次挥手。

TCP 连接的任意一方都可以发起关闭操作,只不过通常情况下发起关闭连接操作一般都是客户端。然而,一些服务器比如 Web 服务器在对请求作出相应后也会发起关闭连接的操作。TCP 协议规定通过发送一个 FIN 报文来发起关闭操作。

所以综上所述,建立一个 TCP 连接需要三个报文段,而关闭一个 TCP 连接需要四个报文段。TCP 协议还支持一种半开启(half-open) 状态,虽然这种情况并不多见。

标签:seq,报文,TCP,关闭,连接,服务端,客户端
From: https://www.cnblogs.com/wuhaoxin/p/18108676

相关文章

  • 本地服务器连接远程服务器上的MySQL
    上周日,在做项目时,连接不上远程服务器,导致数据库不能正常使用,(因为忘记密码了)查阅了很多资料,最终算是解决了吧。写一下自己的感悟。注意,本文是远程数据库的连接,所以是在远程服务器上工作的。我用的远程服务器是Linux系统,MySQL是5.7版本一、进入mysql需要密码,所以,我们得先跳过输......
  • 文件操作(1)【文件打开和关闭】【文件的顺序读写(各种函数)】【sprintf和sscanf的理解】
    一.什么是文件?在程序设计中我们一般谈的文件有两种:程序文件和数据文件1.程序文件程序文件是包含计算机程序代码的文件。它通常包含一系列指令和算法,用于执行特定的任务或实现特定的功能。程序文件可以由不同的编程语言编写,如C、Java、Python等。程序文件通过编译或解释等过......
  • 【数据库】使用DBever连接人大金仓数据库
    下载安装DBever首先需要下载并安装DBever,可以在DBever官网上下载最新版的安装程序,根据提示进行安装即可。下载驱动程序首先需要从人大金仓官方网站下载适用于DBever的驱动程序。下载完成后,将驱动程序保存到本地计算机上。添加驱动程序打开DBever软件,在主界面中点击菜单栏中的......
  • C#中的连接池管理
    连接池管理是在数据库编程和网络通信等领域中非常重要的一个概念,它可以提高应用程序的性能和资源利用率。以下是关于连接池管理的知识点以及可能会在面试中被问到的一些问题和答案:连接池管理的知识点:连接池的概念:连接池是一种管理和重用数据库连接、网络连接等资源的技术。......
  • TCP网络编程实例
    服务器端代码:#include<t_stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<sys/socket.h>#include<ctype.h>#include<unistd.h>intmain(void){structsockaddr_inserv,cl......
  • vscode远程连接docker容器打断点调试python项目
    vscode远程连接服务器docker容器前提:本地和远程都安装docker插件。1.安装完docker插件后点击插件图标2.如果登录的账号没有docker权限的会会报权限不足,使用以下命令把用户加到docker权限组中sudogpasswd-a<当前登陆用户名>docker#从用户组中删除:sudogpasswd-d<当前......
  • Android studio制作的mqtt协议通讯app,可用于搭建的meqx服务器,不可连接阿里云
    首先,在app目录下创建一个libs文件夹,导入相应的MQTT的jar包,然后右击jar包拉到最后找到Add...的一个选项,单击就OK了然后就是添加一些权限添加另一个layout的名字activity_main<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.......
  • 八股文——TCP四大机制!小白也能懂!(重传机制、滑动窗口、流量控制、拥塞控制)
    引言TCP巨复杂!同时在八股计算机网络中也经常被问到,必须会!这篇文章将让小白有个大体框架,知道怎么个事,面试中可以有话说,也能让佬更加巩固知识点。TCP是一个可靠的传输协议,为了保证它的可靠性,出现七七八八的机制,它可能有数据的破坏、丢包、重复以及分片顺序混乱等问题,TCP通过序......
  • nvl函数使外连接无法转换为内连接案例
    nvl函数使外连接无法转换为内连接案例编写:李晓萌sqlSELECTcount(0)FROM(SELECTz.GP3ZZHDMZHDM,a.C_PORT_NAMEZHMC,c.C_SEC_CODEZQDM,......
  • Matlab构建上位机:TCP/IP测试
    版本更新:Matlab代码经历过更新,其中Buffer这类属性都不再被支持使用。WhichistheBufferSizeofaTCP/IPsocket(tcpclient)?-MATLABAnswers-MATLABCentral(mathworks.cn)作为取代的新代码参考:TransitionYourCodetotcpclientInterface-MATLAB&Simulink-......